@squadbase/vantage 0.0.1 → 0.1.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 (167) hide show
  1. package/README.md +21 -4
  2. package/dist/chunk-A2UUGASH.js +12 -0
  3. package/dist/chunk-A2UUGASH.js.map +1 -0
  4. package/dist/{chunk-ZGDU5YLH.js → chunk-PRFBSQA4.js} +9 -5
  5. package/dist/chunk-PRFBSQA4.js.map +1 -0
  6. package/dist/chunk-WQZYXXQW.js +2249 -0
  7. package/dist/chunk-WQZYXXQW.js.map +1 -0
  8. package/dist/{chunk-73J5ZD4C.js → chunk-YLAB6UQS.js} +17 -3
  9. package/dist/chunk-YLAB6UQS.js.map +1 -0
  10. package/dist/cli.js +607 -36
  11. package/dist/cli.js.map +1 -1
  12. package/dist/components/index.d.ts +554 -0
  13. package/dist/components/index.js +1983 -0
  14. package/dist/components/index.js.map +1 -0
  15. package/dist/markdown/index.d.ts +9 -0
  16. package/dist/markdown/index.js +26 -0
  17. package/dist/markdown/index.js.map +1 -0
  18. package/dist/query/index.d.ts +27 -1
  19. package/dist/query/index.js +18 -0
  20. package/dist/query/index.js.map +1 -1
  21. package/dist/server/node.js +6 -1
  22. package/dist/server/node.js.map +1 -1
  23. package/dist/ui/index.d.ts +316 -200
  24. package/dist/ui/index.js +566 -511
  25. package/dist/ui/index.js.map +1 -1
  26. package/dist/vite/index.js +2 -2
  27. package/docs/en/agent-skills.md +89 -0
  28. package/docs/en/api-and-server.md +84 -0
  29. package/docs/en/build-and-deploy.md +280 -0
  30. package/docs/en/cli-reference.md +311 -0
  31. package/docs/en/components.md +233 -0
  32. package/docs/en/data-fetching.md +78 -0
  33. package/docs/en/environment-variables.md +69 -0
  34. package/docs/en/getting-started.md +95 -0
  35. package/docs/en/index.md +65 -0
  36. package/docs/en/markdown/markdown-renderer.md +44 -0
  37. package/docs/en/pages-and-metadata.md +56 -0
  38. package/docs/en/parts/app-shell.md +54 -0
  39. package/docs/en/parts/dashboard-card.md +64 -0
  40. package/docs/en/parts/data-table.md +86 -0
  41. package/docs/en/parts/date-range-picker.md +41 -0
  42. package/docs/en/parts/echart.md +53 -0
  43. package/docs/en/parts/filter-bar.md +66 -0
  44. package/docs/en/parts/funnel-steps.md +33 -0
  45. package/docs/en/parts/metric-value.md +23 -0
  46. package/docs/en/parts/multi-select.md +27 -0
  47. package/docs/en/parts/page-shell.md +45 -0
  48. package/docs/en/parts/searchable-select.md +47 -0
  49. package/docs/en/parts/section-header.md +20 -0
  50. package/docs/en/parts/segmented-control.md +25 -0
  51. package/docs/en/parts/status-badge.md +44 -0
  52. package/docs/en/parts/trend-indicator.md +26 -0
  53. package/docs/en/routing.md +95 -0
  54. package/docs/en/ui/accordion.md +36 -0
  55. package/docs/en/ui/alert.md +31 -0
  56. package/docs/en/ui/badge.md +23 -0
  57. package/docs/en/ui/breadcrumb.md +38 -0
  58. package/docs/en/ui/button.md +39 -0
  59. package/docs/en/ui/calendar.md +28 -0
  60. package/docs/en/ui/card.md +35 -0
  61. package/docs/en/ui/checkbox.md +34 -0
  62. package/docs/en/ui/cn.md +34 -0
  63. package/docs/en/ui/collapsible.md +21 -0
  64. package/docs/en/ui/command.md +37 -0
  65. package/docs/en/ui/dialog.md +52 -0
  66. package/docs/en/ui/dropdown-menu.md +50 -0
  67. package/docs/en/ui/empty.md +22 -0
  68. package/docs/en/ui/error-state.md +50 -0
  69. package/docs/en/ui/input-group.md +30 -0
  70. package/docs/en/ui/input.md +28 -0
  71. package/docs/en/ui/label.md +19 -0
  72. package/docs/en/ui/loading.md +19 -0
  73. package/docs/en/ui/popover.md +34 -0
  74. package/docs/en/ui/progress.md +28 -0
  75. package/docs/en/ui/scroll-area.md +23 -0
  76. package/docs/en/ui/select.md +63 -0
  77. package/docs/en/ui/separator.md +15 -0
  78. package/docs/en/ui/sheet.md +28 -0
  79. package/docs/en/ui/sidebar.md +92 -0
  80. package/docs/en/ui/skeleton.md +16 -0
  81. package/docs/en/ui/slider.md +21 -0
  82. package/docs/en/ui/spinner.md +14 -0
  83. package/docs/en/ui/switch.md +19 -0
  84. package/docs/en/ui/table.md +24 -0
  85. package/docs/en/ui/tabs.md +23 -0
  86. package/docs/en/ui/textarea.md +15 -0
  87. package/docs/en/ui/toggle-group.md +26 -0
  88. package/docs/en/ui/toggle.md +19 -0
  89. package/docs/en/ui/tooltip.md +22 -0
  90. package/docs/en/ui/use-is-mobile.md +18 -0
  91. package/docs/en/ui-and-theming.md +95 -0
  92. package/docs/index.json +1306 -0
  93. package/docs/ja/agent-skills.md +87 -0
  94. package/docs/ja/api-and-server.md +84 -0
  95. package/docs/ja/build-and-deploy.md +279 -0
  96. package/docs/ja/cli-reference.md +305 -0
  97. package/docs/ja/components.md +229 -0
  98. package/docs/ja/data-fetching.md +78 -0
  99. package/docs/ja/environment-variables.md +68 -0
  100. package/docs/ja/getting-started.md +95 -0
  101. package/docs/ja/index.md +65 -0
  102. package/docs/ja/markdown/markdown-renderer.md +43 -0
  103. package/docs/ja/pages-and-metadata.md +56 -0
  104. package/docs/ja/parts/app-shell.md +54 -0
  105. package/docs/ja/parts/dashboard-card.md +64 -0
  106. package/docs/ja/parts/data-table.md +85 -0
  107. package/docs/ja/parts/date-range-picker.md +41 -0
  108. package/docs/ja/parts/echart.md +52 -0
  109. package/docs/ja/parts/filter-bar.md +64 -0
  110. package/docs/ja/parts/funnel-steps.md +33 -0
  111. package/docs/ja/parts/metric-value.md +25 -0
  112. package/docs/ja/parts/multi-select.md +27 -0
  113. package/docs/ja/parts/page-shell.md +45 -0
  114. package/docs/ja/parts/searchable-select.md +47 -0
  115. package/docs/ja/parts/section-header.md +20 -0
  116. package/docs/ja/parts/segmented-control.md +26 -0
  117. package/docs/ja/parts/status-badge.md +44 -0
  118. package/docs/ja/parts/trend-indicator.md +26 -0
  119. package/docs/ja/routing.md +95 -0
  120. package/docs/ja/ui/accordion.md +37 -0
  121. package/docs/ja/ui/alert.md +31 -0
  122. package/docs/ja/ui/badge.md +23 -0
  123. package/docs/ja/ui/breadcrumb.md +38 -0
  124. package/docs/ja/ui/button.md +39 -0
  125. package/docs/ja/ui/calendar.md +28 -0
  126. package/docs/ja/ui/card.md +35 -0
  127. package/docs/ja/ui/checkbox.md +34 -0
  128. package/docs/ja/ui/cn.md +34 -0
  129. package/docs/ja/ui/collapsible.md +21 -0
  130. package/docs/ja/ui/command.md +36 -0
  131. package/docs/ja/ui/dialog.md +51 -0
  132. package/docs/ja/ui/dropdown-menu.md +50 -0
  133. package/docs/ja/ui/empty.md +22 -0
  134. package/docs/ja/ui/error-state.md +50 -0
  135. package/docs/ja/ui/input-group.md +30 -0
  136. package/docs/ja/ui/input.md +28 -0
  137. package/docs/ja/ui/label.md +19 -0
  138. package/docs/ja/ui/loading.md +19 -0
  139. package/docs/ja/ui/popover.md +34 -0
  140. package/docs/ja/ui/progress.md +28 -0
  141. package/docs/ja/ui/scroll-area.md +24 -0
  142. package/docs/ja/ui/select.md +64 -0
  143. package/docs/ja/ui/separator.md +15 -0
  144. package/docs/ja/ui/sheet.md +28 -0
  145. package/docs/ja/ui/sidebar.md +92 -0
  146. package/docs/ja/ui/skeleton.md +16 -0
  147. package/docs/ja/ui/slider.md +21 -0
  148. package/docs/ja/ui/spinner.md +14 -0
  149. package/docs/ja/ui/switch.md +19 -0
  150. package/docs/ja/ui/table.md +24 -0
  151. package/docs/ja/ui/tabs.md +24 -0
  152. package/docs/ja/ui/textarea.md +15 -0
  153. package/docs/ja/ui/toggle-group.md +27 -0
  154. package/docs/ja/ui/toggle.md +19 -0
  155. package/docs/ja/ui/tooltip.md +22 -0
  156. package/docs/ja/ui/use-is-mobile.md +18 -0
  157. package/docs/ja/ui-and-theming.md +95 -0
  158. package/package.json +29 -4
  159. package/registry/blocks/sales-overview.tsx +43 -19
  160. package/registry/ui/data-table.tsx +702 -102
  161. package/skills/vantage-add-feature/SKILL.md +150 -0
  162. package/skills/vantage-app/SKILL.md +258 -0
  163. package/skills/vantage-pitfalls/SKILL.md +115 -0
  164. package/templates/AGENTS.md +268 -0
  165. package/theme.css +178 -40
  166. package/dist/chunk-73J5ZD4C.js.map +0 -1
  167. package/dist/chunk-ZGDU5YLH.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ # Spinner
