@skyroc/scripts 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +508 -0
- package/dist/cli.mjs +78 -0
- package/dist/config-BKkdncJS.mjs +987 -0
- package/dist/index.mjs +14 -0
- package/package.json +83 -0
- package/templates/admin/.env +62 -0
- package/templates/admin/.env.prod +7 -0
- package/templates/admin/.env.test +7 -0
- package/templates/admin/.oxlintrc.json +6 -0
- package/templates/admin/README.md +508 -0
- package/templates/admin/index.html +14 -0
- package/templates/admin/package.json +105 -0
- package/templates/admin/public/favicon.svg +3 -0
- package/templates/admin/src/App.tsx +71 -0
- package/templates/admin/src/assets/audio/wechat-style-notification.wav +0 -0
- package/templates/admin/src/assets/imgs/skyroc.jpg +0 -0
- package/templates/admin/src/assets/svg-icon/activity.svg +1 -0
- package/templates/admin/src/assets/svg-icon/at-sign.svg +1 -0
- package/templates/admin/src/assets/svg-icon/avatar.svg +1 -0
- package/templates/admin/src/assets/svg-icon/banner.svg +1 -0
- package/templates/admin/src/assets/svg-icon/cast.svg +1 -0
- package/templates/admin/src/assets/svg-icon/chrome.svg +1 -0
- package/templates/admin/src/assets/svg-icon/copy.svg +1 -0
- package/templates/admin/src/assets/svg-icon/custom-icon.svg +1 -0
- package/templates/admin/src/assets/svg-icon/empty-data.svg +1 -0
- package/templates/admin/src/assets/svg-icon/error.svg +1 -0
- package/templates/admin/src/assets/svg-icon/expectation.svg +1 -0
- package/templates/admin/src/assets/svg-icon/heart.svg +1 -0
- package/templates/admin/src/assets/svg-icon/logo.svg +15 -0
- package/templates/admin/src/assets/svg-icon/network-error.svg +1 -0
- package/templates/admin/src/assets/svg-icon/no-icon.svg +1 -0
- package/templates/admin/src/assets/svg-icon/no-permission.svg +1 -0
- package/templates/admin/src/assets/svg-icon/not-found.svg +1 -0
- package/templates/admin/src/assets/svg-icon/service-error.svg +1 -0
- package/templates/admin/src/bootstrap.tsx +60 -0
- package/templates/admin/src/components/SkyrocAvatar.tsx +13 -0
- package/templates/admin/src/components/SystemLogo.tsx +7 -0
- package/templates/admin/src/config.ts +125 -0
- package/templates/admin/src/features/antd/AntdProvider.tsx +21 -0
- package/templates/admin/src/features/auth/components/UserAvatar.tsx +76 -0
- package/templates/admin/src/features/auth/use-auth-form-rules.ts +83 -0
- package/templates/admin/src/features/auth/use-auth.ts +96 -0
- package/templates/admin/src/features/auth/use-login.ts +72 -0
- package/templates/admin/src/features/effects/GlobalEffect.tsx +15 -0
- package/templates/admin/src/features/menus/dynamic-routes.ts +10 -0
- package/templates/admin/src/features/menus/extras.ts +3 -0
- package/templates/admin/src/features/menus/menu-category.ts +14 -0
- package/templates/admin/src/features/menus/menu-config.ts +5 -0
- package/templates/admin/src/features/router/RouterProvider.tsx +18 -0
- package/templates/admin/src/features/router/guard.ts +97 -0
- package/templates/admin/src/features/router/index.ts +52 -0
- package/templates/admin/src/features/router/routeTree.gen.ts +237 -0
- package/templates/admin/src/features/router/router-ref.ts +24 -0
- package/templates/admin/src/locales/antd.ts +8 -0
- package/templates/admin/src/locales/index.ts +22 -0
- package/templates/admin/src/locales/sync.ts +14 -0
- package/templates/admin/src/main.tsx +9 -0
- package/templates/admin/src/pages/(admin)/home/index.tsx +46 -0
- package/templates/admin/src/pages/(admin)/layout.tsx +44 -0
- package/templates/admin/src/pages/(auth)/login/index.tsx +102 -0
- package/templates/admin/src/pages/(auth)/login/layout.tsx +71 -0
- package/templates/admin/src/pages/(auth)/login-out.tsx +27 -0
- package/templates/admin/src/pages/(errors)/403.tsx +16 -0
- package/templates/admin/src/pages/(errors)/404.tsx +16 -0
- package/templates/admin/src/pages/(errors)/500.tsx +16 -0
- package/templates/admin/src/pages/__root.tsx +54 -0
- package/templates/admin/src/pages/error.tsx +19 -0
- package/templates/admin/src/pages/index.tsx +14 -0
- package/templates/admin/src/pages/loading.tsx +45 -0
- package/templates/admin/src/pages/not-found.tsx +9 -0
- package/templates/admin/src/plugins/app.tsx +47 -0
- package/templates/admin/src/plugins/assets.ts +4 -0
- package/templates/admin/src/plugins/index.ts +32 -0
- package/templates/admin/src/service/adapter.ts +63 -0
- package/templates/admin/src/service/api/auth/api.ts +31 -0
- package/templates/admin/src/service/api/auth/hooks.ts +28 -0
- package/templates/admin/src/service/api/auth/index.ts +10 -0
- package/templates/admin/src/service/api/auth/keys.ts +7 -0
- package/templates/admin/src/service/api/auth/urls.ts +7 -0
- package/templates/admin/src/service/api/index.ts +2 -0
- package/templates/admin/src/service/api/route/api.ts +7 -0
- package/templates/admin/src/service/api/route/hooks.ts +21 -0
- package/templates/admin/src/service/api/route/index.ts +10 -0
- package/templates/admin/src/service/api/route/keys.ts +3 -0
- package/templates/admin/src/service/api/route/urls.ts +5 -0
- package/templates/admin/src/service/queryClient.ts +13 -0
- package/templates/admin/src/service/request/index.ts +62 -0
- package/templates/admin/src/styles/scss/global.scss +1 -0
- package/templates/admin/src/styles/scss/scrollbar.scss +28 -0
- package/templates/admin/src/types/auto-imports.d.ts +186 -0
- package/templates/admin/src/types/global.d.ts +16 -0
- package/templates/admin/src/types/router.d.ts +14 -0
- package/templates/admin/src/types/storage.d.ts +17 -0
- package/templates/admin/src/types/vite-env.d.ts +117 -0
- package/templates/admin/src/utils/common.tsx +38 -0
- package/templates/admin/src/utils/icon.ts +9 -0
- package/templates/admin/src/utils/service.ts +75 -0
- package/templates/admin/src/utils/storage.ts +7 -0
- package/templates/admin/tsconfig.json +22 -0
- package/templates/admin/uno.config.ts +18 -0
- package/templates/admin/vite.config.ts +13 -0
- package/templates/admin-shell/i18n/atoms/lang.ts +20 -0
- package/templates/admin-shell/i18n/config/default.ts +11 -0
- package/templates/admin-shell/i18n/features/lang/LangEffect.tsx +25 -0
- package/templates/admin-shell/i18n/features/lang/LangSwitch.tsx +49 -0
- package/templates/admin-shell/i18n/hooks/use-lang.ts +47 -0
- package/templates/admin-shell/i18n/i18n.ts +116 -0
- package/templates/admin-shell/i18n/index.ts +23 -0
- package/templates/admin-shell/i18n/langs/en-us/common.json +49 -0
- package/templates/admin-shell/i18n/langs/en-us/datatable.json +8 -0
- package/templates/admin-shell/i18n/langs/en-us/dropdown.json +9 -0
- package/templates/admin-shell/i18n/langs/en-us/form.json +27 -0
- package/templates/admin-shell/i18n/langs/en-us/icon.json +13 -0
- package/templates/admin-shell/i18n/langs/en-us/notification.json +20 -0
- package/templates/admin-shell/i18n/langs/en-us/page.json +442 -0
- package/templates/admin-shell/i18n/langs/en-us/request.json +8 -0
- package/templates/admin-shell/i18n/langs/en-us/route.json +84 -0
- package/templates/admin-shell/i18n/langs/en-us/system.json +9 -0
- package/templates/admin-shell/i18n/langs/en-us/theme.json +173 -0
- package/templates/admin-shell/i18n/langs/index.ts +63 -0
- package/templates/admin-shell/i18n/langs/zh-cn/common.json +49 -0
- package/templates/admin-shell/i18n/langs/zh-cn/datatable.json +8 -0
- package/templates/admin-shell/i18n/langs/zh-cn/dropdown.json +9 -0
- package/templates/admin-shell/i18n/langs/zh-cn/form.json +27 -0
- package/templates/admin-shell/i18n/langs/zh-cn/icon.json +13 -0
- package/templates/admin-shell/i18n/langs/zh-cn/notification.json +20 -0
- package/templates/admin-shell/i18n/langs/zh-cn/page.json +442 -0
- package/templates/admin-shell/i18n/langs/zh-cn/request.json +8 -0
- package/templates/admin-shell/i18n/langs/zh-cn/route.json +84 -0
- package/templates/admin-shell/i18n/langs/zh-cn/system.json +9 -0
- package/templates/admin-shell/i18n/langs/zh-cn/theme.json +173 -0
- package/templates/admin-shell/i18n/types/i18n.ts +29 -0
- package/templates/admin-shell/i18n/types.ts +53 -0
- package/templates/admin-shell/i18n/utils/helpers.ts +18 -0
- package/templates/admin-shell/layouts/AdminLayout.tsx +161 -0
- package/templates/admin-shell/layouts/constant.ts +56 -0
- package/templates/admin-shell/layouts/context.tsx +101 -0
- package/templates/admin-shell/layouts/features/menus/MenuBadge.tsx +76 -0
- package/templates/admin-shell/layouts/features/menus/dynamic-routes.ts +146 -0
- package/templates/admin-shell/layouts/features/menus/menu-generator.tsx +444 -0
- package/templates/admin-shell/layouts/features/menus/menu-renderer.tsx +149 -0
- package/templates/admin-shell/layouts/features/menus/permissions.ts +28 -0
- package/templates/admin-shell/layouts/features/menus/use-menus.ts +98 -0
- package/templates/admin-shell/layouts/features/use-route.ts +30 -0
- package/templates/admin-shell/layouts/index.ts +44 -0
- package/templates/admin-shell/layouts/materials/index.ts +6 -0
- package/templates/admin-shell/layouts/materials/libs/admin-layout/index.module.css +63 -0
- package/templates/admin-shell/layouts/materials/libs/admin-layout/index.module.css.d.ts +18 -0
- package/templates/admin-shell/layouts/materials/libs/admin-layout/index.tsx +238 -0
- package/templates/admin-shell/layouts/materials/libs/admin-layout/shared.ts +67 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/ButtonTab.tsx +44 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/ChromeTab.tsx +54 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/ChromeTabBg.tsx +30 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/SliderTab.tsx +44 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/SvgClose.tsx +51 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/hook.ts +34 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/index.module.css +120 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/index.module.css.d.ts +18 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/index.tsx +76 -0
- package/templates/admin-shell/layouts/materials/libs/page-tab/shared.ts +32 -0
- package/templates/admin-shell/layouts/materials/types/index.ts +322 -0
- package/templates/admin-shell/layouts/modules/AdminContent.tsx +285 -0
- package/templates/admin-shell/layouts/modules/AdminFooter.tsx +13 -0
- package/templates/admin-shell/layouts/modules/AdminLogo.tsx +28 -0
- package/templates/admin-shell/layouts/modules/AdminSider.tsx +50 -0
- package/templates/admin-shell/layouts/modules/admin-header/AdminHeader.tsx +132 -0
- package/templates/admin-shell/layouts/modules/admin-header/components/Breadcrumb.tsx +62 -0
- package/templates/admin-shell/layouts/modules/admin-header/components/ThemeButton.tsx +24 -0
- package/templates/admin-shell/layouts/modules/admin-menu/AdminMenu.tsx +37 -0
- package/templates/admin-shell/layouts/modules/admin-menu/components/FirstLevelMenu.tsx +156 -0
- package/templates/admin-shell/layouts/modules/admin-menu/components/HorizontalMenu.tsx +88 -0
- package/templates/admin-shell/layouts/modules/admin-menu/components/MenuPortal.tsx +28 -0
- package/templates/admin-shell/layouts/modules/admin-menu/components/VerticalMenu.tsx +123 -0
- package/templates/admin-shell/layouts/modules/admin-menu/enum.ts +47 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/Horizontal.tsx +22 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/TopHybridHeaderFirst.tsx +15 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/TopHybridSidebarFirst.tsx +18 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/Vertical.tsx +14 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/VerticalHybridHeaderFirst.tsx +18 -0
- package/templates/admin-shell/layouts/modules/admin-menu/modules/VerticalMix.tsx +132 -0
- package/templates/admin-shell/layouts/modules/admin-search/AdminSearch.tsx +36 -0
- package/templates/admin-shell/layouts/modules/admin-search/components/SearchFooter.tsx +38 -0
- package/templates/admin-shell/layouts/modules/admin-search/components/SearchModal.tsx +171 -0
- package/templates/admin-shell/layouts/modules/admin-search/components/SearchResult.tsx +43 -0
- package/templates/admin-shell/layouts/modules/admin-tab/AdminTab.tsx +125 -0
- package/templates/admin-shell/layouts/modules/admin-tab/components/TabContextMenu.tsx +107 -0
- package/templates/admin-shell/layouts/modules/admin-tab/hooks/useTabScroll.ts +86 -0
- package/templates/admin-shell/layouts/modules/shared/logo.ts +42 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/ThemeDrawer.tsx +68 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/components/AnimatedCollapse.tsx +36 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/components/AnimatedItem.tsx +35 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/components/LayoutModeCard.tsx +110 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/components/SettingItem.tsx +31 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/ConfigOperation.tsx +53 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/appearance/CustomPicker.tsx +105 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/appearance/ThemeColor.tsx +58 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/appearance/ThemeSchema.tsx +42 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/appearance/ThemeToken.tsx +44 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/appearance/index.tsx +23 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/general/GlobalSettings.tsx +57 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/general/ThemeGeneral.tsx +20 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/general/WatermarkSettings.tsx +103 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/ContentSettings.tsx +100 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/FooterSettings.tsx +71 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/HeaderSettings.tsx +63 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/LayoutMode.tsx +73 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/SiderSettings.tsx +124 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/TabSettings.tsx +95 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/layout/ThemeLayout.tsx +32 -0
- package/templates/admin-shell/layouts/modules/theme-drawer/modules/preset/ThemePreset.tsx +132 -0
- package/templates/admin-shell/layouts/options.tsx +79 -0
- package/templates/admin-shell/layouts/setup.ts +102 -0
- package/templates/admin-shell/layouts/state/AdminEffect.tsx +56 -0
- package/templates/admin-shell/layouts/state/AdminTabEffect.tsx +28 -0
- package/templates/admin-shell/layouts/state/index.ts +3 -0
- package/templates/admin-shell/layouts/state/menus/MenuToggler.tsx +53 -0
- package/templates/admin-shell/layouts/state/menus/use-admin-menu-badges.ts +46 -0
- package/templates/admin-shell/layouts/state/menus/use-admin-menus.tsx +164 -0
- package/templates/admin-shell/layouts/state/tabs/index.ts +1 -0
- package/templates/admin-shell/layouts/state/tabs/shared.tsx +148 -0
- package/templates/admin-shell/layouts/state/tabs/use-admin-tab.ts +377 -0
- package/templates/admin-shell/layouts/state/use-admin-state.ts +118 -0
- package/templates/admin-shell/layouts/types/router.d.ts +10 -0
- package/templates/admin-shell/layouts/types/storage.ts +18 -0
- package/templates/admin-shell/notification/NotificationButton.tsx +91 -0
- package/templates/admin-shell/notification/NotificationContext.ts +8 -0
- package/templates/admin-shell/notification/NotificationPanel.tsx +194 -0
- package/templates/admin-shell/notification/NotificationProvider.tsx +59 -0
- package/templates/admin-shell/notification/index.ts +12 -0
- package/templates/admin-shell/notification/mock.ts +59 -0
- package/templates/admin-shell/notification/notification-store.ts +438 -0
- package/templates/admin-shell/notification/notification.css +60 -0
- package/templates/admin-shell/notification/types.ts +104 -0
- package/templates/admin-shell/notification/use-notification.ts +51 -0
- package/templates/admin-shell/notification/useNotificationContext.ts +14 -0
- package/templates/admin-shell/runtime/app-update.ts +156 -0
- package/templates/admin-shell/runtime/dayjs.ts +20 -0
- package/templates/admin-shell/runtime/iconify.ts +17 -0
- package/templates/admin-shell/runtime/index.ts +10 -0
- package/templates/admin-shell/runtime/nprogress.ts +25 -0
- package/templates/admin-shell/runtime/plugins.ts +62 -0
- package/templates/admin-shell/styles/global.css +54 -0
- package/templates/admin-shell/styles/nprogress.css +85 -0
- package/templates/admin-shell/styles/reset.css +378 -0
- package/templates/admin-shell/theme/antd/AntdProvider.tsx +106 -0
- package/templates/admin-shell/theme/antd/index.ts +23 -0
- package/templates/admin-shell/theme/antd/shared.ts +80 -0
- package/templates/admin-shell/theme/antd/ui.ts +250 -0
- package/templates/admin-shell/theme/antd-algorithm/algorithm/dark/colors.ts +99 -0
- package/templates/admin-shell/theme/antd-algorithm/algorithm/dark/index.ts +87 -0
- package/templates/admin-shell/theme/antd-algorithm/algorithm/default/colors.ts +91 -0
- package/templates/admin-shell/theme/antd-algorithm/algorithm/default/index.ts +77 -0
- package/templates/admin-shell/theme/antd-algorithm/index.ts +80 -0
- package/templates/admin-shell/theme/antd-algorithm/seed/index.ts +41 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/colorAlgorithm.ts +10 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genColorMapToken.ts +165 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genCommonMapToken.ts +23 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genControlHeight.ts +14 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genFontMapToken.ts +274 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genRadiusMapToken.ts +139 -0
- package/templates/admin-shell/theme/antd-algorithm/shared/genSizeMapToken.ts +114 -0
- package/templates/admin-shell/theme/antd-algorithm/types/index.ts +20 -0
- package/templates/admin-shell/theme/components/ThemeEffect.tsx +55 -0
- package/templates/admin-shell/theme/components/ThemeSchemaSegmented.tsx +27 -0
- package/templates/admin-shell/theme/components/ThemeSchemaSwitch.tsx +77 -0
- package/templates/admin-shell/theme/components/shared.ts +5 -0
- package/templates/admin-shell/theme/config/default.ts +108 -0
- package/templates/admin-shell/theme/config/index.ts +1 -0
- package/templates/admin-shell/theme/hooks/index.ts +2 -0
- package/templates/admin-shell/theme/hooks/use-theme.ts +244 -0
- package/templates/admin-shell/theme/index.ts +78 -0
- package/templates/admin-shell/theme/presets/azir.json +39 -0
- package/templates/admin-shell/theme/presets/compact.json +38 -0
- package/templates/admin-shell/theme/presets/dark.json +93 -0
- package/templates/admin-shell/theme/presets/default.json +95 -0
- package/templates/admin-shell/theme/presets/index.ts +29 -0
- package/templates/admin-shell/theme/presets/shadcn.json +99 -0
- package/templates/admin-shell/theme/setup.ts +115 -0
- package/templates/admin-shell/theme/types/index.ts +27 -0
- package/templates/admin-shell/theme/types/theme.d.ts +316 -0
- package/templates/admin-shell/theme/utils/dark-mode.ts +46 -0
- package/templates/admin-shell/theme/utils/filters.ts +20 -0
- package/templates/admin-shell/theme/utils/index.ts +3 -0
- package/templates/admin-shell/theme/utils/settings.ts +43 -0
- package/templates/admin-shell/types/api/auth.d.ts +148 -0
- package/templates/admin-shell/types/api/common.d.ts +54 -0
- package/templates/admin-shell/types/api/route.d.ts +104 -0
- package/templates/admin-shell/types/api/service.d.ts +51 -0
- package/templates/admin-shell/types/api/system-manage.d.ts +160 -0
- package/templates/admin-shell/types/app/common.d.ts +31 -0
- package/templates/admin-shell/types/app/global.d.ts +71 -0
- package/templates/admin-shell/types/app/menu.d.ts +57 -0
- package/templates/admin-shell/types/app/router.d.ts +201 -0
- package/templates/admin-shell/types/app/storage.d.ts +10 -0
- package/templates/admin-shell/types/app/union-key.d.ts +156 -0
- package/templates/admin-shell/types/locales/i18n.d.ts +135 -0
- package/templates/admin-shell/ui/antd/components/AppTree.tsx +62 -0
- package/templates/admin-shell/ui/antd/components/BeyondHiding.tsx +42 -0
- package/templates/admin-shell/ui/antd/components/ButtonIcon.tsx +123 -0
- package/templates/admin-shell/ui/antd/components/ButtonLink.tsx +30 -0
- package/templates/admin-shell/ui/antd/components/ErrorBoundary.tsx +45 -0
- package/templates/admin-shell/ui/antd/components/ExceptionBase.tsx +69 -0
- package/templates/admin-shell/ui/antd/components/FullScreen.tsx +33 -0
- package/templates/admin-shell/ui/antd/components/PinToggler.tsx +35 -0
- package/templates/admin-shell/ui/antd/components/ReloadButton.tsx +20 -0
- package/templates/admin-shell/ui/antd/components/index.ts +12 -0
- package/templates/admin-shell/ui/antd/components/styles/button-icon-animations.css +246 -0
- package/templates/admin-shell/ui/antd/index.ts +1 -0
- package/templates/admin-shell/ui/antd/styles.d.ts +1 -0
- package/templates/admin-shell/ui/compose/animate-feature.ts +5 -0
- package/templates/admin-shell/ui/compose/components/BetterScroll.tsx +51 -0
- package/templates/admin-shell/ui/compose/components/DarkModeContainer.tsx +22 -0
- package/templates/admin-shell/ui/compose/components/FlipText.tsx +41 -0
- package/templates/admin-shell/ui/compose/components/I18nLabel.tsx +18 -0
- package/templates/admin-shell/ui/compose/components/LazyAnimate.tsx +10 -0
- package/templates/admin-shell/ui/compose/components/LookForward.tsx +24 -0
- package/templates/admin-shell/ui/compose/components/NumberTicker.tsx +105 -0
- package/templates/admin-shell/ui/compose/components/Portal.tsx +74 -0
- package/templates/admin-shell/ui/compose/components/SvgIcon.tsx +39 -0
- package/templates/admin-shell/ui/compose/components/TypingAnimation.tsx +83 -0
- package/templates/admin-shell/ui/compose/components/WaveBg.tsx +56 -0
- package/templates/admin-shell/ui/compose/components/index.ts +11 -0
- package/templates/admin-shell/ui/compose/index.ts +2 -0
- package/templates/admin-shell/ui/compose/table/DragContent.tsx +239 -0
- package/templates/admin-shell/ui/compose/table/TableHeaderOperation.tsx +210 -0
- package/templates/admin-shell/ui/compose/table/hooks.ts +196 -0
- package/templates/admin-shell/ui/compose/table/index.ts +16 -0
- package/templates/admin-shell/ui/compose/table/types.ts +244 -0
- package/templates/admin-shell/ui/compose/table/use-table-operate.ts +136 -0
- package/templates/admin-shell/ui/compose/table/use-table-scroll.ts +49 -0
- package/templates/admin-shell/ui/compose/table/use-table.ts +303 -0
- package/templates/admin.meta.json +756 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="./public/favicon.svg" width="160" />
|
|
3
|
+
<h1>SkyrocAdmin</h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
|
|
10
|
+
> [!NOTE]
|
|
11
|
+
> 如果您觉得 `React SkyrocAdmin` 对您有所帮助,或者您喜欢我们的项目,请在 GitHub 上给我们一个 ⭐️。您的支持是我们持续改进和增加新功能的动力!感谢您的支持!
|
|
12
|
+
|
|
13
|
+
## 特别鸣谢
|
|
14
|
+
|
|
15
|
+
本项目是基于 [Soybean](https://github.com/honghuangdc) 开发的优秀开源项目 [Soybean Admin](https://github.com/soybeanjs/soybean-admin) 的 React 版本实现。在此特别感谢 Soybean 的开源贡献,为中后台开发提供了优秀的解决方案。如果您喜欢本项目,也请给原作者的 [Soybean Admin](https://github.com/soybeanjs/soybean-admin) 点个 star ⭐️。
|
|
16
|
+
|
|
17
|
+
## 简介
|
|
18
|
+
|
|
19
|
+
[`SkyrocAdmin`](https://github.com/Ohh-889/skyroc-admin) 是一个与时俱进、功能强大、架构优雅的企业级跨端中后台管理模板。
|
|
20
|
+
|
|
21
|
+
**为什么选择 React SkyrocAdmin?**
|
|
22
|
+
|
|
23
|
+
- 🎯 **与时俱进**:采用 2026 年最新前端技术栈(React 19、Vite 8、TypeScript 6),持续紧跟技术潮流
|
|
24
|
+
- 💪 **功能强大**:集成 TanStack Router、TanStack Query、Jotai 等业界最佳实践,提供完整的企业级解决方案
|
|
25
|
+
- ✨ **架构优雅**:`Applications → Web Kit → Core` 三层分层架构,模块化设计,完善的类型系统,代码质量堪称典范
|
|
26
|
+
- 📐 **规范性强**:严格的 oxlint 代码规范、统一的项目结构、Turborepo 标准化开发流程,适合团队协作
|
|
27
|
+
|
|
28
|
+
项目采用了最新的前端技术栈:
|
|
29
|
+
|
|
30
|
+
### 核心技术栈
|
|
31
|
+
|
|
32
|
+
- 🚀 **React 19** - 最新的 React 版本,集成 React Compiler,享受最前沿的特性
|
|
33
|
+
- 🛤️ **TanStack Router** - 类型安全的文件式路由管理系统
|
|
34
|
+
- 🔄 **TanStack Query 5** - 强大的服务端状态管理方案
|
|
35
|
+
- 📦 **Jotai** - 轻量原子化的客户端状态管理
|
|
36
|
+
- 🎨 **Ant Design 6** - 企业级 UI 组件库
|
|
37
|
+
- ⚡️ **Vite 8** - 极速的开发构建工具
|
|
38
|
+
- 🎯 **TypeScript 6** - 完善的类型系统
|
|
39
|
+
- 🌈 **UnoCSS + Tailwind CSS 4** - 高性能的原子化 CSS 引擎
|
|
40
|
+
- 🏗️ **Turborepo + pnpm monorepo** - 高效的多包工程管理方案
|
|
41
|
+
- 🔧 **oxlint + oxfmt** - 现代化的超高速代码质量与格式化工具链
|
|
42
|
+
|
|
43
|
+
### 项目特点
|
|
44
|
+
|
|
45
|
+
- 💡 **代码质量**:代码规范严谨,架构清晰优雅,完善的 TypeScript 类型支持
|
|
46
|
+
- ⚡️ **开箱即用**:无需复杂配置,快速启动项目开发
|
|
47
|
+
- 🧱 **干净骨架**:精简的项目结构,作为开箱即用的中后台起手模板;完整 demo 页面参见 [`apps/admin-example`](../admin-example)
|
|
48
|
+
- 📋 **文件式路由**:基于 TanStack Router 的自动化文件路由系统,类型安全,开发体验极佳
|
|
49
|
+
- 🔄 **数据管理**:集成 TanStack Query,优雅的服务端状态管理,自动缓存、重新验证
|
|
50
|
+
- 🏗️ **架构设计**:`@skyroc/*` 分层包设计,UI、Service、Core 边界清晰,高度模块化
|
|
51
|
+
- 🎨 **主题系统**:基于 OKLCH 色彩算法,支持暗黑模式、多主题色、布局配置等
|
|
52
|
+
- 🌍 **国际化**:完整的 i18n 方案(i18next),支持多语言实时切换
|
|
53
|
+
- 🔐 **权限管理**:基于角色的权限控制系统(RBAC),支持动态菜单与路由
|
|
54
|
+
- 📱 **响应式设计**:完美适配移动端和桌面端
|
|
55
|
+
- 🎯 **错误边界**:自动错误捕获和友好的错误界面
|
|
56
|
+
- ⚙️ **Keep-Alive**:页面缓存功能,提升用户体验
|
|
57
|
+
- 🎭 **动画效果**:基于 Motion 的流畅动画系统
|
|
58
|
+
- 🔧 **CLI 工具**:内置命令行工具(Git 提交规范、代码清理、版本发布、创建 admin 等)
|
|
59
|
+
|
|
60
|
+
### Monorepo 架构
|
|
61
|
+
|
|
62
|
+
项目采用 pnpm workspace + Turborepo 管理,能力沉淀在数十个 `@skyroc/*` 包中,应用(`apps/*`)只是一层薄壳:
|
|
63
|
+
|
|
64
|
+
**基础设施层(`packages/@core/*`)**
|
|
65
|
+
|
|
66
|
+
- 🛠️ **@skyroc/utils** - 平台无关工具函数(日期/存储/加密/事件/并发去重等)
|
|
67
|
+
- 📡 **@skyroc/axios** - 类型安全的 Axios 客户端(重试/转换/取消/Token 刷新)
|
|
68
|
+
- 🔌 **@skyroc/service** - 请求与查询基础设施(适配器模式,接入 UI、鉴权、导航与 React Query)
|
|
69
|
+
- 📦 **@skyroc/core-state** - Jotai 状态管理封装,跨平台支持
|
|
70
|
+
- 📝 **@skyroc/logger** - 跨平台日志系统(基于 LogLayer)
|
|
71
|
+
- 🎨 **@skyroc/color** - 色彩工具与调色板生成(OKLCH)
|
|
72
|
+
- 🔧 **@skyroc/utils/type** - 高级 TypeScript 工具类型
|
|
73
|
+
- 💻 **@skyroc/scripts** - 项目 CLI(changelog、release、git-commit 等)
|
|
74
|
+
|
|
75
|
+
**Web Kit 层(`packages/web/*`)**
|
|
76
|
+
|
|
77
|
+
- 🏠 **admin shell**(`packages/web/admin`,经 `@shell/*` 别名引用)- 后台应用壳源码:
|
|
78
|
+
布局与菜单权限(`@shell/layouts`)、主题与 antd 集成(`@shell/theme`)、国际化
|
|
79
|
+
(`@shell/i18n`)、通知(`@shell/notification`)、启动插件(`@shell/runtime`)、
|
|
80
|
+
全局样式(`@shell/styles`)与全局类型。不发布;`sa create-admin` 生成独立项目时
|
|
81
|
+
整目录复制进 `src/framework`,代码归你所有、可随意修改
|
|
82
|
+
- ⚡️ **@skyroc/web-admin-vite** - Vite 构建辅助与插件预设
|
|
83
|
+
- 🛠️ **@skyroc/web-admin-devtools** - 仅开发态的 devtools 面板
|
|
84
|
+
- 🌈 **@skyroc/web-ui** - 基于 Radix UI + Tailwind 的现代 React 组件库
|
|
85
|
+
- 🎯 **@shell/ui/antd** - Ant Design 复合组件(admin shell 的一部分)
|
|
86
|
+
- 🔲 **@shell/ui/compose** - 无状态复合组件(admin shell 的一部分)
|
|
87
|
+
|
|
88
|
+
**共享层**
|
|
89
|
+
|
|
90
|
+
- 🪝 **@skyroc/hooks** - 跨平台 React Hooks 集合(含 ./web 子路径)
|
|
91
|
+
- 📝 **@skyroc/form** - 类型安全的高级表单处理库(`@skyroc/filed-form`)
|
|
92
|
+
- 🎨 **@skyroc/tailwind-plugin** - Tailwind 主题插件,内含三端共用的设计令牌
|
|
93
|
+
|
|
94
|
+
**架构分层示意**
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
┌───────────────────────────────────────────────────────┐
|
|
98
|
+
│ Applications apps/admin · apps/admin-example │ 业务应用(薄壳)
|
|
99
|
+
└───────────────────────────────────────────────────────┘
|
|
100
|
+
▲ 依赖
|
|
101
|
+
┌───────────────────────────────────────────────────────┐
|
|
102
|
+
│ Web Kit packages/web/*(布局 / 主题 / UI) │ 界面工程层
|
|
103
|
+
└───────────────────────────────────────────────────────┘
|
|
104
|
+
▲ 依赖
|
|
105
|
+
┌───────────────────────────────────────────────────────┐
|
|
106
|
+
│ Core packages/@core/*(utils/axios/...) │ 基础设施层(平台无关)
|
|
107
|
+
└───────────────────────────────────────────────────────┘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
无论是学习最新前端技术,还是开发企业级中后台项目,React SkyrocAdmin 都是您的不二之选。
|
|
111
|
+
|
|
112
|
+
## 版本信息
|
|
113
|
+
|
|
114
|
+
当前版本:**v3.0.0**
|
|
115
|
+
|
|
116
|
+
### 技术栈版本
|
|
117
|
+
|
|
118
|
+
| 技术 | 版本 | 说明 |
|
|
119
|
+
|------|------|------|
|
|
120
|
+
| React | 19.1.0 | 核心框架(含 React Compiler) |
|
|
121
|
+
| TanStack Router | ^1.140.0 | 文件式类型安全路由 |
|
|
122
|
+
| TanStack Query | ^5.90.12 | 数据获取和缓存 |
|
|
123
|
+
| Jotai | ^2.16.0 | 原子化状态管理 |
|
|
124
|
+
| Ant Design | ^6.1.0 | UI 组件库 |
|
|
125
|
+
| Vite | ^8.0.14 | 构建工具 |
|
|
126
|
+
| TypeScript | ^6.0.3 | 类型系统 |
|
|
127
|
+
| UnoCSS | ^66.5.10 | 原子化 CSS |
|
|
128
|
+
| Tailwind CSS | ^4.1.18 | 实用优先 CSS 框架 |
|
|
129
|
+
| Motion | ^12.23.26 | 动画库 |
|
|
130
|
+
| i18next | 25.7.2 | 国际化框架 |
|
|
131
|
+
| pnpm | 10.4.1 | 包管理器 |
|
|
132
|
+
| Turborepo | ^2.7.1 | Monorepo 任务编排 |
|
|
133
|
+
|
|
134
|
+
### 在线预览
|
|
135
|
+
|
|
136
|
+
- **React19(v3)版本:**
|
|
137
|
+
- [预览地址](https://skyroc-admin.com/)
|
|
138
|
+
- [Github 仓库](https://github.com/Ohh-889/skyroc-admin)
|
|
139
|
+
- [Gitee 仓库](https://gitee.com/sjgk_dl/react-admin)
|
|
140
|
+
|
|
141
|
+
- **React19(v2)版本:**
|
|
142
|
+
- [预览地址](https://admin-v2.skyroc.me/home)
|
|
143
|
+
|
|
144
|
+
- **React18 版本 (v1):**
|
|
145
|
+
- [预览地址](https://admin-v1.skyroc.me/)
|
|
146
|
+
|
|
147
|
+
### 文档
|
|
148
|
+
|
|
149
|
+
- **v3 版本:**
|
|
150
|
+
- [在线文档](https://admin-docs.skyroc.me) - 详尽的 Ant Design 风格文档
|
|
151
|
+
- **v2 版本:**
|
|
152
|
+
- [在线文档](https://admin-v2-docs.skyroc.me) - v2 版本文档
|
|
153
|
+
- **v1 版本:**
|
|
154
|
+
- [在线文档](https://admin-docsv1.skyroc.me) - v1 版本文档
|
|
155
|
+
|
|
156
|
+
## 示例图片
|
|
157
|
+
|
|
158
|
+

|
|
159
|
+

|
|
160
|
+

|
|
161
|
+

|
|
162
|
+

|
|
163
|
+

|
|
164
|
+

|
|
165
|
+

|
|
166
|
+

|
|
167
|
+

|
|
168
|
+

|
|
169
|
+

|
|
170
|
+
|
|
171
|
+
## 项目结构
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
soybean-admin-react/ # Monorepo 根目录
|
|
175
|
+
├── apps/
|
|
176
|
+
│ ├── admin/ # 主后台应用 skyroc-admin(本应用)
|
|
177
|
+
│ │ ├── src/
|
|
178
|
+
│ │ │ ├── assets/ # 静态资源
|
|
179
|
+
│ │ │ ├── components/ # 局部组件(SystemLogo 等)
|
|
180
|
+
│ │ │ ├── features/ # 功能模块
|
|
181
|
+
│ │ │ │ ├── antd/ # Antd 全局配置
|
|
182
|
+
│ │ │ │ ├── auth/ # 认证模块
|
|
183
|
+
│ │ │ │ ├── effects/ # 副作用(页面标题、更新检测等)
|
|
184
|
+
│ │ │ │ ├── menus/ # 菜单配置
|
|
185
|
+
│ │ │ │ └── router/ # 路由配置
|
|
186
|
+
│ │ │ ├── hooks/ # 业务 Hooks
|
|
187
|
+
│ │ │ ├── locales/ # 国际化语言包
|
|
188
|
+
│ │ │ ├── pages/ # 页面(TanStack Router 文件式路由)
|
|
189
|
+
│ │ │ │ ├── (admin)/ # 后台布局页面
|
|
190
|
+
│ │ │ │ │ └── home/ # 首页仪表盘
|
|
191
|
+
│ │ │ │ ├── (auth)/ # 认证布局页面
|
|
192
|
+
│ │ │ │ │ └── login/ # 登录页
|
|
193
|
+
│ │ │ │ └── (errors)/ # 异常页(403 / 404 / 500)
|
|
194
|
+
│ │ │ ├── plugins/ # 插件初始化(motion、nprogress 等)
|
|
195
|
+
│ │ │ ├── service/ # API 服务层(分层架构)✨
|
|
196
|
+
│ │ │ │ ├── adapter.ts # @skyroc/service 适配器(接入 UI/鉴权/导航)
|
|
197
|
+
│ │ │ │ ├── queryClient.ts # TanStack Query 客户端配置
|
|
198
|
+
│ │ │ │ ├── api/ # API 请求函数
|
|
199
|
+
│ │ │ │ └── request/ # 请求配置和拦截器
|
|
200
|
+
│ │ │ ├── styles/ # 全局样式
|
|
201
|
+
│ │ │ ├── types/ # TypeScript 类型定义
|
|
202
|
+
│ │ │ └── utils/ # 工具函数
|
|
203
|
+
│ │ ├── .env # 基础环境变量
|
|
204
|
+
│ │ ├── .env.prod # 生产环境变量
|
|
205
|
+
│ │ ├── .env.test # 测试环境变量
|
|
206
|
+
│ │ └── vite.config.ts # Vite 配置(端口 9527)
|
|
207
|
+
│ ├── admin-example/ # 含完整 demo 页面的示例应用
|
|
208
|
+
│ └── web-ui-playground/ # @skyroc/web-ui 组件库 playground
|
|
209
|
+
│
|
|
210
|
+
├── packages/
|
|
211
|
+
│ ├── @core/ # 基础设施层(平台无关)
|
|
212
|
+
│ ├── web/ # Web Kit 层(后台界面工程能力)
|
|
213
|
+
│ ├── shared/ # 跨端共享(ui-types、type-utils)
|
|
214
|
+
│ ├── primitives/ # 基础组件库(filed-form)
|
|
215
|
+
│ └── hooks/ # 跨平台 React hooks
|
|
216
|
+
│
|
|
217
|
+
├── docs/ # 文档站点(5 个,基于 Fumadocs)
|
|
218
|
+
│ ├── project-docs/ # 项目总览
|
|
219
|
+
│ ├── admin-docs/ # 应用文档
|
|
220
|
+
│ ├── core-docs/ # @core 文档
|
|
221
|
+
│ ├── web-kit-docs/ # Web Kit 文档
|
|
222
|
+
│ └── web-ui-docs/ # UI 组件库文档
|
|
223
|
+
│
|
|
224
|
+
└── internal/ # 内部共享配置
|
|
225
|
+
├── tsconfig/ # 共享 TypeScript 配置
|
|
226
|
+
├── uno-config/ # UnoCSS 预设配置
|
|
227
|
+
└── config/ # 共享开发配置
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## 快速开始
|
|
231
|
+
|
|
232
|
+
### 环境准备
|
|
233
|
+
|
|
234
|
+
确保你的环境满足以下要求:
|
|
235
|
+
|
|
236
|
+
- **git**: 用于克隆和管理项目版本
|
|
237
|
+
- **Node.js**: >= 20,推荐 20.19.0 或更高
|
|
238
|
+
- **pnpm**: >= 8.7.0,推荐 10.4.1 或更高
|
|
239
|
+
|
|
240
|
+
### 安装步骤
|
|
241
|
+
|
|
242
|
+
1. **克隆项目**
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
git clone https://github.com/Ohh-889/skyroc-admin.git
|
|
246
|
+
cd skyroc-admin
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
2. **安装依赖**(在仓库根目录执行)
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
pnpm install
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
> ⚠️ 本项目采用 pnpm monorepo,请不要使用 npm 或 yarn 安装依赖。
|
|
256
|
+
|
|
257
|
+
3. **启动开发服务器**
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
# 方式一:在仓库根目录,仅启动主应用
|
|
261
|
+
pnpm --filter skyroc-admin dev
|
|
262
|
+
|
|
263
|
+
# 方式二:进入应用目录后启动
|
|
264
|
+
cd apps/admin
|
|
265
|
+
pnpm dev
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
开发服务器将在 `http://localhost:9527` 启动
|
|
269
|
+
|
|
270
|
+
4. **构建生产版本**
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# 生产环境构建
|
|
274
|
+
pnpm build
|
|
275
|
+
|
|
276
|
+
# 测试环境构建
|
|
277
|
+
pnpm build:test
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### 其他可用命令
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
# 以生产模式启动开发服务器
|
|
284
|
+
pnpm dev:prod
|
|
285
|
+
|
|
286
|
+
# 预览构建产物
|
|
287
|
+
pnpm preview
|
|
288
|
+
|
|
289
|
+
# 类型检查
|
|
290
|
+
pnpm typecheck
|
|
291
|
+
|
|
292
|
+
# 代码 Lint 修复(oxlint)
|
|
293
|
+
pnpm lint
|
|
294
|
+
|
|
295
|
+
# Git 提交(符合规范)
|
|
296
|
+
pnpm commit
|
|
297
|
+
|
|
298
|
+
# 清理缓存和依赖
|
|
299
|
+
pnpm cleanup
|
|
300
|
+
|
|
301
|
+
# 版本发布
|
|
302
|
+
pnpm release
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Turborepo 根目录脚本
|
|
306
|
+
|
|
307
|
+
在仓库根目录,Turborepo 提供统一的任务编排命令:
|
|
308
|
+
|
|
309
|
+
| 命令 | 说明 |
|
|
310
|
+
|------|------|
|
|
311
|
+
| `pnpm dev` | 启动所有应用/包的开发模式 |
|
|
312
|
+
| `pnpm build` | 构建全部包与应用 |
|
|
313
|
+
| `pnpm lint` | 运行 oxlint 代码检查 |
|
|
314
|
+
| `pnpm format` | 使用 oxfmt 格式化代码 |
|
|
315
|
+
| `pnpm format:check` | 校验代码格式 |
|
|
316
|
+
| `pnpm typecheck` | 全量 TypeScript 类型检查 |
|
|
317
|
+
| `pnpm test` | 运行单元测试(Vitest) |
|
|
318
|
+
| `pnpm test:e2e` | 运行端到端测试(Playwright) |
|
|
319
|
+
| `pnpm test:ui` | 启动 Vitest UI |
|
|
320
|
+
| `pnpm clean` | 清理构建产物 |
|
|
321
|
+
| `pnpm create:admin` | 通过 CLI 创建新的 admin 项目 |
|
|
322
|
+
|
|
323
|
+
## 核心功能
|
|
324
|
+
|
|
325
|
+
### 🎨 主题系统
|
|
326
|
+
|
|
327
|
+
- **OKLCH 色彩**:基于 OKLCH 色彩算法生成感知均匀的调色板
|
|
328
|
+
- **多主题色**:内置多种主题颜色,支持自定义主题色
|
|
329
|
+
- **暗黑模式**:完整的暗黑模式支持,自动适配系统主题
|
|
330
|
+
- **布局模式**:支持垂直、水平、混合等多种布局模式
|
|
331
|
+
- **主题配置**:可视化的主题配置面板,实时预览
|
|
332
|
+
- **配置导出**:支持主题配置的导出和导入
|
|
333
|
+
|
|
334
|
+
### 🔐 权限管理
|
|
335
|
+
|
|
336
|
+
- **角色权限**:基于 RBAC 的角色权限控制
|
|
337
|
+
- **菜单权限**:根据用户角色动态生成菜单
|
|
338
|
+
- **按钮权限**:细粒度的按钮级权限控制
|
|
339
|
+
- **路由守卫**:完善的路由前置守卫和权限验证
|
|
340
|
+
- **动态路由**:支持根据权限动态添加路由
|
|
341
|
+
|
|
342
|
+
### 🛤️ 路由系统
|
|
343
|
+
|
|
344
|
+
- **文件式路由**:基于 TanStack Router 的自动文件路由,全程类型安全
|
|
345
|
+
- **动态路由**:支持动态参数路由 `[id]`、`[...slug]` 等
|
|
346
|
+
- **路由缓存**:Keep-Alive 页面缓存功能
|
|
347
|
+
- **路由动画**:页面切换动画效果
|
|
348
|
+
- **面包屑**:自动生成面包屑导航
|
|
349
|
+
- **路由元信息**:丰富的路由元数据配置
|
|
350
|
+
|
|
351
|
+
### 📱 标签页系统
|
|
352
|
+
|
|
353
|
+
- **多标签页**:Chrome 风格的多标签页管理
|
|
354
|
+
- **右键菜单**:关闭、刷新、固定等操作
|
|
355
|
+
- **标签拖拽**:支持标签页拖拽排序
|
|
356
|
+
- **标签缓存**:标签页状态持久化
|
|
357
|
+
- **快捷操作**:关闭其他、关闭左侧、关闭右侧等
|
|
358
|
+
|
|
359
|
+
### 🌍 国际化
|
|
360
|
+
|
|
361
|
+
- **多语言**:支持中文、英文等多语言
|
|
362
|
+
- **动态切换**:语言实时切换,无需刷新
|
|
363
|
+
- **Antd 集成**:完整的 Antd 组件国际化
|
|
364
|
+
- **Dayjs 集成**:日期时间国际化支持
|
|
365
|
+
|
|
366
|
+
### 🔄 数据管理
|
|
367
|
+
|
|
368
|
+
#### TanStack Query + @skyroc/service 集成
|
|
369
|
+
|
|
370
|
+
项目通过 `@skyroc/service` 适配器深度集成了 TanStack Query,采用分层设计:
|
|
371
|
+
|
|
372
|
+
**架构设计**
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
service/adapter.ts → 接入 UI 层、鉴权、导航与 React Query
|
|
376
|
+
service/queryClient.ts → TanStack QueryClient 配置
|
|
377
|
+
service/api/ → 原生 API 请求函数
|
|
378
|
+
service/request/ → 请求配置和拦截器
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**使用示例**
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
// 在组件中使用 @skyroc/service 提供的 hooks
|
|
385
|
+
import { useLogin, useUserInfo } from '@skyroc/service';
|
|
386
|
+
|
|
387
|
+
const LoginPage = () => {
|
|
388
|
+
const { mutate: login, isPending } = useLogin();
|
|
389
|
+
const { data: userInfo, isLoading } = useUserInfo();
|
|
390
|
+
|
|
391
|
+
function handleLogin() {
|
|
392
|
+
login({ userName: 'admin', password: '123456' }, {
|
|
393
|
+
onSuccess: (data) => {
|
|
394
|
+
// 登录成功后的处理
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return <button onClick={handleLogin} disabled={isPending}>登录</button>;
|
|
400
|
+
};
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**核心特性**
|
|
404
|
+
|
|
405
|
+
- ✨ **自动缓存**:智能缓存管理,减少不必要的网络请求
|
|
406
|
+
- 🔄 **自动重新验证**:数据过期自动重新获取,保持数据新鲜
|
|
407
|
+
- ⚡️ **并发请求**:自动去重和批处理并发请求
|
|
408
|
+
- 🎯 **乐观更新**:支持乐观 UI 更新,提升用户体验
|
|
409
|
+
- 🔌 **离线支持**:离线状态下的数据缓存和同步
|
|
410
|
+
- 📊 **DevTools**:强大的开发者工具,实时查看请求状态
|
|
411
|
+
|
|
412
|
+
### 📡 HTTP 请求
|
|
413
|
+
|
|
414
|
+
- **@skyroc/axios**:类型安全的 Axios 客户端,完善的请求拦截和响应处理
|
|
415
|
+
- **错误处理**:统一的错误处理机制
|
|
416
|
+
- **Token 刷新**:自动 Token 刷新机制
|
|
417
|
+
- **请求取消**:支持请求取消和重复请求过滤
|
|
418
|
+
- **请求重试**:内置 axios-retry,自动重试失败请求
|
|
419
|
+
|
|
420
|
+
### 🛠️ 开发工具
|
|
421
|
+
|
|
422
|
+
- **oxlint**:高性能 Rust 实现的 Linter,比 ESLint 快数十倍
|
|
423
|
+
- **oxfmt**:统一的代码格式化工具
|
|
424
|
+
- **TypeScript 6**:完整的类型检查
|
|
425
|
+
- **Git Hooks**:提交前自动检查(simple-git-hooks)
|
|
426
|
+
- **Conventional Commits**:规范的提交信息
|
|
427
|
+
- **CLI 工具**:内置命令行工具集
|
|
428
|
+
- **Turborepo**:任务缓存与并行执行
|
|
429
|
+
|
|
430
|
+
## 文档
|
|
431
|
+
|
|
432
|
+
项目提供多个独立文档站点(均位于 `docs/`,基于 Fumadocs 构建):
|
|
433
|
+
|
|
434
|
+
| 文档站点 | 说明 |
|
|
435
|
+
|---------|------|
|
|
436
|
+
| **project-docs** | 项目总览与整体架构 |
|
|
437
|
+
| **admin-docs** | `apps/admin` 的启动、路由、菜单、权限与请求服务 |
|
|
438
|
+
| **core-docs** | `@core` 基础设施层各包的用途与边界 |
|
|
439
|
+
| **web-kit-docs** | 应用壳、主题、布局材料与 Ant Design 适配 |
|
|
440
|
+
| **web-ui-docs** | `@skyroc/web-ui` 组件库使用与设计系统 |
|
|
441
|
+
|
|
442
|
+
启动任一文档站点:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
# 示例:启动 web-ui 文档
|
|
446
|
+
pnpm --filter web-ui-docs dev
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## 如何贡献
|
|
450
|
+
|
|
451
|
+
我们热烈欢迎并感谢所有形式的贡献。如果您有任何想法或建议,欢迎通过提交 [pull requests](https://github.com/Ohh-889/skyroc-admin/pulls) 或创建 GitHub [issue](https://github.com/Ohh-889/skyroc-admin/issues) 来分享。
|
|
452
|
+
|
|
453
|
+
## 团队理念
|
|
454
|
+
|
|
455
|
+
- 欢迎各位小伙伴一起交流、讨论,彼此学习、共同进步。
|
|
456
|
+
- 项目采用 **MIT** 开源协议,永久免费使用,无需担忧版权问题。
|
|
457
|
+
- 任何关于功能扩展、Bug 修复、或文档纠正的贡献都十分欢迎,也鼓励你提交 **PR**,哪怕只是修正一个错别字。
|
|
458
|
+
|
|
459
|
+
## Git 提交规范
|
|
460
|
+
|
|
461
|
+
本项目已内置 `commit` 命令,您可以通过执行 `pnpm commit` 来生成符合 [Conventional Commits](https://www.conventionalcommits.org/) 规范的提交信息。在提交 PR 时,请务必使用 `commit` 命令来创建提交信息,以确保信息的规范性。
|
|
462
|
+
|
|
463
|
+
## 浏览器支持
|
|
464
|
+
|
|
465
|
+
推荐使用最新版的 Chrome 浏览器进行开发,以获得更好的体验。
|
|
466
|
+
|
|
467
|
+
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png" alt="IE" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/) | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/) | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/) | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/) | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/) |
|
|
468
|
+
| --- | --- | --- | --- | --- |
|
|
469
|
+
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
|
|
470
|
+
|
|
471
|
+
## 开源作者
|
|
472
|
+
|
|
473
|
+
[Ohh-889](https://github.com/Ohh-889)
|
|
474
|
+
|
|
475
|
+
## 贡献者
|
|
476
|
+
|
|
477
|
+
感谢以下贡献者的贡献。如果您想为本项目做出贡献,请参考 [如何贡献](#如何贡献)。
|
|
478
|
+
|
|
479
|
+
<a href="https://github.com/mufeng889/react-soybean-admin/graphs/contributors">
|
|
480
|
+
<img src="https://contrib.rocks/image?repo=mufeng889/react-soybean-admin" />
|
|
481
|
+
</a>
|
|
482
|
+
|
|
483
|
+
## 交流
|
|
484
|
+
|
|
485
|
+
`React SkyrocAdmin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供微信和 QQ 交流群,使用问题欢迎在群内提问。
|
|
486
|
+
|
|
487
|
+
<div>
|
|
488
|
+
<p>QQ交流群</p>
|
|
489
|
+
<img src="https://assets.skyroc.me/qq-group01.jpg" style="width:200px" />
|
|
490
|
+
</div>
|
|
491
|
+
|
|
492
|
+
<div>
|
|
493
|
+
<p>添加下面微信添加作者,邀请进微信群</p>
|
|
494
|
+
<img src="https://assets.skyroc.me/wx-avatar.jpg" style="width:200px" />
|
|
495
|
+
</div>
|
|
496
|
+
|
|
497
|
+
<div>
|
|
498
|
+
<p>微信群</p>
|
|
499
|
+
<img src="https://assets.skyroc.me/wx-group01.jpg" style="width:200px" />
|
|
500
|
+
</div>
|
|
501
|
+
|
|
502
|
+
## 开源协议
|
|
503
|
+
|
|
504
|
+
项目基于 [MIT © 2021 Skyroc](./LICENSE) 协议,仅供学习参考,商业使用请保留作者版权信息,作者不保证也不承担任何软件的使用风险。
|
|
505
|
+
|
|
506
|
+
## 祝福与展望
|
|
507
|
+
|
|
508
|
+
非常感谢你选择 **SkyrocAdmin**,愿它能在你的工作和学习中带来便利与收获。祝所有使用者在工作和生活中都能顺利进步、健康平安。欢迎大家积极参与、贡献代码,共同将 **SkyrocAdmin** 打造得更加完善与强大!
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-cmn-Hans">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>%VITE_APP_TITLE%</title>
|
|
8
|
+
<meta name="description" content="%VITE_APP_DESC%" />
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="app"></div>
|
|
12
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skyroc-admin",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "A fresh and elegant admin template, based on React18、Vite5、TypeScript、Ant Design and UnoCSS. 一个基于React18、Vite5、TypeScript、Ant Design and UnoCSS的清新优雅的中后台模版。",
|
|
6
|
+
"keywords": [],
|
|
7
|
+
"homepage": "https://github.com/Ohh-889/skyroc",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/Ohh-889/skyroc/issues"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "Ohh",
|
|
14
|
+
"email": "1509326266@qq.com",
|
|
15
|
+
"url": "https://github.com/mufeng889"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"url": "https://github.com/Ohh-889/skyroc.git"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build:admin-vite": "pnpm --filter @skyroc/web-admin-vite build",
|
|
23
|
+
"build": "vite build --mode prod",
|
|
24
|
+
"build:test": "vite build --mode test",
|
|
25
|
+
"cleanup": "sa cleanup",
|
|
26
|
+
"commit": "sa git-commit",
|
|
27
|
+
"commit:zh": "sa git-commit -l=zh-cn",
|
|
28
|
+
"dev": "vite --mode test",
|
|
29
|
+
"dev:prod": "vite --mode prod",
|
|
30
|
+
"lint": "oxlint --fix",
|
|
31
|
+
"prebuild": "pnpm run build:admin-vite",
|
|
32
|
+
"prebuild:test": "pnpm run build:admin-vite",
|
|
33
|
+
"predev": "pnpm run build:admin-vite",
|
|
34
|
+
"predev:prod": "pnpm run build:admin-vite",
|
|
35
|
+
"prepreview": "pnpm run build:admin-vite",
|
|
36
|
+
"preview": "vite preview",
|
|
37
|
+
"release": "sa release",
|
|
38
|
+
"typecheck": "tsc --noEmit --skipLibCheck",
|
|
39
|
+
"update-pkg": "sa update-pkg"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@skyroc/axios": "workspace:*",
|
|
43
|
+
"@skyroc/color": "workspace:*",
|
|
44
|
+
"@skyroc/core-state": "workspace:*",
|
|
45
|
+
"@skyroc/hooks": "workspace:*",
|
|
46
|
+
"@skyroc/logger": "workspace:*",
|
|
47
|
+
"@skyroc/service": "workspace:*",
|
|
48
|
+
"@skyroc/utils": "workspace:*",
|
|
49
|
+
"@skyroc/web-admin-devtools": "workspace:*",
|
|
50
|
+
"@skyroc/web-admin-shell": "workspace:*",
|
|
51
|
+
"@skyroc/web-ui": "workspace:*",
|
|
52
|
+
"@tanstack/react-query": "catalog:core",
|
|
53
|
+
"@tanstack/react-router": "catalog:web",
|
|
54
|
+
"ahooks": "catalog:utils",
|
|
55
|
+
"antd": "catalog:web",
|
|
56
|
+
"clsx": "catalog:utils",
|
|
57
|
+
"dayjs": "catalog:utils",
|
|
58
|
+
"defu": "catalog:utils",
|
|
59
|
+
"i18next": "catalog:i18n",
|
|
60
|
+
"jotai": "catalog:core",
|
|
61
|
+
"motion": "catalog:ui-shared",
|
|
62
|
+
"nprogress": "catalog:ui-shared",
|
|
63
|
+
"react": "catalog:core",
|
|
64
|
+
"react-dom": "catalog:core",
|
|
65
|
+
"react-error-boundary": "catalog:core",
|
|
66
|
+
"react-i18next": "catalog:i18n",
|
|
67
|
+
"zod": "catalog:utils"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@iconify/json": "catalog:ui-shared",
|
|
71
|
+
"@iconify/react": "catalog:ui-shared",
|
|
72
|
+
"@iconify/types": "catalog:ui-shared",
|
|
73
|
+
"@sa/uno-config": "workspace:*",
|
|
74
|
+
"@skyroc/scripts": "workspace:*",
|
|
75
|
+
"@skyroc/web-admin-vite": "workspace:*",
|
|
76
|
+
"@svgr/core": "catalog:web",
|
|
77
|
+
"@svgr/plugin-jsx": "catalog:web",
|
|
78
|
+
"@types/node": "catalog:dev",
|
|
79
|
+
"@types/nprogress": "catalog:dev",
|
|
80
|
+
"@types/react": "catalog:dev",
|
|
81
|
+
"@types/react-dom": "catalog:dev",
|
|
82
|
+
"@unocss/eslint-config": "catalog:dev",
|
|
83
|
+
"@unocss/preset-uno": "catalog:dev",
|
|
84
|
+
"@unocss/preset-wind3": "catalog:dev",
|
|
85
|
+
"@unocss/transformer-directives": "catalog:dev",
|
|
86
|
+
"@unocss/transformer-variant-group": "catalog:dev",
|
|
87
|
+
"eslint-plugin-react": "catalog:dev",
|
|
88
|
+
"eslint-plugin-react-hooks": "catalog:dev",
|
|
89
|
+
"eslint-plugin-react-refresh": "catalog:dev",
|
|
90
|
+
"eslint-plugin-sort": "catalog:dev",
|
|
91
|
+
"fast-glob": "catalog:dev",
|
|
92
|
+
"oxlint": "catalog:dev",
|
|
93
|
+
"sass": "catalog:web",
|
|
94
|
+
"tsx": "catalog:dev",
|
|
95
|
+
"typescript": "catalog:core",
|
|
96
|
+
"unocss": "^66.5.11",
|
|
97
|
+
"vite": "catalog:core"
|
|
98
|
+
},
|
|
99
|
+
"engines": {
|
|
100
|
+
"node": ">=18.12.0",
|
|
101
|
+
"pnpm": ">=8.7.0"
|
|
102
|
+
},
|
|
103
|
+
"packageManager": "pnpm@10.4.1",
|
|
104
|
+
"website": "https://skyroc-admin.com/home/"
|
|
105
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" role="img" aria-label="Skyroc 天鹏">
|
|
2
|
+
<path fill="#6366F1" fill-rule="evenodd" d="M 8.31 49.69 Q 8.00 51.38 8.00 54.15 Q 8.00 56.92 8.46 59.08 Q 8.92 61.23 9.85 63.54 Q 10.77 65.85 12.31 68.15 Q 13.85 70.46 15.77 72.38 Q 17.69 74.31 19.85 75.85 Q 22.00 77.38 24.46 78.62 Q 26.92 79.85 30.85 81.00 Q 34.77 82.15 31.92 82.23 Q 29.08 82.31 27.38 82.00 Q 25.69 81.69 23.85 81.08 Q 22.00 80.46 19.23 78.92 Q 16.46 77.38 16.38 78.08 Q 16.31 78.77 16.77 80.15 Q 17.23 81.54 18.15 83.23 Q 19.08 84.92 22.08 87.92 Q 25.08 90.92 28.15 92.46 Q 31.23 94.00 36.00 94.77 Q 40.77 95.54 44.62 95.23 Q 48.46 94.92 53.85 93.69 Q 59.23 92.46 62.15 92.46 Q 65.08 92.46 67.38 93.38 Q 69.69 94.31 70.85 95.46 Q 72.00 96.62 72.46 97.54 Q 72.92 98.46 72.77 100.77 Q 72.62 103.08 71.54 105.38 Q 70.46 107.69 66.92 113.23 Q 63.38 118.77 62.92 120.31 Q 62.46 121.85 62.46 123.54 Q 62.46 125.23 63.08 126.92 Q 63.69 128.62 64.69 129.62 Q 65.69 130.62 69.00 123.92 Q 72.31 117.23 73.92 111.15 Q 75.54 105.08 75.62 108.38 Q 75.69 111.69 74.31 118.31 Q 72.92 124.92 72.77 126.92 Q 72.62 128.92 72.92 130.62 Q 73.23 132.31 74.15 134.31 Q 75.08 136.31 77.31 139.00 Q 79.54 141.69 80.00 141.69 Q 80.46 141.69 81.31 140.85 Q 82.15 140.00 83.85 137.69 Q 85.54 135.38 86.46 132.46 Q 87.38 129.54 87.23 127.08 Q 87.08 124.62 85.69 117.54 Q 84.31 110.46 84.38 107.62 Q 84.46 104.77 86.23 111.31 Q 88.00 117.85 91.00 124.23 Q 94.00 130.62 95.00 129.77 Q 96.00 128.92 96.77 127.23 Q 97.54 125.54 97.54 123.38 Q 97.54 121.23 97.08 119.85 Q 96.62 118.46 93.38 113.54 Q 90.15 108.62 88.77 105.54 Q 87.38 102.46 87.23 100.77 Q 87.08 99.08 88.00 97.38 Q 88.92 95.69 90.08 94.69 Q 91.23 93.69 93.23 92.92 Q 95.23 92.15 97.54 92.15 Q 99.85 92.15 107.08 93.69 Q 114.31 95.23 118.31 95.23 Q 122.31 95.23 126.31 94.15 Q 130.31 93.08 133.08 91.38 Q 135.85 89.69 138.69 86.54 Q 141.54 83.38 142.69 80.38 Q 143.85 77.38 139.08 79.54 Q 134.31 81.69 132.62 82.00 Q 130.92 82.31 128.23 82.23 Q 125.54 82.15 129.00 81.15 Q 132.46 80.15 135.54 78.62 Q 138.62 77.08 140.31 75.85 Q 142.00 74.62 144.69 71.77 Q 147.38 68.92 148.77 66.46 Q 150.15 64.00 150.92 61.54 Q 151.69 59.08 151.85 55.08 Q 152.00 51.08 151.54 49.08 Q 151.08 47.08 150.77 47.08 Q 150.46 47.08 147.85 51.08 Q 145.23 55.08 140.69 59.15 Q 136.15 63.23 131.08 66.00 Q 126.00 68.77 119.69 70.92 Q 113.38 73.08 109.69 74.77 Q 106.00 76.46 101.85 79.85 Q 97.69 83.23 97.46 83.15 Q 97.23 83.08 98.77 80.92 Q 100.31 78.77 103.62 75.92 Q 106.92 73.08 110.62 71.08 Q 114.31 69.08 119.54 67.08 Q 124.77 65.08 129.54 62.46 Q 134.31 59.85 137.31 57.15 Q 140.31 54.46 141.85 52.31 Q 143.38 50.15 144.77 46.31 Q 146.15 42.46 146.15 38.62 Q 146.15 34.77 145.38 32.00 Q 144.62 29.23 143.54 26.92 Q 142.46 24.62 139.92 21.46 Q 137.38 18.31 136.54 22.69 Q 135.69 27.08 134.62 29.85 Q 133.54 32.62 130.00 38.00 Q 126.46 43.38 121.62 48.08 Q 116.77 52.77 108.15 59.38 Q 99.54 66.00 95.08 70.77 Q 90.62 75.54 89.92 75.00 Q 89.23 74.46 88.46 73.08 Q 87.69 71.69 87.38 68.92 Q 87.08 66.15 88.15 63.69 Q 89.23 61.23 90.54 60.08 Q 91.85 58.92 93.15 58.54 Q 94.46 58.15 93.77 57.15 Q 93.08 56.15 88.92 56.31 Q 84.77 56.46 82.62 57.69 Q 80.46 58.92 78.69 60.85 Q 76.92 62.77 77.85 62.77 Q 78.77 62.77 76.62 66.77 Q 74.46 70.77 72.85 72.38 Q 71.23 74.00 70.15 74.46 Q 69.08 74.92 64.46 70.15 Q 59.85 65.38 51.23 58.77 Q 42.62 52.15 38.08 47.77 Q 33.54 43.38 31.54 40.77 Q 29.54 38.15 27.85 35.08 Q 26.15 32.00 25.08 28.92 Q 24.00 25.85 23.31 22.08 Q 22.62 18.31 20.23 21.31 Q 17.85 24.31 16.77 26.46 Q 15.69 28.62 14.77 31.85 Q 13.85 35.08 13.85 38.77 Q 13.85 42.46 15.23 46.31 Q 16.62 50.15 18.15 52.31 Q 19.69 54.46 23.62 57.77 Q 27.54 61.08 30.77 62.77 Q 34.00 64.46 40.00 66.77 Q 46.00 69.08 50.46 71.54 Q 54.92 74.00 57.77 76.69 Q 60.62 79.38 61.77 81.46 Q 62.92 83.54 60.46 81.23 Q 58.00 78.92 55.23 77.08 Q 52.46 75.23 49.69 74.00 Q 46.92 72.77 39.85 70.46 Q 32.77 68.15 27.69 65.23 Q 22.62 62.31 19.00 59.00 Q 15.38 55.69 12.38 51.31 Q 9.38 46.92 9.00 47.46 Q 8.62 48.00 8.31 49.69 Z"/>
|
|
3
|
+
</svg>
|