@squadbase/vantage 0.6.2-dev1.42c4e48 → 0.6.2-dev1.72360fb

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 (259) hide show
  1. package/dist/{build-MFWRPYKW.js → build-X5NVCQKT.js} +4 -4
  2. package/dist/{build-MFWRPYKW.js.map → build-X5NVCQKT.js.map} +1 -1
  3. package/dist/chunk-2IAPIOPS.js +152 -0
  4. package/dist/chunk-2IAPIOPS.js.map +1 -0
  5. package/dist/{chunk-IBGOCWJB.js → chunk-2ICNHUG6.js} +186 -82
  6. package/dist/chunk-2ICNHUG6.js.map +1 -0
  7. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  8. package/dist/chunk-2N72FKLB.js.map +1 -0
  9. package/dist/chunk-57GHR5LN.js +163 -0
  10. package/dist/chunk-57GHR5LN.js.map +1 -0
  11. package/dist/chunk-6OTTGAPO.js +44 -0
  12. package/dist/chunk-6OTTGAPO.js.map +1 -0
  13. package/dist/{chunk-OB6UBJXF.js → chunk-7S52M2SL.js} +127 -36
  14. package/dist/chunk-7S52M2SL.js.map +1 -0
  15. package/dist/chunk-JXFCSF3K.js +673 -0
  16. package/dist/chunk-JXFCSF3K.js.map +1 -0
  17. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  18. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  19. package/dist/chunk-QOXXOFGL.js +7051 -0
  20. package/dist/chunk-QOXXOFGL.js.map +1 -0
  21. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  22. package/dist/chunk-U736PVHY.js.map +1 -0
  23. package/dist/{chunk-QEWCYW3I.js → chunk-WAMZWZJB.js} +13 -3
  24. package/dist/chunk-WAMZWZJB.js.map +1 -0
  25. package/dist/cli.js +3 -3
  26. package/dist/components/index.d.ts +1596 -100
  27. package/dist/components/index.js +7 -4
  28. package/dist/delta-text-CvwBGJ95.d.ts +15 -0
  29. package/dist/{dev-DCTOHQ6W.js → dev-4XEDTELV.js} +4 -4
  30. package/dist/{dev-DCTOHQ6W.js.map → dev-4XEDTELV.js.map} +1 -1
  31. package/dist/doc/index.d.ts +215 -2
  32. package/dist/doc/index.js +302 -5
  33. package/dist/doc/index.js.map +1 -1
  34. package/dist/format-U0cQl069.d.ts +243 -0
  35. package/dist/markdown/index.js +1 -1
  36. package/dist/markdown/index.js.map +1 -1
  37. package/dist/slide/index.d.ts +272 -1
  38. package/dist/slide/index.js +968 -3
  39. package/dist/slide/index.js.map +1 -1
  40. package/dist/table/index.js +9 -6
  41. package/dist/table/index.js.map +1 -1
  42. package/dist/ui/index.d.ts +8 -2
  43. package/dist/ui/index.js +22 -112
  44. package/dist/ui/index.js.map +1 -1
  45. package/dist/{upgrade-DBBE6GIR.js → upgrade-JHXZBGQS.js} +3 -3
  46. package/dist/{upgrade-DBBE6GIR.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  47. package/dist/vite/index.js +2 -2
  48. package/docs/en/components.md +42 -17
  49. package/docs/en/doc/delta-text.md +40 -0
  50. package/docs/en/doc/doc-action-items.md +49 -0
  51. package/docs/en/doc/doc-callout.md +38 -0
  52. package/docs/en/doc/doc-data-table.md +60 -0
  53. package/docs/en/doc/doc-executive-summary.md +64 -0
  54. package/docs/en/doc/doc-figure.md +56 -0
  55. package/docs/en/doc/doc-key-findings.md +61 -0
  56. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  57. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  58. package/docs/en/doc/doc-report-header.md +46 -0
  59. package/docs/en/parts/area-chart.md +99 -0
  60. package/docs/en/parts/bar-chart.md +91 -0
  61. package/docs/en/parts/bar-list.md +50 -0
  62. package/docs/en/parts/category-bar.md +37 -0
  63. package/docs/en/parts/chart-frame.md +39 -0
  64. package/docs/en/parts/data-table.md +22 -0
  65. package/docs/en/parts/delta.md +51 -0
  66. package/docs/en/parts/donut-chart.md +72 -0
  67. package/docs/en/parts/format.md +43 -0
  68. package/docs/en/parts/funnel-steps.md +2 -1
  69. package/docs/en/parts/heatmap.md +53 -0
  70. package/docs/en/parts/kpi-card.md +58 -0
  71. package/docs/en/parts/legend.md +35 -0
  72. package/docs/en/parts/line-chart.md +94 -0
  73. package/docs/en/parts/metric-value.md +3 -2
  74. package/docs/en/parts/progress-circle.md +33 -0
  75. package/docs/en/parts/sample-data.md +39 -0
  76. package/docs/en/parts/scatter-chart.md +56 -0
  77. package/docs/en/parts/sparkline.md +1 -1
  78. package/docs/en/parts/tracker.md +36 -0
  79. package/docs/en/parts/trend-indicator.md +17 -1
  80. package/docs/en/parts/updated-at.md +30 -0
  81. package/docs/en/parts/waterfall-chart.md +56 -0
  82. package/docs/en/slide/slide-chart-full.md +48 -0
  83. package/docs/en/slide/slide-chart-insight.md +52 -0
  84. package/docs/en/slide/slide-columns.md +46 -0
  85. package/docs/en/slide/slide-comparison.md +68 -0
  86. package/docs/en/slide/slide-cover.md +39 -0
  87. package/docs/en/slide/slide-exec-summary.md +47 -0
  88. package/docs/en/slide/slide-heading.md +38 -0
  89. package/docs/en/slide/slide-kpi-grid.md +55 -0
  90. package/docs/en/slide/slide-kpi-hero.md +58 -0
  91. package/docs/en/slide/slide-next-actions.md +49 -0
  92. package/docs/en/slide/slide-scorecard-table.md +54 -0
  93. package/docs/en/slide/slide-section.md +44 -0
  94. package/docs/en/slide/slide-source-line.md +34 -0
  95. package/docs/en/ui/alert-dialog.md +42 -0
  96. package/docs/en/ui/avatar.md +31 -0
  97. package/docs/en/ui/combobox.md +74 -0
  98. package/docs/en/ui/drawer.md +41 -0
  99. package/docs/en/ui/empty.md +1 -1
  100. package/docs/en/ui/error-state.md +4 -3
  101. package/docs/en/ui/field.md +42 -0
  102. package/docs/en/ui/hover-card.md +21 -0
  103. package/docs/en/ui/kbd.md +17 -0
  104. package/docs/en/ui/loading.md +1 -1
  105. package/docs/en/ui/pagination.md +36 -0
  106. package/docs/en/ui/radio-group.md +21 -0
  107. package/docs/en/ui/toast.md +44 -0
  108. package/docs/en/ui/toggle-group.md +4 -3
  109. package/docs/en/ui-and-theming.md +1 -1
  110. package/docs/index.json +917 -77
  111. package/docs/ja/components.md +39 -16
  112. package/docs/ja/doc/delta-text.md +40 -0
  113. package/docs/ja/doc/doc-action-items.md +49 -0
  114. package/docs/ja/doc/doc-callout.md +38 -0
  115. package/docs/ja/doc/doc-data-table.md +60 -0
  116. package/docs/ja/doc/doc-executive-summary.md +64 -0
  117. package/docs/ja/doc/doc-figure.md +56 -0
  118. package/docs/ja/doc/doc-key-findings.md +61 -0
  119. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  120. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  121. package/docs/ja/doc/doc-report-header.md +46 -0
  122. package/docs/ja/parts/area-chart.md +49 -25
  123. package/docs/ja/parts/bar-chart.md +50 -24
  124. package/docs/ja/parts/bar-list.md +31 -8
  125. package/docs/ja/parts/chart-frame.md +36 -0
  126. package/docs/ja/parts/data-table.md +22 -0
  127. package/docs/ja/parts/delta.md +51 -0
  128. package/docs/ja/parts/donut-chart.md +45 -26
  129. package/docs/ja/parts/format.md +44 -0
  130. package/docs/ja/parts/funnel-steps.md +27 -8
  131. package/docs/ja/parts/heatmap.md +45 -0
  132. package/docs/ja/parts/kpi-card.md +56 -0
  133. package/docs/ja/parts/legend.md +36 -0
  134. package/docs/ja/parts/line-chart.md +48 -22
  135. package/docs/ja/parts/metric-value.md +3 -2
  136. package/docs/ja/parts/sample-data.md +61 -0
  137. package/docs/ja/parts/scatter-chart.md +69 -0
  138. package/docs/ja/parts/sparkline.md +1 -1
  139. package/docs/ja/parts/trend-indicator.md +17 -1
  140. package/docs/ja/parts/updated-at.md +27 -0
  141. package/docs/ja/parts/waterfall-chart.md +61 -0
  142. package/docs/ja/slide/slide-chart-full.md +48 -0
  143. package/docs/ja/slide/slide-chart-insight.md +52 -0
  144. package/docs/ja/slide/slide-columns.md +46 -0
  145. package/docs/ja/slide/slide-comparison.md +68 -0
  146. package/docs/ja/slide/slide-cover.md +39 -0
  147. package/docs/ja/slide/slide-exec-summary.md +47 -0
  148. package/docs/ja/slide/slide-heading.md +38 -0
  149. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  150. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  151. package/docs/ja/slide/slide-next-actions.md +49 -0
  152. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  153. package/docs/ja/slide/slide-section.md +44 -0
  154. package/docs/ja/slide/slide-source-line.md +34 -0
  155. package/docs/ja/ui/empty.md +1 -1
  156. package/docs/ja/ui/error-state.md +4 -3
  157. package/docs/ja/ui/loading.md +1 -1
  158. package/docs/ja/ui/toggle-group.md +4 -3
  159. package/docs/ja/ui-and-theming.md +2 -2
  160. package/package.json +26 -24
  161. package/registry/ui/accordion.tsx +4 -2
  162. package/registry/ui/alert-dialog.tsx +3 -3
  163. package/registry/ui/alert.tsx +3 -1
  164. package/registry/ui/app-shell.tsx +7 -1
  165. package/registry/ui/area-chart.tsx +2852 -166
  166. package/registry/ui/attention-list.tsx +303 -0
  167. package/registry/ui/avatar.tsx +1 -1
  168. package/registry/ui/badge.tsx +3 -1
  169. package/registry/ui/bar-chart.tsx +2851 -166
  170. package/registry/ui/bar-list.tsx +3531 -90
  171. package/registry/ui/box-plot-chart.tsx +3906 -0
  172. package/registry/ui/breadcrumb.tsx +3 -1
  173. package/registry/ui/button.tsx +3 -1
  174. package/registry/ui/calendar.tsx +3 -1
  175. package/registry/ui/card.tsx +4 -2
  176. package/registry/ui/category-bar.tsx +1025 -16
  177. package/registry/ui/chart-frame.tsx +1393 -0
  178. package/registry/ui/checkbox.tsx +3 -1
  179. package/registry/ui/collapsible.tsx +3 -1
  180. package/registry/ui/combobox.tsx +2 -2
  181. package/registry/ui/command.tsx +3 -1
  182. package/registry/ui/dashboard-card.tsx +71 -28
  183. package/registry/ui/data-table.tsx +678 -56
  184. package/registry/ui/date-range-picker.tsx +245 -64
  185. package/registry/ui/delta.tsx +191 -0
  186. package/registry/ui/dialog.tsx +5 -3
  187. package/registry/ui/donut-chart.tsx +2929 -182
  188. package/registry/ui/drawer.tsx +1 -1
  189. package/registry/ui/dropdown-menu.tsx +5 -3
  190. package/registry/ui/echart.tsx +621 -67
  191. package/registry/ui/field.tsx +1 -1
  192. package/registry/ui/filter-bar.tsx +33 -6
  193. package/registry/ui/funnel-steps.tsx +3344 -49
  194. package/registry/ui/heatmap.tsx +1786 -0
  195. package/registry/ui/histogram-chart.tsx +3986 -0
  196. package/registry/ui/hover-card.tsx +2 -2
  197. package/registry/ui/input-group.tsx +3 -1
  198. package/registry/ui/input.tsx +3 -1
  199. package/registry/ui/kbd.tsx +3 -1
  200. package/registry/ui/kpi-card.tsx +704 -0
  201. package/registry/ui/label.tsx +3 -1
  202. package/registry/ui/legend.tsx +3563 -0
  203. package/registry/ui/line-chart.tsx +2852 -160
  204. package/registry/ui/metric-value.tsx +9 -1
  205. package/registry/ui/multi-select.tsx +11 -5
  206. package/registry/ui/page-shell.tsx +106 -51
  207. package/registry/ui/pagination.tsx +3 -1
  208. package/registry/ui/paired-chart.tsx +3827 -0
  209. package/registry/ui/placeholder.tsx +8 -2
  210. package/registry/ui/popover.tsx +4 -2
  211. package/registry/ui/progress-circle.tsx +607 -12
  212. package/registry/ui/progress.tsx +3 -1
  213. package/registry/ui/radio-group.tsx +1 -1
  214. package/registry/ui/sample-data.tsx +86 -0
  215. package/registry/ui/scatter-chart.tsx +4212 -0
  216. package/registry/ui/scroll-area.tsx +3 -2
  217. package/registry/ui/searchable-select.tsx +8 -3
  218. package/registry/ui/section-header.tsx +5 -3
  219. package/registry/ui/segmented-control.tsx +7 -2
  220. package/registry/ui/select.tsx +4 -2
  221. package/registry/ui/separator.tsx +3 -1
  222. package/registry/ui/sheet.tsx +4 -2
  223. package/registry/ui/sidebar.tsx +4 -2
  224. package/registry/ui/skeleton.tsx +4 -2
  225. package/registry/ui/slider.tsx +4 -2
  226. package/registry/ui/sparkline.tsx +84 -9
  227. package/registry/ui/spinner.tsx +3 -1
  228. package/registry/ui/states.tsx +34 -5
  229. package/registry/ui/status-badge.tsx +83 -41
  230. package/registry/ui/switch.tsx +3 -1
  231. package/registry/ui/table.tsx +4 -2
  232. package/registry/ui/tabs.tsx +5 -3
  233. package/registry/ui/textarea.tsx +3 -1
  234. package/registry/ui/toast.tsx +2 -2
  235. package/registry/ui/toggle-group.tsx +3 -1
  236. package/registry/ui/toggle.tsx +3 -1
  237. package/registry/ui/tooltip.tsx +10 -4
  238. package/registry/ui/tracker.tsx +632 -19
  239. package/registry/ui/trend-indicator.tsx +15 -3
  240. package/registry/ui/updated-at.tsx +122 -0
  241. package/registry/ui/waterfall-chart.tsx +4248 -0
  242. package/skills/vantage-design/SKILL.md +34 -24
  243. package/skills/vantage-design/references/extract.md +16 -14
  244. package/skills/vantage-design/references/format.md +6 -5
  245. package/skills/vantage-design/references/presets.md +60 -110
  246. package/skills/vantage-slide/SKILL.md +54 -36
  247. package/templates/AGENTS.md +15 -3
  248. package/templates/agents/doc.md +48 -0
  249. package/templates/agents/page.md +32 -1
  250. package/templates/agents/slide.md +70 -2
  251. package/theme.css +244 -149
  252. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  253. package/dist/chunk-A2UUGASH.js.map +0 -1
  254. package/dist/chunk-AG6RZ2RR.js +0 -3208
  255. package/dist/chunk-AG6RZ2RR.js.map +0 -1
  256. package/dist/chunk-IBGOCWJB.js.map +0 -1
  257. package/dist/chunk-OB6UBJXF.js.map +0 -1
  258. package/dist/chunk-PXRX5PEC.js.map +0 -1
  259. package/dist/chunk-QEWCYW3I.js.map +0 -1
@@ -1,8 +1,14 @@
1
1
  // Copied by `vantage add ui metric-value`. This file is yours to edit.
2
- // Generated from @squadbase/vantage src/components/metric-value.tsx by `npm run registry` (in Vantage, edit src/, not registry/).
2
+ // Generated from @squadbase/squadkit registry/components/metric-value.tsx by `pnpm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
3
5
  /**
4
6
  * MetricValue / MetricUnit — the large number in a dashboard tile and its
5
7
  * trailing unit, sized as a pair so the unit stays subordinate at every size.
8
+ *
9
+ * @deprecated KPI の数字は KpiCard を使う。KpiCard は書式(`format`、単位は
10
+ * `{ type: "number", unit: "社" }`)・比較ラベル・増減を値から計算するので、
11
+ * 手書きの数字と TrendIndicator の組み合わせのように食い違わない。
6
12
  */
7
13
  import { forwardRef, type HTMLAttributes } from "react"
8
14
  import { cva, type VariantProps } from "class-variance-authority"
@@ -27,6 +33,7 @@ export interface MetricValueProps
27
33
  extends HTMLAttributes<HTMLDivElement>,
28
34
  VariantProps<typeof metricValueVariants> {}
29
35
 
36
+ /** @deprecated KPI の数字は KpiCard を使う。 */
30
37
  export const MetricValue = forwardRef<HTMLDivElement, MetricValueProps>(
31
38
  ({ className, size, ...props }, ref) => (
32
39
  <div
@@ -41,6 +48,7 @@ MetricValue.displayName = "MetricValue"
41
48
 
42
49
  export interface MetricUnitProps extends HTMLAttributes<HTMLSpanElement> {}
43
50
 
51
+ /** @deprecated KPI の単位は KpiCard の `format`(`{ type: "number", unit: "社" }`)で付ける。 */
44
52
  export const MetricUnit = forwardRef<HTMLSpanElement, MetricUnitProps>(
45
53
  ({ className, ...props }, ref) => (
46
54
  <span
@@ -1,5 +1,7 @@
1
1
  // Copied by `vantage add ui multi-select`. This file is yours to edit.
2
- // Generated from @squadbase/vantage src/components/multi-select.tsx by `npm run registry` (in Vantage, edit src/, not registry/).
2
+ // Generated from @squadbase/squadkit registry/components/multi-select.tsx by `pnpm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
3
5
  /**
4
6
  * MultiSelect — a multi-value combobox that shows the selection as removable
5
7
  * badges. Past `maxCount` badges the rest collapse into a "+N件" counter.
@@ -17,7 +19,7 @@ import { CheckIcon, LoaderIcon, XIcon } from "lucide-react"
17
19
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@squadbase/vantage/ui"
18
20
  import { isGroupedOptions, type SelectOption } from "@squadbase/vantage/components"
19
21
 
20
- /* ---------- inlined from src/components/option-command.tsx (internal to @squadbase/vantage) ---------- */
22
+ /* ---------- inlined from @squadbase/squadkit registry/components/option-command.tsx (internal to @squadbase/vantage) ---------- */
21
23
 
22
24
  interface OptionCommandListProps {
23
25
  options: SelectOptions
@@ -134,10 +136,14 @@ export interface MultiSelectProps {
134
136
  className?: string
135
137
  }
136
138
 
139
+ /** Not given yet (a draft fills props in steps): render empty, keep the same value between renders. */
140
+ const NO_OPTIONS: never[] = []
141
+ const NO_VALUES: string[] = []
142
+
137
143
  export const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function MultiSelect(
138
144
  {
139
- options,
140
- value,
145
+ options = NO_OPTIONS,
146
+ value = NO_VALUES,
141
147
  onChange,
142
148
  onSearch,
143
149
  maxCount = 3,
@@ -179,7 +185,7 @@ export const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function
179
185
  aria-controls={listId}
180
186
  disabled={disabled}
181
187
  className={cn(
182
- "inline-flex min-h-9 w-full items-center justify-between gap-2 rounded-md border bg-background px-3 py-1.5 text-sm shadow-xs transition-all outline-none hover:bg-accent hover:text-accent-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
188
+ "inline-flex min-h-9 w-full items-center justify-between gap-2 rounded-md border bg-background px-3 py-1.5 text-sm shadow-xs transition-[color,background-color,border-color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
183
189
  className,
184
190
  )}
185
191
  >
@@ -1,14 +1,19 @@
1
1
  // Copied by `vantage add ui page-shell`. This file is yours to edit.
2
- // Generated from @squadbase/vantage src/components/page-shell.tsx by `npm run registry` (in Vantage, edit src/, not registry/).
2
+ // Generated from @squadbase/squadkit registry/components/page-shell.tsx by `pnpm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
3
5
  /**
4
6
  * PageShell — the standard page frame: a bordered header band (title,
5
7
  * description, meta, actions), an optional summary card row, and the content
6
8
  * area. Composed from parts so a page can use only what it needs.
7
9
  */
8
- import { forwardRef, type HTMLAttributes } from "react"
10
+ import { forwardRef, type HTMLAttributes, type ReactNode } from "react"
9
11
  import { cva, type VariantProps } from "class-variance-authority"
10
12
 
13
+ import { formatDateRange, EMPTY_VALUE } from "@squadbase/vantage/components"
11
14
  import { cn } from "@squadbase/vantage/ui"
15
+ import { Badge } from "@squadbase/vantage/ui"
16
+ import { UpdatedAt, type UpdatedAtProps } from "@squadbase/vantage/components"
12
17
 
13
18
  export interface PageShellProps extends HTMLAttributes<HTMLDivElement> {}
14
19
 
@@ -19,7 +24,20 @@ export const PageShell = forwardRef<HTMLDivElement, PageShellProps>(
19
24
  )
20
25
  PageShell.displayName = "PageShell"
21
26
 
22
- export interface PageShellHeaderProps extends HTMLAttributes<HTMLDivElement> {}
27
+ export interface PageShellHeaderProps extends HTMLAttributes<HTMLDivElement> {
28
+ /** When the data was last updated. Drawn by `UpdatedAt` at the right end of the title row. */
29
+ updatedAt?: UpdatedAtProps["at"]
30
+ /** `"relative"` (default) or `"absolute-first"` ("16:41 更新(23 分前)") for pages where "now" matters. */
31
+ updatedAtVariant?: UpdatedAtProps["variant"]
32
+ /** IANA time zone for the absolute time of `updatedAt`. Defaults to the runtime's zone. */
33
+ timeZone?: string
34
+ /** Where the data comes from. Shown as a chip "出典:○○" on the second row. */
35
+ source?: string
36
+ /** The period the data covers. Shown as a chip "2026/9/23〜10/20" on the second row. */
37
+ period?: { start: Date | string | number; end: Date | string | number }
38
+ /** The page's overall state (an alert, a status badge). Shown on the third row; no row when absent. */
39
+ status?: ReactNode
40
+ }
23
41
 
24
42
  /**
25
43
  * A wrapping flex row, not a two-column grid: when the heading cannot keep its
@@ -27,16 +45,52 @@ export interface PageShellHeaderProps extends HTMLAttributes<HTMLDivElement> {}
27
45
  * `1fr auto` grid would instead hand the heading whatever the end block leaves,
28
46
  * and a CJK title — breakable between any two characters — collapses into a
29
47
  * one-character column.
48
+ *
49
+ * The meta props (`updatedAt`, `source`, `period`, `status`) fix the order every
50
+ * page head shares: title and update time (right end) → source / period chips →
51
+ * overall status → summary cards. Empty rows are not drawn. Rows are placed with
52
+ * flex `order`, so they land before `PageShellSummary` whatever the child order.
30
53
  */
31
54
  export const PageShellHeader = forwardRef<HTMLDivElement, PageShellHeaderProps>(
32
- ({ className, ...props }, ref) => (
33
- <div
34
- ref={ref}
35
- data-slot="page-shell-header"
36
- className={cn("flex flex-wrap items-start gap-x-4 gap-y-6 border-b px-6 py-12", className)}
37
- {...props}
38
- />
39
- ),
55
+ ({ className, updatedAt, updatedAtVariant, timeZone, source, period, status, children, ...props }, ref) => {
56
+ const periodText = period ? formatDateRange(period.start, period.end, { timeZone }) : undefined
57
+ const hasChips = Boolean(source) || (periodText !== undefined && periodText !== EMPTY_VALUE)
58
+ const hasStatus = status !== undefined && status !== null && status !== false && status !== ""
59
+ return (
60
+ <div
61
+ ref={ref}
62
+ data-slot="page-shell-header"
63
+ className={cn("flex flex-wrap items-start gap-x-4 gap-y-4 px-6 pt-8", className)}
64
+ {...props}
65
+ >
66
+ {children}
67
+ {updatedAt !== undefined && updatedAt !== null ? (
68
+ <div data-slot="page-shell-updated-at" className="ml-auto max-w-full shrink-0 text-right">
69
+ <UpdatedAt at={updatedAt} variant={updatedAtVariant} timeZone={timeZone} />
70
+ </div>
71
+ ) : null}
72
+ {hasChips ? (
73
+ <div data-slot="page-shell-chips" className="order-1 flex basis-full flex-wrap gap-1.5">
74
+ {source ? (
75
+ <Badge variant="outline" className="h-auto max-w-full whitespace-normal text-muted-foreground">
76
+ 出典:{source}
77
+ </Badge>
78
+ ) : null}
79
+ {periodText && periodText !== EMPTY_VALUE ? (
80
+ <Badge variant="outline" className="tabular-nums text-muted-foreground">
81
+ {periodText}
82
+ </Badge>
83
+ ) : null}
84
+ </div>
85
+ ) : null}
86
+ {hasStatus ? (
87
+ <div data-slot="page-shell-status" className="order-2 min-w-0 basis-full">
88
+ {status}
89
+ </div>
90
+ ) : null}
91
+ </div>
92
+ )
93
+ },
40
94
  )
41
95
  PageShellHeader.displayName = "PageShellHeader"
42
96
 
@@ -61,7 +115,7 @@ export const PageShellTitle = forwardRef<HTMLHeadingElement, PageShellTitleProps
61
115
  <h1
62
116
  ref={ref}
63
117
  data-slot="page-shell-title"
64
- className={cn("text-2xl font-bold tracking-tight text-foreground", className)}
118
+ className={cn("text-2xl font-semibold tracking-tight text-foreground", className)}
65
119
  {...props}
66
120
  />
67
121
  ),
@@ -132,7 +186,7 @@ export const PageShellSummary = forwardRef<HTMLDivElement, PageShellSummaryProps
132
186
  ref={ref}
133
187
  data-slot="page-shell-summary"
134
188
  className={cn(
135
- "grid basis-full grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",
189
+ "order-3 grid basis-full grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",
136
190
  className,
137
191
  )}
138
192
  {...props}
@@ -142,10 +196,23 @@ export const PageShellSummary = forwardRef<HTMLDivElement, PageShellSummaryProps
142
196
  PageShellSummary.displayName = "PageShellSummary"
143
197
 
144
198
  /**
145
- * Accent colours are spelled out one utility set per colour rather than built
146
- * from a template string — Tailwind only emits classes it can see literally in
147
- * the source.
199
+ * Accent tints come from theme tokens, never Tailwind palette colours: the
200
+ * semantic tones (`--positive` / `--negative` / `--warning` / `--info` /
201
+ * `--neutral` and their `*-subtle`) and, for hues with no status meaning,
202
+ * `--chart-4` / `--chart-5`. The colour-named accents are kept for compatibility
203
+ * and map to the nearest tone. Each set is a literal string — Tailwind only
204
+ * emits classes it can see literally in the source.
148
205
  */
206
+ const summaryCardTones = {
207
+ positive: "border-positive/20 dark:border-positive/25 bg-positive-subtle [&>svg]:text-positive",
208
+ negative: "border-negative/20 dark:border-negative/25 bg-negative-subtle [&>svg]:text-negative",
209
+ warning: "border-warning/20 dark:border-warning/25 bg-warning-subtle [&>svg]:text-warning",
210
+ info: "border-info/20 dark:border-info/25 bg-info-subtle [&>svg]:text-info",
211
+ neutral: "border-neutral/20 dark:border-neutral/25 bg-neutral-subtle [&>svg]:text-neutral",
212
+ violet: "border-chart-4/30 bg-chart-4/5 [&>svg]:text-chart-4",
213
+ pink: "border-chart-5/30 bg-chart-5/5 [&>svg]:text-chart-5",
214
+ } as const
215
+
149
216
  export const pageShellSummaryCardVariants = cva(
150
217
  "relative flex items-start gap-3 rounded-lg border bg-background px-4 py-3 text-sm [&>svg]:mt-0.5 [&>svg]:size-4 [&>svg]:shrink-0",
151
218
  {
@@ -154,40 +221,28 @@ export const pageShellSummaryCardVariants = cva(
154
221
  default: "text-card-foreground",
155
222
  accent:
156
223
  "border-[var(--chart-1)]/30 bg-linear-to-r from-[var(--chart-1)]/5 to-[var(--chart-1)]/5 [&>svg]:text-[var(--chart-1)]",
157
- amber:
158
- "border-amber-300 bg-amber-50 [&>svg]:text-amber-600 dark:border-amber-800 dark:bg-amber-950/50 dark:[&>svg]:text-amber-400",
159
- blue: "border-blue-300 bg-blue-50 [&>svg]:text-blue-600 dark:border-blue-800 dark:bg-blue-950/50 dark:[&>svg]:text-blue-400",
160
- emerald:
161
- "border-emerald-300 bg-emerald-50 [&>svg]:text-emerald-600 dark:border-emerald-800 dark:bg-emerald-950/50 dark:[&>svg]:text-emerald-400",
162
- red: "border-red-300 bg-red-50 [&>svg]:text-red-600 dark:border-red-800 dark:bg-red-950/50 dark:[&>svg]:text-red-400",
163
- violet:
164
- "border-violet-300 bg-violet-50 [&>svg]:text-violet-600 dark:border-violet-800 dark:bg-violet-950/50 dark:[&>svg]:text-violet-400",
165
- orange:
166
- "border-orange-300 bg-orange-50 [&>svg]:text-orange-600 dark:border-orange-800 dark:bg-orange-950/50 dark:[&>svg]:text-orange-400",
167
- cyan: "border-cyan-300 bg-cyan-50 [&>svg]:text-cyan-600 dark:border-cyan-800 dark:bg-cyan-950/50 dark:[&>svg]:text-cyan-400",
168
- slate:
169
- "border-slate-300 bg-slate-50 [&>svg]:text-slate-600 dark:border-slate-800 dark:bg-slate-950/50 dark:[&>svg]:text-slate-400",
170
- green:
171
- "border-green-300 bg-green-50 [&>svg]:text-green-600 dark:border-green-800 dark:bg-green-950/50 dark:[&>svg]:text-green-400",
172
- teal: "border-teal-300 bg-teal-50 [&>svg]:text-teal-600 dark:border-teal-800 dark:bg-teal-950/50 dark:[&>svg]:text-teal-400",
173
- sky: "border-sky-300 bg-sky-50 [&>svg]:text-sky-600 dark:border-sky-800 dark:bg-sky-950/50 dark:[&>svg]:text-sky-400",
174
- indigo:
175
- "border-indigo-300 bg-indigo-50 [&>svg]:text-indigo-600 dark:border-indigo-800 dark:bg-indigo-950/50 dark:[&>svg]:text-indigo-400",
176
- purple:
177
- "border-purple-300 bg-purple-50 [&>svg]:text-purple-600 dark:border-purple-800 dark:bg-purple-950/50 dark:[&>svg]:text-purple-400",
178
- pink: "border-pink-300 bg-pink-50 [&>svg]:text-pink-600 dark:border-pink-800 dark:bg-pink-950/50 dark:[&>svg]:text-pink-400",
179
- rose: "border-rose-300 bg-rose-50 [&>svg]:text-rose-600 dark:border-rose-800 dark:bg-rose-950/50 dark:[&>svg]:text-rose-400",
180
- yellow:
181
- "border-yellow-300 bg-yellow-50 [&>svg]:text-yellow-600 dark:border-yellow-800 dark:bg-yellow-950/50 dark:[&>svg]:text-yellow-400",
182
- lime: "border-lime-300 bg-lime-50 [&>svg]:text-lime-600 dark:border-lime-800 dark:bg-lime-950/50 dark:[&>svg]:text-lime-400",
183
- gray: "border-gray-300 bg-gray-50 [&>svg]:text-gray-600 dark:border-gray-800 dark:bg-gray-950/50 dark:[&>svg]:text-gray-400",
184
- zinc: "border-zinc-300 bg-zinc-50 [&>svg]:text-zinc-600 dark:border-zinc-800 dark:bg-zinc-950/50 dark:[&>svg]:text-zinc-400",
185
- neutral:
186
- "border-neutral-300 bg-neutral-50 [&>svg]:text-neutral-600 dark:border-neutral-800 dark:bg-neutral-950/50 dark:[&>svg]:text-neutral-400",
187
- stone:
188
- "border-stone-300 bg-stone-50 [&>svg]:text-stone-600 dark:border-stone-800 dark:bg-stone-950/50 dark:[&>svg]:text-stone-400",
189
- fuchsia:
190
- "border-fuchsia-300 bg-fuchsia-50 [&>svg]:text-fuchsia-600 dark:border-fuchsia-800 dark:bg-fuchsia-950/50 dark:[&>svg]:text-fuchsia-400",
224
+ amber: summaryCardTones.warning,
225
+ blue: summaryCardTones.info,
226
+ emerald: summaryCardTones.positive,
227
+ red: summaryCardTones.negative,
228
+ violet: summaryCardTones.violet,
229
+ orange: summaryCardTones.warning,
230
+ cyan: summaryCardTones.info,
231
+ slate: summaryCardTones.neutral,
232
+ green: summaryCardTones.positive,
233
+ teal: summaryCardTones.positive,
234
+ sky: summaryCardTones.info,
235
+ indigo: summaryCardTones.info,
236
+ purple: summaryCardTones.violet,
237
+ pink: summaryCardTones.pink,
238
+ rose: summaryCardTones.negative,
239
+ yellow: summaryCardTones.warning,
240
+ lime: summaryCardTones.positive,
241
+ gray: summaryCardTones.neutral,
242
+ zinc: summaryCardTones.neutral,
243
+ neutral: summaryCardTones.neutral,
244
+ stone: summaryCardTones.neutral,
245
+ fuchsia: summaryCardTones.violet,
191
246
  },
192
247
  },
193
248
  defaultVariants: {
@@ -219,7 +274,7 @@ export const PageShellContent = forwardRef<HTMLDivElement, PageShellContentProps
219
274
  <div
220
275
  ref={ref}
221
276
  data-slot="page-shell-content"
222
- className={cn("flex-1 p-6", className)}
277
+ className={cn("flex min-w-0 flex-1 flex-col gap-6 p-6", className)}
223
278
  {...props}
224
279
  />
225
280
  ),
@@ -1,5 +1,7 @@
1
1
  // Copied by `vantage add ui pagination`. This file is yours to edit.
2
- // Generated from @squadbase/vantage src/ui/pagination.tsx by `npm run registry` (in Vantage, edit src/, not registry/).
2
+ // Generated from @squadbase/squadkit registry/ui/pagination.tsx by `pnpm run registry` (in Vantage, edit packages/squadkit, not registry/).
3
+ "use client"
4
+
3
5
  import * as React from "react"
4
6
  import { cn } from "@squadbase/vantage/ui"
5
7