2
+
3
+ > いちばん小さい待機表示。
4
+
5
+ 回転するアイコンだけの待機表示です。ボタンの中など、狭い場所に置きます。
6
+
7
+ ```tsx
8
+ import { Spinner } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ `<svg>` そのものなので、大きさは `size-*`、色は `text-*` で決まります。
12
+
13
+ 画面ぶんの読み込みには [`Loading`](ui/loading)、レイアウトを保ったまま待たせるなら
14
+ [`Skeleton`](ui/skeleton) を使ってください。
@@ -0,0 +1,19 @@
1
+ # Switch
2
+
3
+ > 即時に効く設定のトグル。
4
+
5
+ その場で効く設定の切り替えです。フォームを送信して初めて効く項目には
6
+ [`Checkbox`](ui/checkbox) の方が適しています。
7
+
8
+ ```tsx
9
+ import { Switch } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ | Prop | Type | Default | 説明 |
13
+ | --- | --- | --- | --- |
14
+ | `checked` | `boolean` | | オン/オフ。 |
15
+ | `onCheckedChange` | `(checked: boolean) => void` | | 変更時。 |
16
+ | `size` | `"default" \| "sm"` | `"default"` | 大きさ。 |
17
+ | `disabled` | `boolean` | | 操作を無効にする。 |
18
+
19
+ ラベルは [`Label`](ui/label) で包むと、文字の側を押しても切り替わります。
@@ -0,0 +1,24 @@
1
+ # Table
2
+
3
+ > 素の表プリミティブ。並べ替えや検索が要るなら DataTable を。
4
+
5
+ `<table>` 一式にテーマの罫線と余白を付けただけのプリミティブです。並べ替え・検索・ページングが
6
+ 要るなら [`DataTable`](parts/data-table) を使ってください。
7
+
8
+ ```tsx
9
+ import {
10
+ Table,
11
+ TableHeader,
12
+ TableBody,
13
+ TableFooter,
14
+ TableRow,
15
+ TableHead,
16
+ TableCell,
17
+ TableCaption,
18
+ } from "@squadbase/vantage/ui";
19
+ ```
20
+
21
+ 対応は素の HTML そのままです — `Table` は `<table>`、`TableHeader` は `<thead>`、`TableHead` は
22
+ `<th>`、`TableCell` は `<td>`。props もネイティブのものが通ります。
23
+
24
+ 数値の列は `text-right tabular-nums` を付けると桁が揃います。
@@ -0,0 +1,24 @@
1
+ # Tabs
2
+
3
+ > 表示を切り替えるタブ。
4
+
5
+ 同じ場所に複数の内容を出し分けます。ボタン 2〜4 個で切り替えるだけなら
6
+ [`SegmentedControl`](parts/segmented-control) の方が場所を取りません。
7
+
8
+ ```tsx
9
+ import { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ ## パーツ
13
+
14
+ | パーツ | 役割 |
15
+ | --- | --- |
16
+ | `Tabs` | 状態。`value` / `defaultValue` / `onValueChange`、`orientation` |
17
+ | `TabsList` | タブの帯。`variant`: `default`(塗り)\| `line`(下線) |
18
+ | `TabsTrigger` | タブ 1 つ。`value` は必須 |
19
+ | `TabsContent` | 対応する中身 |
20
+
21
+ URL に状態を残したい場合は、`value` を検索パラメータと結び付けてください
22
+ ([ルーティング](routing) を参照)。
23
+
24
+ `orientation="vertical"` にすると縦並びになります。
@@ -0,0 +1,15 @@
1
+ # Textarea
2
+
3
+ > 複数行のテキスト入力。
4
+
5
+ 複数行の入力です。props はネイティブの `<textarea>` と同じです。
6
+
7
+ ```tsx
8
+ import { Textarea } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ 高さは `rows` か `className`(`min-h-32` など)で決めます。`aria-invalid` を付けるとエラー色に
12
+ なるのは [`Input`](ui/input) と同じです。
13
+
14
+ 上下にツールバーを付けたいときは、[`InputGroup`](ui/input-group) の
15
+ `InputGroupTextarea` と `align="block-end"` の組み合わせが使えます。
@@ -0,0 +1,27 @@
1
+ # ToggleGroup
2
+
3
+ > トグルの束。value は常に配列。
4
+
5
+ 複数のトグルをひとつの帯にまとめます。Base UI では**単一選択でも `value` は配列**です — 単一
6
+ 選択が欲しいだけなら [`SegmentedControl`](parts/segmented-control) がその面倒を
7
+ 引き受けます。
8
+
9
+ ```tsx
10
+ import { ToggleGroup, ToggleGroupItem } from "@squadbase/vantage/ui";
11
+ ```
12
+
13
+ | Prop | Type | Default | 説明 |
14
+ | --- | --- | --- | --- |
15
+ | `value` | `string[]` | | 選択中の値。**単一選択でも配列**。 |
16
+ | `onValueChange` | `(value: string[]) => void` | | 変更時。配列で返る。 |
17
+ | `toggleMultiple` | `boolean` | | 複数選択を許す。 |
18
+ | `variant` | `"default" \| "outline"` | `"default"` | |
19
+ | `size` | `"default" \| "sm" \| "lg"` | `"default"` | |
20
+ | `spacing` | `number` | `2` | 項目の間隔。`0` で連結された帯になる。 |
21
+ | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | |
22
+
23
+ > [!WARNING]
24
+ > Radix 版の `type="single"` / `type="multiple"` はありません。単一選択は「配列の長さを 1 に保つ」
25
+ > という運用になります。その処理は
26
+ > [`SegmentedControl`](parts/segmented-control) に入っているので、
27
+ > 単一選択ならそちらを使うのが確実です。
@@ -0,0 +1,19 @@
1
+ # Toggle
2
+
3
+ > 押した状態を保つボタン。
4
+
5
+ 押すとその状態が残るボタンです。複数を束ねたいときは
6
+ [`ToggleGroup`](ui/toggle-group) を使います。
7
+
8
+ ```tsx
9
+ import { Toggle, toggleVariants } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ | Prop | Type | Default | 説明 |
13
+ | --- | --- | --- | --- |
14
+ | `pressed` | `boolean` | | 押された状態。 |
15
+ | `onPressedChange` | `(pressed: boolean) => void` | | 変更時。 |
16
+ | `variant` | `"default" \| "outline"` | `"default"` | 見た目。 |
17
+ | `size` | `"default" \| "sm" \| "lg"` | `"default"` | 大きさ。 |
18
+
19
+ アイコンだけの場合は `aria-label` を必ず付けてください。
@@ -0,0 +1,22 @@
1
+ # Tooltip
2
+
3
+ > ホバーで出る短い説明。
4
+
5
+ ホバーやフォーカスで出る短い説明です。中に操作を置きたくなったら
6
+ [`Popover`](ui/popover) の出番です。
7
+
8
+ ```tsx
9
+ import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ ## パーツ
13
+
14
+ | パーツ | 役割 |
15
+ | --- | --- |
16
+ | `TooltipProvider` | 遅延の共有設定。`delay`(既定 `0`、ミリ秒) |
17
+ | `Tooltip` | 1 つ分の状態 |
18
+ | `TooltipTrigger` | きっかけ。`render` で任意の要素にする |
19
+ | `TooltipContent` | 中身。`side`(既定 `top`)/ `align` / `sideOffset` |
20
+
21
+ > [!NOTE]
22
+ > ツールチップはタッチ環境では出ません。**必要な情報をツールチップだけに置かないでください**。
@@ -0,0 +1,18 @@
1
+ # useIsMobile()
2
+
3
+ > 画面幅が狭いかどうかを返すフック。
4
+
5
+ ビューポートが狭い(768px 未満)かどうかを返すフックです。[`Sidebar`](ui/sidebar) が
6
+ モバイルでシートに切り替わる判定にも使っています。
7
+
8
+ ```tsx
9
+ import { useIsMobile } from "@squadbase/vantage/ui";
10
+
11
+ export default function Overview() {
12
+ const isMobile = useIsMobile();
13
+ return <EChart option={option} height={isMobile ? 200 : 360} />;
14
+ }
15
+ ```
16
+
17
+ `matchMedia` を購読しているので、幅を変えると再描画されます。初回描画では `false` から始まる点に
18
+ 注意してください(レイアウトの分岐は、可能なら CSS のブレークポイントで書く方が確実です)。
@@ -0,0 +1,95 @@
1
+ # UI とテーマ
2
+
3
+ > 組み込み UI キットを import する。styles.css でテーマトークンを上書きする。add でソースをコピーする。
4
+
5
+ Vantage は **shadcn/ui**(Base UI 版)と、Tailwind v4 ベースのテーマを同梱しています。設定不要で
6
+ すぐ使えます。
7
+
8
+ ## UI キットを使う
9
+
10
+ 入り口は 2 つです。shadcn/ui のプリミティブは `@squadbase/vantage/ui`、それらを組み上げた
11
+ ダッシュボード部品は `@squadbase/vantage/components` から import します。
12
+
13
+ ```tsx
14
+ import { Button } from "@squadbase/vantage/ui";
15
+ import { DashboardCardPreset, MetricValue } from "@squadbase/vantage/components";
16
+
17
+ export default function Overview() {
18
+ return (
19
+ <div className="grid gap-4 p-6 md:grid-cols-3">
20
+ <DashboardCardPreset title="売上">
21
+ <MetricValue className="my-0">¥1,240,000</MetricValue>
22
+ </DashboardCardPreset>
23
+ <DashboardCardPreset title="新規顧客">
24
+ <MetricValue className="my-0">128</MetricValue>
25
+ </DashboardCardPreset>
26
+ <DashboardCardPreset title="解約率">
27
+ <MetricValue className="my-0">2.1%</MetricValue>
28
+ </DashboardCardPreset>
29
+ </div>
30
+ );
31
+ }
32
+ ```
33
+
34
+ `/ui` にあるもの(抜粋): `Button`、`Card`、`Table` プリミティブ、`Tabs`、`Input` / `Select` /
35
+ `Checkbox` / `Switch` / `Slider`、`Calendar`、`Dialog` / `Sheet` / `Popover` / `Tooltip` /
36
+ `DropdownMenu`、`Sidebar`、`Alert` / `Skeleton` / `Spinner`、`Loading` / `Empty` / `ErrorState`。
37
+
38
+ `/components` にあるもの(抜粋): `PageShell`、`AppShell`、`DashboardCard`、`DataTable`、
39
+ `EChart`、`FunnelSteps`、`FilterBar`、`DateRangePicker`、`MetricValue`、`TrendIndicator`。
40
+
41
+ 各コンポーネントの props と使い方は [コンポーネント](components) タブにまとめてあります。
42
+
43
+ ## Tailwind はそのまま使える
44
+
45
+ `className` に Tailwind ユーティリティを書くだけで効きます。`tailwind.config` も `postcss.config`
46
+ も書きません(書くと禁止ファイルとしてエラーになります)。クラス結合には `cn()` が使えます。
47
+
48
+ ```tsx
49
+ import { cn } from "@squadbase/vantage/ui";
50
+
51
+ <div className={cn("p-4", isActive && "bg-accent")} />;
52
+ ```
53
+
54
+ ## テーマトークンを上書きする
55
+
56
+ 色や角丸などのデザイントークンは CSS 変数です。上書きしたいときは、プロジェクトルートに
57
+ `styles.css` を置き、**CSS 変数だけ**を上書きします。このファイルはテーマの後に自動 import されます。
58
+
59
+ ```css
60
+ /* styles.css — CSS 変数の上書きのみ */
61
+ :root {
62
+ --primary: oklch(0.55 0.22 265);
63
+ }
64
+ .dark,
65
+ [data-theme="dark"] {
66
+ --primary: oklch(0.72 0.19 265);
67
+ }
68
+ ```
69
+
70
+ > [!WARNING]
71
+ > `styles.css` で許されるのは **CSS 変数(テーマトークン)の上書き**です。`tailwind.config` の
72
+ > 持ち込みはできません(禁止ファイル)。
73
+
74
+ トークンは shadcn/ui の neutral パレット(oklch)に、チャート用の `--chart-1` 〜 `--chart-5` と
75
+ サイドバー用の `--sidebar-*` を足したものです。`--chart-*` を変えると
76
+ [`EChart`](parts/echart) の配色も一緒に変わります。チャートは CSS 変数を実際に読み取って
77
+ テーマを組み立てるためです。
78
+
79
+ ## ソースを編集したいとき: `vantage add`
80
+
81
+ コンポーネントの中身を自分のものにしたいときは、編集可能なソースを `components/` にコピーします。
82
+
83
+ ```bash
84
+ vantage add ui data-table # 編集可能な DataTable をコピー
85
+ vantage add block sales-overview
86
+ ```
87
+
88
+ > [!NOTE]
89
+ > 現行プロトタイプで `vantage add` がコピーできるのは `data-table`(ui)と `sales-overview`(block)
90
+ > のみです。その他の UI コンポーネントは import 専用です。
91
+
92
+ ## 次に読む
93
+
94
+ - [コンポーネント](components) — 全コンポーネントの props リファレンス
95
+ - [CLI リファレンス](cli-reference) — 全コマンド
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squadbase/vantage",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "description": "Data dashboard framework for Squadbase Editor. Vite-powered, config-free, one-file first.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,6 +50,14 @@
50
50
  "types": "./dist/ui/index.d.ts",
