@lobehub/ui 5.59.0 → 5.61.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.
Files changed (164) hide show
  1. package/es/ActionIcon/style.mjs +8 -2
  2. package/es/ActionIcon/style.mjs.map +1 -1
  3. package/es/EmojiPicker/AvatarUploader.mjs +1 -1
  4. package/es/Form/components/FormSubmitFooter.mjs +1 -1
  5. package/es/awesome/Grainient/Grainient.d.mts +11 -0
  6. package/es/awesome/Grainient/Grainient.mjs +311 -0
  7. package/es/awesome/Grainient/Grainient.mjs.map +1 -0
  8. package/es/awesome/Grainient/index.d.mts +3 -0
  9. package/es/awesome/Grainient/style.mjs +25 -0
  10. package/es/awesome/Grainient/style.mjs.map +1 -0
  11. package/es/awesome/Grainient/type.d.mts +122 -0
  12. package/es/awesome/index.d.mts +4 -1
  13. package/es/awesome/index.mjs +2 -1
  14. package/es/base-ui/ActionIcon/style.mjs +8 -2
  15. package/es/base-ui/ActionIcon/style.mjs.map +1 -1
  16. package/es/base-ui/Input/style.d.mts +1 -1
  17. package/es/base-ui/Pagination/Pagination.mjs +158 -41
  18. package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
  19. package/es/base-ui/Pagination/helpers.mjs +3 -3
  20. package/es/base-ui/Pagination/helpers.mjs.map +1 -1
  21. package/es/base-ui/Pagination/index.d.mts +2 -2
  22. package/es/base-ui/Pagination/style.mjs +39 -0
  23. package/es/base-ui/Pagination/style.mjs.map +1 -1
  24. package/es/base-ui/Pagination/type.d.mts +42 -4
  25. package/es/base-ui/QRCode/QRCode.mjs +1 -1
  26. package/es/base-ui/Table/Column.d.mts +9 -0
  27. package/es/base-ui/Table/Column.mjs +7 -0
  28. package/es/base-ui/Table/Column.mjs.map +1 -0
  29. package/es/base-ui/Table/ColumnGroup.d.mts +12 -0
  30. package/es/base-ui/Table/ColumnGroup.mjs +7 -0
  31. package/es/base-ui/Table/ColumnGroup.mjs.map +1 -0
  32. package/es/base-ui/Table/ExpandIcon.mjs +33 -0
  33. package/es/base-ui/Table/ExpandIcon.mjs.map +1 -0
  34. package/es/base-ui/Table/FilterDropdown.mjs +284 -0
  35. package/es/base-ui/Table/FilterDropdown.mjs.map +1 -0
  36. package/es/base-ui/Table/LoadingSkeleton.mjs +83 -0
  37. package/es/base-ui/Table/LoadingSkeleton.mjs.map +1 -0
  38. package/es/base-ui/Table/Table.d.mts +21 -3
  39. package/es/base-ui/Table/Table.mjs +444 -97
  40. package/es/base-ui/Table/Table.mjs.map +1 -1
  41. package/es/base-ui/Table/columnUtils.mjs +56 -0
  42. package/es/base-ui/Table/columnUtils.mjs.map +1 -0
  43. package/es/base-ui/Table/index.d.mts +4 -2
  44. package/es/base-ui/Table/selectionUtils.d.mts +9 -0
  45. package/es/base-ui/Table/selectionUtils.mjs +128 -0
  46. package/es/base-ui/Table/selectionUtils.mjs.map +1 -0
  47. package/es/base-ui/Table/semantic.mjs +55 -0
  48. package/es/base-ui/Table/semantic.mjs.map +1 -0
  49. package/es/base-ui/Table/style.mjs +801 -161
  50. package/es/base-ui/Table/style.mjs.map +1 -1
  51. package/es/base-ui/Table/type.d.mts +471 -37
  52. package/es/base-ui/Table/useBreakpoint.mjs +41 -0
  53. package/es/base-ui/Table/useBreakpoint.mjs.map +1 -0
  54. package/es/base-ui/Table/useFilter.mjs +64 -0
  55. package/es/base-ui/Table/useFilter.mjs.map +1 -0
  56. package/es/base-ui/Table/useSelection.mjs +421 -0
  57. package/es/base-ui/Table/useSelection.mjs.map +1 -0
  58. package/es/base-ui/Table/useSorter.mjs +152 -0
  59. package/es/base-ui/Table/useSorter.mjs.map +1 -0
  60. package/es/base-ui/Table/useTableState.mjs +82 -55
  61. package/es/base-ui/Table/useTableState.mjs.map +1 -1
  62. package/es/base-ui/index.d.mts +6 -4
  63. package/es/base-ui/index.mjs +9 -9
  64. package/es/chat/EditableMessageList/EditableMessageList.mjs +1 -1
  65. package/es/chat/MessageInput/MessageInput.mjs +1 -1
  66. package/es/chat/MessageModal/MessageModal.mjs +1 -1
  67. package/es/chat/TokenTag/TokenTag.mjs +1 -1
  68. package/es/dashboard/AuthLayout/Aside.d.mts +10 -0
  69. package/es/dashboard/AuthLayout/Aside.mjs +30 -0
  70. package/es/dashboard/AuthLayout/Aside.mjs.map +1 -0
  71. package/es/dashboard/AuthLayout/AuthLayout.d.mts +3 -1
  72. package/es/dashboard/AuthLayout/AuthLayout.mjs +93 -37
  73. package/es/dashboard/AuthLayout/AuthLayout.mjs.map +1 -1
  74. package/es/dashboard/AuthLayout/index.d.mts +3 -2
  75. package/es/dashboard/AuthLayout/style.mjs +120 -1
  76. package/es/dashboard/AuthLayout/style.mjs.map +1 -1
  77. package/es/dashboard/AuthLayout/type.d.mts +39 -3
  78. package/es/dashboard/AuthTools/AuthLocaleSwitch.d.mts +10 -0
  79. package/es/dashboard/AuthTools/AuthLocaleSwitch.mjs +32 -0
  80. package/es/dashboard/AuthTools/AuthLocaleSwitch.mjs.map +1 -0
  81. package/es/dashboard/AuthTools/AuthThemeSwitch.d.mts +10 -0
  82. package/es/dashboard/AuthTools/AuthThemeSwitch.mjs +59 -0
  83. package/es/dashboard/AuthTools/AuthThemeSwitch.mjs.map +1 -0
  84. package/es/dashboard/AuthTools/index.d.mts +4 -0
  85. package/es/dashboard/AuthTools/style.mjs +63 -0
  86. package/es/dashboard/AuthTools/style.mjs.map +1 -0
  87. package/es/dashboard/AuthTools/type.d.mts +30 -0
  88. package/es/dashboard/ConsoleNav/Skeleton.d.mts +15 -0
  89. package/es/dashboard/ConsoleNav/Skeleton.mjs +81 -0
  90. package/es/dashboard/ConsoleNav/Skeleton.mjs.map +1 -0
  91. package/es/dashboard/ConsoleNav/index.d.mts +3 -2
  92. package/es/dashboard/ConsoleNav/style.mjs +15 -0
  93. package/es/dashboard/ConsoleNav/style.mjs.map +1 -1
  94. package/es/dashboard/ConsoleNav/type.d.mts +14 -1
  95. package/es/dashboard/ConsoleShell/ConsoleShell.d.mts +1 -1
  96. package/es/dashboard/ConsoleShell/ConsoleShell.mjs +11 -3
  97. package/es/dashboard/ConsoleShell/ConsoleShell.mjs.map +1 -1
  98. package/es/dashboard/ConsoleShell/style.mjs +6 -0
  99. package/es/dashboard/ConsoleShell/style.mjs.map +1 -1
  100. package/es/dashboard/ConsoleShell/type.d.mts +9 -0
  101. package/es/dashboard/FilterSidebar/FilterSidebar.mjs +18 -17
  102. package/es/dashboard/FilterSidebar/FilterSidebar.mjs.map +1 -1
  103. package/es/dashboard/FilterStrip/FilterStrip.mjs +36 -32
  104. package/es/dashboard/FilterStrip/FilterStrip.mjs.map +1 -1
  105. package/es/dashboard/FilterStrip/style.mjs +2 -1
  106. package/es/dashboard/FilterStrip/style.mjs.map +1 -1
  107. package/es/dashboard/MetricStrip/MetricCell.mjs +81 -0
  108. package/es/dashboard/MetricStrip/MetricCell.mjs.map +1 -0
  109. package/es/dashboard/MetricStrip/MetricStrip.d.mts +5 -2
  110. package/es/dashboard/MetricStrip/MetricStrip.mjs +33 -62
  111. package/es/dashboard/MetricStrip/MetricStrip.mjs.map +1 -1
  112. package/es/dashboard/MetricStrip/style.mjs +49 -4
  113. package/es/dashboard/MetricStrip/style.mjs.map +1 -1
  114. package/es/dashboard/MetricStrip/type.d.mts +12 -0
  115. package/es/dashboard/PageSkeleton/PageSkeleton.mjs +20 -18
  116. package/es/dashboard/PageSkeleton/PageSkeleton.mjs.map +1 -1
  117. package/es/dashboard/PageSkeleton/style.mjs +1 -1
  118. package/es/dashboard/PageSkeleton/style.mjs.map +1 -1
  119. package/es/dashboard/PanelSurface/PanelSurface.mjs +4 -1
  120. package/es/dashboard/PanelSurface/PanelSurface.mjs.map +1 -1
  121. package/es/dashboard/StatCard/StatCard.d.mts +2 -1
  122. package/es/dashboard/StatCard/StatCard.mjs +24 -72
  123. package/es/dashboard/StatCard/StatCard.mjs.map +1 -1
  124. package/es/dashboard/StatCard/type.d.mts +16 -5
  125. package/es/dashboard/Surface/Surface.mjs +26 -10
  126. package/es/dashboard/Surface/Surface.mjs.map +1 -1
  127. package/es/dashboard/Surface/index.d.mts +2 -2
  128. package/es/dashboard/Surface/link.d.mts +6 -1
  129. package/es/dashboard/Surface/link.mjs +12 -1
  130. package/es/dashboard/Surface/link.mjs.map +1 -1
  131. package/es/dashboard/Surface/style.d.mts +22 -3
  132. package/es/dashboard/Surface/style.mjs +95 -26
  133. package/es/dashboard/Surface/style.mjs.map +1 -1
  134. package/es/dashboard/index.d.mts +10 -4
  135. package/es/dashboard/index.mjs +7 -3
  136. package/es/i18n/resources/en/index.d.mts +3 -2
  137. package/es/i18n/resources/en/index.mjs +4 -2
  138. package/es/i18n/resources/en/index.mjs.map +1 -1
  139. package/es/i18n/resources/en/table.d.mts +23 -0
  140. package/es/i18n/resources/en/table.mjs +24 -0
  141. package/es/i18n/resources/en/table.mjs.map +1 -0
  142. package/es/i18n/resources/zhCn/index.d.mts +3 -2
  143. package/es/i18n/resources/zhCn/index.mjs +4 -2
  144. package/es/i18n/resources/zhCn/index.mjs.map +1 -1
  145. package/es/i18n/resources/zhCn/table.d.mts +23 -0
  146. package/es/i18n/resources/zhCn/table.mjs +24 -0
  147. package/es/i18n/resources/zhCn/table.mjs.map +1 -0
  148. package/es/i18n/types.d.mts +2 -1
  149. package/es/index.mjs +2 -2
  150. package/package.json +2 -2
  151. package/es/base-ui/Table/FilterMenu.mjs +0 -45
  152. package/es/base-ui/Table/FilterMenu.mjs.map +0 -1
  153. package/es/base-ui/Table/TableBody.mjs +0 -59
  154. package/es/base-ui/Table/TableBody.mjs.map +0 -1
  155. package/es/base-ui/Table/TableHead.mjs +0 -50
  156. package/es/base-ui/Table/TableHead.mjs.map +0 -1
  157. package/es/base-ui/Table/features.mjs +0 -12
  158. package/es/base-ui/Table/features.mjs.map +0 -1
  159. package/es/base-ui/Table/fixedOffsets.mjs +0 -29
  160. package/es/base-ui/Table/fixedOffsets.mjs.map +0 -1
  161. package/es/base-ui/Table/toColumnDefs.mjs +0 -26
  162. package/es/base-ui/Table/toColumnDefs.mjs.map +0 -1
  163. package/es/dashboard/StatCard/style.mjs +0 -135
  164. package/es/dashboard/StatCard/style.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
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";
3
+ import { useSurfaceCardClassName } from "../Surface/link.mjs";
4
+ import { styles } from "./style.mjs";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/dashboard/PageSkeleton/PageSkeleton.tsx
7
7
  const bone = {
@@ -17,7 +17,7 @@ const lineWidths = [
17
17
  function LoadingAnnouncer({ label }) {
18
18
  return /* @__PURE__ */ jsx("output", {
19
19
  "aria-live": "polite",
20
- className: styles$1.srOnly,
20
+ className: styles.srOnly,
21
21
  children: label
22
22
  });
23
23
  }
@@ -25,43 +25,44 @@ LoadingAnnouncer.displayName = "LoadingAnnouncer";
25
25
  function PageHeaderSkeleton({ action = true }) {
26
26
  return /* @__PURE__ */ jsxs("div", {
27
27
  "aria-hidden": true,
28
- className: styles$1.header,
28
+ className: styles.header,
29
29
  children: [/* @__PURE__ */ jsxs("div", {
30
- className: styles$1.headerCopy,
30
+ className: styles.headerCopy,
31
31
  children: [/* @__PURE__ */ jsx(Skeleton, {
32
- className: styles$1.title,
32
+ className: styles.title,
33
33
  style: bone
34
34
  }), /* @__PURE__ */ jsx(Skeleton.Text, {
35
35
  fontSize: 14,
36
36
  width: "46%"
37
37
  })]
38
38
  }), action ? /* @__PURE__ */ jsx(Skeleton, {
39
- className: styles$1.action,
39
+ className: styles.action,
40
40
  style: bone
41
41
  }) : null]
42
42
  });
43
43
  }
44
44
  PageHeaderSkeleton.displayName = "PageHeaderSkeleton";
45
45
  function TableSkeleton({ framed = true, leading = "text", rows = 6 }) {
46
+ const cardClassName = useSurfaceCardClassName();
46
47
  return /* @__PURE__ */ jsxs("div", {
47
48
  "aria-hidden": true,
48
- className: framed ? `${styles$1.table} ${styles.card}` : styles$1.table,
49
+ className: framed ? `${styles.table} ${cardClassName}` : styles.table,
49
50
  children: [/* @__PURE__ */ jsx("div", {
50
- className: styles$1.thead,
51
+ className: styles.thead,
51
52
  children: [
52
53
  96,
53
54
  72,
54
55
  64,
55
56
  48
56
57
  ].map((width, index) => /* @__PURE__ */ jsx(Skeleton, {
57
- className: styles$1.theadCell,
58
+ className: styles.theadCell,
58
59
  style: {
59
60
  ...bone,
60
61
  width
61
62
  }
62
63
  }, index))
63
64
  }), Array.from({ length: rows }, (_, index) => /* @__PURE__ */ jsxs("div", {
64
- className: styles$1.row,
65
+ className: styles.row,
65
66
  children: [
66
67
  leading === "avatar" ? /* @__PURE__ */ jsx(Skeleton.Avatar, {
67
68
  shape: "circle",
@@ -72,7 +73,7 @@ function TableSkeleton({ framed = true, leading = "text", rows = 6 }) {
72
73
  size: 24
73
74
  }) : null,
74
75
  /* @__PURE__ */ jsx("div", {
75
- className: styles$1.copy,
76
+ className: styles.copy,
76
77
  children: /* @__PURE__ */ jsx(Skeleton.Text, {
77
78
  fontSize: 14,
78
79
  rows: 2,
@@ -80,11 +81,11 @@ function TableSkeleton({ framed = true, leading = "text", rows = 6 }) {
80
81
  })
81
82
  }),
82
83
  /* @__PURE__ */ jsx(Skeleton, {
83
- className: styles$1.tag,
84
+ className: styles.tag,
84
85
  style: bone
85
86
  }),
86
87
  /* @__PURE__ */ jsx(Skeleton, {
87
- className: styles$1.cell,
88
+ className: styles.cell,
88
89
  style: bone
89
90
  })
90
91
  ]
@@ -93,16 +94,17 @@ function TableSkeleton({ framed = true, leading = "text", rows = 6 }) {
93
94
  }
94
95
  TableSkeleton.displayName = "TableSkeleton";
95
96
  function StatCardSkeleton() {
97
+ const cardClassName = useSurfaceCardClassName();
96
98
  return /* @__PURE__ */ jsxs("div", {
97
99
  "aria-hidden": true,
98
- className: `${styles$1.stat} ${styles.card}`,
100
+ className: `${styles.stat} ${cardClassName}`,
99
101
  children: [
100
102
  /* @__PURE__ */ jsx(Skeleton.Text, {
101
103
  fontSize: 14,
102
104
  width: 72
103
105
  }),
104
106
  /* @__PURE__ */ jsx(Skeleton, {
105
- className: styles$1.statValue,
107
+ className: styles.statValue,
106
108
  style: bone
107
109
  }),
108
110
  /* @__PURE__ */ jsx(Skeleton.Text, {
@@ -116,13 +118,13 @@ StatCardSkeleton.displayName = "StatCardSkeleton";
116
118
  function PageLoading({ header = true, label = "Loading", stats = 4 }) {
117
119
  return /* @__PURE__ */ jsxs("div", {
118
120
  "aria-busy": "true",
119
- className: styles$1.page,
121
+ className: styles.page,
120
122
  children: [
121
123
  /* @__PURE__ */ jsx(LoadingAnnouncer, { label }),
122
124
  header ? /* @__PURE__ */ jsx(PageHeaderSkeleton, {}) : null,
123
125
  /* @__PURE__ */ jsx("section", {
124
126
  "aria-hidden": true,
125
- className: styles$1.statGrid,
127
+ className: styles.statGrid,
126
128
  children: Array.from({ length: stats }, (_, index) => /* @__PURE__ */ jsx(StatCardSkeleton, {}, index))
127
129
  }),
128
130
  /* @__PURE__ */ jsx(TableSkeleton, {})
@@ -1 +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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"}
1
+ {"version":3,"file":"PageSkeleton.mjs","names":[],"sources":["../../../src/dashboard/PageSkeleton/PageSkeleton.tsx"],"sourcesContent":["'use client';\n\nimport Skeleton from '@/base-ui/Skeleton';\n\nimport { useSurfaceCardClassName } from '../Surface/link';\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 cardClassName = useSurfaceCardClassName();\n const head = [96, 72, 64, 48];\n return (\n <div aria-hidden className={framed ? `${styles.table} ${cardClassName}` : 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 const cardClassName = useSurfaceCardClassName();\n return (\n <div aria-hidden className={`${styles.stat} ${cardClassName}`}>\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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"}
@@ -52,7 +52,7 @@ const styles = createStaticStyles(({ css, cssVar, responsive }) => ({
52
52
  min-block-size: 54px;
53
53
  padding-block: 12px;
54
54
  padding-inline: 16px;
55
- border-block-end: 1px solid ${cssVar.colorBorder};
55
+ border-block-end: 1px solid ${cssVar.colorFillSecondary};
56
56
 
57
57
  &:last-child {
58
58
  border-block-end: none;
@@ -1 +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"}
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.colorFillSecondary};\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,mBAAmB;;;;;;CAM1D,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"}
@@ -11,7 +11,10 @@ import { cx } from "antd-style";
11
11
  const PanelSurface = ({ title, description, extra, href, loading, renderLink, size = "default", className, style, children }) => /* @__PURE__ */ jsx(Surface, {
12
12
  className,
13
13
  description,
14
- extra: loading && children ? /* @__PURE__ */ jsx(Spin, { size: "small" }) : extra,
14
+ extra: loading && children ? /* @__PURE__ */ jsx(Spin, {
15
+ size: "small",
16
+ variant: "network"
17
+ }) : extra,
15
18
  href,
16
19
  padded: false,
17
20
  renderLink,
@@ -1 +1 @@
1
- {"version":3,"file":"PanelSurface.mjs","names":["styles","surfaceStyles"],"sources":["../../../src/dashboard/PanelSurface/PanelSurface.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\n\nimport Skeleton from '@/base-ui/Skeleton';\nimport Spin from '@/base-ui/Spin';\n\nimport { styles as surfaceStyles } from '../Surface/style';\nimport Surface from '../Surface/Surface';\nimport { styles } from './style';\nimport type { PanelSurfaceProps } from './type';\n\n/** Titled console panel. Body padding stays inside so a trailing table can bleed to the edges. */\nconst PanelSurface = ({\n title,\n description,\n extra,\n href,\n loading,\n renderLink,\n size = 'default',\n className,\n style,\n children,\n}: PanelSurfaceProps) => (\n <Surface\n className={className}\n description={description}\n extra={loading && children ? <Spin size=\"small\" /> : extra}\n href={href}\n padded={false}\n renderLink={renderLink}\n style={style}\n title={title}\n >\n {loading && !children ? (\n <div aria-busy=\"true\" className={styles.loadingBody}>\n <Skeleton height={220} radius={8} />\n </div>\n ) : (\n <div\n className={cx(size === 'small' ? styles.bodySmall : styles.body, surfaceStyles.tableBleed)}\n >\n {children}\n </div>\n )}\n </Surface>\n);\n\nPanelSurface.displayName = 'PanelSurface';\n\nexport default PanelSurface;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,gBAAgB,EACpB,OACA,aACA,OACA,MACA,SACA,YACA,OAAO,WACP,WACA,OACA,eAEA,oBAAC,SAAD;CACa;CACE;CACb,OAAO,WAAW,WAAW,oBAAC,MAAD,EAAM,MAAK,QAAS,CAAA,IAAI;CAC/C;CACN,QAAQ;CACI;CACL;CACA;CAEN,UAAA,WAAW,CAAC,WACX,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAWA,SAAO;EACtC,UAAA,oBAAC,UAAD;GAAU,QAAQ;GAAK,QAAQ;EAAI,CAAA;CAChC,CAAA,IAEL,oBAAC,OAAD;EACE,WAAW,GAAG,SAAS,UAAUA,SAAO,YAAYA,SAAO,MAAMC,OAAc,UAAU;EAExF;CACE,CAAA;AAEA,CAAA;AAGX,aAAa,cAAc"}
1
+ {"version":3,"file":"PanelSurface.mjs","names":["styles","surfaceStyles"],"sources":["../../../src/dashboard/PanelSurface/PanelSurface.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\n\nimport Skeleton from '@/base-ui/Skeleton';\nimport Spin from '@/base-ui/Spin';\n\nimport { styles as surfaceStyles } from '../Surface/style';\nimport Surface from '../Surface/Surface';\nimport { styles } from './style';\nimport type { PanelSurfaceProps } from './type';\n\n/** Titled console panel. Body padding stays inside so a trailing table can bleed to the edges. */\nconst PanelSurface = ({\n title,\n description,\n extra,\n href,\n loading,\n renderLink,\n size = 'default',\n className,\n style,\n children,\n}: PanelSurfaceProps) => (\n <Surface\n className={className}\n description={description}\n extra={loading && children ? <Spin size=\"small\" variant=\"network\" /> : extra}\n href={href}\n padded={false}\n renderLink={renderLink}\n style={style}\n title={title}\n >\n {loading && !children ? (\n <div aria-busy=\"true\" className={styles.loadingBody}>\n <Skeleton height={220} radius={8} />\n </div>\n ) : (\n <div\n className={cx(size === 'small' ? styles.bodySmall : styles.body, surfaceStyles.tableBleed)}\n >\n {children}\n </div>\n )}\n </Surface>\n);\n\nPanelSurface.displayName = 'PanelSurface';\n\nexport default PanelSurface;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,gBAAgB,EACpB,OACA,aACA,OACA,MACA,SACA,YACA,OAAO,WACP,WACA,OACA,eAEA,oBAAC,SAAD;CACa;CACE;CACb,OAAO,WAAW,WAAW,oBAAC,MAAD;EAAM,MAAK;EAAQ,SAAQ;CAAW,CAAA,IAAI;CACjE;CACN,QAAQ;CACI;CACL;CACA;CAEN,UAAA,WAAW,CAAC,WACX,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAWA,SAAO;EACtC,UAAA,oBAAC,UAAD;GAAU,QAAQ;GAAK,QAAQ;EAAI,CAAA;CAChC,CAAA,IAEL,oBAAC,OAAD;EACE,WAAW,GAAG,SAAS,UAAUA,SAAO,YAAYA,SAAO,MAAMC,OAAc,UAAU;EAExF;CACE,CAAA;AAEA,CAAA;AAGX,aAAa,cAAc"}
@@ -1,6 +1,7 @@
1
1
  import { StatCardProps } from "./type.mjs";
2
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;
3
+ /** One metric in its own card: the same item as a `split` MetricStrip. */
4
+ declare function StatCard({ action, className, delta, direction, hint, href, label, loading, mark, onClick, renderLink, value, valueTone }: StatCardProps): import("react").JSX.Element;
4
5
  declare namespace StatCard {
5
6
  var displayName: string;
6
7
  }
@@ -1,79 +1,31 @@
1
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
2
  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";
3
+ import { useSurfaceCardClassName } from "../Surface/link.mjs";
4
+ import { styles as styles$1 } from "../MetricStrip/style.mjs";
5
+ import MetricCell from "../MetricStrip/MetricCell.mjs";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { cx } from "antd-style";
10
8
  //#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];
9
+ /** One metric in its own card: the same item as a `split` MetricStrip. */
10
+ function StatCard({ action, className, delta, direction = "flat", hint, href, label, loading, mark, onClick, renderLink, value, valueTone }) {
11
+ const cardClassName = useSurfaceCardClassName();
22
12
  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
- })
13
+ className: cx(styles$1.card, cardClassName, styles.clip, className),
14
+ children: /* @__PURE__ */ jsx(MetricCell, {
15
+ renderLink,
16
+ item: {
17
+ action,
18
+ delta,
19
+ direction,
20
+ hint,
21
+ href,
22
+ label,
23
+ loading,
24
+ mark,
25
+ onClick,
26
+ value,
27
+ valueTone
28
+ }
77
29
  })
78
30
  });
79
31
  }
@@ -1 +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"}
1
+ {"version":3,"file":"StatCard.mjs","names":["metricStyles","surfaceStyles"],"sources":["../../../src/dashboard/StatCard/StatCard.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\n\nimport MetricCell from '../MetricStrip/MetricCell';\nimport { styles as metricStyles } from '../MetricStrip/style';\nimport { useSurfaceCardClassName } from '../Surface/link';\nimport { styles as surfaceStyles } from '../Surface/style';\nimport type { StatCardProps } from './type';\n\n/** One metric in its own card: the same item as a `split` MetricStrip. */\nfunction StatCard({\n action,\n className,\n delta,\n direction = 'flat',\n hint,\n href,\n label,\n loading,\n mark,\n onClick,\n renderLink,\n value,\n valueTone,\n}: StatCardProps) {\n const cardClassName = useSurfaceCardClassName();\n\n return (\n <div className={cx(metricStyles.card, cardClassName, surfaceStyles.clip, className)}>\n <MetricCell\n renderLink={renderLink}\n item={{\n action,\n delta,\n direction,\n hint,\n href,\n label,\n loading,\n mark,\n onClick,\n value,\n valueTone,\n }}\n />\n </div>\n );\n}\n\nStatCard.displayName = 'StatCard';\n\nexport default StatCard;\n"],"mappings":";;;;;;;;;AAWA,SAAS,SAAS,EAChB,QACA,WACA,OACA,YAAY,QACZ,MACA,MACA,OACA,SACA,MACA,SACA,YACA,OACA,aACgB;CAChB,MAAM,gBAAgB,wBAAwB;CAE9C,OACE,oBAAC,OAAD;EAAK,WAAW,GAAGA,SAAa,MAAM,eAAeC,OAAc,MAAM,SAAS;EAChF,UAAA,oBAAC,YAAD;GACc;GACZ,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF;EACD,CAAA;CACE,CAAA;AAET;AAEA,SAAS,cAAc"}
@@ -1,24 +1,35 @@
1
1
  import { IconProps } from "../../Icon/type.mjs";
2
2
  import "../../Icon/index.mjs";
3
+ import { SurfaceRenderLink } from "../Surface/type.mjs";
3
4
  import { ReactNode } from "react";
4
5
  //#region src/dashboard/StatCard/type.d.ts
5
6
  type StatDirection = 'up' | 'down' | 'flat';
6
- /** Top-to-bottom gray wash. Decorative color fields stay in the app. */
7
+ /** @deprecated StatCard renders as a MetricStrip item and no longer draws a wash. */
7
8
  type StatWash = 'gray';
8
9
  interface StatCardProps {
9
10
  /** Control rendered on the label row, such as a menu. */
10
11
  action?: ReactNode;
12
+ className?: string;
11
13
  /** Change amount, colored by `direction`. */
12
- delta?: string;
14
+ delta?: ReactNode;
13
15
  direction?: StatDirection;
14
- /** Line under the figure. */
15
- hint?: string;
16
+ /** Line after the delta. */
17
+ hint?: ReactNode;
18
+ /** Makes the card a link (through `renderLink` / `SurfaceLinkProvider`). */
19
+ href?: string;
16
20
  label: ReactNode;
21
+ /** Value placeholder while loading; the label stays. */
22
+ loading?: boolean;
17
23
  /** Corner glyph. Hidden from assistive tech so it does not repeat the label. */
18
24
  mark?: IconProps['icon'];
19
- /** Overview scale: label, then a large figure, then the note. */
25
+ onClick?: () => void;
26
+ /** @deprecated Ignored. StatCard always uses the MetricStrip item scale. */
20
27
  prominent?: boolean;
28
+ renderLink?: SurfaceRenderLink;
21
29
  value: ReactNode;
30
+ /** Color the figure when the number itself is the thing to act on. */
31
+ valueTone?: 'danger' | 'warning';
32
+ /** @deprecated Ignored. StatCard renders as a MetricStrip item without a wash. */
22
33
  wash?: StatWash;
23
34
  }
24
35
  //#endregion
@@ -2,7 +2,7 @@
2
2
  import Spin from "../../base-ui/Spin/Spin.mjs";
3
3
  import Skeleton from "../../base-ui/Skeleton/index.mjs";
4
4
  import { styles } from "./style.mjs";
5
- import { SurfaceDepthContext, useSurfaceDepth, useSurfaceLink } from "./link.mjs";
5
+ import { SurfaceDepthContext, useSurfaceCardClassName, useSurfaceDepth, useSurfaceLink } from "./link.mjs";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { cx } from "antd-style";
8
8
  import { ArrowUpRight } from "lucide-react";
@@ -16,6 +16,7 @@ const defined = (node) => node !== null && node !== void 0 && node !== false;
16
16
  function Surface({ bleed = false, chart, children, className, description, extra, href, loading, padded, renderLink, title, ...rest }) {
17
17
  const depth = useSurfaceDepth();
18
18
  const link = useSurfaceLink(renderLink);
19
+ const cardClassName = useSurfaceCardClassName();
19
20
  const refreshing = Boolean(loading) && defined(children);
20
21
  const placeholder = Boolean(loading) && !defined(children);
21
22
  const hasHeader = defined(title) || defined(description) || defined(extra) || refreshing;
@@ -39,26 +40,41 @@ function Surface({ bleed = false, chart, children, className, description, extra
39
40
  radius: 8
40
41
  })
41
42
  }) : children;
43
+ const trailing = refreshing || defined(extra);
44
+ const arrow = /* @__PURE__ */ jsx(ArrowUpRight, {
45
+ "aria-hidden": true,
46
+ "data-surface-arrow": true,
47
+ className: styles.arrow,
48
+ size: 16
49
+ });
42
50
  return /* @__PURE__ */ jsx(SurfaceDepthContext, {
43
51
  value: depth + 1,
44
52
  children: /* @__PURE__ */ jsxs("div", {
45
- className: cx(styles.card, styles.content, clip && styles.clip, href && styles.cardLinked, bleed && styles.bleed, className),
53
+ className: cx(cardClassName, styles.content, clip && styles.clip, href && styles.cardLinked, bleed && styles.bleed, className),
46
54
  ...rest,
47
55
  children: [
48
56
  hasHeader ? /* @__PURE__ */ jsxs("div", {
49
57
  className: styles.header,
50
58
  children: [href ? link({
51
- children: /* @__PURE__ */ jsxs(Fragment, { children: [heading, /* @__PURE__ */ jsx(ArrowUpRight, {
52
- "aria-hidden": true,
53
- "data-surface-arrow": true,
54
- className: styles.arrow,
55
- size: 16
56
- })] }),
59
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [heading, trailing ? null : arrow] }),
57
60
  className: styles.headingLink,
58
61
  href
59
- }) : heading, refreshing || defined(extra) ? /* @__PURE__ */ jsxs("div", {
62
+ }) : heading, trailing ? /* @__PURE__ */ jsxs("div", {
60
63
  className: styles.extra,
61
- children: [refreshing ? /* @__PURE__ */ jsx(Spin, { size: "small" }) : null, extra]
64
+ children: [
65
+ refreshing ? /* @__PURE__ */ jsx(Spin, {
66
+ size: "small",
67
+ variant: "network"
68
+ }) : null,
69
+ extra,
70
+ href ? link({
71
+ "aria-hidden": true,
72
+ "children": arrow,
73
+ "className": styles.arrowLink,
74
+ href,
75
+ "tabIndex": -1
76
+ }) : null
77
+ ]
62
78
  }) : null]
63
79
  }) : null,
64
80
  pad ? /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"Surface.mjs","names":[],"sources":["../../../src/dashboard/Surface/Surface.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ArrowUpRight } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport Skeleton from '@/base-ui/Skeleton';\nimport Spin from '@/base-ui/Spin';\n\nimport { SurfaceDepthContext, useSurfaceDepth, useSurfaceLink } from './link';\nimport { styles } from './style';\nimport type { SurfaceProps } from './type';\n\nconst defined = (node: ReactNode) => node !== null && node !== undefined && node !== false;\n\n/**\n * Elevated card on a workspace canvas. Bare, it is a plain frame. With `title`,\n * `description` or `extra` it gets a header and a padded body that lets a\n * trailing table meet the card edges.\n */\nfunction Surface({\n bleed = false,\n chart,\n children,\n className,\n description,\n extra,\n href,\n loading,\n padded,\n renderLink,\n title,\n ...rest\n}: SurfaceProps) {\n const depth = useSurfaceDepth();\n const link = useSurfaceLink(renderLink);\n const refreshing = Boolean(loading) && defined(children);\n const placeholder = Boolean(loading) && !defined(children);\n const hasHeader = defined(title) || defined(description) || defined(extra) || refreshing;\n const pad = bleed ? false : (padded ?? (hasHeader || placeholder));\n const clip = hasHeader || bleed || pad || defined(chart);\n\n const heading = (\n <div className={styles.heading}>\n {defined(title) ? <div className={styles.title}>{title}</div> : null}\n {defined(description) ? <div className={styles.desc}>{description}</div> : null}\n </div>\n );\n\n const body = placeholder ? (\n <div aria-busy=\"true\" className={styles.loading}>\n <Skeleton height={220} radius={8} />\n </div>\n ) : (\n children\n );\n\n return (\n <SurfaceDepthContext value={depth + 1}>\n <div\n className={cx(\n styles.card,\n styles.content,\n clip && styles.clip,\n href && styles.cardLinked,\n bleed && styles.bleed,\n className,\n )}\n {...rest}\n >\n {hasHeader ? (\n <div className={styles.header}>\n {href\n ? link({\n children: (\n <>\n {heading}\n <ArrowUpRight\n aria-hidden\n data-surface-arrow\n className={styles.arrow}\n size={16}\n />\n </>\n ),\n className: styles.headingLink,\n href,\n })\n : heading}\n {refreshing || defined(extra) ? (\n <div className={styles.extra}>\n {refreshing ? <Spin size=\"small\" /> : null}\n {extra}\n </div>\n ) : null}\n </div>\n ) : null}\n {pad ? <div className={cx(styles.body, styles.tableBleed)}>{body}</div> : body}\n {defined(chart) ? <div className={styles.chart}>{chart}</div> : null}\n </div>\n </SurfaceDepthContext>\n );\n}\n\nSurface.displayName = 'Surface';\n\nexport default Surface;\n"],"mappings":";;;;;;;;;AAaA,MAAM,WAAW,SAAoB,SAAS,QAAQ,SAAS,KAAA,KAAa,SAAS;;;;;;AAOrF,SAAS,QAAQ,EACf,QAAQ,OACR,OACA,UACA,WACA,aACA,OACA,MACA,SACA,QACA,YACA,OACA,GAAG,QACY;CACf,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,OAAO,eAAe,UAAU;CACtC,MAAM,aAAa,QAAQ,OAAO,KAAK,QAAQ,QAAQ;CACvD,MAAM,cAAc,QAAQ,OAAO,KAAK,CAAC,QAAQ,QAAQ;CACzD,MAAM,YAAY,QAAQ,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,KAAK,KAAK;CAC9E,MAAM,MAAM,QAAQ,QAAS,WAAW,aAAa;CACrD,MAAM,OAAO,aAAa,SAAS,OAAO,QAAQ,KAAK;CAEvD,MAAM,UACJ,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAvB,UAAA,CACG,QAAQ,KAAK,IAAI,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAQ,UAAA;EAAW,CAAA,IAAI,MAC/D,QAAQ,WAAW,IAAI,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAO,UAAA;EAAiB,CAAA,IAAI,IACxE;;CAGP,MAAM,OAAO,cACX,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAW,OAAO;EACtC,UAAA,oBAAC,UAAD;GAAU,QAAQ;GAAK,QAAQ;EAAI,CAAA;CAChC,CAAA,IAEL;CAGF,OACE,oBAAC,qBAAD;EAAqB,OAAO,QAAQ;EAClC,UAAA,qBAAC,OAAD;GACE,WAAW,GACT,OAAO,MACP,OAAO,SACP,QAAQ,OAAO,MACf,QAAQ,OAAO,YACf,SAAS,OAAO,OAChB,SACF;GACA,GAAI;GATN,UAAA;IAWG,YACC,qBAAC,OAAD;KAAK,WAAW,OAAO;KAAvB,UAAA,CACG,OACG,KAAK;MACH,UACE,qBAAA,UAAA,EAAA,UAAA,CACG,SACD,oBAAC,cAAD;OACE,eAAA;OACA,sBAAA;OACA,WAAW,OAAO;OAClB,MAAM;MACP,CAAA,CACD,EAAA,CAAA;MAEJ,WAAW,OAAO;MAClB;KACF,CAAC,IACD,SACH,cAAc,QAAQ,KAAK,IAC1B,qBAAC,OAAD;MAAK,WAAW,OAAO;MAAvB,UAAA,CACG,aAAa,oBAAC,MAAD,EAAM,MAAK,QAAS,CAAA,IAAI,MACrC,KACE;KACH,CAAA,IAAA,IACD;IACH,CAAA,IAAA;IACH,MAAM,oBAAC,OAAD;KAAK,WAAW,GAAG,OAAO,MAAM,OAAO,UAAU;KAAI,UAAA;IAAU,CAAA,IAAI;IACzE,QAAQ,KAAK,IAAI,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAQ,UAAA;IAAW,CAAA,IAAI;GAC7D;;CACc,CAAA;AAEzB;AAEA,QAAQ,cAAc"}
1
+ {"version":3,"file":"Surface.mjs","names":[],"sources":["../../../src/dashboard/Surface/Surface.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ArrowUpRight } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport Skeleton from '@/base-ui/Skeleton';\nimport Spin from '@/base-ui/Spin';\n\nimport {\n SurfaceDepthContext,\n useSurfaceCardClassName,\n useSurfaceDepth,\n useSurfaceLink,\n} from './link';\nimport { styles } from './style';\nimport type { SurfaceProps } from './type';\n\nconst defined = (node: ReactNode) => node !== null && node !== undefined && node !== false;\n\n/**\n * Elevated card on a workspace canvas. Bare, it is a plain frame. With `title`,\n * `description` or `extra` it gets a header and a padded body that lets a\n * trailing table meet the card edges.\n */\nfunction Surface({\n bleed = false,\n chart,\n children,\n className,\n description,\n extra,\n href,\n loading,\n padded,\n renderLink,\n title,\n ...rest\n}: SurfaceProps) {\n const depth = useSurfaceDepth();\n const link = useSurfaceLink(renderLink);\n const cardClassName = useSurfaceCardClassName();\n const refreshing = Boolean(loading) && defined(children);\n const placeholder = Boolean(loading) && !defined(children);\n const hasHeader = defined(title) || defined(description) || defined(extra) || refreshing;\n const pad = bleed ? false : (padded ?? (hasHeader || placeholder));\n const clip = hasHeader || bleed || pad || defined(chart);\n\n const heading = (\n <div className={styles.heading}>\n {defined(title) ? <div className={styles.title}>{title}</div> : null}\n {defined(description) ? <div className={styles.desc}>{description}</div> : null}\n </div>\n );\n\n const body = placeholder ? (\n <div aria-busy=\"true\" className={styles.loading}>\n <Skeleton height={220} radius={8} />\n </div>\n ) : (\n children\n );\n\n // With header actions, the arrow sits after them as the rightmost item.\n const trailing = refreshing || defined(extra);\n const arrow = <ArrowUpRight aria-hidden data-surface-arrow className={styles.arrow} size={16} />;\n\n return (\n <SurfaceDepthContext value={depth + 1}>\n <div\n className={cx(\n cardClassName,\n styles.content,\n clip && styles.clip,\n href && styles.cardLinked,\n bleed && styles.bleed,\n className,\n )}\n {...rest}\n >\n {hasHeader ? (\n <div className={styles.header}>\n {href\n ? link({\n children: (\n <>\n {heading}\n {trailing ? null : arrow}\n </>\n ),\n className: styles.headingLink,\n href,\n })\n : heading}\n {trailing ? (\n <div className={styles.extra}>\n {refreshing ? <Spin size=\"small\" variant=\"network\" /> : null}\n {extra}\n {href\n ? link({\n 'aria-hidden': true,\n 'children': arrow,\n 'className': styles.arrowLink,\n href,\n 'tabIndex': -1,\n } as any)\n : null}\n </div>\n ) : null}\n </div>\n ) : null}\n {pad ? <div className={cx(styles.body, styles.tableBleed)}>{body}</div> : body}\n {defined(chart) ? <div className={styles.chart}>{chart}</div> : null}\n </div>\n </SurfaceDepthContext>\n );\n}\n\nSurface.displayName = 'Surface';\n\nexport default Surface;\n"],"mappings":";;;;;;;;;AAkBA,MAAM,WAAW,SAAoB,SAAS,QAAQ,SAAS,KAAA,KAAa,SAAS;;;;;;AAOrF,SAAS,QAAQ,EACf,QAAQ,OACR,OACA,UACA,WACA,aACA,OACA,MACA,SACA,QACA,YACA,OACA,GAAG,QACY;CACf,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,OAAO,eAAe,UAAU;CACtC,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,aAAa,QAAQ,OAAO,KAAK,QAAQ,QAAQ;CACvD,MAAM,cAAc,QAAQ,OAAO,KAAK,CAAC,QAAQ,QAAQ;CACzD,MAAM,YAAY,QAAQ,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,KAAK,KAAK;CAC9E,MAAM,MAAM,QAAQ,QAAS,WAAW,aAAa;CACrD,MAAM,OAAO,aAAa,SAAS,OAAO,QAAQ,KAAK;CAEvD,MAAM,UACJ,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAvB,UAAA,CACG,QAAQ,KAAK,IAAI,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAQ,UAAA;EAAW,CAAA,IAAI,MAC/D,QAAQ,WAAW,IAAI,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAO,UAAA;EAAiB,CAAA,IAAI,IACxE;;CAGP,MAAM,OAAO,cACX,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAW,OAAO;EACtC,UAAA,oBAAC,UAAD;GAAU,QAAQ;GAAK,QAAQ;EAAI,CAAA;CAChC,CAAA,IAEL;CAIF,MAAM,WAAW,cAAc,QAAQ,KAAK;CAC5C,MAAM,QAAQ,oBAAC,cAAD;EAAc,eAAA;EAAY,sBAAA;EAAmB,WAAW,OAAO;EAAO,MAAM;CAAK,CAAA;CAE/F,OACE,oBAAC,qBAAD;EAAqB,OAAO,QAAQ;EAClC,UAAA,qBAAC,OAAD;GACE,WAAW,GACT,eACA,OAAO,SACP,QAAQ,OAAO,MACf,QAAQ,OAAO,YACf,SAAS,OAAO,OAChB,SACF;GACA,GAAI;GATN,UAAA;IAWG,YACC,qBAAC,OAAD;KAAK,WAAW,OAAO;KAAvB,UAAA,CACG,OACG,KAAK;MACH,UACE,qBAAA,UAAA,EAAA,UAAA,CACG,SACA,WAAW,OAAO,KACnB,EAAA,CAAA;MAEJ,WAAW,OAAO;MAClB;KACF,CAAC,IACD,SACH,WACC,qBAAC,OAAD;MAAK,WAAW,OAAO;MAAvB,UAAA;OACG,aAAa,oBAAC,MAAD;QAAM,MAAK;QAAQ,SAAQ;OAAW,CAAA,IAAI;OACvD;OACA,OACG,KAAK;QACH,eAAe;QACf,YAAY;QACZ,aAAa,OAAO;QACpB;QACA,YAAY;OACd,CAAQ,IACR;MACD;KACH,CAAA,IAAA,IACD;IACH,CAAA,IAAA;IACH,MAAM,oBAAC,OAAD;KAAK,WAAW,GAAG,OAAO,MAAM,OAAO,UAAU;KAAI,UAAA;IAAU,CAAA,IAAI;IACzE,QAAQ,KAAK,IAAI,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAQ,UAAA;IAAW,CAAA,IAAI;GAC7D;;CACc,CAAA;AAEzB;AAEA,QAAQ,cAAc"}
@@ -1,5 +1,5 @@
1
1
  import { SurfaceLinkProps, SurfaceProps, SurfaceRenderLink } from "./type.mjs";
2
- import { SurfaceLinkProvider, useSurfaceDepth, useSurfaceLink } from "./link.mjs";
2
+ import { SurfaceLinkProvider, useSurfaceCardClassName, useSurfaceDepth, useSurfaceLink } from "./link.mjs";
3
3
  import { styles } from "./style.mjs";
4
4
  import Surface from "./Surface.mjs";
5
- export { type SurfaceLinkProps, SurfaceLinkProvider, type SurfaceProps, type SurfaceRenderLink, Surface as default, styles as surfaceStyles, useSurfaceDepth, useSurfaceLink };
5
+ export { type SurfaceLinkProps, SurfaceLinkProvider, type SurfaceProps, type SurfaceRenderLink, Surface as default, styles as surfaceStyles, useSurfaceCardClassName, useSurfaceDepth, useSurfaceLink };
@@ -9,6 +9,11 @@ declare const SurfaceLinkProvider: ({ children, renderLink }: {
9
9
  declare const useSurfaceLink: (override?: SurfaceRenderLink) => SurfaceRenderLink;
10
10
  /** How many Surface cards wrap this node. A table can skip its own card when already inside one. */
11
11
  declare const useSurfaceDepth: () => number;
12
+ /**
13
+ * Class for a dashboard card: `colorBgContainer` in light, translucent `colorFillTertiary` in
14
+ * dark, and no fill of its own when nested in another Surface.
15
+ */
16
+ declare const useSurfaceCardClassName: () => string;
12
17
  //#endregion
13
- export { SurfaceLinkProvider, useSurfaceDepth, useSurfaceLink };
18
+ export { SurfaceLinkProvider, useSurfaceCardClassName, useSurfaceDepth, useSurfaceLink };
14
19
  //# sourceMappingURL=link.d.mts.map
@@ -1,6 +1,8 @@
1
1
  "use client";
2
+ import { styles } from "./style.mjs";
2
3
  import { createContext, use } from "react";
3
4
  import { jsx } from "react/jsx-runtime";
5
+ import { cx, useThemeMode } from "antd-style";
4
6
  //#region src/dashboard/Surface/link.tsx
5
7
  const defaultRenderLink = ({ children, ...rest }) => /* @__PURE__ */ jsx("a", {
6
8
  ...rest,
@@ -16,7 +18,16 @@ const SurfaceLinkProvider = ({ children, renderLink }) => /* @__PURE__ */ jsx(Su
16
18
  const useSurfaceLink = (override) => override ?? use(SurfaceLinkContext);
17
19
  /** How many Surface cards wrap this node. A table can skip its own card when already inside one. */
18
20
  const useSurfaceDepth = () => use(SurfaceDepthContext);
21
+ /**
22
+ * Class for a dashboard card: `colorBgContainer` in light, translucent `colorFillTertiary` in
23
+ * dark, and no fill of its own when nested in another Surface.
24
+ */
25
+ const useSurfaceCardClassName = () => {
26
+ const { isDarkMode } = useThemeMode();
27
+ const depth = useSurfaceDepth();
28
+ return cx(styles.card, isDarkMode && styles.cardDark, depth > 0 && styles.cardNested);
29
+ };
19
30
  //#endregion
20
- export { SurfaceDepthContext, SurfaceLinkProvider, useSurfaceDepth, useSurfaceLink };
31
+ export { SurfaceDepthContext, SurfaceLinkProvider, useSurfaceCardClassName, useSurfaceDepth, useSurfaceLink };
21
32
 
22
33
  //# sourceMappingURL=link.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.mjs","names":[],"sources":["../../../src/dashboard/Surface/link.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, type ReactNode, use } from 'react';\n\nimport type { SurfaceLinkProps, SurfaceRenderLink } from './type';\n\nconst defaultRenderLink: SurfaceRenderLink = ({ children, ...rest }: SurfaceLinkProps) => (\n <a {...rest}>{children}</a>\n);\n\nconst SurfaceLinkContext = createContext<SurfaceRenderLink>(defaultRenderLink);\n\nconst SurfaceDepthContext = createContext(0);\n\n/** Plugs the app router into every dashboard card link (Surface, MetricStrip, Section). */\nexport const SurfaceLinkProvider = ({\n children,\n renderLink,\n}: {\n children?: ReactNode;\n renderLink: SurfaceRenderLink;\n}) => <SurfaceLinkContext value={renderLink}>{children}</SurfaceLinkContext>;\n\nexport const useSurfaceLink = (override?: SurfaceRenderLink) => override ?? use(SurfaceLinkContext);\n\n/** How many Surface cards wrap this node. A table can skip its own card when already inside one. */\nexport const useSurfaceDepth = () => use(SurfaceDepthContext);\n\nexport { SurfaceDepthContext };\n"],"mappings":";;;;AAMA,MAAM,qBAAwC,EAAE,UAAU,GAAG,WAC3D,oBAAC,KAAD;CAAG,GAAI;CAAO;AAAY,CAAA;AAG5B,MAAM,qBAAqB,cAAiC,iBAAiB;AAE7E,MAAM,sBAAsB,cAAc,CAAC;;AAG3C,MAAa,uBAAuB,EAClC,UACA,iBAII,oBAAC,oBAAD;CAAoB,OAAO;CAAa;AAA6B,CAAA;AAE3E,MAAa,kBAAkB,aAAiC,YAAY,IAAI,kBAAkB;;AAGlG,MAAa,wBAAwB,IAAI,mBAAmB"}
1
+ {"version":3,"file":"link.mjs","names":[],"sources":["../../../src/dashboard/Surface/link.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport { createContext, type ReactNode, use } from 'react';\n\nimport { styles } from './style';\nimport type { SurfaceLinkProps, SurfaceRenderLink } from './type';\n\nconst defaultRenderLink: SurfaceRenderLink = ({ children, ...rest }: SurfaceLinkProps) => (\n <a {...rest}>{children}</a>\n);\n\nconst SurfaceLinkContext = createContext<SurfaceRenderLink>(defaultRenderLink);\n\nconst SurfaceDepthContext = createContext(0);\n\n/** Plugs the app router into every dashboard card link (Surface, MetricStrip, Section). */\nexport const SurfaceLinkProvider = ({\n children,\n renderLink,\n}: {\n children?: ReactNode;\n renderLink: SurfaceRenderLink;\n}) => <SurfaceLinkContext value={renderLink}>{children}</SurfaceLinkContext>;\n\nexport const useSurfaceLink = (override?: SurfaceRenderLink) => override ?? use(SurfaceLinkContext);\n\n/** How many Surface cards wrap this node. A table can skip its own card when already inside one. */\nexport const useSurfaceDepth = () => use(SurfaceDepthContext);\n\nexport { SurfaceDepthContext };\n\n/**\n * Class for a dashboard card: `colorBgContainer` in light, translucent `colorFillTertiary` in\n * dark, and no fill of its own when nested in another Surface.\n */\nexport const useSurfaceCardClassName = () => {\n const { isDarkMode } = useThemeMode();\n const depth = useSurfaceDepth();\n return cx(styles.card, isDarkMode && styles.cardDark, depth > 0 && styles.cardNested);\n};\n"],"mappings":";;;;;;AAQA,MAAM,qBAAwC,EAAE,UAAU,GAAG,WAC3D,oBAAC,KAAD;CAAG,GAAI;CAAO;AAAY,CAAA;AAG5B,MAAM,qBAAqB,cAAiC,iBAAiB;AAE7E,MAAM,sBAAsB,cAAc,CAAC;;AAG3C,MAAa,uBAAuB,EAClC,UACA,iBAII,oBAAC,oBAAD;CAAoB,OAAO;CAAa;AAA6B,CAAA;AAE3E,MAAa,kBAAkB,aAAiC,YAAY,IAAI,kBAAkB;;AAGlG,MAAa,wBAAwB,IAAI,mBAAmB;;;;;AAQ5D,MAAa,gCAAgC;CAC3C,MAAM,EAAE,eAAe,aAAa;CACpC,MAAM,QAAQ,gBAAgB;CAC9B,OAAO,GAAG,OAAO,MAAM,cAAc,OAAO,UAAU,QAAQ,KAAK,OAAO,UAAU;AACtF"}
@@ -2,17 +2,36 @@
2
2
  /**
3
3
  * A content card sitting on the workspace.
4
4
  *
5
- * Outlined `Block` uses `colorBorderSecondary` on `colorBgContainer`.
6
- * The workspace is already that container, so a card inside it steps up to
7
- * `colorBgElevated` and `colorBorder`.
5
+ * Backgrounds: light mode uses `colorBgContainer`. Dark mode uses the translucent
6
+ * `colorFillTertiary` (white 6%): on the #0d0d0d workspace it reads as about #1c1c1c, a subtle
7
+ * raised step. `colorFillQuaternary` (white 2%, about #111) would barely separate from the page.
8
+ *
9
+ * Borders and inner dividers (table, header and cell lines, PageSkeleton) use `colorFillSecondary`
10
+ * (white 10% / black 6%); hover and focus use the stronger `colorFill`. Painted over the dark card
11
+ * the border lands near #2f2f2f against #1c1c1c, and in light near #f0f0f0 against #ffffff.
12
+ *
13
+ * Anything that must hide content scrolled beneath it (table header cells, pinned and sticky
14
+ * cells, their scroll shadows) uses `--lobe-surface-bg-solid`: the same white 6% blended onto
15
+ * `--lobe-surface-canvas` (default `colorBgContainer`, the ConsoleShell workspace). `color-mix`
16
+ * in srgb with an opaque base is plain alpha compositing, so it matches the translucent card.
17
+ * Set `--lobe-surface-canvas` when a card sits on another page color.
18
+ *
19
+ * A Surface inside another Surface (`useSurfaceDepth() > 0`) drops its own fill so fills do not
20
+ * stack. Row hover backgrounds keep their own mix. Layout containers (ConsoleShell, ConsoleNav,
21
+ * FilterSidebar split divider, AuthLayout page canvas) keep their own tokens.
22
+ *
23
+ * Apply the card with `useSurfaceCardClassName()`; plain `surfaceStyles.card` is the light look.
8
24
  */
9
25
  declare const styles: {
10
26
  card: string;
27
+ cardDark: string;
28
+ cardNested: string;
11
29
  chart: string;
12
30
  /** Rounded corners clip a bled table, header rule, or chart. Bare cards keep overflow visible. */
13
31
  clip: string;
14
32
  loading: string;
15
33
  arrow: string;
34
+ arrowLink: string;
16
35
  bleed: string;
17
36
  body: string;
18
37
  /** Table and header rules for the rich card. Kept off `card` so the shared class stays a plain frame. */