@lobehub/ui 5.48.1 → 5.49.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/es/Highlighter/FullFeatured.mjs +1 -1
- package/es/Highlighter/FullFeatured.mjs.map +1 -1
- package/es/Highlighter/LangSelect.mjs +1 -1
- package/es/Highlighter/LangSelect.mjs.map +1 -1
- package/es/Highlighter/style.mjs +14 -11
- package/es/Highlighter/style.mjs.map +1 -1
- package/es/Mermaid/FullFeatured.mjs +1 -1
- package/es/Mermaid/FullFeatured.mjs.map +1 -1
- package/es/ThemeProvider/ThemeProvider.mjs +2 -2
- package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
- package/es/awesome/AgentSkillCard/AgentSkillCard.d.mts +6 -0
- package/es/awesome/AgentSkillCard/AgentSkillCard.mjs +83 -0
- package/es/awesome/AgentSkillCard/AgentSkillCard.mjs.map +1 -0
- package/es/awesome/AgentSkillCard/agents.d.mts +6 -0
- package/es/awesome/AgentSkillCard/agents.mjs +40 -0
- package/es/awesome/AgentSkillCard/agents.mjs.map +1 -0
- package/es/awesome/AgentSkillCard/index.d.mts +4 -0
- package/es/awesome/AgentSkillCard/style.mjs +85 -0
- package/es/awesome/AgentSkillCard/style.mjs.map +1 -0
- package/es/awesome/AgentSkillCard/type.d.mts +41 -0
- package/es/awesome/BentoGrid/BentoCard.d.mts +6 -0
- package/es/awesome/BentoGrid/BentoCard.mjs +39 -0
- package/es/awesome/BentoGrid/BentoCard.mjs.map +1 -0
- package/es/awesome/BentoGrid/BentoGrid.d.mts +6 -0
- package/es/awesome/BentoGrid/BentoGrid.mjs +20 -0
- package/es/awesome/BentoGrid/BentoGrid.mjs.map +1 -0
- package/es/awesome/BentoGrid/index.d.mts +4 -0
- package/es/awesome/BentoGrid/style.mjs +102 -0
- package/es/awesome/BentoGrid/style.mjs.map +1 -0
- package/es/awesome/BentoGrid/type.d.mts +40 -0
- package/es/awesome/CodeShowcase/CodeShowcase.d.mts +6 -0
- package/es/awesome/CodeShowcase/CodeShowcase.mjs +51 -0
- package/es/awesome/CodeShowcase/CodeShowcase.mjs.map +1 -0
- package/es/awesome/CodeShowcase/index.d.mts +3 -0
- package/es/awesome/CodeShowcase/style.mjs +50 -0
- package/es/awesome/CodeShowcase/style.mjs.map +1 -0
- package/es/awesome/CodeShowcase/type.d.mts +27 -0
- package/es/awesome/FeatureGrid/FeatureGrid.d.mts +6 -0
- package/es/awesome/FeatureGrid/FeatureGrid.mjs +48 -0
- package/es/awesome/FeatureGrid/FeatureGrid.mjs.map +1 -0
- package/es/awesome/FeatureGrid/index.d.mts +3 -0
- package/es/awesome/FeatureGrid/style.mjs +75 -0
- package/es/awesome/FeatureGrid/style.mjs.map +1 -0
- package/es/awesome/FeatureGrid/type.d.mts +25 -0
- package/es/awesome/FluidGradient/FluidGradient.d.mts +6 -0
- package/es/awesome/FluidGradient/FluidGradient.mjs +293 -0
- package/es/awesome/FluidGradient/FluidGradient.mjs.map +1 -0
- package/es/awesome/FluidGradient/index.d.mts +3 -0
- package/es/awesome/FluidGradient/style.mjs +52 -0
- package/es/awesome/FluidGradient/style.mjs.map +1 -0
- package/es/awesome/FluidGradient/type.d.mts +22 -0
- package/es/awesome/InstallBanner/InstallBanner.d.mts +6 -0
- package/es/awesome/InstallBanner/InstallBanner.mjs +35 -0
- package/es/awesome/InstallBanner/InstallBanner.mjs.map +1 -0
- package/es/awesome/InstallBanner/index.d.mts +3 -0
- package/es/awesome/InstallBanner/style.mjs +46 -0
- package/es/awesome/InstallBanner/style.mjs.map +1 -0
- package/es/awesome/InstallBanner/type.d.mts +18 -0
- package/es/awesome/LandingHero/LandingHero.d.mts +6 -0
- package/es/awesome/LandingHero/LandingHero.mjs +55 -0
- package/es/awesome/LandingHero/LandingHero.mjs.map +1 -0
- package/es/awesome/LandingHero/index.d.mts +3 -0
- package/es/awesome/LandingHero/style.mjs +155 -0
- package/es/awesome/LandingHero/style.mjs.map +1 -0
- package/es/awesome/LandingHero/type.d.mts +29 -0
- package/es/awesome/LandingSection/LandingSection.d.mts +6 -0
- package/es/awesome/LandingSection/LandingSection.mjs +61 -0
- package/es/awesome/LandingSection/LandingSection.mjs.map +1 -0
- package/es/awesome/LandingSection/index.d.mts +3 -0
- package/es/awesome/LandingSection/style.mjs +88 -0
- package/es/awesome/LandingSection/style.mjs.map +1 -0
- package/es/awesome/LandingSection/type.d.mts +40 -0
- package/es/awesome/LogoMarquee/LogoMarquee.d.mts +6 -0
- package/es/awesome/LogoMarquee/LogoMarquee.mjs +52 -0
- package/es/awesome/LogoMarquee/LogoMarquee.mjs.map +1 -0
- package/es/awesome/LogoMarquee/index.d.mts +3 -0
- package/es/awesome/LogoMarquee/style.mjs +70 -0
- package/es/awesome/LogoMarquee/style.mjs.map +1 -0
- package/es/awesome/LogoMarquee/type.d.mts +40 -0
- package/es/awesome/index.d.mts +33 -1
- package/es/awesome/index.mjs +13 -1
- package/es/awesome/landingActions.d.mts +20 -0
- package/es/awesome/landingActions.mjs +123 -0
- package/es/awesome/landingActions.mjs.map +1 -0
- package/es/awesome/landingIcon.mjs +13 -0
- package/es/awesome/landingIcon.mjs.map +1 -0
- package/es/awesome/landingLink.d.mts +12 -0
- package/es/awesome/landingLink.mjs +23 -0
- package/es/awesome/landingLink.mjs.map +1 -0
- package/es/awesome/landingTokens.d.mts +10 -0
- package/es/awesome/landingTokens.mjs +19 -0
- package/es/awesome/landingTokens.mjs.map +1 -0
- package/es/base-ui/Avatar/Avatar.mjs +1 -1
- package/es/base-ui/Avatar/Avatar.mjs.map +1 -1
- package/es/base-ui/Segmented/atoms.mjs +1 -0
- package/es/base-ui/Segmented/atoms.mjs.map +1 -1
- package/es/base-ui/Segmented/style.mjs +127 -125
- package/es/base-ui/Segmented/style.mjs.map +1 -1
- package/es/base-ui/Text/style.d.mts +1 -1
- package/es/base-ui/index.mjs +4 -4
- package/es/dashboard/AuthLayout/AuthLayout.d.mts +9 -0
- package/es/dashboard/AuthLayout/AuthLayout.mjs +54 -0
- package/es/dashboard/AuthLayout/AuthLayout.mjs.map +1 -0
- package/es/dashboard/AuthLayout/index.d.mts +3 -0
- package/es/dashboard/AuthLayout/style.mjs +120 -0
- package/es/dashboard/AuthLayout/style.mjs.map +1 -0
- package/es/dashboard/AuthLayout/type.d.mts +16 -0
- package/es/dashboard/Breadcrumb/Breadcrumb.d.mts +9 -0
- package/es/dashboard/Breadcrumb/Breadcrumb.mjs +55 -0
- package/es/dashboard/Breadcrumb/Breadcrumb.mjs.map +1 -0
- package/es/dashboard/Breadcrumb/index.d.mts +3 -0
- package/es/dashboard/Breadcrumb/style.mjs +66 -0
- package/es/dashboard/Breadcrumb/style.mjs.map +1 -0
- package/es/dashboard/Breadcrumb/type.d.mts +25 -0
- package/es/dashboard/ConsoleNav/ConsoleNav.d.mts +9 -0
- package/es/dashboard/ConsoleNav/ConsoleNav.mjs +275 -0
- package/es/dashboard/ConsoleNav/ConsoleNav.mjs.map +1 -0
- package/es/dashboard/ConsoleNav/active.d.mts +7 -0
- package/es/dashboard/ConsoleNav/active.mjs +29 -0
- package/es/dashboard/ConsoleNav/active.mjs.map +1 -0
- package/es/dashboard/ConsoleNav/index.d.mts +4 -0
- package/es/dashboard/ConsoleNav/style.mjs +283 -0
- package/es/dashboard/ConsoleNav/style.mjs.map +1 -0
- package/es/dashboard/ConsoleNav/type.d.mts +71 -0
- package/es/dashboard/ConsoleShell/ConsoleBrand.d.mts +9 -0
- package/es/dashboard/ConsoleShell/ConsoleBrand.mjs +37 -0
- package/es/dashboard/ConsoleShell/ConsoleBrand.mjs.map +1 -0
- package/es/dashboard/ConsoleShell/ConsoleShell.d.mts +9 -0
- package/es/dashboard/ConsoleShell/ConsoleShell.mjs +149 -0
- package/es/dashboard/ConsoleShell/ConsoleShell.mjs.map +1 -0
- package/es/dashboard/ConsoleShell/context.d.mts +6 -0
- package/es/dashboard/ConsoleShell/context.mjs +16 -0
- package/es/dashboard/ConsoleShell/context.mjs.map +1 -0
- package/es/dashboard/ConsoleShell/index.d.mts +5 -0
- package/es/dashboard/ConsoleShell/style.mjs +209 -0
- package/es/dashboard/ConsoleShell/style.mjs.map +1 -0
- package/es/dashboard/ConsoleShell/type.d.mts +67 -0
- package/es/dashboard/FilterSidebar/FilterSidebar.d.mts +17 -0
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs +151 -0
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs.map +1 -0
- package/es/dashboard/FilterSidebar/context.d.mts +7 -0
- package/es/dashboard/FilterSidebar/context.mjs +19 -0
- package/es/dashboard/FilterSidebar/context.mjs.map +1 -0
- package/es/dashboard/FilterSidebar/index.d.mts +4 -0
- package/es/dashboard/FilterSidebar/style.mjs +155 -0
- package/es/dashboard/FilterSidebar/style.mjs.map +1 -0
- package/es/dashboard/FilterSidebar/type.d.mts +44 -0
- package/es/dashboard/FilterSidebar/width.mjs +18 -0
- package/es/dashboard/FilterSidebar/width.mjs.map +1 -0
- package/es/dashboard/PageHeader/PageHeader.d.mts +9 -0
- package/es/dashboard/PageHeader/PageHeader.mjs +37 -0
- package/es/dashboard/PageHeader/PageHeader.mjs.map +1 -0
- package/es/dashboard/PageHeader/index.d.mts +3 -0
- package/es/dashboard/PageHeader/style.mjs +47 -0
- package/es/dashboard/PageHeader/style.mjs.map +1 -0
- package/es/dashboard/PageHeader/type.d.mts +14 -0
- package/es/dashboard/PageSkeleton/PageSkeleton.d.mts +25 -0
- package/es/dashboard/PageSkeleton/PageSkeleton.mjs +136 -0
- package/es/dashboard/PageSkeleton/PageSkeleton.mjs.map +1 -0
- package/es/dashboard/PageSkeleton/style.mjs +122 -0
- package/es/dashboard/PageSkeleton/style.mjs.map +1 -0
- package/es/dashboard/PageSkeleton/type.d.mts +22 -0
- package/es/dashboard/PageTabs/PageTabs.d.mts +9 -0
- package/es/dashboard/PageTabs/PageTabs.mjs +37 -0
- package/es/dashboard/PageTabs/PageTabs.mjs.map +1 -0
- package/es/dashboard/PageTabs/index.d.mts +3 -0
- package/es/dashboard/PageTabs/style.mjs +57 -0
- package/es/dashboard/PageTabs/style.mjs.map +1 -0
- package/es/dashboard/PageTabs/type.d.mts +17 -0
- package/es/dashboard/RouteProgress/RouteProgress.d.mts +9 -0
- package/es/dashboard/RouteProgress/RouteProgress.mjs +44 -0
- package/es/dashboard/RouteProgress/RouteProgress.mjs.map +1 -0
- package/es/dashboard/RouteProgress/style.mjs +19 -0
- package/es/dashboard/RouteProgress/style.mjs.map +1 -0
- package/es/dashboard/RouteProgress/type.d.mts +8 -0
- package/es/dashboard/StatCard/StatCard.d.mts +9 -0
- package/es/dashboard/StatCard/StatCard.mjs +84 -0
- package/es/dashboard/StatCard/StatCard.mjs.map +1 -0
- package/es/dashboard/StatCard/index.d.mts +3 -0
- package/es/dashboard/StatCard/style.mjs +135 -0
- package/es/dashboard/StatCard/style.mjs.map +1 -0
- package/es/dashboard/StatCard/type.d.mts +26 -0
- package/es/dashboard/Surface/Surface.d.mts +13 -0
- package/es/dashboard/Surface/Surface.mjs +20 -0
- package/es/dashboard/Surface/Surface.mjs.map +1 -0
- package/es/dashboard/Surface/index.d.mts +4 -0
- package/es/dashboard/Surface/style.d.mts +14 -0
- package/es/dashboard/Surface/style.mjs +22 -0
- package/es/dashboard/Surface/style.mjs.map +1 -0
- package/es/dashboard/Surface/type.d.mts +8 -0
- package/es/dashboard/hooks.mjs +49 -0
- package/es/dashboard/hooks.mjs.map +1 -0
- package/es/dashboard/index.d.mts +37 -0
- package/es/dashboard/index.d.ts +1 -0
- package/es/dashboard/index.js +1 -0
- package/es/dashboard/index.mjs +17 -0
- package/es/static-css/registry.mjs +2 -2
- package/es/static-css/registry.mjs.map +1 -1
- package/es/storybook/StoryBook/index.mjs +4 -0
- package/es/storybook/StoryBook/index.mjs.map +1 -1
- package/es/storybook/StoryBook/style.mjs +7 -2
- package/es/storybook/StoryBook/style.mjs.map +1 -1
- package/es/styles/theme/token/base.mjs +2 -2
- package/es/styles/theme/token/base.mjs.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import Skeleton from "../../base-ui/Skeleton/index.mjs";
|
|
3
|
+
import { styles } from "../Surface/style.mjs";
|
|
4
|
+
import { styles as styles$1 } from "./style.mjs";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/dashboard/PageSkeleton/PageSkeleton.tsx
|
|
7
|
+
const bone = {
|
|
8
|
+
height: void 0,
|
|
9
|
+
width: void 0
|
|
10
|
+
};
|
|
11
|
+
const lineWidths = [
|
|
12
|
+
["68%", "36%"],
|
|
13
|
+
["52%", "28%"],
|
|
14
|
+
["76%", "42%"],
|
|
15
|
+
["58%", "32%"]
|
|
16
|
+
];
|
|
17
|
+
function LoadingAnnouncer({ label }) {
|
|
18
|
+
return /* @__PURE__ */ jsx("output", {
|
|
19
|
+
"aria-live": "polite",
|
|
20
|
+
className: styles$1.srOnly,
|
|
21
|
+
children: label
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
LoadingAnnouncer.displayName = "LoadingAnnouncer";
|
|
25
|
+
function PageHeaderSkeleton({ action = true }) {
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
27
|
+
"aria-hidden": true,
|
|
28
|
+
className: styles$1.header,
|
|
29
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: styles$1.headerCopy,
|
|
31
|
+
children: [/* @__PURE__ */ jsx(Skeleton, {
|
|
32
|
+
className: styles$1.title,
|
|
33
|
+
style: bone
|
|
34
|
+
}), /* @__PURE__ */ jsx(Skeleton.Text, {
|
|
35
|
+
fontSize: 14,
|
|
36
|
+
width: "46%"
|
|
37
|
+
})]
|
|
38
|
+
}), action ? /* @__PURE__ */ jsx(Skeleton, {
|
|
39
|
+
className: styles$1.action,
|
|
40
|
+
style: bone
|
|
41
|
+
}) : null]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
PageHeaderSkeleton.displayName = "PageHeaderSkeleton";
|
|
45
|
+
function TableSkeleton({ framed = true, leading = "text", rows = 6 }) {
|
|
46
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: framed ? `${styles$1.table} ${styles.card}` : styles$1.table,
|
|
49
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
50
|
+
className: styles$1.thead,
|
|
51
|
+
children: [
|
|
52
|
+
96,
|
|
53
|
+
72,
|
|
54
|
+
64,
|
|
55
|
+
48
|
|
56
|
+
].map((width, index) => /* @__PURE__ */ jsx(Skeleton, {
|
|
57
|
+
className: styles$1.theadCell,
|
|
58
|
+
style: {
|
|
59
|
+
...bone,
|
|
60
|
+
width
|
|
61
|
+
}
|
|
62
|
+
}, index))
|
|
63
|
+
}), Array.from({ length: rows }, (_, index) => /* @__PURE__ */ jsxs("div", {
|
|
64
|
+
className: styles$1.row,
|
|
65
|
+
children: [
|
|
66
|
+
leading === "avatar" ? /* @__PURE__ */ jsx(Skeleton.Avatar, {
|
|
67
|
+
shape: "circle",
|
|
68
|
+
size: 24
|
|
69
|
+
}) : null,
|
|
70
|
+
leading === "icon" ? /* @__PURE__ */ jsx(Skeleton.Avatar, {
|
|
71
|
+
shape: "square",
|
|
72
|
+
size: 24
|
|
73
|
+
}) : null,
|
|
74
|
+
/* @__PURE__ */ jsx("div", {
|
|
75
|
+
className: styles$1.copy,
|
|
76
|
+
children: /* @__PURE__ */ jsx(Skeleton.Text, {
|
|
77
|
+
fontSize: 14,
|
|
78
|
+
rows: 2,
|
|
79
|
+
width: [...lineWidths[index % lineWidths.length]]
|
|
80
|
+
})
|
|
81
|
+
}),
|
|
82
|
+
/* @__PURE__ */ jsx(Skeleton, {
|
|
83
|
+
className: styles$1.tag,
|
|
84
|
+
style: bone
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ jsx(Skeleton, {
|
|
87
|
+
className: styles$1.cell,
|
|
88
|
+
style: bone
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
}, index))]
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
TableSkeleton.displayName = "TableSkeleton";
|
|
95
|
+
function StatCardSkeleton() {
|
|
96
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
97
|
+
"aria-hidden": true,
|
|
98
|
+
className: `${styles$1.stat} ${styles.card}`,
|
|
99
|
+
children: [
|
|
100
|
+
/* @__PURE__ */ jsx(Skeleton.Text, {
|
|
101
|
+
fontSize: 14,
|
|
102
|
+
width: 72
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ jsx(Skeleton, {
|
|
105
|
+
className: styles$1.statValue,
|
|
106
|
+
style: bone
|
|
107
|
+
}),
|
|
108
|
+
/* @__PURE__ */ jsx(Skeleton.Text, {
|
|
109
|
+
fontSize: 14,
|
|
110
|
+
width: "68%"
|
|
111
|
+
})
|
|
112
|
+
]
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
StatCardSkeleton.displayName = "StatCardSkeleton";
|
|
116
|
+
function PageLoading({ header = true, label = "Loading", stats = 4 }) {
|
|
117
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
118
|
+
"aria-busy": "true",
|
|
119
|
+
className: styles$1.page,
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ jsx(LoadingAnnouncer, { label }),
|
|
122
|
+
header ? /* @__PURE__ */ jsx(PageHeaderSkeleton, {}) : null,
|
|
123
|
+
/* @__PURE__ */ jsx("section", {
|
|
124
|
+
"aria-hidden": true,
|
|
125
|
+
className: styles$1.statGrid,
|
|
126
|
+
children: Array.from({ length: stats }, (_, index) => /* @__PURE__ */ jsx(StatCardSkeleton, {}, index))
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ jsx(TableSkeleton, {})
|
|
129
|
+
]
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
PageLoading.displayName = "PageLoading";
|
|
133
|
+
//#endregion
|
|
134
|
+
export { LoadingAnnouncer, PageHeaderSkeleton, StatCardSkeleton, TableSkeleton, PageLoading as default };
|
|
135
|
+
|
|
136
|
+
//# sourceMappingURL=PageSkeleton.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageSkeleton.mjs","names":["styles","surfaceStyles"],"sources":["../../../src/dashboard/PageSkeleton/PageSkeleton.tsx"],"sourcesContent":["'use client';\n\nimport Skeleton from '@/base-ui/Skeleton';\n\nimport { styles as surfaceStyles } from '../Surface/style';\nimport { styles } from './style';\nimport type {\n LoadingAnnouncerProps,\n PageHeaderSkeletonProps,\n PageLoadingProps,\n TableSkeletonProps,\n} from './type';\n\nconst bone = { height: undefined, width: undefined };\nconst lineWidths = [\n ['68%', '36%'],\n ['52%', '28%'],\n ['76%', '42%'],\n ['58%', '32%'],\n] as const;\n\nfunction LoadingAnnouncer({ label }: LoadingAnnouncerProps) {\n return (\n <output aria-live=\"polite\" className={styles.srOnly}>\n {label}\n </output>\n );\n}\n\nLoadingAnnouncer.displayName = 'LoadingAnnouncer';\n\nfunction PageHeaderSkeleton({ action = true }: PageHeaderSkeletonProps) {\n return (\n <div aria-hidden className={styles.header}>\n <div className={styles.headerCopy}>\n <Skeleton className={styles.title} style={bone} />\n <Skeleton.Text fontSize={14} width=\"46%\" />\n </div>\n {action ? <Skeleton className={styles.action} style={bone} /> : null}\n </div>\n );\n}\n\nPageHeaderSkeleton.displayName = 'PageHeaderSkeleton';\n\nfunction TableSkeleton({ framed = true, leading = 'text', rows = 6 }: TableSkeletonProps) {\n const head = [96, 72, 64, 48];\n return (\n <div aria-hidden className={framed ? `${styles.table} ${surfaceStyles.card}` : styles.table}>\n <div className={styles.thead}>\n {head.map((width, index) => (\n <Skeleton className={styles.theadCell} key={index} style={{ ...bone, width }} />\n ))}\n </div>\n {Array.from({ length: rows }, (_, index) => (\n <div className={styles.row} key={index}>\n {leading === 'avatar' ? <Skeleton.Avatar shape=\"circle\" size={24} /> : null}\n {leading === 'icon' ? <Skeleton.Avatar shape=\"square\" size={24} /> : null}\n <div className={styles.copy}>\n <Skeleton.Text\n fontSize={14}\n rows={2}\n width={[...lineWidths[index % lineWidths.length]]}\n />\n </div>\n <Skeleton className={styles.tag} style={bone} />\n <Skeleton className={styles.cell} style={bone} />\n </div>\n ))}\n </div>\n );\n}\n\nTableSkeleton.displayName = 'TableSkeleton';\n\nfunction StatCardSkeleton() {\n return (\n <div aria-hidden className={`${styles.stat} ${surfaceStyles.card}`}>\n <Skeleton.Text fontSize={14} width={72} />\n <Skeleton className={styles.statValue} style={bone} />\n <Skeleton.Text fontSize={14} width=\"68%\" />\n </div>\n );\n}\n\nStatCardSkeleton.displayName = 'StatCardSkeleton';\n\nfunction PageLoading({ header = true, label = 'Loading', stats = 4 }: PageLoadingProps) {\n return (\n <div aria-busy=\"true\" className={styles.page}>\n <LoadingAnnouncer label={label} />\n {header ? <PageHeaderSkeleton /> : null}\n <section aria-hidden className={styles.statGrid}>\n {Array.from({ length: stats }, (_, index) => (\n <StatCardSkeleton key={index} />\n ))}\n </section>\n <TableSkeleton />\n </div>\n );\n}\n\nPageLoading.displayName = 'PageLoading';\n\nexport { LoadingAnnouncer, PageHeaderSkeleton, StatCardSkeleton, TableSkeleton };\nexport default PageLoading;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createStaticStyles } from "antd-style";
|
|
2
|
+
//#region src/dashboard/PageSkeleton/style.ts
|
|
3
|
+
const styles = createStaticStyles(({ css, cssVar, responsive }) => ({
|
|
4
|
+
action: css`
|
|
5
|
+
flex: none;
|
|
6
|
+
inline-size: 96px;
|
|
7
|
+
block-size: 32px;
|
|
8
|
+
|
|
9
|
+
${responsive.mobile} {
|
|
10
|
+
inline-size: 100%;
|
|
11
|
+
block-size: 44px;
|
|
12
|
+
}
|
|
13
|
+
`,
|
|
14
|
+
cell: css`
|
|
15
|
+
flex: none;
|
|
16
|
+
inline-size: 88px;
|
|
17
|
+
block-size: 14px;
|
|
18
|
+
`,
|
|
19
|
+
copy: css`
|
|
20
|
+
flex: 1;
|
|
21
|
+
min-inline-size: 0;
|
|
22
|
+
`,
|
|
23
|
+
header: css`
|
|
24
|
+
display: flex;
|
|
25
|
+
gap: 16px;
|
|
26
|
+
align-items: flex-start;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
|
|
29
|
+
${responsive.mobile} {
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
align-items: stretch;
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
headerCopy: css`
|
|
35
|
+
display: flex;
|
|
36
|
+
flex: 1;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: 8px;
|
|
39
|
+
|
|
40
|
+
min-inline-size: 0;
|
|
41
|
+
`,
|
|
42
|
+
page: css`
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: 20px;
|
|
46
|
+
`,
|
|
47
|
+
row: css`
|
|
48
|
+
display: flex;
|
|
49
|
+
gap: 12px;
|
|
50
|
+
align-items: center;
|
|
51
|
+
|
|
52
|
+
min-block-size: 54px;
|
|
53
|
+
padding-block: 12px;
|
|
54
|
+
padding-inline: 16px;
|
|
55
|
+
border-block-end: 1px solid ${cssVar.colorBorder};
|
|
56
|
+
|
|
57
|
+
&:last-child {
|
|
58
|
+
border-block-end: none;
|
|
59
|
+
}
|
|
60
|
+
`,
|
|
61
|
+
srOnly: css`
|
|
62
|
+
position: absolute;
|
|
63
|
+
|
|
64
|
+
overflow: hidden;
|
|
65
|
+
|
|
66
|
+
inline-size: 1px;
|
|
67
|
+
block-size: 1px;
|
|
68
|
+
|
|
69
|
+
white-space: nowrap;
|
|
70
|
+
|
|
71
|
+
clip-path: inset(50%);
|
|
72
|
+
`,
|
|
73
|
+
statGrid: css`
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
76
|
+
gap: 12px;
|
|
77
|
+
`,
|
|
78
|
+
stat: css`
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
padding: 16px;
|
|
82
|
+
`,
|
|
83
|
+
statValue: css`
|
|
84
|
+
inline-size: 42%;
|
|
85
|
+
block-size: ${cssVar.fontSizeHeading2};
|
|
86
|
+
margin-block: 6px 14px;
|
|
87
|
+
`,
|
|
88
|
+
table: css`
|
|
89
|
+
overflow: hidden;
|
|
90
|
+
min-inline-size: 0;
|
|
91
|
+
`,
|
|
92
|
+
tag: css`
|
|
93
|
+
flex: none;
|
|
94
|
+
inline-size: 72px;
|
|
95
|
+
block-size: 22px;
|
|
96
|
+
border-radius: ${cssVar.borderRadiusSM};
|
|
97
|
+
`,
|
|
98
|
+
thead: css`
|
|
99
|
+
display: flex;
|
|
100
|
+
gap: 12px;
|
|
101
|
+
align-items: center;
|
|
102
|
+
|
|
103
|
+
min-block-size: 39px;
|
|
104
|
+
padding-block: 10px;
|
|
105
|
+
padding-inline: 16px;
|
|
106
|
+
|
|
107
|
+
background: ${cssVar.colorFillTertiary};
|
|
108
|
+
`,
|
|
109
|
+
theadCell: css`
|
|
110
|
+
flex: none;
|
|
111
|
+
block-size: 12px;
|
|
112
|
+
`,
|
|
113
|
+
title: css`
|
|
114
|
+
inline-size: 220px;
|
|
115
|
+
max-inline-size: 70%;
|
|
116
|
+
block-size: ${cssVar.fontSizeHeading3};
|
|
117
|
+
`
|
|
118
|
+
}));
|
|
119
|
+
//#endregion
|
|
120
|
+
export { styles };
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/dashboard/PageSkeleton/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const styles = createStaticStyles(({ css, cssVar, responsive }) => ({\n action: css`\n flex: none;\n inline-size: 96px;\n block-size: 32px;\n\n ${responsive.mobile} {\n inline-size: 100%;\n block-size: 44px;\n }\n `,\n cell: css`\n flex: none;\n inline-size: 88px;\n block-size: 14px;\n `,\n copy: css`\n flex: 1;\n min-inline-size: 0;\n `,\n header: css`\n display: flex;\n gap: 16px;\n align-items: flex-start;\n justify-content: space-between;\n\n ${responsive.mobile} {\n flex-direction: column;\n align-items: stretch;\n }\n `,\n headerCopy: css`\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 8px;\n\n min-inline-size: 0;\n `,\n page: css`\n display: flex;\n flex-direction: column;\n gap: 20px;\n `,\n row: css`\n display: flex;\n gap: 12px;\n align-items: center;\n\n min-block-size: 54px;\n padding-block: 12px;\n padding-inline: 16px;\n border-block-end: 1px solid ${cssVar.colorBorder};\n\n &:last-child {\n border-block-end: none;\n }\n `,\n srOnly: css`\n position: absolute;\n\n overflow: hidden;\n\n inline-size: 1px;\n block-size: 1px;\n\n white-space: nowrap;\n\n clip-path: inset(50%);\n `,\n statGrid: css`\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n `,\n stat: css`\n display: flex;\n flex-direction: column;\n padding: 16px;\n `,\n statValue: css`\n inline-size: 42%;\n block-size: ${cssVar.fontSizeHeading2};\n margin-block: 6px 14px;\n `,\n table: css`\n overflow: hidden;\n min-inline-size: 0;\n `,\n tag: css`\n flex: none;\n inline-size: 72px;\n block-size: 22px;\n border-radius: ${cssVar.borderRadiusSM};\n `,\n thead: css`\n display: flex;\n gap: 12px;\n align-items: center;\n\n min-block-size: 39px;\n padding-block: 10px;\n padding-inline: 16px;\n\n background: ${cssVar.colorFillTertiary};\n `,\n theadCell: css`\n flex: none;\n block-size: 12px;\n `,\n title: css`\n inline-size: 220px;\n max-inline-size: 70%;\n block-size: ${cssVar.fontSizeHeading3};\n `,\n}));\n"],"mappings":";;AAEA,MAAa,SAAS,oBAAoB,EAAE,KAAK,QAAQ,kBAAkB;CACzE,QAAQ,GAAG;;;;;MAKP,WAAW,OAAO;;;;;CAKtB,MAAM,GAAG;;;;;CAKT,MAAM,GAAG;;;;CAIT,QAAQ,GAAG;;;;;;MAMP,WAAW,OAAO;;;;;CAKtB,YAAY,GAAG;;;;;;;;CAQf,MAAM,GAAG;;;;;CAKT,KAAK,GAAG;;;;;;;;kCAQwB,OAAO,YAAY;;;;;;CAMnD,QAAQ,GAAG;;;;;;;;;;;;CAYX,UAAU,GAAG;;;;;CAKb,MAAM,GAAG;;;;;CAKT,WAAW,GAAG;;kBAEE,OAAO,iBAAiB;;;CAGxC,OAAO,GAAG;;;;CAIV,KAAK,GAAG;;;;qBAIW,OAAO,eAAe;;CAEzC,OAAO,GAAG;;;;;;;;;kBASM,OAAO,kBAAkB;;CAEzC,WAAW,GAAG;;;;CAId,OAAO,GAAG;;;kBAGM,OAAO,iBAAiB;;AAE1C,EAAE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/dashboard/PageSkeleton/type.d.ts
|
|
2
|
+
interface LoadingAnnouncerProps {
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
interface PageHeaderSkeletonProps {
|
|
6
|
+
action?: boolean;
|
|
7
|
+
}
|
|
8
|
+
interface TableSkeletonProps {
|
|
9
|
+
framed?: boolean;
|
|
10
|
+
/** First cell: two lines, a person, or a mark. */
|
|
11
|
+
leading?: 'text' | 'avatar' | 'icon';
|
|
12
|
+
rows?: number;
|
|
13
|
+
}
|
|
14
|
+
interface PageLoadingProps {
|
|
15
|
+
header?: boolean;
|
|
16
|
+
/** Announced to assistive tech. */
|
|
17
|
+
label?: string;
|
|
18
|
+
stats?: number;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { LoadingAnnouncerProps, PageHeaderSkeletonProps, PageLoadingProps, TableSkeletonProps };
|
|
22
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PageTabsProps } from "./type.mjs";
|
|
2
|
+
//#region src/dashboard/PageTabs/PageTabs.d.ts
|
|
3
|
+
declare function PageTabs<Value extends string>({ label, onChange, tabs, value }: PageTabsProps<Value>): import("react").JSX.Element;
|
|
4
|
+
declare namespace PageTabs {
|
|
5
|
+
var displayName: string;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { PageTabs as default };
|
|
9
|
+
//# sourceMappingURL=PageTabs.d.mts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import Tabs from "../../base-ui/Tabs/Tabs.mjs";
|
|
3
|
+
import { styles } from "./style.mjs";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/dashboard/PageTabs/PageTabs.tsx
|
|
6
|
+
function PageTabs({ label, onChange, tabs, value }) {
|
|
7
|
+
return /* @__PURE__ */ jsx("div", {
|
|
8
|
+
"aria-label": label,
|
|
9
|
+
className: styles.root,
|
|
10
|
+
role: "navigation",
|
|
11
|
+
children: /* @__PURE__ */ jsx(Tabs, {
|
|
12
|
+
activeKey: value,
|
|
13
|
+
classNames: {
|
|
14
|
+
list: styles.list,
|
|
15
|
+
panel: styles.panel,
|
|
16
|
+
tab: styles.tab
|
|
17
|
+
},
|
|
18
|
+
items: tabs.map((tab) => ({
|
|
19
|
+
children: tab.content,
|
|
20
|
+
key: tab.value,
|
|
21
|
+
label: /* @__PURE__ */ jsxs(Fragment, { children: [tab.label, tab.count !== void 0 ? /* @__PURE__ */ jsx("span", {
|
|
22
|
+
className: styles.count,
|
|
23
|
+
children: tab.count
|
|
24
|
+
}) : null] })
|
|
25
|
+
})),
|
|
26
|
+
onChange: (next) => {
|
|
27
|
+
const tab = tabs.find((item) => item.value === next);
|
|
28
|
+
if (tab) onChange(tab.value);
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
PageTabs.displayName = "PageTabs";
|
|
34
|
+
//#endregion
|
|
35
|
+
export { PageTabs as default };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=PageTabs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageTabs.mjs","names":[],"sources":["../../../src/dashboard/PageTabs/PageTabs.tsx"],"sourcesContent":["'use client';\n\nimport Tabs from '@/base-ui/Tabs';\n\nimport { styles } from './style';\nimport type { PageTabsProps } from './type';\n\nfunction PageTabs<Value extends string>({ label, onChange, tabs, value }: PageTabsProps<Value>) {\n return (\n <div aria-label={label} className={styles.root} role=\"navigation\">\n <Tabs\n activeKey={value}\n classNames={{ list: styles.list, panel: styles.panel, tab: styles.tab }}\n items={tabs.map((tab) => ({\n children: tab.content,\n key: tab.value,\n label: (\n <>\n {tab.label}\n {tab.count !== undefined ? <span className={styles.count}>{tab.count}</span> : null}\n </>\n ),\n }))}\n onChange={(next) => {\n const tab = tabs.find((item) => item.value === next);\n if (tab) onChange(tab.value);\n }}\n />\n </div>\n );\n}\n\nPageTabs.displayName = 'PageTabs';\n\nexport default PageTabs;\n"],"mappings":";;;;;AAOA,SAAS,SAA+B,EAAE,OAAO,UAAU,MAAM,SAA+B;CAC9F,OACE,oBAAC,OAAD;EAAK,cAAY;EAAO,WAAW,OAAO;EAAM,MAAK;EACnD,UAAA,oBAAC,MAAD;GACE,WAAW;GACX,YAAY;IAAE,MAAM,OAAO;IAAM,OAAO,OAAO;IAAO,KAAK,OAAO;GAAI;GACtE,OAAO,KAAK,KAAK,SAAS;IACxB,UAAU,IAAI;IACd,KAAK,IAAI;IACT,OACE,qBAAA,UAAA,EAAA,UAAA,CACG,IAAI,OACJ,IAAI,UAAU,KAAA,IAAY,oBAAC,QAAD;KAAM,WAAW,OAAO;KAAQ,UAAA,IAAI;IAAY,CAAA,IAAI,IAC/E,EAAA,CAAA;GAEN,EAAE;GACF,WAAW,SAAS;IAClB,MAAM,MAAM,KAAK,MAAM,SAAS,KAAK,UAAU,IAAI;IACnD,IAAI,KAAK,SAAS,IAAI,KAAK;GAC7B;EACD,CAAA;CACE,CAAA;AAET;AAEA,SAAS,cAAc"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createStaticStyles } from "antd-style";
|
|
2
|
+
//#region src/dashboard/PageTabs/style.ts
|
|
3
|
+
const styles = createStaticStyles(({ css, cssVar, responsive }) => ({
|
|
4
|
+
count: css`
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
|
|
9
|
+
min-inline-size: 1.5em;
|
|
10
|
+
padding-inline: ${cssVar.paddingXXS};
|
|
11
|
+
border-radius: ${cssVar.borderRadiusXS};
|
|
12
|
+
|
|
13
|
+
font-size: ${cssVar.fontSizeSM};
|
|
14
|
+
font-weight: 500;
|
|
15
|
+
font-variant-numeric: tabular-nums;
|
|
16
|
+
line-height: 1.4;
|
|
17
|
+
color: ${cssVar.colorTextSecondary};
|
|
18
|
+
|
|
19
|
+
background: ${cssVar.colorFillSecondary};
|
|
20
|
+
`,
|
|
21
|
+
list: css`
|
|
22
|
+
scrollbar-width: none;
|
|
23
|
+
overflow-x: auto;
|
|
24
|
+
flex-wrap: nowrap;
|
|
25
|
+
max-inline-size: 100%;
|
|
26
|
+
|
|
27
|
+
&::-webkit-scrollbar {
|
|
28
|
+
display: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&& {
|
|
32
|
+
gap: ${cssVar.paddingXXS};
|
|
33
|
+
padding: ${cssVar.paddingXXS};
|
|
34
|
+
}
|
|
35
|
+
`,
|
|
36
|
+
panel: css`
|
|
37
|
+
padding-block-start: 16px;
|
|
38
|
+
`,
|
|
39
|
+
root: css`
|
|
40
|
+
min-inline-size: 0;
|
|
41
|
+
`,
|
|
42
|
+
tab: css`
|
|
43
|
+
flex: none;
|
|
44
|
+
|
|
45
|
+
&& {
|
|
46
|
+
gap: ${cssVar.paddingXS};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
${responsive.mobile} {
|
|
50
|
+
min-block-size: 44px;
|
|
51
|
+
}
|
|
52
|
+
`
|
|
53
|
+
}));
|
|
54
|
+
//#endregion
|
|
55
|
+
export { styles };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/dashboard/PageTabs/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const styles = createStaticStyles(({ css, cssVar, responsive }) => ({\n count: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n min-inline-size: 1.5em;\n padding-inline: ${cssVar.paddingXXS};\n border-radius: ${cssVar.borderRadiusXS};\n\n font-size: ${cssVar.fontSizeSM};\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n line-height: 1.4;\n color: ${cssVar.colorTextSecondary};\n\n background: ${cssVar.colorFillSecondary};\n `,\n list: css`\n scrollbar-width: none;\n overflow-x: auto;\n flex-wrap: nowrap;\n max-inline-size: 100%;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n && {\n gap: ${cssVar.paddingXXS};\n padding: ${cssVar.paddingXXS};\n }\n `,\n panel: css`\n padding-block-start: 16px;\n `,\n root: css`\n min-inline-size: 0;\n `,\n tab: css`\n flex: none;\n\n && {\n gap: ${cssVar.paddingXS};\n }\n\n ${responsive.mobile} {\n min-block-size: 44px;\n }\n `,\n}));\n"],"mappings":";;AAEA,MAAa,SAAS,oBAAoB,EAAE,KAAK,QAAQ,kBAAkB;CACzE,OAAO,GAAG;;;;;;sBAMU,OAAO,WAAW;qBACnB,OAAO,eAAe;;iBAE1B,OAAO,WAAW;;;;aAItB,OAAO,mBAAmB;;kBAErB,OAAO,mBAAmB;;CAE1C,MAAM,GAAG;;;;;;;;;;;aAWE,OAAO,WAAW;iBACd,OAAO,WAAW;;;CAGjC,OAAO,GAAG;;;CAGV,MAAM,GAAG;;;CAGT,KAAK,GAAG;;;;aAIG,OAAO,UAAU;;;MAGxB,WAAW,OAAO;;;;AAIxB,EAAE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
//#region src/dashboard/PageTabs/type.d.ts
|
|
3
|
+
interface PageTab<Value extends string> {
|
|
4
|
+
content: ReactNode;
|
|
5
|
+
count?: ReactNode;
|
|
6
|
+
label: string;
|
|
7
|
+
value: Value;
|
|
8
|
+
}
|
|
9
|
+
interface PageTabsProps<Value extends string> {
|
|
10
|
+
label: string;
|
|
11
|
+
onChange: (value: Value) => void;
|
|
12
|
+
tabs: PageTab<Value>[];
|
|
13
|
+
value: Value;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { PageTab, PageTabsProps };
|
|
17
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RouteProgressProps } from "./type.mjs";
|
|
2
|
+
//#region src/dashboard/RouteProgress/RouteProgress.d.ts
|
|
3
|
+
declare function RouteProgress({ loading }: RouteProgressProps): import("react").JSX.Element | null;
|
|
4
|
+
declare namespace RouteProgress {
|
|
5
|
+
var displayName: string;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { RouteProgress as default };
|
|
9
|
+
//# sourceMappingURL=RouteProgress.d.mts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { styles } from "./style.mjs";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/dashboard/RouteProgress/RouteProgress.tsx
|
|
6
|
+
const FADE_MS = 200;
|
|
7
|
+
const CREEP_MS = 120;
|
|
8
|
+
function RouteProgress({ loading = false }) {
|
|
9
|
+
const [progress, setProgress] = useState(null);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (loading) {
|
|
12
|
+
const creep = window.setInterval(() => {
|
|
13
|
+
setProgress((value) => {
|
|
14
|
+
const from = value ?? 0;
|
|
15
|
+
return from >= .9 ? from : from + (.9 - from) * .2;
|
|
16
|
+
});
|
|
17
|
+
}, CREEP_MS);
|
|
18
|
+
return () => window.clearInterval(creep);
|
|
19
|
+
}
|
|
20
|
+
const settle = window.setTimeout(() => {
|
|
21
|
+
setProgress((value) => value === null ? null : 1);
|
|
22
|
+
}, 0);
|
|
23
|
+
const hide = window.setTimeout(() => setProgress(null), FADE_MS);
|
|
24
|
+
return () => {
|
|
25
|
+
window.clearTimeout(settle);
|
|
26
|
+
window.clearTimeout(hide);
|
|
27
|
+
};
|
|
28
|
+
}, [loading]);
|
|
29
|
+
if (progress === null) return null;
|
|
30
|
+
return /* @__PURE__ */ jsx("div", {
|
|
31
|
+
"aria-hidden": true,
|
|
32
|
+
className: styles.bar,
|
|
33
|
+
style: {
|
|
34
|
+
opacity: progress >= 1 ? 0 : 1,
|
|
35
|
+
transform: `scaleX(${progress})`,
|
|
36
|
+
transition: `transform ${FADE_MS}ms ease-out, opacity ${FADE_MS}ms ease-in`
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
RouteProgress.displayName = "RouteProgress";
|
|
41
|
+
//#endregion
|
|
42
|
+
export { RouteProgress as default };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=RouteProgress.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteProgress.mjs","names":[],"sources":["../../../src/dashboard/RouteProgress/RouteProgress.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { styles } from './style';\nimport type { RouteProgressProps } from './type';\n\nconst FADE_MS = 200;\nconst CREEP_MS = 120;\n\nfunction RouteProgress({ loading = false }: RouteProgressProps) {\n const [progress, setProgress] = useState<number | null>(null);\n\n useEffect(() => {\n if (loading) {\n const creep = window.setInterval(() => {\n setProgress((value) => {\n const from = value ?? 0;\n return from >= 0.9 ? from : from + (0.9 - from) * 0.2;\n });\n }, CREEP_MS);\n return () => window.clearInterval(creep);\n }\n\n const settle = window.setTimeout(() => {\n setProgress((value) => (value === null ? null : 1));\n }, 0);\n const hide = window.setTimeout(() => setProgress(null), FADE_MS);\n return () => {\n window.clearTimeout(settle);\n window.clearTimeout(hide);\n };\n }, [loading]);\n\n if (progress === null) return null;\n return (\n <div\n aria-hidden\n className={styles.bar}\n style={{\n opacity: progress >= 1 ? 0 : 1,\n transform: `scaleX(${progress})`,\n transition: `transform ${FADE_MS}ms ease-out, opacity ${FADE_MS}ms ease-in`,\n }}\n />\n );\n}\n\nRouteProgress.displayName = 'RouteProgress';\n\nexport default RouteProgress;\n"],"mappings":";;;;;AAOA,MAAM,UAAU;AAChB,MAAM,WAAW;AAEjB,SAAS,cAAc,EAAE,UAAU,SAA6B;CAC9D,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAE5D,gBAAgB;EACd,IAAI,SAAS;GACX,MAAM,QAAQ,OAAO,kBAAkB;IACrC,aAAa,UAAU;KACrB,MAAM,OAAO,SAAS;KACtB,OAAO,QAAQ,KAAM,OAAO,QAAQ,KAAM,QAAQ;IACpD,CAAC;GACH,GAAG,QAAQ;GACX,aAAa,OAAO,cAAc,KAAK;EACzC;EAEA,MAAM,SAAS,OAAO,iBAAiB;GACrC,aAAa,UAAW,UAAU,OAAO,OAAO,CAAE;EACpD,GAAG,CAAC;EACJ,MAAM,OAAO,OAAO,iBAAiB,YAAY,IAAI,GAAG,OAAO;EAC/D,aAAa;GACX,OAAO,aAAa,MAAM;GAC1B,OAAO,aAAa,IAAI;EAC1B;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,IAAI,aAAa,MAAM,OAAO;CAC9B,OACE,oBAAC,OAAD;EACE,eAAA;EACA,WAAW,OAAO;EAClB,OAAO;GACL,SAAS,YAAY,IAAI,IAAI;GAC7B,WAAW,UAAU,SAAS;GAC9B,YAAY,aAAa,QAAQ,uBAAuB,QAAQ;EAClE;CACD,CAAA;AAEL;AAEA,cAAc,cAAc"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createStaticStyles } from "antd-style";
|
|
2
|
+
//#region src/dashboard/RouteProgress/style.ts
|
|
3
|
+
const styles = createStaticStyles(({ css, cssVar }) => ({ bar: css`
|
|
4
|
+
will-change: transform, opacity;
|
|
5
|
+
|
|
6
|
+
position: fixed;
|
|
7
|
+
z-index: 1000;
|
|
8
|
+
inset-block-start: 0;
|
|
9
|
+
inset-inline: 0;
|
|
10
|
+
transform-origin: 0 50%;
|
|
11
|
+
|
|
12
|
+
block-size: 2px;
|
|
13
|
+
|
|
14
|
+
background: ${cssVar.colorPrimary};
|
|
15
|
+
` }));
|
|
16
|
+
//#endregion
|
|
17
|
+
export { styles };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/dashboard/RouteProgress/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n bar: css`\n will-change: transform, opacity;\n\n position: fixed;\n z-index: 1000;\n inset-block-start: 0;\n inset-inline: 0;\n transform-origin: 0 50%;\n\n block-size: 2px;\n\n background: ${cssVar.colorPrimary};\n `,\n}));\n"],"mappings":";;AAEA,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc,EAC7D,KAAK,GAAG;;;;;;;;;;;kBAWQ,OAAO,aAAa;IAEtC,EAAE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/dashboard/RouteProgress/type.d.ts
|
|
2
|
+
interface RouteProgressProps {
|
|
3
|
+
/** While true, the bar creeps toward the end. When it becomes false, the bar finishes and fades. */
|
|
4
|
+
loading?: boolean;
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { RouteProgressProps };
|
|
8
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { StatCardProps } from "./type.mjs";
|
|
2
|
+
//#region src/dashboard/StatCard/StatCard.d.ts
|
|
3
|
+
declare function StatCard({ action, delta, direction, hint, label, mark, prominent, value, wash }: StatCardProps): import("react").JSX.Element;
|
|
4
|
+
declare namespace StatCard {
|
|
5
|
+
var displayName: string;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { StatCard as default };
|
|
9
|
+
//# sourceMappingURL=StatCard.d.mts.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
3
|
+
import Block from "../../Block/Block.mjs";
|
|
4
|
+
import Icon from "../../Icon/Icon.mjs";
|
|
5
|
+
import Text from "../../base-ui/Text/Text.mjs";
|
|
6
|
+
import { styles } from "../Surface/style.mjs";
|
|
7
|
+
import { styles as styles$1 } from "./style.mjs";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { Minus, TrendingDown, TrendingUp } from "lucide-react";
|
|
10
|
+
//#region src/dashboard/StatCard/StatCard.tsx
|
|
11
|
+
const deltaIcon = {
|
|
12
|
+
down: TrendingDown,
|
|
13
|
+
flat: Minus,
|
|
14
|
+
up: TrendingUp
|
|
15
|
+
};
|
|
16
|
+
function StatCard({ action, delta, direction = "flat", hint, label, mark, prominent = false, value, wash }) {
|
|
17
|
+
const deltaClass = {
|
|
18
|
+
down: styles$1.deltaDown,
|
|
19
|
+
flat: styles$1.deltaFlat,
|
|
20
|
+
up: styles$1.deltaUp
|
|
21
|
+
}[direction];
|
|
22
|
+
return /* @__PURE__ */ jsx("div", {
|
|
23
|
+
className: styles$1.lift,
|
|
24
|
+
children: /* @__PURE__ */ jsx(Block, {
|
|
25
|
+
className: `${styles$1.root} ${styles.card}${wash ? ` ${styles$1.wash} ${styles$1[wash]}` : ""} ${styles$1.frame}`,
|
|
26
|
+
variant: "borderless",
|
|
27
|
+
children: /* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
28
|
+
className: styles$1.body,
|
|
29
|
+
gap: prominent ? 0 : 8,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
32
|
+
horizontal: true,
|
|
33
|
+
align: "center",
|
|
34
|
+
justify: "space-between",
|
|
35
|
+
children: [/* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
36
|
+
horizontal: true,
|
|
37
|
+
align: "center",
|
|
38
|
+
className: styles$1.copy,
|
|
39
|
+
gap: 6,
|
|
40
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
41
|
+
ellipsis: true,
|
|
42
|
+
className: prominent ? styles$1.metricLabel : styles$1.label,
|
|
43
|
+
children: label
|
|
44
|
+
}), action]
|
|
45
|
+
}), mark ? /* @__PURE__ */ jsx("span", {
|
|
46
|
+
"aria-hidden": true,
|
|
47
|
+
className: styles$1.badge,
|
|
48
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
49
|
+
icon: mark,
|
|
50
|
+
size: 14
|
|
51
|
+
})
|
|
52
|
+
}) : null]
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ jsx("div", {
|
|
55
|
+
className: prominent ? styles$1.metricValue : styles$1.value,
|
|
56
|
+
children: value
|
|
57
|
+
}),
|
|
58
|
+
delta || hint ? /* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
59
|
+
horizontal: true,
|
|
60
|
+
align: "center",
|
|
61
|
+
className: prominent ? styles$1.metricFoot : void 0,
|
|
62
|
+
gap: 8,
|
|
63
|
+
wrap: "wrap",
|
|
64
|
+
children: [delta ? /* @__PURE__ */ jsxs("span", {
|
|
65
|
+
className: `${styles$1.delta} ${deltaClass}`,
|
|
66
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
67
|
+
icon: deltaIcon[direction],
|
|
68
|
+
size: 14
|
|
69
|
+
}), delta]
|
|
70
|
+
}) : null, hint ? /* @__PURE__ */ jsx(Text, {
|
|
71
|
+
className: prominent ? styles$1.metricHint : styles$1.hint,
|
|
72
|
+
children: hint
|
|
73
|
+
}) : null]
|
|
74
|
+
}) : null
|
|
75
|
+
]
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
StatCard.displayName = "StatCard";
|
|
81
|
+
//#endregion
|
|
82
|
+
export { StatCard as default };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=StatCard.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatCard.mjs","names":["styles","surfaceStyles","Flexbox"],"sources":["../../../src/dashboard/StatCard/StatCard.tsx"],"sourcesContent":["'use client';\n\nimport { Minus, TrendingDown, TrendingUp } from 'lucide-react';\n\nimport Text from '@/base-ui/Text';\nimport Block from '@/Block';\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { styles as surfaceStyles } from '../Surface/style';\nimport { styles } from './style';\nimport type { StatCardProps, StatDirection } from './type';\n\nconst deltaIcon = {\n down: TrendingDown,\n flat: Minus,\n up: TrendingUp,\n} satisfies Record<StatDirection, typeof Minus>;\n\nfunction StatCard({\n action,\n delta,\n direction = 'flat',\n hint,\n label,\n mark,\n prominent = false,\n value,\n wash,\n}: StatCardProps) {\n const deltaClass = {\n down: styles.deltaDown,\n flat: styles.deltaFlat,\n up: styles.deltaUp,\n }[direction];\n\n return (\n <div className={styles.lift}>\n <Block\n className={`${styles.root} ${surfaceStyles.card}${wash ? ` ${styles.wash} ${styles[wash]}` : ''} ${styles.frame}`}\n variant=\"borderless\"\n >\n <Flexbox className={styles.body} gap={prominent ? 0 : 8}>\n <Flexbox horizontal align=\"center\" justify=\"space-between\">\n <Flexbox horizontal align=\"center\" className={styles.copy} gap={6}>\n <Text ellipsis className={prominent ? styles.metricLabel : styles.label}>\n {label}\n </Text>\n {action}\n </Flexbox>\n {mark ? (\n <span aria-hidden className={styles.badge}>\n <Icon icon={mark} size={14} />\n </span>\n ) : null}\n </Flexbox>\n <div className={prominent ? styles.metricValue : styles.value}>{value}</div>\n {delta || hint ? (\n <Flexbox\n horizontal\n align=\"center\"\n className={prominent ? styles.metricFoot : undefined}\n gap={8}\n wrap=\"wrap\"\n >\n {delta ? (\n <span className={`${styles.delta} ${deltaClass}`}>\n <Icon icon={deltaIcon[direction]} size={14} />\n {delta}\n </span>\n ) : null}\n {hint ? (\n <Text className={prominent ? styles.metricHint : styles.hint}>{hint}</Text>\n ) : null}\n </Flexbox>\n ) : null}\n </Flexbox>\n </Block>\n </div>\n );\n}\n\nStatCard.displayName = 'StatCard';\n\nexport default StatCard;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,YAAY;CAChB,MAAM;CACN,MAAM;CACN,IAAI;AACN;AAEA,SAAS,SAAS,EAChB,QACA,OACA,YAAY,QACZ,MACA,OACA,MACA,YAAY,OACZ,OACA,QACgB;CAChB,MAAM,aAAa;EACjB,MAAMA,SAAO;EACb,MAAMA,SAAO;EACb,IAAIA,SAAO;CACb,EAAE;CAEF,OACE,oBAAC,OAAD;EAAK,WAAWA,SAAO;EACrB,UAAA,oBAAC,OAAD;GACE,WAAW,GAAGA,SAAO,KAAK,GAAGC,OAAc,OAAO,OAAO,IAAID,SAAO,KAAK,GAAGA,SAAO,UAAU,GAAG,GAAGA,SAAO;GAC1G,SAAQ;GAER,UAAA,qBAACE,mBAAD;IAAS,WAAWF,SAAO;IAAM,KAAK,YAAY,IAAI;IAAtD,UAAA;KACE,qBAACE,mBAAD;MAAS,YAAA;MAAW,OAAM;MAAS,SAAQ;MAA3C,UAAA,CACE,qBAACA,mBAAD;OAAS,YAAA;OAAW,OAAM;OAAS,WAAWF,SAAO;OAAM,KAAK;OAAhE,UAAA,CACE,oBAAC,MAAD;QAAM,UAAA;QAAS,WAAW,YAAYA,SAAO,cAAcA,SAAO;QAC/D,UAAA;OACG,CAAA,GACL,MACM;MACR,CAAA,GAAA,OACC,oBAAC,QAAD;OAAM,eAAA;OAAY,WAAWA,SAAO;OAClC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAM,MAAM;OAAK,CAAA;MACzB,CAAA,IACJ,IACG;;KACT,oBAAC,OAAD;MAAK,WAAW,YAAYA,SAAO,cAAcA,SAAO;MAAQ,UAAA;KAAW,CAAA;KAC1E,SAAS,OACR,qBAACE,mBAAD;MACE,YAAA;MACA,OAAM;MACN,WAAW,YAAYF,SAAO,aAAa,KAAA;MAC3C,KAAK;MACL,MAAK;MALP,UAAA,CAOG,QACC,qBAAC,QAAD;OAAM,WAAW,GAAGA,SAAO,MAAM,GAAG;OAApC,UAAA,CACE,oBAAC,MAAD;QAAM,MAAM,UAAU;QAAY,MAAM;OAAK,CAAA,GAC5C,KACG;MACJ,CAAA,IAAA,MACH,OACC,oBAAC,MAAD;OAAM,WAAW,YAAYA,SAAO,aAAaA,SAAO;OAAO,UAAA;MAAW,CAAA,IACxE,IACG;KACP,CAAA,IAAA;IACG;;EACJ,CAAA;CACJ,CAAA;AAET;AAEA,SAAS,cAAc"}
|