51
51
  "default": "./dist/ui/index.js"
52
52
  },
53
+ "./components": {
54
+ "types": "./dist/components/index.d.ts",
55
+ "default": "./dist/components/index.js"
56
+ },
57
+ "./markdown": {
58
+ "types": "./dist/markdown/index.d.ts",
59
+ "default": "./dist/markdown/index.js"
60
+ },
53
61
  "./server": {
54
62
  "types": "./dist/server/index.d.ts",
55
63
  "default": "./dist/server/index.js"
@@ -71,25 +79,42 @@
71
79
  },
72
80
  "files": [
73
81
  "dist",
82
+ "docs",
74
83
  "theme.css",
75
- "registry"
84
+ "registry",
85
+ "skills",
86
+ "templates"
76
87
  ],
77
88
  "scripts": {
78
- "build": "tsup",
89
+ "build": "node scripts/build-docs.mjs && tsup",
90
+ "build:docs": "node scripts/build-docs.mjs",
79
91
  "dev": "tsup --watch",
80
92
  "typecheck": "tsc --noEmit",
81
- "prepublishOnly": "tsup"
93
+ "prepublishOnly": "node scripts/build-docs.mjs && tsup"
82
94
  },
83
95
  "dependencies": {
96
+ "@base-ui/react": "^1.6.0",
84
97
  "@hono/node-server": "^2.0.8",
98
+ "@streamdown/code": "^1.1.1",
85
99
  "@tailwindcss/vite": "^4.3.2",
86
100
  "@tanstack/react-query": "^5.101.2",
87
101
  "@tanstack/react-router": "^1.170.17",
102
+ "@tanstack/react-table": "^8.21.3",
88
103
  "@vitejs/plugin-react": "^6.0.3",
104
+ "class-variance-authority": "^0.7.1",
105
+ "clsx": "^2.1.1",
106
+ "cmdk": "^1.1.1",
107
+ "date-fns": "^4.1.0",
108
+ "echarts": "^6.0.0",
89
109
  "esbuild": "^0.28.1",
90
110
  "hono": "^4.12.30",
111
+ "lucide-react": "^0.468.0",
91
112
  "picocolors": "^1.1.1",
113
+ "react-day-picker": "^10.0.1",
114
+ "streamdown": "^2.5.0",
115
+ "tailwind-merge": "^3.0.0",
92
116
  "tailwindcss": "^4.3.2",
117
+ "tw-animate-css": "^1.0.0",
93
118
  "vite": "^8.1.4"
94
119
  },
