@lobehub/ui 5.48.2 → 5.49.1

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.
Files changed (205) hide show
  1. package/es/Highlighter/FullFeatured.mjs +1 -1
  2. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  3. package/es/Highlighter/LangSelect.mjs +1 -1
  4. package/es/Highlighter/LangSelect.mjs.map +1 -1
  5. package/es/Highlighter/style.mjs +14 -11
  6. package/es/Highlighter/style.mjs.map +1 -1
  7. package/es/Markdown/type.d.mts +1 -0
  8. package/es/Mermaid/FullFeatured.mjs +1 -1
  9. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  10. package/es/ThemeProvider/ThemeProvider.mjs +2 -2
  11. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
  12. package/es/awesome/AgentSkillCard/AgentSkillCard.d.mts +6 -0
  13. package/es/awesome/AgentSkillCard/AgentSkillCard.mjs +83 -0
  14. package/es/awesome/AgentSkillCard/AgentSkillCard.mjs.map +1 -0
  15. package/es/awesome/AgentSkillCard/agents.d.mts +6 -0
  16. package/es/awesome/AgentSkillCard/agents.mjs +40 -0
  17. package/es/awesome/AgentSkillCard/agents.mjs.map +1 -0
  18. package/es/awesome/AgentSkillCard/index.d.mts +4 -0
  19. package/es/awesome/AgentSkillCard/style.mjs +85 -0
  20. package/es/awesome/AgentSkillCard/style.mjs.map +1 -0
  21. package/es/awesome/AgentSkillCard/type.d.mts +41 -0
  22. package/es/awesome/BentoGrid/BentoCard.d.mts +6 -0
  23. package/es/awesome/BentoGrid/BentoCard.mjs +39 -0
  24. package/es/awesome/BentoGrid/BentoCard.mjs.map +1 -0
  25. package/es/awesome/BentoGrid/BentoGrid.d.mts +6 -0
  26. package/es/awesome/BentoGrid/BentoGrid.mjs +20 -0
  27. package/es/awesome/BentoGrid/BentoGrid.mjs.map +1 -0
  28. package/es/awesome/BentoGrid/index.d.mts +4 -0
  29. package/es/awesome/BentoGrid/style.mjs +102 -0
  30. package/es/awesome/BentoGrid/style.mjs.map +1 -0
  31. package/es/awesome/BentoGrid/type.d.mts +40 -0
  32. package/es/awesome/CodeShowcase/CodeShowcase.d.mts +6 -0
  33. package/es/awesome/CodeShowcase/CodeShowcase.mjs +51 -0
  34. package/es/awesome/CodeShowcase/CodeShowcase.mjs.map +1 -0
  35. package/es/awesome/CodeShowcase/index.d.mts +3 -0
  36. package/es/awesome/CodeShowcase/style.mjs +50 -0
  37. package/es/awesome/CodeShowcase/style.mjs.map +1 -0
  38. package/es/awesome/CodeShowcase/type.d.mts +27 -0
  39. package/es/awesome/FeatureGrid/FeatureGrid.d.mts +6 -0
  40. package/es/awesome/FeatureGrid/FeatureGrid.mjs +48 -0
  41. package/es/awesome/FeatureGrid/FeatureGrid.mjs.map +1 -0
  42. package/es/awesome/FeatureGrid/index.d.mts +3 -0
  43. package/es/awesome/FeatureGrid/style.mjs +75 -0
  44. package/es/awesome/FeatureGrid/style.mjs.map +1 -0
  45. package/es/awesome/FeatureGrid/type.d.mts +25 -0
  46. package/es/awesome/FluidGradient/FluidGradient.d.mts +6 -0
  47. package/es/awesome/FluidGradient/FluidGradient.mjs +293 -0
  48. package/es/awesome/FluidGradient/FluidGradient.mjs.map +1 -0
  49. package/es/awesome/FluidGradient/index.d.mts +3 -0
  50. package/es/awesome/FluidGradient/style.mjs +52 -0
  51. package/es/awesome/FluidGradient/style.mjs.map +1 -0
  52. package/es/awesome/FluidGradient/type.d.mts +22 -0
  53. package/es/awesome/InstallBanner/InstallBanner.d.mts +6 -0
  54. package/es/awesome/InstallBanner/InstallBanner.mjs +35 -0
  55. package/es/awesome/InstallBanner/InstallBanner.mjs.map +1 -0
  56. package/es/awesome/InstallBanner/index.d.mts +3 -0
  57. package/es/awesome/InstallBanner/style.mjs +46 -0
  58. package/es/awesome/InstallBanner/style.mjs.map +1 -0
  59. package/es/awesome/InstallBanner/type.d.mts +18 -0
  60. package/es/awesome/LandingHero/LandingHero.d.mts +6 -0
  61. package/es/awesome/LandingHero/LandingHero.mjs +55 -0
  62. package/es/awesome/LandingHero/LandingHero.mjs.map +1 -0
  63. package/es/awesome/LandingHero/index.d.mts +3 -0
  64. package/es/awesome/LandingHero/style.mjs +155 -0
  65. package/es/awesome/LandingHero/style.mjs.map +1 -0
  66. package/es/awesome/LandingHero/type.d.mts +29 -0
  67. package/es/awesome/LandingSection/LandingSection.d.mts +6 -0
  68. package/es/awesome/LandingSection/LandingSection.mjs +61 -0
  69. package/es/awesome/LandingSection/LandingSection.mjs.map +1 -0
  70. package/es/awesome/LandingSection/index.d.mts +3 -0
  71. package/es/awesome/LandingSection/style.mjs +88 -0
  72. package/es/awesome/LandingSection/style.mjs.map +1 -0
  73. package/es/awesome/LandingSection/type.d.mts +40 -0
  74. package/es/awesome/LogoMarquee/LogoMarquee.d.mts +6 -0
  75. package/es/awesome/LogoMarquee/LogoMarquee.mjs +52 -0
  76. package/es/awesome/LogoMarquee/LogoMarquee.mjs.map +1 -0
  77. package/es/awesome/LogoMarquee/index.d.mts +3 -0
  78. package/es/awesome/LogoMarquee/style.mjs +70 -0
  79. package/es/awesome/LogoMarquee/style.mjs.map +1 -0
  80. package/es/awesome/LogoMarquee/type.d.mts +40 -0
  81. package/es/awesome/index.d.mts +33 -1
  82. package/es/awesome/index.mjs +13 -1
  83. package/es/awesome/landingActions.d.mts +20 -0
  84. package/es/awesome/landingActions.mjs +123 -0
  85. package/es/awesome/landingActions.mjs.map +1 -0
  86. package/es/awesome/landingIcon.mjs +13 -0
  87. package/es/awesome/landingIcon.mjs.map +1 -0
  88. package/es/awesome/landingLink.d.mts +12 -0
  89. package/es/awesome/landingLink.mjs +23 -0
  90. package/es/awesome/landingLink.mjs.map +1 -0
  91. package/es/awesome/landingTokens.d.mts +10 -0
  92. package/es/awesome/landingTokens.mjs +19 -0
  93. package/es/awesome/landingTokens.mjs.map +1 -0
  94. package/es/base-ui/Segmented/atoms.mjs +1 -0
  95. package/es/base-ui/Segmented/atoms.mjs.map +1 -1
  96. package/es/base-ui/Segmented/style.mjs +127 -125
  97. package/es/base-ui/Segmented/style.mjs.map +1 -1
  98. package/es/base-ui/index.mjs +4 -4
  99. package/es/dashboard/AuthLayout/AuthLayout.d.mts +9 -0
  100. package/es/dashboard/AuthLayout/AuthLayout.mjs +54 -0
  101. package/es/dashboard/AuthLayout/AuthLayout.mjs.map +1 -0
  102. package/es/dashboard/AuthLayout/index.d.mts +3 -0
  103. package/es/dashboard/AuthLayout/style.mjs +120 -0
  104. package/es/dashboard/AuthLayout/style.mjs.map +1 -0
  105. package/es/dashboard/AuthLayout/type.d.mts +16 -0
  106. package/es/dashboard/Breadcrumb/Breadcrumb.d.mts +9 -0
  107. package/es/dashboard/Breadcrumb/Breadcrumb.mjs +55 -0
  108. package/es/dashboard/Breadcrumb/Breadcrumb.mjs.map +1 -0
  109. package/es/dashboard/Breadcrumb/index.d.mts +3 -0
  110. package/es/dashboard/Breadcrumb/style.mjs +66 -0
  111. package/es/dashboard/Breadcrumb/style.mjs.map +1 -0
  112. package/es/dashboard/Breadcrumb/type.d.mts +25 -0
  113. package/es/dashboard/ConsoleNav/ConsoleNav.d.mts +9 -0
  114. package/es/dashboard/ConsoleNav/ConsoleNav.mjs +275 -0
  115. package/es/dashboard/ConsoleNav/ConsoleNav.mjs.map +1 -0
  116. package/es/dashboard/ConsoleNav/active.d.mts +7 -0
  117. package/es/dashboard/ConsoleNav/active.mjs +29 -0
  118. package/es/dashboard/ConsoleNav/active.mjs.map +1 -0
  119. package/es/dashboard/ConsoleNav/index.d.mts +4 -0
  120. package/es/dashboard/ConsoleNav/style.mjs +283 -0
  121. package/es/dashboard/ConsoleNav/style.mjs.map +1 -0
  122. package/es/dashboard/ConsoleNav/type.d.mts +71 -0
  123. package/es/dashboard/ConsoleShell/ConsoleBrand.d.mts +9 -0
  124. package/es/dashboard/ConsoleShell/ConsoleBrand.mjs +37 -0
  125. package/es/dashboard/ConsoleShell/ConsoleBrand.mjs.map +1 -0
  126. package/es/dashboard/ConsoleShell/ConsoleShell.d.mts +9 -0
  127. package/es/dashboard/ConsoleShell/ConsoleShell.mjs +149 -0
  128. package/es/dashboard/ConsoleShell/ConsoleShell.mjs.map +1 -0
  129. package/es/dashboard/ConsoleShell/context.d.mts +6 -0
  130. package/es/dashboard/ConsoleShell/context.mjs +16 -0
  131. package/es/dashboard/ConsoleShell/context.mjs.map +1 -0
  132. package/es/dashboard/ConsoleShell/index.d.mts +5 -0
  133. package/es/dashboard/ConsoleShell/style.mjs +209 -0
  134. package/es/dashboard/ConsoleShell/style.mjs.map +1 -0
  135. package/es/dashboard/ConsoleShell/type.d.mts +67 -0
  136. package/es/dashboard/FilterSidebar/FilterSidebar.d.mts +17 -0
  137. package/es/dashboard/FilterSidebar/FilterSidebar.mjs +151 -0
  138. package/es/dashboard/FilterSidebar/FilterSidebar.mjs.map +1 -0
  139. package/es/dashboard/FilterSidebar/context.d.mts +7 -0
  140. package/es/dashboard/FilterSidebar/context.mjs +19 -0
  141. package/es/dashboard/FilterSidebar/context.mjs.map +1 -0
  142. package/es/dashboard/FilterSidebar/index.d.mts +4 -0
  143. package/es/dashboard/FilterSidebar/style.mjs +155 -0
  144. package/es/dashboard/FilterSidebar/style.mjs.map +1 -0
  145. package/es/dashboard/FilterSidebar/type.d.mts +44 -0
  146. package/es/dashboard/FilterSidebar/width.mjs +18 -0
  147. package/es/dashboard/FilterSidebar/width.mjs.map +1 -0
  148. package/es/dashboard/PageHeader/PageHeader.d.mts +9 -0
  149. package/es/dashboard/PageHeader/PageHeader.mjs +37 -0
  150. package/es/dashboard/PageHeader/PageHeader.mjs.map +1 -0
  151. package/es/dashboard/PageHeader/index.d.mts +3 -0
  152. package/es/dashboard/PageHeader/style.mjs +47 -0
  153. package/es/dashboard/PageHeader/style.mjs.map +1 -0
  154. package/es/dashboard/PageHeader/type.d.mts +14 -0
  155. package/es/dashboard/PageSkeleton/PageSkeleton.d.mts +25 -0
  156. package/es/dashboard/PageSkeleton/PageSkeleton.mjs +136 -0
  157. package/es/dashboard/PageSkeleton/PageSkeleton.mjs.map +1 -0
  158. package/es/dashboard/PageSkeleton/style.mjs +122 -0
  159. package/es/dashboard/PageSkeleton/style.mjs.map +1 -0
  160. package/es/dashboard/PageSkeleton/type.d.mts +22 -0
  161. package/es/dashboard/PageTabs/PageTabs.d.mts +9 -0
  162. package/es/dashboard/PageTabs/PageTabs.mjs +37 -0
  163. package/es/dashboard/PageTabs/PageTabs.mjs.map +1 -0
  164. package/es/dashboard/PageTabs/index.d.mts +3 -0
  165. package/es/dashboard/PageTabs/style.mjs +57 -0
  166. package/es/dashboard/PageTabs/style.mjs.map +1 -0
  167. package/es/dashboard/PageTabs/type.d.mts +17 -0
  168. package/es/dashboard/RouteProgress/RouteProgress.d.mts +9 -0
  169. package/es/dashboard/RouteProgress/RouteProgress.mjs +44 -0
  170. package/es/dashboard/RouteProgress/RouteProgress.mjs.map +1 -0
  171. package/es/dashboard/RouteProgress/style.mjs +19 -0
  172. package/es/dashboard/RouteProgress/style.mjs.map +1 -0
  173. package/es/dashboard/RouteProgress/type.d.mts +8 -0
  174. package/es/dashboard/StatCard/StatCard.d.mts +9 -0
  175. package/es/dashboard/StatCard/StatCard.mjs +84 -0
  176. package/es/dashboard/StatCard/StatCard.mjs.map +1 -0
  177. package/es/dashboard/StatCard/index.d.mts +3 -0
  178. package/es/dashboard/StatCard/style.mjs +135 -0
  179. package/es/dashboard/StatCard/style.mjs.map +1 -0
  180. package/es/dashboard/StatCard/type.d.mts +26 -0
  181. package/es/dashboard/Surface/Surface.d.mts +13 -0
  182. package/es/dashboard/Surface/Surface.mjs +20 -0
  183. package/es/dashboard/Surface/Surface.mjs.map +1 -0
  184. package/es/dashboard/Surface/index.d.mts +4 -0
  185. package/es/dashboard/Surface/style.d.mts +14 -0
  186. package/es/dashboard/Surface/style.mjs +22 -0
  187. package/es/dashboard/Surface/style.mjs.map +1 -0
  188. package/es/dashboard/Surface/type.d.mts +8 -0
  189. package/es/dashboard/hooks.mjs +49 -0
  190. package/es/dashboard/hooks.mjs.map +1 -0
  191. package/es/dashboard/index.d.mts +37 -0
  192. package/es/dashboard/index.d.ts +1 -0
  193. package/es/dashboard/index.js +1 -0
  194. package/es/dashboard/index.mjs +17 -0
  195. package/es/hooks/useMarkdown/useMarkdownRehypePlugins.mjs +2 -0
  196. package/es/hooks/useMarkdown/useMarkdownRehypePlugins.mjs.map +1 -1
  197. package/es/static-css/registry.mjs +2 -2
  198. package/es/static-css/registry.mjs.map +1 -1
  199. package/es/storybook/StoryBook/index.mjs +4 -0
  200. package/es/storybook/StoryBook/index.mjs.map +1 -1
  201. package/es/storybook/StoryBook/style.mjs +7 -2
  202. package/es/storybook/StoryBook/style.mjs.map +1 -1
  203. package/es/styles/theme/token/base.mjs +2 -2
  204. package/es/styles/theme/token/base.mjs.map +1 -1
  205. package/package.json +7 -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,3 @@
1
+ import { PageTab, PageTabsProps } from "./type.mjs";
2
+ import PageTabs from "./PageTabs.mjs";
3
+ export { type PageTab, type PageTabsProps, PageTabs as default };
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { StatCardProps, StatDirection, StatWash } from "./type.mjs";
2
+ import StatCard from "./StatCard.mjs";
3
+ export { type StatCardProps, type StatDirection, StatCard as default };