@spacego/fe-components 0.0.1-alpha.5 → 0.0.1-alpha.7

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.
@@ -1,102 +1,115 @@
1
1
  import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
- import { LogoutOutlined as v } from "@ant-design/icons";
3
- import { useSelector as N } from "@spacego/zustand";
4
- import { Breadcrumb as y, Space as k, Popover as w, Badge as T, Dropdown as S, Avatar as M } from "antd";
5
- import { useState as E } from "react";
6
- import { IoMoon as C } from "react-icons/io5";
7
- import { MdWbSunny as G } from "react-icons/md";
8
- import { Link as O } from "react-router-dom";
9
- import j from "../../../../assets/svg/icon-arrows-right.svg.js";
10
- import A from "../../../../assets/svg/icon-bell.svg.js";
11
- import B from "../../../../assets/svg/icon-system.svg.js";
12
- import { useAuth as L } from "../../../../hooks/use-auth.hook.js";
13
- import "../../../../store/modules/layout-config.store.js";
14
- import { useThemeStore as R } from "../../../../store/modules/theme.store.js";
15
- import { applyThemeWithTransition as z } from "../../../../utils/theme.js";
16
- import { useGlobal as H } from "../../../context/context.js";
17
- import _ from "./setting-drawer.js";
18
- function oe({ breadcrumbItems: n }) {
19
- const { logout: l } = L(), { appName: s, logo: c, headerActionsRender: m, userInfo: r, userMenuItems: d = [] } = H(), { theme: a, TOGGLE_THEME: h } = R(N(["theme", "TOGGLE_THEME"])), [p, i] = E(!1), g = (f) => {
20
- const o = f.currentTarget.getBoundingClientRect(), x = o.left + o.width / 2, b = o.top + o.height / 2;
21
- z(a === "light" ? "dark" : "light", x, b).then(() => {
22
- h();
2
+ import { LogoutOutlined as S } from "@ant-design/icons";
3
+ import { Breadcrumb as T, Space as R, Popover as B, Badge as C, Dropdown as M, Avatar as j } from "antd";
4
+ import { useState as z } from "react";
5
+ import { IoMoon as A } from "react-icons/io5";
6
+ import { MdWbSunny as I } from "react-icons/md";
7
+ import { Link as L } from "react-router-dom";
8
+ import O from "../../../../assets/svg/icon-arrows-right.svg.js";
9
+ import D from "../../../../assets/svg/icon-bell.svg.js";
10
+ import W from "../../../../assets/svg/icon-system.svg.js";
11
+ import { applyThemeWithTransition as H } from "../../../../utils/theme.js";
12
+ import P from "./setting-drawer.js";
13
+ function $(i) {
14
+ const {
15
+ breadcrumbItems: l,
16
+ appName: c,
17
+ logo: s,
18
+ headerActionsRender: m,
19
+ breadcrumbBeforeRender: d,
20
+ searchRender: h,
21
+ noticeRender: g,
22
+ isNotice: p,
23
+ userInfo: r,
24
+ userMenuItems: u = [],
25
+ theme: a,
26
+ onToggleTheme: x,
27
+ onLogout: f
28
+ } = i, [b, n] = z(!1), v = (y) => {
29
+ const o = y.currentTarget.getBoundingClientRect(), k = o.left + o.width / 2, w = o.top + o.height / 2;
30
+ H(a === "light" ? "dark" : "light", k, w).then(() => {
31
+ x();
23
32
  });
24
- }, u = [
25
- ...d,
33
+ }, N = [
34
+ ...u,
26
35
  {
27
36
  key: "logout",
28
37
  label: "退出登录",
29
- icon: /* @__PURE__ */ e(v, {}),
38
+ icon: /* @__PURE__ */ e(S, {}),
30
39
  onClick: () => {
31
- l();
40
+ f();
32
41
  }
33
42
  }
34
43
  ];
35
44
  return /* @__PURE__ */ t("header", { className: "layout-header h-[50px] px-4 flex items-center justify-between bg-(--global-background-color) border-b border-(--border-color) z-10", children: [
36
45
  /* @__PURE__ */ t("div", { className: "flex items-center gap-2", children: [
37
- /* @__PURE__ */ e("div", { className: "min-w-[204px]", children: /* @__PURE__ */ t(O, { to: "/", className: "flex items-center gap-2 no-underline", children: [
38
- c,
39
- /* @__PURE__ */ e("span", { className: "text-lg font-semibold text-gray-800 dark:text-[#f2f2f2] tracking-wide", children: s })
46
+ /* @__PURE__ */ e("div", { className: "min-w-[204px]", children: /* @__PURE__ */ t(L, { to: "/", className: "flex items-center gap-2 no-underline", children: [
47
+ s,
48
+ /* @__PURE__ */ e("span", { className: "text-lg font-semibold text-gray-800 dark:text-[#f2f2f2] tracking-wide", children: c })
40
49
  ] }) }),
50
+ d,
41
51
  /* @__PURE__ */ e(
42
- y,
52
+ T,
43
53
  {
44
- items: n,
54
+ items: l,
45
55
  className: "items-center basics-breadcrumb text-sm! hidden md:flex",
46
- separator: /* @__PURE__ */ e(j, { className: "w-4 h-4 text-gray-400" })
56
+ separator: /* @__PURE__ */ e(O, { className: "w-4 h-4 text-gray-400" })
47
57
  }
48
58
  )
49
59
  ] }),
50
- /* @__PURE__ */ e("div", { className: "flex items-center", children: /* @__PURE__ */ t(k, { size: 6, children: [
51
- m,
52
- /* @__PURE__ */ e(
53
- "div",
54
- {
55
- className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation",
56
- onClick: () => i(!0),
57
- children: /* @__PURE__ */ e(B, {})
58
- }
59
- ),
60
- /* @__PURE__ */ e(
61
- "div",
62
- {
63
- onClick: g,
64
- className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation flex items-center justify-center",
65
- title: a === "light" ? "切换到暗色主题" : "切换到亮色主题",
66
- children: a === "light" ? /* @__PURE__ */ e(C, { className: "text-lg" }) : /* @__PURE__ */ e(G, { className: "text-lg" })
67
- }
68
- ),
69
- /* @__PURE__ */ e("div", { className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation", children: /* @__PURE__ */ e(
70
- w,
71
- {
72
- placement: "bottom",
73
- arrow: !1,
74
- trigger: "click",
75
- classNames: {
76
- container: "p-0!"
77
- },
78
- content: 1,
79
- children: /* @__PURE__ */ e(T, { dot: !0, color: "var(--color-primary)", children: /* @__PURE__ */ e(A, {}) })
80
- }
81
- ) }),
82
- /* @__PURE__ */ e(S, { menu: { items: u }, placement: "bottomRight", arrow: !0, children: /* @__PURE__ */ t("div", { className: "flex items-center gap-2 cursor-pointer hover:bg-(--hover-background-color) px-2 py-1 rounded-full transition-all border border-transparent", children: [
60
+ /* @__PURE__ */ t("div", { className: "flex items-center", children: [
61
+ h,
62
+ /* @__PURE__ */ t(R, { size: 6, className: "ml-2", children: [
63
+ m,
83
64
  /* @__PURE__ */ e(
84
- M,
65
+ "div",
85
66
  {
86
- size: "default",
87
- className: "bg-primary/10 text-primary border border-primary/20",
88
- src: r == null ? void 0 : r.avatar
67
+ className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation",
68
+ onClick: () => n(!0),
69
+ children: /* @__PURE__ */ e(W, {})
89
70
  }
90
71
  ),
91
- /* @__PURE__ */ t("div", { className: "hidden lg:flex flex-col items-start", children: [
92
- /* @__PURE__ */ e("span", { className: "text-sm font-medium text-gray-700 dark:text-[#f2f2f2] leading-tight", children: r == null ? void 0 : r.username }),
93
- /* @__PURE__ */ e("span", { className: "text-xs text-gray-400 dark:text-[#a1a1aa] leading-tight", children: r == null ? void 0 : r.roleName })
94
- ] })
95
- ] }) })
96
- ] }) }),
97
- /* @__PURE__ */ e(_, { open: p, onClose: () => i(!1) })
72
+ /* @__PURE__ */ e(
73
+ "div",
74
+ {
75
+ onClick: v,
76
+ className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation flex items-center justify-center",
77
+ title: a === "light" ? "切换到暗色主题" : "切换到亮色主题",
78
+ children: a === "light" ? /* @__PURE__ */ e(A, { className: "text-lg" }) : /* @__PURE__ */ e(I, { className: "text-lg" })
79
+ }
80
+ ),
81
+ p && /* @__PURE__ */ e("div", { className: "cursor-pointer w-8 h-8 text-(--icon-text-color) hover:text-primary transition-colors p-2 rounded-full hover:bg-(--hover-background-color) hover-scale-animation", children: /* @__PURE__ */ e(
82
+ B,
83
+ {
84
+ placement: "bottom",
85
+ arrow: !1,
86
+ trigger: "click",
87
+ classNames: {
88
+ container: "p-0!"
89
+ },
90
+ content: g,
91
+ children: /* @__PURE__ */ e(C, { dot: !0, color: "var(--color-primary)", children: /* @__PURE__ */ e(D, {}) })
92
+ }
93
+ ) }),
94
+ /* @__PURE__ */ e(M, { menu: { items: N }, placement: "bottomRight", arrow: !0, children: /* @__PURE__ */ t("div", { className: "flex items-center gap-2 cursor-pointer hover:bg-(--hover-background-color) px-2 py-1 rounded-full transition-all border border-transparent", children: [
95
+ /* @__PURE__ */ e(
96
+ j,
97
+ {
98
+ size: "default",
99
+ className: "bg-primary/10 text-primary border border-primary/20",
100
+ src: r == null ? void 0 : r.avatar
101
+ }
102
+ ),
103
+ /* @__PURE__ */ t("div", { className: "hidden lg:flex flex-col items-start", children: [
104
+ /* @__PURE__ */ e("span", { className: "text-sm font-medium text-gray-700 dark:text-[#f2f2f2] leading-tight", children: r == null ? void 0 : r.username }),
105
+ /* @__PURE__ */ e("span", { className: "text-xs text-gray-400 dark:text-[#a1a1aa] leading-tight", children: r == null ? void 0 : r.roleName })
106
+ ] })
107
+ ] }) })
108
+ ] })
109
+ ] }),
110
+ /* @__PURE__ */ e(P, { open: b, onClose: () => n(!1) })
98
111
  ] });
99
112
  }
100
113
  export {
101
- oe as default
114
+ $ as default
102
115
  };
@@ -1,27 +1,36 @@
1
- import { jsx as e, jsxs as b } from "react/jsx-runtime";
2
- import { Layout as h, Menu as p } from "antd";
3
- import { useState as y, useEffect as x, useMemo as g } from "react";
4
- import { MdOutlineKeyboardDoubleArrowRight as v, MdOutlineKeyboardDoubleArrowLeft as k } from "react-icons/md";
5
- import { renderIcon as K } from "../../../../utils/icon.js";
1
+ import { jsx as e, jsxs as p } from "react/jsx-runtime";
2
+ import { Layout as y, Menu as x } from "antd";
3
+ import { useState as g, useEffect as v, useMemo as k } from "react";
4
+ import { MdOutlineKeyboardDoubleArrowRight as K, MdOutlineKeyboardDoubleArrowLeft as w } from "react-icons/md";
5
+ import { renderIcon as M } from "../../../../utils/icon.js";
6
6
  import "../../../../store/modules/layout-config.store.js";
7
7
  import "../../../../store/modules/theme.store.js";
8
- const { Sider: w } = h;
9
- function A(a) {
10
- const { collapsed: l, menus: n = [], activeKey: s, openKeys: o = [], onMenuClick: d, onCollapse: c } = a, [f, i] = y(o);
11
- x(() => {
8
+ const { Sider: N } = y;
9
+ function D(a) {
10
+ const {
11
+ collapsed: l,
12
+ menus: n = [],
13
+ activeKey: s,
14
+ openKeys: o = [],
15
+ onMenuClick: d,
16
+ onCollapse: c,
17
+ beforeRender: f,
18
+ afterRender: m
19
+ } = a, [u, i] = g(o);
20
+ v(() => {
12
21
  o.length > 0 && i(o);
13
22
  }, [o]);
14
- const m = g(() => {
15
- const t = (u) => u.map((r) => ({
23
+ const b = k(() => {
24
+ const t = (h) => h.map((r) => ({
16
25
  key: r.key,
17
26
  label: r.label,
18
- icon: K(r.icon),
27
+ icon: M(r.icon),
19
28
  children: r.children ? t(r.children) : void 0
20
29
  }));
21
30
  return t(n);
22
31
  }, [n]);
23
32
  return /* @__PURE__ */ e(
24
- w,
33
+ N,
25
34
  {
26
35
  trigger: null,
27
36
  collapsible: !0,
@@ -29,26 +38,28 @@ function A(a) {
29
38
  width: 224,
30
39
  className: "layout-sidebar border-r border-(--border-color) bg-(--global-background-color)! h-full relative",
31
40
  theme: "light",
32
- children: /* @__PURE__ */ b("div", { className: "h-full flex flex-col", children: [
41
+ children: /* @__PURE__ */ p("div", { className: "h-full flex flex-col", children: [
42
+ f,
33
43
  /* @__PURE__ */ e("div", { className: "flex-1 overflow-y-auto overflow-x-hidden py-2 custom-scrollbar", children: /* @__PURE__ */ e(
34
- p,
44
+ x,
35
45
  {
36
46
  mode: "inline",
37
47
  selectedKeys: [s],
38
- openKeys: f,
48
+ openKeys: u,
39
49
  onOpenChange: i,
40
- items: m,
50
+ items: b,
41
51
  onClick: ({ key: t }) => d(t),
42
52
  className: "sidebar-menu border-none",
43
53
  inlineIndent: 16
44
54
  }
45
55
  ) }),
56
+ m,
46
57
  /* @__PURE__ */ e("div", { className: "flex items-center justify-start pl-4 mb-2", children: /* @__PURE__ */ e(
47
58
  "div",
48
59
  {
49
60
  onClick: () => c(!l),
50
61
  className: "text-gray-500 dark:text-[#a1a1a2] text-xl hover:text-[#323639] dark:hover:text-[#f0f0f0] hover:bg-[#dfe3e4] dark:hover:bg-[#333538] transition-all duration-300 w-7 h-7 rounded-sm bg-[#f4f4f5] dark:bg-[#292a2d] cursor-pointer flex items-center justify-center",
51
- children: l ? /* @__PURE__ */ e(v, {}) : /* @__PURE__ */ e(k, {})
62
+ children: l ? /* @__PURE__ */ e(K, {}) : /* @__PURE__ */ e(w, {})
52
63
  }
53
64
  ) })
54
65
  ] })
@@ -56,5 +67,5 @@ function A(a) {
56
67
  );
57
68
  }
58
69
  export {
59
- A as default
70
+ D as default
60
71
  };
@@ -1,60 +1,64 @@
1
- import { jsx as r, jsxs as i, Fragment as u } from "react/jsx-runtime";
1
+ import { jsxs as l, jsx as r, Fragment as v } from "react/jsx-runtime";
2
2
  import { classnames as s } from "@spacego/turbo-utils";
3
- import { Divider as x } from "antd";
4
- import { useRef as v, useState as b, useEffect as g } from "react";
5
- import { MdClear as k } from "react-icons/md";
6
- import y from "../../../../assets/svg/chrome-bg-after.svg.js";
7
- import w from "../../../../assets/svg/chrome-bg-before.svg.js";
8
- function z(c) {
9
- const { tabs: o, activeKey: d, onChange: f, onClose: h } = c, n = v(null), [l, m] = b(!1), a = () => {
3
+ import { Divider as b } from "antd";
4
+ import { useRef as g, useState as k, useEffect as y } from "react";
5
+ import { MdClear as w } from "react-icons/md";
6
+ import C from "../../../../assets/svg/chrome-bg-after.svg.js";
7
+ import N from "../../../../assets/svg/chrome-bg-before.svg.js";
8
+ function L(c) {
9
+ const { tabs: o, activeKey: d, onChange: f, onClose: m, beforeRender: h, afterRender: p } = c, n = g(null), [i, u] = k(!1), a = () => {
10
10
  const e = n.current;
11
11
  if (e) {
12
12
  const t = e.scrollWidth > e.clientWidth;
13
- m(t);
13
+ u(t);
14
14
  }
15
15
  };
16
- return g(() => (a(), window.addEventListener("resize", a), () => {
16
+ return y(() => (a(), window.addEventListener("resize", a), () => {
17
17
  window.removeEventListener("resize", a);
18
- }), [o]), /* @__PURE__ */ r(
19
- "div",
20
- {
21
- ref: n,
22
- className: s("layout-tabs bg-(--global-background-color) border-b border-(--border-color) overflow-x-auto overflow-y-hidden relative transition-all duration-300 shrink-0", {
23
- "h-[38px]": !l,
24
- // 出现滚动条时增加高度,留出滚动条的空间,防止挤压内容
25
- "h-[46px]": l
26
- }),
27
- children: /* @__PURE__ */ r("div", { className: "flex items-center h-[38px] px-2 pt-1 min-w-fit", children: o.map((e, t) => /* @__PURE__ */ i(u, { children: [
28
- /* @__PURE__ */ i(
29
- "div",
30
- {
31
- className: s("layout-tabs-item group cursor-pointer px-[16px] h-full flex items-center justify-center rounded-tl-[8px] rounded-tr-[8px] transition-all duration-500 relative hover:bg-[#f4f4f5] dark:hover:bg-[#292a2d] shrink-0", {
32
- "bg-(--background-primary-light)! text-(--color-primary) dark:text-[#f9f9f9]! is-active": d === e.key
33
- }),
34
- onClick: () => f(e.key),
35
- children: [
36
- /* @__PURE__ */ r(w, {}),
37
- e.label,
38
- /* @__PURE__ */ r(y, {}),
39
- e.closable !== !1 && /* @__PURE__ */ r(
40
- "div",
41
- {
42
- className: "w-4 h-4 flex ml-1 mr-[-10px] items-center justify-center text-[#18181bcc] hover:text-[#18181b] hover:bg-[#f4f4f5] dark:hover:bg-transparent rounded-full transition-all duration-300",
43
- onClick: (p) => {
44
- p.stopPropagation(), h(e.key);
45
- },
46
- children: /* @__PURE__ */ r(k, { className: "text-xs text-[#333333] dark:text-[#cfd0d0] hover:text-black dark:hover:text-white transition-all" })
47
- }
48
- )
49
- ]
50
- },
51
- `${e.key}-${t}`
52
- ),
53
- t !== o.length - 1 && /* @__PURE__ */ r(x, { orientation: "vertical", className: "mx-1! shrink-0" })
54
- ] }, `${e.key}-${t}`)) })
55
- }
56
- );
18
+ }), [o]), /* @__PURE__ */ l("div", { className: "flex items-center bg-(--global-background-color) border-b border-(--border-color)", children: [
19
+ h,
20
+ /* @__PURE__ */ r(
21
+ "div",
22
+ {
23
+ ref: n,
24
+ className: s("layout-tabs flex-1 overflow-x-auto overflow-y-hidden relative transition-all duration-300", {
25
+ "h-[38px]": !i,
26
+ // 出现滚动条时增加高度,留出滚动条的空间,防止挤压内容
27
+ "h-[46px]": i
28
+ }),
29
+ children: /* @__PURE__ */ r("div", { className: "flex items-center h-[38px] px-2 pt-1 min-w-fit", children: o.map((e, t) => /* @__PURE__ */ l(v, { children: [
30
+ /* @__PURE__ */ l(
31
+ "div",
32
+ {
33
+ className: s("layout-tabs-item group cursor-pointer px-[16px] h-full flex items-center justify-center rounded-tl-[8px] rounded-tr-[8px] transition-all duration-500 relative hover:bg-[#f4f4f5] dark:hover:bg-[#292a2d] shrink-0", {
34
+ "bg-(--background-primary-light)! text-(--color-primary) dark:text-[#f9f9f9]! is-active": d === e.key
35
+ }),
36
+ onClick: () => f(e.key),
37
+ children: [
38
+ /* @__PURE__ */ r(N, {}),
39
+ e.label,
40
+ /* @__PURE__ */ r(C, {}),
41
+ e.closable !== !1 && /* @__PURE__ */ r(
42
+ "div",
43
+ {
44
+ className: "w-4 h-4 flex ml-1 mr-[-10px] items-center justify-center text-[#18181bcc] hover:text-[#18181b] hover:bg-[#f4f4f5] dark:hover:bg-transparent rounded-full transition-all duration-300",
45
+ onClick: (x) => {
46
+ x.stopPropagation(), m(e.key);
47
+ },
48
+ children: /* @__PURE__ */ r(w, { className: "text-xs text-[#333333] dark:text-[#cfd0d0] hover:text-black dark:hover:text-white transition-all" })
49
+ }
50
+ )
51
+ ]
52
+ },
53
+ `${e.key}-${t}`
54
+ ),
55
+ t !== o.length - 1 && /* @__PURE__ */ r(b, { orientation: "vertical", className: "mx-1! shrink-0" })
56
+ ] }, `${e.key}-${t}`)) })
57
+ }
58
+ ),
59
+ p
60
+ ] });
57
61
  }
58
62
  export {
59
- z as default
63
+ L as default
60
64
  };
@@ -1,98 +1,137 @@
1
- import { jsxs as f, jsx as i } from "react/jsx-runtime";
2
- import { useSelector as N } from "@spacego/zustand";
3
- import { Layout as g, Spin as I } from "antd";
4
- import { useMemo as d, useEffect as O } from "react";
5
- import { useLocation as P, useNavigate as V, Outlet as j } from "react-router-dom";
6
- import { useLayoutConfigStore as Y } from "../../store/modules/layout-config.store.js";
7
- import "../../store/modules/theme.store.js";
8
- import { useGlobal as z } from "../context/context.js";
9
- import G from "./components/basics-layout/header.js";
10
- import H from "./components/basics-layout/sidebar.js";
11
- import q from "./components/basics-layout/tabs.js";
12
- import { findRouteByPath as b, findMenuParentKeys as F, buildRouteMap as J, findParentRoutes as Q, findMenuByKey as U } from "./components/utils/index.js";
1
+ import { jsxs as f, jsx as s } from "react/jsx-runtime";
2
+ import { useSelector as y } from "@spacego/zustand";
3
+ import { Layout as g, Spin as Z } from "antd";
4
+ import { useMemo as d, useEffect as $ } from "react";
5
+ import { useLocation as ee, useNavigate as te, Outlet as oe } from "react-router-dom";
6
+ import { useAuth as ne } from "../../hooks/use-auth.hook.js";
7
+ import { useLayoutConfigStore as re } from "../../store/modules/layout-config.store.js";
8
+ import { useThemeStore as ae } from "../../store/modules/theme.store.js";
9
+ import { useGlobal as se } from "../context/context.js";
10
+ import ie from "./components/basics-layout/header.js";
11
+ import le from "./components/basics-layout/sidebar.js";
12
+ import ce from "./components/basics-layout/tabs.js";
13
+ import { findRouteByPath as b, findMenuParentKeys as ue, buildRouteMap as fe, findParentRoutes as de, findMenuByKey as me } from "./components/utils/index.js";
13
14
  /* empty css */
14
15
  /* empty css */
15
- const { Content: W } = g;
16
- function fe() {
17
- const a = P(), m = V(), { token: C, menus: s = [], routes: n = [] } = z(), { tabsAttribute: A, sidebarCollapsed: v, loadingConfig: _, ADD_TAB: x, REMOVE_TAB: L, SET_ACTIVE_TAB_KEY: E, SET_SIDEBAR_COLLAPSED: S } = Y(N(["tabsAttribute", "sidebarCollapsed", "loadingConfig", "ADD_TAB", "REMOVE_TAB", "SET_ACTIVE_TAB_KEY", "SET_SIDEBAR_COLLAPSED"])), { tabsList: h, tabsActiveKey: r } = A, l = d(() => {
16
+ const { Content: he } = g;
17
+ function Se() {
18
+ const r = ee(), m = te(), { logout: R } = ne(), {
19
+ token: T,
20
+ menus: a = [],
21
+ routes: o = [],
22
+ appName: _,
23
+ logo: L,
24
+ headerActionsRender: v,
25
+ breadcrumbBeforeRender: M,
26
+ searchRender: x,
27
+ noticeRender: B,
28
+ isNotice: S,
29
+ userInfo: K,
30
+ userMenuItems: k,
31
+ sidebarBefore: N,
32
+ sidebarAfter: D,
33
+ tabsBefore: I,
34
+ tabsAfter: w
35
+ } = se(), { tabsAttribute: O, sidebarCollapsed: G, loadingConfig: P, ADD_TAB: V, REMOVE_TAB: j, SET_ACTIVE_TAB_KEY: E, SET_SIDEBAR_COLLAPSED: H } = re(y(["tabsAttribute", "sidebarCollapsed", "loadingConfig", "ADD_TAB", "REMOVE_TAB", "SET_ACTIVE_TAB_KEY", "SET_SIDEBAR_COLLAPSED"])), { tabsList: h, tabsActiveKey: i } = O, { theme: Y, TOGGLE_THEME: z } = ae(y(["theme", "TOGGLE_THEME"])), l = d(() => {
18
36
  var t;
19
- if (!n || n.length === 0)
20
- return r;
21
- const e = b(a.pathname, n);
22
- return e && (((t = e.handle) == null ? void 0 : t.activeRouteMenuId) || e.id) || r;
23
- }, [a.pathname, n, r]), M = d(() => {
37
+ if (!o || o.length === 0)
38
+ return i;
39
+ const e = b(r.pathname, o);
40
+ return e && (((t = e.handle) == null ? void 0 : t.activeRouteMenuId) || e.id) || i;
41
+ }, [r.pathname, o, i]), q = d(() => {
24
42
  const e = [];
25
- if (!s || s.length === 0 || !l)
43
+ if (!a || a.length === 0 || !l)
26
44
  return e;
27
- const t = F(l, s);
45
+ const t = ue(l, a);
28
46
  return t && e.push(...t), e;
29
- }, [l, s]), B = d(() => {
47
+ }, [l, a]), F = d(() => {
30
48
  const e = [];
31
- if (!n || n.length === 0)
32
- return a.pathname === "/" && e.push({ title: "首页" }), e;
33
- const t = n, o = J(t), c = b(a.pathname, t);
34
- return c ? Q(c, o).forEach((u) => {
35
- var y;
36
- const T = ((y = u.handle) == null ? void 0 : y.title) || u.id || "";
37
- T && e.push({ title: T });
38
- }) : a.pathname === "/" && e.push({ title: "首页" }), e;
39
- }, [a.pathname, n]), K = (e) => {
40
- var o;
41
- const t = U(e, s);
42
- m(((o = t == null ? void 0 : t.routeNode) == null ? void 0 : o.path) ?? "/");
43
- }, k = (e) => {
49
+ if (!o || o.length === 0)
50
+ return r.pathname === "/" && e.push({ title: "首页" }), e;
51
+ const t = o, n = fe(t), c = b(r.pathname, t);
52
+ return c ? de(c, n).forEach((u) => {
53
+ var C;
54
+ const A = ((C = u.handle) == null ? void 0 : C.title) || u.id || "";
55
+ A && e.push({ title: A });
56
+ }) : r.pathname === "/" && e.push({ title: "首页" }), e;
57
+ }, [r.pathname, o]), J = (e) => {
58
+ var n;
59
+ const t = me(e, a);
60
+ m(((n = t == null ? void 0 : t.routeNode) == null ? void 0 : n.path) ?? "/");
61
+ }, Q = (e) => {
44
62
  E(e);
45
- const t = h.find((o) => o.key === e);
63
+ const t = h.find((n) => n.key === e);
46
64
  t && m(t.path);
47
- }, R = (e) => {
48
- const t = L(e);
65
+ }, U = (e) => {
66
+ const t = j(e);
49
67
  m(t.path ?? "/");
50
- }, p = d(() => !n || n.length === 0 ? null : (e) => b(e, n), [n]), D = () => {
68
+ }, p = d(() => !o || o.length === 0 ? null : (e) => b(e, o), [o]), W = () => {
51
69
  var t;
52
- const e = p == null ? void 0 : p(a.pathname);
70
+ const e = p == null ? void 0 : p(r.pathname);
53
71
  if (e && e.id && !["root", "blank", "auth"].includes(e.id)) {
54
- const o = e.id, c = ((t = e.handle) == null ? void 0 : t.title) || e.id;
55
- h.find((u) => u.key === o) ? E(o) : x({
56
- key: o,
72
+ const n = e.id, c = ((t = e.handle) == null ? void 0 : t.title) || e.id;
73
+ h.find((u) => u.key === n) ? E(n) : V({
74
+ key: n,
57
75
  label: c,
58
- path: a.pathname
76
+ path: r.pathname
59
77
  });
60
78
  }
61
79
  };
62
- return O(() => {
63
- C && D();
64
- }, [a.pathname, C]), /* @__PURE__ */ f(g, { className: "basics-layout w-full h-screen overflow-hidden flex flex-col", children: [
65
- /* @__PURE__ */ i(G, { breadcrumbItems: B }),
80
+ return $(() => {
81
+ T && W();
82
+ }, [r.pathname, T]), /* @__PURE__ */ f(g, { className: "basics-layout w-full h-screen overflow-hidden flex flex-col", children: [
83
+ /* @__PURE__ */ s(
84
+ ie,
85
+ {
86
+ breadcrumbItems: F,
87
+ appName: _,
88
+ logo: L,
89
+ headerActionsRender: v,
90
+ breadcrumbBeforeRender: M,
91
+ searchRender: x,
92
+ noticeRender: B,
93
+ isNotice: S,
94
+ userInfo: K,
95
+ userMenuItems: k,
96
+ theme: Y,
97
+ onToggleTheme: z,
98
+ onLogout: R
99
+ }
100
+ ),
66
101
  /* @__PURE__ */ f(g, { className: "flex-1 overflow-hidden", children: [
67
- /* @__PURE__ */ i(
68
- H,
102
+ /* @__PURE__ */ s(
103
+ le,
69
104
  {
70
- collapsed: v,
71
- onCollapse: S,
72
- menus: s,
105
+ collapsed: G,
106
+ onCollapse: H,
107
+ menus: a,
73
108
  activeKey: l,
74
- openKeys: M,
75
- onMenuClick: K
109
+ openKeys: q,
110
+ onMenuClick: J,
111
+ beforeRender: N,
112
+ afterRender: D
76
113
  }
77
114
  ),
78
- /* @__PURE__ */ f(W, { className: "flex flex-col flex-1 overflow-hidden bg-[#eff1f4] dark:bg-[#141619]", children: [
79
- /* @__PURE__ */ i(
80
- q,
115
+ /* @__PURE__ */ f(he, { className: "flex flex-col flex-1 overflow-hidden bg-[#eff1f4] dark:bg-[#141619]", children: [
116
+ /* @__PURE__ */ s(
117
+ ce,
81
118
  {
82
119
  tabs: h,
83
- activeKey: r,
84
- onChange: k,
85
- onClose: R
120
+ activeKey: i,
121
+ onChange: Q,
122
+ onClose: U,
123
+ beforeRender: I,
124
+ afterRender: w
86
125
  }
87
126
  ),
88
127
  /* @__PURE__ */ f("div", { className: "flex-1 overflow-auto p-3 custom-scrollbar relative", children: [
89
- /* @__PURE__ */ i(j, {}),
90
- _.show && /* @__PURE__ */ i("div", { className: "absolute inset-0 z-9999 flex items-center justify-center bg-white/80 dark:bg-[#1a1c1f]/80", children: /* @__PURE__ */ i(I, { spinning: !0 }) })
128
+ /* @__PURE__ */ s(oe, {}),
129
+ P.show && /* @__PURE__ */ s("div", { className: "absolute inset-0 z-9999 flex items-center justify-center bg-white/80 dark:bg-[#1a1c1f]/80", children: /* @__PURE__ */ s(Z, { spinning: !0 }) })
91
130
  ] })
92
131
  ] })
93
132
  ] })
94
133
  ] });
95
134
  }
96
135
  export {
97
- fe as default
136
+ Se as default
98
137
  };
@@ -1,14 +1,14 @@
1
- import { jsx as w } from "react/jsx-runtime";
1
+ import { jsx as E } from "react/jsx-runtime";
2
2
  import { useState as t } from "react";
3
- import { GlobalContext as z } from "./context.js";
4
- function K(e) {
5
- const [n, r] = t(e.appName), [s, o] = t(e.logo), [c, i] = t(e.noticeRender), [a, d] = t(e.description), [f, u] = t(e.descriptionDetail), [b, m] = t(e.copyright), [l, R] = t(e.userMenuItems), [h, A] = t(e.userInfo), [B, g] = t(e.sidebarBefore), [I, D] = t(e.sidebarAfter), [x, M] = t(e.tabsBefore), [N, S] = t(e.tabsAfter), [k, v] = t(e.headerActionsRender), [y, C] = t(e.searchRender), [T, G] = t(e.breadcrumbBeforeRender), [P, U] = t(e.token), [j, H] = t(e.menus), [L, q] = t(e.routes);
6
- return /* @__PURE__ */ w(
7
- z.Provider,
3
+ import { GlobalContext as F } from "./context.js";
4
+ function Q(e) {
5
+ const [n, s] = t(e.appName), [r, o] = t(e.logo), [c, i] = t(e.noticeRender), [a, d] = t(e.description), [f, u] = t(e.descriptionDetail), [b, m] = t(e.copyright), [l, R] = t(e.userMenuItems), [h, A] = t(e.userInfo), [B, I] = t(e.sidebarBefore), [N, g] = t(e.sidebarAfter), [D, x] = t(e.tabsBefore), [M, S] = t(e.tabsAfter), [k, v] = t(e.headerActionsRender), [y, C] = t(e.searchRender), [T, G] = t(e.breadcrumbBeforeRender), [P, U] = t(e.token), [j, H] = t(e.menus), [L, q] = t(e.routes), [w, z] = t(e.isNotice ?? !0);
6
+ return /* @__PURE__ */ E(
7
+ F.Provider,
8
8
  {
9
9
  value: {
10
10
  appName: n,
11
- logo: s,
11
+ logo: r,
12
12
  noticeRender: c,
13
13
  description: a,
14
14
  descriptionDetail: f,
@@ -16,16 +16,17 @@ function K(e) {
16
16
  userMenuItems: l,
17
17
  userInfo: h,
18
18
  sidebarBefore: B,
19
- sidebarAfter: I,
20
- tabsBefore: x,
21
- tabsAfter: N,
19
+ sidebarAfter: N,
20
+ tabsBefore: D,
21
+ tabsAfter: M,
22
22
  headerActionsRender: k,
23
23
  searchRender: y,
24
24
  breadcrumbBeforeRender: T,
25
25
  token: P,
26
26
  menus: j,
27
27
  routes: L,
28
- setAppName: r,
28
+ isNotice: w,
29
+ setAppName: s,
29
30
  setLogo: o,
30
31
  setNoticeRender: i,
31
32
  setDescription: d,
@@ -33,21 +34,22 @@ function K(e) {
33
34
  setCopyright: m,
34
35
  setUserMenuItems: R,
35
36
  setUserInfo: A,
36
- setSidebarBefore: g,
37
- setSidebarAfter: D,
38
- setTabsBefore: M,
37
+ setSidebarBefore: I,
38
+ setSidebarAfter: g,
39
+ setTabsBefore: x,
39
40
  setTabsAfter: S,
40
41
  setHeaderActionsRender: v,
41
42
  setSearchRender: C,
42
43
  setBreadcrumbBeforeRender: G,
43
44
  setToken: U,
44
45
  setMenus: H,
45
- setRoutes: q
46
+ setRoutes: q,
47
+ setIsNotice: z
46
48
  },
47
49
  children: e.children
48
50
  }
49
51
  );
50
52
  }
51
53
  export {
52
- K as default
54
+ Q as default
53
55
  };
package/lib/index.css CHANGED
@@ -1 +1 @@
1
- .bg-background-deep{background-color:#f1f3f6}.bg-background-deep .login-background{background:linear-gradient(154deg,#07070915 30%,color-mix(in srgb,var(--color-primary) 30%,transparent) 48%,#07070915 64%);filter:blur(100px)}.bg-background-deep .-enter-x{animation:enter-x-animation .3s ease-in-out .2s forwards;opacity:0;transform:translate(-50px)}.bg-background-deep .animate-float{animation:float 5s linear 0s infinite}.login-side .side-content{animation-name:slide-right;animation-duration:.3s;animation-timing-function:cubic-bezier(.16,1,.3,1)}.login-side .side-content.exit-x{animation-name:exit-x-animation;animation-duration:.5s;animation-timing-function:cubic-bezier(.16,1,.3,1);animation-fill-mode:forwards}@keyframes enter-x-animation{to{opacity:1;transform:translate(0)}}@keyframes float{0%{transform:translateY(0)}50%{transform:translateY(-20px)}to{transform:translateY(0)}}@keyframes slide-right{0%{opacity:0;transform:translate(50px)}to{opacity:1;transform:translate(0)}}@keyframes exit-x-animation{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(50px)}}@keyframes scale-pulse{0%{transform:scale(1)}50%{transform:scale(.9)}to{transform:scale(1)}}.hover-scale-animation:hover{animation:scale-pulse .3s cubic-bezier(.4,0,.2,1)}@custom-variant dark (&:where(.dark,.dark *));:root{--color-primary: #006BE6;--global-background-color: white;--border-color: #e4e4e7;--text-color: #323639}[data-theme=dark]{--global-background-color: #1a1c1f;--border-color: #36363a;--text-color: #f2f2f2}html{background-color:var(--global-background-color);--hover-primary-color: color-mix(in srgb, var(--color-primary) 80%, transparent)}#root,body,html{height:100%;width:100%}body{min-height:100vh}.spin-wrapper-full,.spin-wrapper-full .ant-spin-container{width:100%;height:100%}.spin-wrapper-full .ant-spin{max-height:100%!important}.basics-layout{--sidebar-width: 220px;--header-height: 64px;--tabs-height: 44px;--background-primary-light: color-mix(in srgb, var(--color-primary) 10%, transparent);--hover-background-color: #f4f4f5;--icon-text-color: #323639}[data-theme=dark] .basics-layout{--hover-background-color: #2e3033;--icon-text-color: #dddddd;--background-primary-light: #292a2d}.basics-layout .layout-header{flex-shrink:0}.basics-layout .layout-header .basics-breadcrumb .ant-breadcrumb-separator{display:flex;align-items:center;margin-inline:6px}.basics-layout .layout-sidebar{z-index:20;flex-shrink:0}.basics-layout .layout-sidebar .sidebar-menu{background:var(--global-background-color);border:none}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item{margin:4px 8px;width:calc(100% - 16px);border-radius:8px;transition:all .3s cubic-bezier(.4,0,.2,1);padding-inline:30%}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item:hover{background:var(--hover-background-color)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item:hover .ant-menu-item-icon{transition:transform .3s cubic-bezier(.4,0,.2,1);transform:scale(1.18)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item.ant-menu-item-selected{background-color:var(--background-primary-light);color:var(--color-primary)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item .ant-menu-title-content{margin-inline-start:8px}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title{margin:4px 8px;width:calc(100% - 16px);border-radius:8px;padding-inline:30%}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title:hover{background-color:var(--hover-background-color)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title:hover .ant-menu-item-icon{transition:transform .3s cubic-bezier(.4,0,.2,1);transform:scale(1.18)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-sub{background:transparent}.basics-layout .custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.basics-layout .custom-scrollbar::-webkit-scrollbar-track{background:transparent}.basics-layout .custom-scrollbar::-webkit-scrollbar-thumb{background:#0000004d;border-radius:4px}.basics-layout .custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#00000080}.basics-layout .layout-tabs{position:relative;scrollbar-width:thin}
1
+ .bg-background-deep{background-color:#f1f3f6}.bg-background-deep .login-background{background:linear-gradient(154deg,#07070915 30%,color-mix(in srgb,var(--color-primary) 30%,transparent) 48%,#07070915 64%);filter:blur(100px)}.bg-background-deep .-enter-x{animation:enter-x-animation .3s ease-in-out .2s forwards;opacity:0;transform:translate(-50px)}.bg-background-deep .animate-float{animation:float 5s linear 0s infinite}.login-side .side-content{animation-name:slide-right;animation-duration:.3s;animation-timing-function:cubic-bezier(.16,1,.3,1)}.login-side .side-content.exit-x{animation-name:exit-x-animation;animation-duration:.5s;animation-timing-function:cubic-bezier(.16,1,.3,1);animation-fill-mode:forwards}/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--leading-tight:1.25;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-3xl:1.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.right-3{right:calc(var(--spacing)*3)}.right-\[-7px\]{right:-7px}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-3{bottom:calc(var(--spacing)*3)}.left-0{left:calc(var(--spacing)*0)}.left-\[-7px\]{left:-7px}.z-1{z-index:1}.z-10{z-index:10}.z-9999{z-index:9999}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-1\!{margin-inline:calc(var(--spacing)*1)!important}.mx-9{margin-inline:calc(var(--spacing)*9)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-20{margin-right:calc(var(--spacing)*20)}.mr-\[-10px\]{margin-right:-10px}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-\[2px\]{margin-bottom:2px}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.aspect-\[2\]{aspect-ratio:2}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-\[10px\]{width:10px;height:10px}.size-full{width:100%;height:100%}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-64{height:calc(var(--spacing)*64)}.h-\[16px\]{height:16px}.h-\[18px\]{height:18px}.h-\[38px\]{height:38px}.h-\[46px\]{height:46px}.h-\[50px\]{height:50px}.h-full{height:100%}.h-screen{height:100vh}.min-h-full{min-height:100%}.w-0{width:calc(var(--spacing)*0)}.w-2\/5{width:40%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-\[16px\]{width:16px}.w-\[18px\]{width:18px}.w-full{width:100%}.min-w-\[204px\]{min-width:204px}.min-w-fit{min-width:fit-content}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-right{transform-origin:100%}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-6{gap:calc(var(--spacing)*6)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-tl-\[8px\]{border-top-left-radius:8px}.rounded-tr-\[8px\]{border-top-right-radius:8px}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-\(--border-color\){border-color:var(--border-color)}.border-\(--color-primary\){border-color:var(--color-primary)}.border-transparent{border-color:#0000}.bg-\(--background-primary-light\)\!{background-color:var(--background-primary-light)!important}.bg-\(--global-background-color\){background-color:var(--global-background-color)}.bg-\(--global-background-color\)\!{background-color:var(--global-background-color)!important}.bg-\[\#eff1f4\]{background-color:#eff1f4}.bg-\[\#f4f4f5\]{background-color:#f4f4f5}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white)80%,transparent)}}.fill-transparent{fill:#0000}.p-0\!{padding:calc(var(--spacing)*0)!important}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-\[16px\]{padding-inline:16px}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-10{padding-block:calc(var(--spacing)*10)}.pt-1{padding-top:calc(var(--spacing)*1)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\!{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.text-\(--color-primary\){color:var(--color-primary)}.text-\(--color-primary\)\!{color:var(--color-primary)!important}.text-\(--icon-text-color\){color:var(--icon-text-color)}.text-\(--text-color\){color:var(--text-color)}.text-\[\#2d2f32\]{color:#2d2f32}.text-\[\#333\]{color:#333}.text-\[\#18181bcc\]{color:#18181bcc}.text-\[\#71717a\]{color:#71717a}.text-\[\#323639\]{color:#323639}.text-\[\#323639cc\]{color:#323639cc}.text-\[\#333333\]{color:#333}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-white{color:var(--color-white)}.no-underline{text-decoration-line:none}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-\(--color-primary\){outline-color:var(--color-primary)}.outline-\[\#e4e4e7\]{outline-color:#e4e4e7}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-\[\.is-active\]\:fill-\(--background-primary-light\):is(:where(.group).is-active *){fill:var(--background-primary-light)}@media(hover:hover){.hover\:bg-\(--hover-background-color\):hover{background-color:var(--hover-background-color)}.hover\:bg-\[\#dfe3e4\]:hover{background-color:#dfe3e4}.hover\:bg-\[\#f4f4f5\]:hover{background-color:#f4f4f5}.hover\:text-\(--hover-primary-color\)\!:hover{color:var(--hover-primary-color)!important}.hover\:text-\[\#18181b\]:hover{color:#18181b}.hover\:text-\[\#323639\]:hover{color:#323639}.hover\:text-black:hover{color:var(--color-black)}}@media(min-width:40rem){.sm\:top-6{top:calc(var(--spacing)*6)}.sm\:left-6{left:calc(var(--spacing)*6)}}@media(min-width:48rem){.md\:flex{display:flex}}@media(min-width:64rem){.lg\:block{display:block}.lg\:flex{display:flex}.lg\:flex-initial{flex:0 auto}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}.dark\:bg-\[\#1a1c1f\]\!:where(.dark,.dark *){background-color:#1a1c1f!important}.dark\:bg-\[\#1a1c1f\]\/80:where(.dark,.dark *){background-color:#1a1c1fcc}.dark\:bg-\[\#2e3033\]:where(.dark,.dark *){background-color:#2e3033}.dark\:bg-\[\#292a2d\]:where(.dark,.dark *){background-color:#292a2d}.dark\:bg-\[\#14161a\]:where(.dark,.dark *){background-color:#14161a}.dark\:bg-\[\#070709\]\!:where(.dark,.dark *){background-color:#070709!important}.dark\:bg-\[\#141619\]:where(.dark,.dark *){background-color:#141619}.dark\:text-\[\#a1a1a2\]:where(.dark,.dark *){color:#a1a1a2}.dark\:text-\[\#a1a1aa\]:where(.dark,.dark *){color:#a1a1aa}.dark\:text-\[\#cfd0d0\]:where(.dark,.dark *){color:#cfd0d0}.dark\:text-\[\#f0f0f0\]:where(.dark,.dark *){color:#f0f0f0}.dark\:text-\[\#f2f2f2\]:where(.dark,.dark *){color:#f2f2f2}.dark\:text-\[\#f9f9f9\]\!:where(.dark,.dark *){color:#f9f9f9!important}.dark\:outline-\[\#36363a\]:where(.dark,.dark *){outline-color:#36363a}@media(hover:hover){.dark\:hover\:bg-\[\#292a2d\]:where(.dark,.dark *):hover{background-color:#292a2d}.dark\:hover\:bg-\[\#333538\]:where(.dark,.dark *):hover{background-color:#333538}.dark\:hover\:bg-transparent:where(.dark,.dark *):hover{background-color:#0000}.dark\:hover\:text-\[\#f0f0f0\]:where(.dark,.dark *):hover{color:#f0f0f0}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}}@keyframes enter-x-animation{to{opacity:1;transform:translate(0)}}@keyframes float{0%{transform:translateY(0)}50%{transform:translateY(-20px)}to{transform:translateY(0)}}@keyframes slide-right{0%{opacity:0;transform:translate(50px)}to{opacity:1;transform:translate(0)}}@keyframes exit-x-animation{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(50px)}}@keyframes scale-pulse{0%{transform:scale(1)}50%{transform:scale(.9)}to{transform:scale(1)}}.hover-scale-animation:hover{animation:.3s cubic-bezier(.4,0,.2,1) scale-pulse}:root{--color-primary:#006be6;--global-background-color:white;--border-color:#e4e4e7;--text-color:#323639}[data-theme=dark]{--global-background-color:#1a1c1f;--border-color:#36363a;--text-color:#f2f2f2}html{background-color:var(--global-background-color);--hover-primary-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){html{--hover-primary-color:color-mix(in srgb,var(--color-primary)80%,transparent)}}#root,body,html{width:100%;height:100%}body{min-height:100vh}.spin-wrapper-full,.spin-wrapper-full .ant-spin-container{width:100%;height:100%}.spin-wrapper-full .ant-spin{max-height:100%!important}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}.basics-layout{--sidebar-width: 220px;--header-height: 64px;--tabs-height: 44px;--background-primary-light: color-mix(in srgb, var(--color-primary) 10%, transparent);--hover-background-color: #f4f4f5;--icon-text-color: #323639}[data-theme=dark] .basics-layout{--hover-background-color: #2e3033;--icon-text-color: #dddddd;--background-primary-light: #292a2d}.basics-layout .layout-header{flex-shrink:0}.basics-layout .layout-header .basics-breadcrumb .ant-breadcrumb-separator{display:flex;align-items:center;margin-inline:6px}.basics-layout .layout-sidebar{z-index:20;flex-shrink:0}.basics-layout .layout-sidebar .sidebar-menu{background:var(--global-background-color);border:none}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item{margin:4px 8px;width:calc(100% - 16px);border-radius:8px;transition:all .3s cubic-bezier(.4,0,.2,1);padding-inline:30%}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item:hover{background:var(--hover-background-color)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item:hover .ant-menu-item-icon{transition:transform .3s cubic-bezier(.4,0,.2,1);transform:scale(1.18)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item.ant-menu-item-selected{background-color:var(--background-primary-light);color:var(--color-primary)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-item .ant-menu-title-content{margin-inline-start:8px}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title{margin:4px 8px;width:calc(100% - 16px);border-radius:8px;padding-inline:30%}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title:hover{background-color:var(--hover-background-color)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-submenu-title:hover .ant-menu-item-icon{transition:transform .3s cubic-bezier(.4,0,.2,1);transform:scale(1.18)}.basics-layout .layout-sidebar .sidebar-menu .ant-menu-sub{background:transparent}.basics-layout .custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.basics-layout .custom-scrollbar::-webkit-scrollbar-track{background:transparent}.basics-layout .custom-scrollbar::-webkit-scrollbar-thumb{background:#0000004d;border-radius:4px}.basics-layout .custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#00000080}.basics-layout .layout-tabs{position:relative;scrollbar-width:thin}
@@ -1,7 +1,22 @@
1
+ import { MenuProps } from 'antd';
2
+ import { ReactNode } from 'react';
3
+ import { IUserInfo } from '../../../context';
1
4
  interface HeaderProps {
2
5
  breadcrumbItems: {
3
6
  title: string;
4
7
  }[];
8
+ appName?: ReactNode;
9
+ logo?: ReactNode;
10
+ headerActionsRender?: ReactNode;
11
+ breadcrumbBeforeRender?: ReactNode;
12
+ searchRender?: ReactNode;
13
+ noticeRender?: ReactNode;
14
+ isNotice?: boolean;
15
+ userInfo?: IUserInfo;
16
+ userMenuItems?: MenuProps['items'];
17
+ theme: string;
18
+ onToggleTheme: () => void;
19
+ onLogout: () => void;
5
20
  }
6
- export default function Header({ breadcrumbItems }: HeaderProps): import("react/jsx-runtime").JSX.Element;
21
+ export default function Header(props: HeaderProps): import("react/jsx-runtime").JSX.Element;
7
22
  export {};
@@ -1,3 +1,4 @@
1
+ import { ReactNode } from 'react';
1
2
  import { MenuItem } from '../../../../router';
2
3
  interface SidebarProps {
3
4
  collapsed: boolean;
@@ -6,6 +7,8 @@ interface SidebarProps {
6
7
  openKeys?: string[];
7
8
  onMenuClick: (key: string) => void;
8
9
  onCollapse: (collapsed: boolean) => void;
10
+ beforeRender?: ReactNode;
11
+ afterRender?: ReactNode;
9
12
  }
10
13
  export default function Sidebar(props: SidebarProps): import("react/jsx-runtime").JSX.Element;
11
14
  export {};
@@ -1,9 +1,12 @@
1
+ import { ReactNode } from 'react';
1
2
  import { TabItem } from '../../../../store/modules/layout-config.store';
2
3
  interface TabsComponentProps {
3
4
  tabs: TabItem[];
4
5
  activeKey: string;
5
6
  onChange: (key: string) => void;
6
7
  onClose: (key: string) => void;
8
+ beforeRender?: ReactNode;
9
+ afterRender?: ReactNode;
7
10
  }
8
11
  export default function TabsComponent(props: TabsComponentProps): import("react/jsx-runtime").JSX.Element;
9
12
  export {};
@@ -0,0 +1,246 @@
1
+ import { MenuProps } from 'antd';
2
+ import { ReactNode } from 'react';
3
+ import { RouteObject } from 'react-router-dom';
4
+ import { MenuItem } from '../../router';
5
+ export interface IUserInfo {
6
+ username?: string;
7
+ avatar?: string;
8
+ roleName?: string;
9
+ [key: string]: any;
10
+ }
11
+
12
+ export interface IGlobalContextProps {
13
+ /**
14
+ * @name 项目名称
15
+ */
16
+ appName?: ReactNode;
17
+ /**
18
+ * @name 项目logo
19
+ */
20
+ logo?: ReactNode;
21
+ /**
22
+ * @name 通知的reactNode
23
+ */
24
+ noticeRender?: ReactNode;
25
+ /**
26
+ * @name 项目说明
27
+ */
28
+ description?: ReactNode;
29
+ /**
30
+ * @name 项目详细说明
31
+ */
32
+ descriptionDetail?: ReactNode;
33
+ /**
34
+ * @name Copyright
35
+ */
36
+ copyright?: ReactNode;
37
+ /**
38
+ * @name 用户菜单
39
+ */
40
+ userMenuItems?: MenuProps['items'];
41
+ /**
42
+ * @name 用户信息
43
+ */
44
+ userInfo?: IUserInfo;
45
+ /**
46
+ * @name 侧边栏前置内容
47
+ */
48
+ sidebarBefore?: ReactNode;
49
+ /**
50
+ * @name 侧边栏后置内容
51
+ */
52
+ sidebarAfter?: ReactNode;
53
+ /**
54
+ * @name tabs前置内容
55
+ */
56
+ tabsBefore?: ReactNode;
57
+ /**
58
+ * @name tabs后置内容
59
+ */
60
+ tabsAfter?: ReactNode;
61
+ /**
62
+ * @name header按钮组render
63
+ */
64
+ headerActionsRender?: ReactNode;
65
+ /**
66
+ * @name 搜索框render
67
+ */
68
+ searchRender?: ReactNode;
69
+ /**
70
+ * @name 面包屑前置render
71
+ */
72
+ breadcrumbBeforeRender?: ReactNode;
73
+ /**
74
+ * @name 登录凭证
75
+ */
76
+ token?: string;
77
+ /**
78
+ * @name 菜单列表
79
+ */
80
+ menus?: MenuItem[];
81
+ /**
82
+ * @name 路由配置
83
+ */
84
+ routes?: RouteObject[];
85
+ /**
86
+ * @name 是否显示通知按钮
87
+ * @default true
88
+ */
89
+ isNotice?: boolean;
90
+ }
91
+
92
+ export interface IGlobalContext {
93
+ /**
94
+ * @name 项目名称
95
+ */
96
+ appName?: ReactNode;
97
+ /**
98
+ * @name 通知的reactNode
99
+ */
100
+ noticeRender?: ReactNode;
101
+ /**
102
+ * @name 项目logo
103
+ */
104
+ logo?: ReactNode;
105
+ /**
106
+ * @name 项目说明
107
+ */
108
+ description?: ReactNode;
109
+ /**
110
+ * @name 项目详细说明
111
+ */
112
+ descriptionDetail?: ReactNode;
113
+ /**
114
+ * @name Copyright
115
+ */
116
+ copyright?: ReactNode;
117
+ /**
118
+ * @name 用户菜单
119
+ */
120
+ userMenuItems?: MenuProps['items'];
121
+ /**
122
+ * @name 用户信息
123
+ */
124
+ userInfo?: IUserInfo;
125
+ /**
126
+ * @name 设置项目名称
127
+ */
128
+ setAppName: (name?: ReactNode) => void;
129
+ /**
130
+ * @name 设置通知的reactNode,用于在顶部通知图标点击显示通知
131
+ */
132
+ setNoticeRender: (render?: ReactNode) => void;
133
+ /**
134
+ * @name 设置项目logo
135
+ */
136
+ setLogo: (logo?: ReactNode) => void;
137
+ /**
138
+ * @name 设置项目说明
139
+ */
140
+ setDescription: (description?: ReactNode) => void;
141
+ /**
142
+ * @name 设置项目详细说明
143
+ */
144
+ setDescriptionDetail: (descriptionDetail?: ReactNode) => void;
145
+ /**
146
+ * @name 设置Copyright
147
+ */
148
+ setCopyright: (copyright?: ReactNode) => void;
149
+ /**
150
+ * @name 设置用户菜单
151
+ */
152
+ setUserMenuItems: (items?: MenuProps['items']) => void;
153
+ /**
154
+ * @name 设置用户信息
155
+ */
156
+ setUserInfo: (info?: IUserInfo) => void;
157
+ /**
158
+ * @name 侧边栏前置内容
159
+ */
160
+ sidebarBefore?: ReactNode;
161
+ /**
162
+ * @name 侧边栏后置内容
163
+ */
164
+ sidebarAfter?: ReactNode;
165
+ /**
166
+ * @name tabs前置内容
167
+ */
168
+ tabsBefore?: ReactNode;
169
+ /**
170
+ * @name tabs后置内容
171
+ */
172
+ tabsAfter?: ReactNode;
173
+ /**
174
+ * @name header按钮组render
175
+ */
176
+ headerActionsRender?: ReactNode;
177
+ /**
178
+ * @name 搜索框render
179
+ */
180
+ searchRender?: ReactNode;
181
+ /**
182
+ * @name 面包屑前置render
183
+ */
184
+ breadcrumbBeforeRender?: ReactNode;
185
+ /**
186
+ * @name 设置侧边栏前置内容
187
+ */
188
+ setSidebarBefore: (content?: ReactNode) => void;
189
+ /**
190
+ * @name 设置侧边栏后置内容
191
+ */
192
+ setSidebarAfter: (content?: ReactNode) => void;
193
+ /**
194
+ * @name 设置tabs前置内容
195
+ */
196
+ setTabsBefore: (content?: ReactNode) => void;
197
+ /**
198
+ * @name 设置tabs后置内容
199
+ */
200
+ setTabsAfter: (content?: ReactNode) => void;
201
+ /**
202
+ * @name 设置header按钮组render
203
+ */
204
+ setHeaderActionsRender: (render?: ReactNode) => void;
205
+ /**
206
+ * @name 设置搜索框render
207
+ */
208
+ setSearchRender: (render?: ReactNode) => void;
209
+ /**
210
+ * @name 设置面包屑前置render
211
+ */
212
+ setBreadcrumbBeforeRender: (render?: ReactNode) => void;
213
+ /**
214
+ * @name 登录凭证
215
+ */
216
+ token?: string;
217
+ /**
218
+ * @name 菜单列表
219
+ */
220
+ menus?: MenuItem[];
221
+ /**
222
+ * @name 路由配置
223
+ */
224
+ routes?: RouteObject[];
225
+ /**
226
+ * @name 设置登录凭证
227
+ */
228
+ setToken: (token?: string) => void;
229
+ /**
230
+ * @name 设置菜单列表
231
+ */
232
+ setMenus: (menus?: MenuItem[]) => void;
233
+ /**
234
+ * @name 设置路由配置
235
+ */
236
+ setRoutes: (routes?: RouteObject[]) => void;
237
+ /**
238
+ * @name 是否显示通知按钮
239
+ * @default true
240
+ */
241
+ isNotice?: boolean;
242
+ /**
243
+ * @name 设置是否显示通知按钮
244
+ */
245
+ setIsNotice: (isNotice?: boolean) => void;
246
+ }
@@ -0,0 +1,59 @@
1
+ /*
2
+ * @Author: dushuai
3
+ * @Date: 2026-01-13 20:55:57
4
+ * @LastEditors: dushuai
5
+ * @LastEditTime: 2026-01-26 23:49:50
6
+ * @description: 类型声明
7
+ */
8
+ /// <reference types="vite-plugin-svgr/client" />
9
+
10
+ /**
11
+ * 菜单类型枚举
12
+ * @1 目录 - 仅用于菜单分组,不对应实际页面
13
+ * @2 菜单 - 对应实际页面路由
14
+ * @3 按钮 - 页面内的按钮权限
15
+ */
16
+ export type MenuType = 1 | 2 | 3;
17
+
18
+ /**
19
+ * 路由类型
20
+ */
21
+ export interface IRoute {
22
+ /** 数据库主键id */
23
+ id: number
24
+ /** 菜单类型:1目录、2菜单、3按钮 */
25
+ menuType: MenuType
26
+ /** 菜单唯一标识,必填且唯一 */
27
+ menuId: string
28
+ /** 路由路径 */
29
+ path?: string
30
+ /**
31
+ * 菜单标识
32
+ * - 菜单类型:对应 pages 目录下文件夹名称(如 home、system/user)
33
+ * - 按钮类型:权限标识(如 user:add、user:edit)
34
+ */
35
+ menuCode?: string
36
+ /** 父级菜单的menuId */
37
+ parentId?: string
38
+ /** 是否受保护,默认true */
39
+ protected?: boolean
40
+ /** 是否是首页(仅菜单类型有效) */
41
+ index?: boolean
42
+ /** 路由/菜单标题 */
43
+ title?: string
44
+ /** 路由/菜单图标 */
45
+ icon?: string
46
+ /** 排序,数字越小越靠前 */
47
+ sort?: number
48
+ /** 是否在侧边栏菜单中显示,默认true(详情页等不需要显示在菜单中的页面设为false) */
49
+ isShowMenu?: boolean
50
+ /** 是否独立菜单 */
51
+ isIndependentMenu?: boolean
52
+ /** 激活路由的menuId */
53
+ activeRouteMenuId?: string
54
+ }
55
+
56
+ /**
57
+ * 更新store
58
+ */
59
+ export type TUpdateStore<T> = T | Partial<T> | ((state: T) => T | Partial<T>);
@@ -0,0 +1,38 @@
1
+ /*
2
+ * @Author: dushuai
3
+ * @Date: 2025-12-07 16:31:57
4
+ * @LastEditors: dushuai
5
+ * @LastEditTime: 2026-01-13 22:14:53
6
+ * @description: 请求config配置
7
+ */
8
+ declare module 'axios' {
9
+ export interface AxiosRequestConfig {
10
+ /**
11
+ * @name 是否单独处理请求数据,true:返回结构为Response类型(且不处理错误码),false:返回结构为data类型,默认false
12
+ */
13
+ isCheck?: boolean;
14
+ /**
15
+ * @name 是否加载loading
16
+ * @default true
17
+ */
18
+ showLoading?: boolean;
19
+ /**
20
+ * @name 加载loading的文本,最多七个字
21
+ */
22
+ loadingText?: string;
23
+ }
24
+ }
25
+
26
+ export interface IResponse<T = unknown> {
27
+ code: number;
28
+ data: T;
29
+ msg: string;
30
+ }
31
+
32
+ export interface IRecord<T = unknown> {
33
+ pageNum: number;
34
+ pageSize: number;
35
+ records: T[];
36
+ total: number;
37
+ totalPage?: number;
38
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spacego/fe-components",
3
- "version": "0.0.1-alpha.5",
3
+ "version": "0.0.1-alpha.7",
4
4
  "description": "🚀 A component library for fe to use.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",