95
120
  "peerDependencies": {
@@ -1,5 +1,11 @@
1
1
  // Copied by `vantage add block sales-overview`. This file is yours to edit.
2
- import { BarChart, Card, CardContent, CardHeader, CardTitle, MetricCard } from "@squadbase/vantage/ui"
2
+ import {
3
+ DashboardCardPreset,
4
+ EChart,
5
+ MetricValue,
6
+ TrendIndicator,
7
+ type EChartsOption,
8
+ } from "@squadbase/vantage/components"
3
9
 
4
10
  export interface SalesOverviewProps {
5
11
  totalRevenue: string
@@ -10,28 +16,46 @@ export interface SalesOverviewProps {
10
16
 
11
17
  /** A composed dashboard section: KPI row + revenue vs. target chart. */
12
18
  export function SalesOverview({ totalRevenue, orders, revenueDelta, monthly }: SalesOverviewProps) {
19
+ const avgOrder = Math.round(
20
+ (Number(totalRevenue.replace(/[^0-9.]/g, "")) || 0) / Math.max(1, orders),
21
+ )
22
+
23
+ // Annotate the option — without it TypeScript widens `type: "category"` to
24
+ // `string` and ECharts rejects it.
25
+ const option: EChartsOption = {
26
+ tooltip: { trigger: "axis" },
27
+ legend: { data: ["Revenue", "Target"], top: 0 },
28
+ grid: { left: 8, right: 8, top: 40, bottom: 8, containLabel: true },
29
+ xAxis: { type: "category", data: monthly.map((m) => m.month) },
30
+ yAxis: { type: "value" },
31
+ series: [
32
+ { name: "Revenue", type: "bar", data: monthly.map((m) => m.revenue) },
33
+ { name: "Target", type: "bar", data: monthly.map((m) => m.target) },
34
+ ],
35
+ }
36
+
13
37
  return (
14
38
  <section className="flex flex-col gap-4">
15
39
  <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
16
- <MetricCard label="Revenue" value={totalRevenue} delta={revenueDelta} />
17
- <MetricCard label="Orders" value={orders.toLocaleString()} />
18
- <MetricCard label="Avg. order" value={`$${Math.round((Number(totalRevenue.replace(/[^0-9.]/g, "")) || 0) / Math.max(1, orders))}`} />
40
+ <DashboardCardPreset title="Revenue">
41
+ <MetricValue className="my-0">{totalRevenue}</MetricValue>
42
+ {revenueDelta !== undefined && (
43
+ <TrendIndicator
44
+ value={Math.abs(revenueDelta)}
45
+ direction={revenueDelta >= 0 ? "up" : "down"}
46
+ />
47
+ )}
48
+ </DashboardCardPreset>
49
+ <DashboardCardPreset title="Orders">
50
+ <MetricValue className="my-0">{orders.toLocaleString()}</MetricValue>
51
+ </DashboardCardPreset>
52
+ <DashboardCardPreset title="Avg. order">
53
+ <MetricValue className="my-0">${avgOrder}</MetricValue>
54
+ </DashboardCardPreset>
19
55
  </div>
20
- <Card>
21
- <CardHeader>
22
- <CardTitle>Revenue vs. target</CardTitle>
23
- </CardHeader>
24
- <CardContent>
25
- <BarChart
26
- data={monthly}
27
- categoryKey="month"
28
- series={[
29
- { key: "revenue", label: "Revenue" },
30
- { key: "target", label: "Target" },
31
- ]}
32
- />
33
- </CardContent>
34
- </Card>
56
+ <DashboardCardPreset title="Revenue vs. target">
57
+ <EChart option={option} height={320} ariaLabel="Revenue vs. target by month" />
58
+ </DashboardCardPreset>
35
59
  </section>
36
60
  )
37
61
  }