@squadbase/vantage 0.6.2-dev1.9d91dda → 0.6.2-dev1.ac99e02

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 (172) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-TVKFIVFQ.js → build-MFWRPYKW.js} +7 -7
  4. package/dist/{build-TVKFIVFQ.js.map → build-MFWRPYKW.js.map} +1 -1
  5. package/dist/{check-3KHZXZMQ.js → check-ZBIH422T.js} +5 -5
  6. package/dist/{check-3KHZXZMQ.js.map → check-ZBIH422T.js.map} +1 -1
  7. package/dist/{chunk-P7W4LR3Z.js → chunk-7DZGJQ3P.js} +3 -3
  8. package/dist/{chunk-P7W4LR3Z.js.map → chunk-7DZGJQ3P.js.map} +1 -1
  9. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  10. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  11. package/dist/{chunk-NKFBFDRZ.js → chunk-AG6RZ2RR.js} +981 -14
  12. package/dist/chunk-AG6RZ2RR.js.map +1 -0
  13. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  14. package/dist/chunk-GNXCX4WE.js.map +1 -0
  15. package/dist/chunk-IBGOCWJB.js +1716 -0
  16. package/dist/chunk-IBGOCWJB.js.map +1 -0
  17. package/dist/{chunk-RPZAALCX.js → chunk-OB6UBJXF.js} +153 -153
  18. package/dist/{chunk-RPZAALCX.js.map → chunk-OB6UBJXF.js.map} +1 -1
  19. package/dist/{chunk-LMUACBMA.js → chunk-QEWCYW3I.js} +43 -8
  20. package/dist/chunk-QEWCYW3I.js.map +1 -0
  21. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  22. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  23. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  24. package/dist/chunk-V3LF7BE7.js.map +1 -0
  25. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  26. package/dist/chunk-XQUSGIDG.js.map +1 -0
  27. package/dist/cli.js +12 -11
  28. package/dist/cli.js.map +1 -1
  29. package/dist/client/index.d.ts +32 -3
  30. package/dist/client/index.js +205 -12
  31. package/dist/client/index.js.map +1 -1
  32. package/dist/components/index.d.ts +216 -1
  33. package/dist/components/index.js +2 -2
  34. package/dist/{dev-GDKATCC7.js → dev-DCTOHQ6W.js} +8 -8
  35. package/dist/dev-DCTOHQ6W.js.map +1 -0
  36. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  37. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  38. package/dist/{doctor-WQXPXP6K.js → doctor-5E2VEZPK.js} +5 -5
  39. package/dist/{doctor-WQXPXP6K.js.map → doctor-5E2VEZPK.js.map} +1 -1
  40. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  41. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  42. package/dist/query/index.d.ts +0 -11
  43. package/dist/query/index.js +2 -2
  44. package/dist/{routes-MWBWWOJ2.js → routes-3SGAFDMC.js} +4 -4
  45. package/dist/{routes-MWBWWOJ2.js.map → routes-3SGAFDMC.js.map} +1 -1
  46. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  47. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  48. package/dist/table/index.js +7 -6
  49. package/dist/table/index.js.map +1 -1
  50. package/dist/ui/index.d.ts +140 -10
  51. package/dist/ui/index.js +1405 -63
  52. package/dist/ui/index.js.map +1 -1
  53. package/dist/{upgrade-HCANX4GQ.js → upgrade-DBBE6GIR.js} +6 -6
  54. package/dist/{upgrade-HCANX4GQ.js.map → upgrade-DBBE6GIR.js.map} +1 -1
  55. package/dist/vite/index.d.ts +10 -0
  56. package/dist/vite/index.js +3 -3
  57. package/docs/index.json +291 -61
  58. package/docs/ja/changelog.md +26 -0
  59. package/docs/ja/components.md +33 -89
  60. package/docs/ja/page-types/csv.md +83 -0
  61. package/docs/ja/page-types/doc.md +83 -0
  62. package/docs/ja/page-types/excel.md +82 -0
  63. package/docs/ja/page-types/slide.md +132 -0
  64. package/docs/ja/page-types.md +47 -0
  65. package/docs/ja/parts/area-chart.md +61 -0
  66. package/docs/ja/parts/bar-chart.md +69 -0
  67. package/docs/ja/parts/bar-list.md +35 -0
  68. package/docs/ja/parts/category-bar.md +36 -0
  69. package/docs/ja/parts/donut-chart.md +47 -0
  70. package/docs/ja/parts/echart.md +3 -0
  71. package/docs/ja/parts/line-chart.md +58 -0
  72. package/docs/ja/parts/progress-circle.md +34 -0
  73. package/docs/ja/parts/sparkline.md +1 -1
  74. package/docs/ja/parts/tracker.md +32 -0
  75. package/docs/ja/routing.md +8 -86
  76. package/docs/ja/ui/alert-dialog.md +41 -0
  77. package/docs/ja/ui/avatar.md +31 -0
  78. package/docs/ja/ui/combobox.md +74 -0
  79. package/docs/ja/ui/drawer.md +41 -0
  80. package/docs/ja/ui/field.md +42 -0
  81. package/docs/ja/ui/hover-card.md +21 -0
  82. package/docs/ja/ui/kbd.md +16 -0
  83. package/docs/ja/ui/pagination.md +36 -0
  84. package/docs/ja/ui/radio-group.md +21 -0
  85. package/docs/ja/ui/toast.md +46 -0
  86. package/docs/ja/ui-and-theming.md +14 -7
  87. package/package.json +21 -13
  88. package/registry/ui/accordion.tsx +74 -0
  89. package/registry/ui/alert-dialog.tsx +189 -0
  90. package/registry/ui/alert.tsx +78 -0
  91. package/registry/ui/app-shell.tsx +281 -0
  92. package/registry/ui/area-chart.tsx +1015 -0
  93. package/registry/ui/avatar.tsx +110 -0
  94. package/registry/ui/badge.tsx +54 -0
  95. package/registry/ui/bar-chart.tsx +1013 -0
  96. package/registry/ui/bar-list.tsx +302 -0
  97. package/registry/ui/breadcrumb.tsx +126 -0
  98. package/registry/ui/button.tsx +60 -0
  99. package/registry/ui/calendar.tsx +221 -0
  100. package/registry/ui/card.tsx +105 -0
  101. package/registry/ui/category-bar.tsx +281 -0
  102. package/registry/ui/checkbox.tsx +28 -0
  103. package/registry/ui/collapsible.tsx +21 -0
  104. package/registry/ui/combobox.tsx +310 -0
  105. package/registry/ui/command.tsx +196 -0
  106. package/registry/ui/dashboard-card.tsx +174 -0
  107. package/registry/ui/data-table.tsx +16 -91
  108. package/registry/ui/date-range-picker.tsx +209 -0
  109. package/registry/ui/dialog.tsx +159 -0
  110. package/registry/ui/donut-chart.tsx +1004 -0
  111. package/registry/ui/drawer.tsx +229 -0
  112. package/registry/ui/dropdown-menu.tsx +272 -0
  113. package/registry/ui/echart.tsx +486 -0
  114. package/registry/ui/field.tsx +240 -0
  115. package/registry/ui/filter-bar.tsx +365 -0
  116. package/registry/ui/funnel-steps.tsx +274 -0
  117. package/registry/ui/hover-card.tsx +52 -0
  118. package/registry/ui/input-group.tsx +158 -0
  119. package/registry/ui/input.tsx +22 -0
  120. package/registry/ui/kbd.tsx +28 -0
  121. package/registry/ui/label.tsx +20 -0
  122. package/registry/ui/line-chart.tsx +1007 -0
  123. package/registry/ui/metric-value.tsx +54 -0
  124. package/registry/ui/multi-select.tsx +226 -0
  125. package/registry/ui/page-shell.tsx +227 -0
  126. package/registry/ui/pagination.tsx +138 -0
  127. package/registry/ui/placeholder.tsx +30 -0
  128. package/registry/ui/popover.tsx +90 -0
  129. package/registry/ui/progress-circle.tsx +272 -0
  130. package/registry/ui/progress.tsx +83 -0
  131. package/registry/ui/radio-group.tsx +39 -0
  132. package/registry/ui/scroll-area.tsx +55 -0
  133. package/registry/ui/searchable-select.tsx +209 -0
  134. package/registry/ui/section-header.tsx +41 -0
  135. package/registry/ui/segmented-control.tsx +71 -0
  136. package/registry/ui/select.tsx +253 -0
  137. package/registry/ui/separator.tsx +25 -0
  138. package/registry/ui/sheet.tsx +137 -0
  139. package/registry/ui/sidebar.tsx +723 -0
  140. package/registry/ui/skeleton.tsx +15 -0
  141. package/registry/ui/slider.tsx +54 -0
  142. package/registry/ui/sparkline.tsx +155 -0
  143. package/registry/ui/spinner.tsx +12 -0
  144. package/registry/ui/states.tsx +61 -0
  145. package/registry/ui/status-badge.tsx +79 -0
  146. package/registry/ui/switch.tsx +32 -0
  147. package/registry/ui/table.tsx +116 -0
  148. package/registry/ui/tabs.tsx +82 -0
  149. package/registry/ui/textarea.tsx +20 -0
  150. package/registry/ui/toast.tsx +250 -0
  151. package/registry/ui/toggle-group.tsx +89 -0
  152. package/registry/ui/toggle.tsx +45 -0
  153. package/registry/ui/tooltip.tsx +66 -0
  154. package/registry/ui/tracker.tsx +236 -0
  155. package/registry/ui/trend-indicator.tsx +62 -0
  156. package/skills/vantage-add-feature/SKILL.md +9 -7
  157. package/skills/vantage-pitfalls/SKILL.md +5 -1
  158. package/templates/AGENTS.md +10 -1
  159. package/templates/agents/csv.md +2 -1
  160. package/templates/agents/doc.md +4 -3
  161. package/templates/agents/page.md +22 -8
  162. package/templates/agents/xlsx.md +2 -1
  163. package/dist/add-DY4AXANK.js +0 -6
  164. package/dist/add-DY4AXANK.js.map +0 -1
  165. package/dist/chunk-DTDVSFRY.js.map +0 -1
  166. package/dist/chunk-LMUACBMA.js.map +0 -1
  167. package/dist/chunk-NKFBFDRZ.js.map +0 -1
  168. package/dist/chunk-PVTHHV7X.js.map +0 -1
  169. package/dist/chunk-QI3XQKHS.js.map +0 -1
  170. package/dist/chunk-VA776YE5.js +0 -316
  171. package/dist/chunk-VA776YE5.js.map +0 -1
  172. package/dist/dev-GDKATCC7.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ // Copied by `vantage add ui trend-indicator`. This file is yours to edit.
2
+ // Generated from @squadbase/vantage src/components/trend-indicator.tsx by `npm run registry` (in Vantage, edit src/, not registry/).
3
+ /**
4
+ * TrendIndicator — an arrow plus percentage change. Colour tracks *sentiment*,
5
+ * not direction: set `positiveIsGood={false}` for metrics where going up is bad
6
+ * (churn, error rate) and a rise renders as negative.
7
+ */
8
+ import { forwardRef } from "react"
9
+ import { ArrowDown, ArrowUp, Minus } from "lucide-react"
10
+ import { cva } from "class-variance-authority"
11
+
12
+ import { cn } from "@squadbase/vantage/ui"
13
+ import type { TrendDirection } from "@squadbase/vantage/components"
14
+
15
+ const trendIndicatorVariants = cva("inline-flex items-center gap-0.5 text-sm font-medium", {
16
+ variants: {
17
+ sentiment: {
18
+ positive: "text-chart-1",
19
+ negative: "text-primary",
20
+ neutral: "text-muted-foreground",
21
+ },
22
+ },
23
+ defaultVariants: {
24
+ sentiment: "neutral",
25
+ },
26
+ })
27
+
28
+ export interface TrendIndicatorProps {
29
+ value: number
30
+ direction: TrendDirection
31
+ positiveIsGood?: boolean
32
+ className?: string
33
+ }
34
+
35
+ export const TrendIndicator = forwardRef<HTMLSpanElement, TrendIndicatorProps>(
36
+ ({ value, direction, positiveIsGood = true, className }, ref) => {
37
+ const isGood = direction === "neutral" ? null : (direction === "up") === positiveIsGood
38
+ const sentiment = isGood === null ? "neutral" : isGood ? "positive" : "negative"
39
+
40
+ const Icon = direction === "up" ? ArrowUp : direction === "down" ? ArrowDown : Minus
41
+
42
+ const ariaLabel =
43
+ direction === "neutral"
44
+ ? `変化なし ${value}%`
45
+ : direction === "up"
46
+ ? `${value}% 増加`
47
+ : `${value}% 減少`
48
+
49
+ return (
50
+ <span
51
+ ref={ref}
52
+ data-slot="trend-indicator"
53
+ className={cn(trendIndicatorVariants({ sentiment }), className)}
54
+ aria-label={ariaLabel}
55
+ >
56
+ <Icon className="size-3.5" aria-hidden="true" />
57
+ <span>{value}%</span>
58
+ </span>
59
+ )
60
+ },
61
+ )
62
+ TrendIndicator.displayName = "TrendIndicator"
@@ -16,7 +16,7 @@ CLI は雛形を出すだけで、規約の遵守はこちらの責任。**追
16
16
  ```bash
17
17
  vantage add page <name> # ルートページ(.tsx)
18
18
  vantage add api <name> # server/api/**.ts の API モジュール
19
- vantage add ui <name> # registry から UI ソースを components/ui/ にコピー(src/ があればその中)
19
+ vantage add ui <name> # /ui・/components の部品ソースを components/ui/ にコピー(src/ があればその中)
20
20
  vantage add block <name> # registry からブロックを components/blocks/ にコピー(同上)
21
21
  ```
22
22
 
@@ -121,15 +121,17 @@ vantage add ui data-table # → components/ui/data-table.tsx(編集可能
121
121
  vantage add block sales-overview # → components/blocks/sales-overview.tsx
122
122
  ```
123
123
 
124
- - **多くの UI コンポーネントは「import 専用」で、`add ui` でコピーできる名前は限られる。**
125
- 現在 registry からコピー可能なのは `data-table`(ui)と `sales-overview`(block)のみ。
126
- 未知の名前を渡すと利用可能な名前一覧を出して失敗する。
127
- - コピーが要らない大半のプリミティブは `@squadbase/vantage/ui` から、複合パーツは
128
- `@squadbase/vantage/components` から**そのまま import**するのが基本(コピー不要)。
124
+ - **基本はコピーせず import する。** プリミティブは `@squadbase/vantage/ui` から、複合パーツと
125
+ チャートは `@squadbase/vantage/components` から**そのまま import**する。
129
126
  ```tsx
130
127
  import { Button, Loading, ErrorState } from "@squadbase/vantage/ui"
131
- import { DashboardCardPreset, DataTablePreset, EChart } from "@squadbase/vantage/components"
128
+ import { DashboardCardPreset, DataTablePreset, LineChart } from "@squadbase/vantage/components"
132
129
  ```
130
+ - `add ui` は**改造したいときだけ**使う。`/ui` と `/components` の部品はすべて kebab-case 名で
131
+ コピーできる(`add ui bar-chart`・`add ui combobox`)。未知の名前を渡すと利用可能な名前一覧を
132
+ 出して失敗する。
133
+ - グラフは型付きチャート(`LineChart`・`BarChart` など)から選ぶ。選び方は `agents/page.md` の
134
+ 「グラフはまず型付きチャートで描く」。
133
135
  - **props は `vantage docs <name>` で確認してから書く**(`vantage docs button`・
134
136
  `vantage docs parts/data-table`。名前が分からなければ `vantage search <やりたいこと>` で
135
137
  探してから `vantage docs` に渡す)。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vantage-pitfalls
3
- description: Vantage(@squadbase/vantage)アプリを書くときに静かに壊れる落とし穴のリファレンス。Base UI は Radix ではない(asChild 無し・render プロップ)、Select の value/label、クライアントから server/ を import しない、EChart の配色と高さ、動的パラメータの3綴り同期、PUBLIC_ env、HttpError、csv/xlsx ページの URL 衝突とサイズ上限、スライドの data-waitfor など。Vantage の UI コンポーネントやルーティングが思った通りに動かないとき、ビルドやスタイルが静かに欠落するときに参照する。
3
+ description: Vantage(@squadbase/vantage)アプリを書くときに静かに壊れる落とし穴のリファレンス。Base UI は Radix ではない(asChild 無し・render プロップ)、Select の value/label、クライアントから server/ を import しない、チャートの色指定と EChart の配色・高さ、動的パラメータの3綴り同期、PUBLIC_ env、HttpError、csv/xlsx ページの URL 衝突とサイズ上限、スライドの data-waitfor など。Vantage の UI コンポーネントやルーティングが思った通りに動かないとき、ビルドやスタイルが静かに欠落するときに参照する。
4
4
  ---
5
5
 
6
6
  # Vantage アプリの落とし穴リファレンス
@@ -59,6 +59,10 @@ Base UI の `SelectValue` は選択中の **value をそのまま描き**、`Sel
59
59
 
60
60
  ## チャート:`EChart` の配色はトークン追従。上書きは `option.color`
61
61
 
62
+ ふつうの推移・比較・構成比は型付きチャート(`LineChart`・`BarChart` など。→ `agents/page.md`)で
63
+ 描く。その `colors` に渡すのはトークン名 `"chart-1"`〜`"chart-5"` か CSS 色で、Tailwind クラス
64
+ (`"bg-blue-500"` など)は効かない。以下は `EChart` を直接使うときの話。
65
+
62
66
  系列色は `--chart-1..5`、軸・凡例・ツールチップは文字色/境界色のトークンから組まれる
63
67
  (init 時にトークンの実値を解決している)。ライト / ダークの切り替えにも、`styles.css` の
64
68
  書き換えやテーマプリセットの適用にも追従する。
@@ -93,7 +93,7 @@ root/
93
93
  | `@squadbase/vantage/router` | `Link`・`Outlet`・`useParams`・`useSearch`・`useNavigate`・`redirect`・`notFound`・`useRoutes`・`useCurrentRoute`・`useSearchParam`・`useSearchState` |
94
94
  | `@squadbase/vantage/query` | `useApiQuery`・`useApiMutation`・`apiJson`・`apiFetch`・`apiUrl`・`ApiError`、ほか `useQuery`/`useMutation` など TanStack Query の再エクスポート |
95
95
  | `@squadbase/vantage/ui` | shadcn/ui(Base UI バリアント)プリミティブ(`Button`・`Loading`・`ErrorState`・`Empty` ほか) |
96
- | `@squadbase/vantage/components` | 複合パーツ(`PageShell`・`DashboardCardPreset`・`DataTablePreset`・`EChart` ほか) |
96
+ | `@squadbase/vantage/components` | 複合パーツ(`PageShell`・`DashboardCardPreset`・`DataTablePreset`、型付きチャート `LineChart`・`BarChart`・`AreaChart`・`DonutChart`・`BarList` ほか、`EChart`) |
97
97
  | `@squadbase/vantage/table` | `FilePageView`・`TableViewer`(データファイルページの表ビューア) |
98
98
  | `@squadbase/vantage/slide` | `SlideDeck`・`Slide`・`Steps`・`Step`・`MorphElement`・`useSlideNumber`・`useIsActiveSlide`(スライド専用。1920×1080 の固定キャンバス) |
99
99
  | `@squadbase/vantage/doc` | `Document`(ドキュメント専用。中の素の HTML 要素に見出し・表などのスタイルが当たる) |
@@ -137,6 +137,15 @@ root/
137
137
  | `.xlsx` ページ | `agents/xlsx.md` |
138
138
  | `.csv` ページ | `agents/csv.md` |
139
139
 
140
+ **ページになるのは `.tsx` / `.jsx`(`.slide.tsx`・`.doc.tsx` を含む)・`.csv`・`.xlsx` だけ。**
141
+
142
+ - `.xls`・`.xlsm`・`.xlsb`・`.ods`・`.tsv`・`.numbers`・`.parquet` はルートにならず、404 にもならない。
143
+ `vantage check` の `UNSUPPORTED_PAGE_FILE` 警告だけが知らせる。`.xlsx` / `.csv` に変換して置く
144
+ - `.md`・`.json`・`.txt` は何も言わずに無視される。Markdown を見せたいときは `.tsx` のページで
145
+ `MarkdownRenderer`(`@squadbase/vantage/markdown`)に渡す
146
+ - `.csv` / `.xlsx` はブラウザでパースする。25MB を超えるとそのページにエラーが出る
147
+ (`FILE_PAGE_TOO_LARGE` 警告)。20 万行を超えるシートは先頭 20 万行だけが表示される
148
+
140
149
  ## 環境変数
141
150
 
142
151
  - **クライアントで読めるのは `import.meta.env.PUBLIC_*` と `MODE`/`DEV`/`PROD`/`SSR`/`BASE_URL`
@@ -27,6 +27,7 @@
27
27
  ```
28
28
  - 数式・グラフ・セル書式といった概念は csv には無いので、値がそのまま読めます。ブラウザで
29
29
  パースするので 25MB を超えるファイルはそのページにエラーが出ます —— 大きいデータは
30
- `server/api/` から配って `DataTable` で描いてください
30
+ `server/api/` から配って `DataTable` で描いてください。20 万行を超えると先頭
31
+ 20 万行だけが表示されます(残りはダウンロードして見る)
31
32
  - **ビューアの無い拡張子(`.tsv` など)はルートになりません。** `vantage check` の
32
33
  `UNSUPPORTED_PAGE_FILE` 警告が知らせます
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```tsx
14
14
  import { definePage } from "@squadbase/vantage"
15
- import { EChart } from "@squadbase/vantage/components"
15
+ import { BarChart } from "@squadbase/vantage/components"
16
16
  import { Document } from "@squadbase/vantage/doc"
17
17
 
18
18
  export const page = definePage({ title: "6月度サマリー", navLabel: "6月度サマリー" })
@@ -23,7 +23,7 @@ export default function JuneSummary() {
23
23
  <p>6月の売上は <strong>5,250 万円</strong>で、目標を 5% 上回りました。</p>
24
24
  <h2>週次の売上</h2>
25
25
  <figure>
26
- <EChart option={option} height={280} ariaLabel="6月の週次売上" />
26
+ <BarChart data={weekly} index="week" categories={["売上"]} height={280} ariaLabel="6月の週次売上" />
27
27
  <figcaption>第4週はキャンペーン初週</figcaption>
28
28
  </figure>
29
29
  <table>…</table>
@@ -42,7 +42,8 @@ export default function JuneSummary() {
42
42
  見た目を変えたいときはユーティリティを並べず、下の `--doc-*` を変えます。
43
43
  - **数値はコードに直接書く。** ドキュメントは書いた時点の内容を残すページです。
44
44
  `useApiQuery` などで読み込むと、開くたびに値が変わります。
45
- - **チャートは `EChart`(`@squadbase/vantage/components`)を文中に置く。** `figure` で囲めば
45
+ - **チャートは型付きチャート(`BarChart`・`LineChart` など。`@squadbase/vantage/components`)を
46
+ 文中に置く**(選び方は `agents/page.md` の「グラフはまず型付きチャートで描く」)。`figure` で囲めば
46
47
  `figcaption` がキャプションになります。
47
48
  - **PDF の保存ボタンは作らない。** `<Document>` が右下に PDF 保存のボタンを出し、印刷時は
48
49
  本文だけをライトの配色で出します。
@@ -26,8 +26,8 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@squadbase/vantage": "^0.5.0",
29
- "react": "^19.2.7",
30
- "react-dom": "^19.2.7"
29
+ "react": "^19.3.1",
30
+ "react-dom": "^19.3.1"
31
31
  }
32
32
  }
33
33
  ```
@@ -164,17 +164,31 @@ refetchOnWindowFocus false・networkMode "always")。挙動を変えたいとき
164
164
  ## 組み込み UI / コンポーネントの入口
165
165
 
166
166
  - **プリミティブ**は `@squadbase/vantage/ui` から import する(`Button`・`Loading`・
167
- `ErrorState`・`Empty`・`Select`・`Checkbox` ほか)。
167
+ `ErrorState`・`Empty`・`Select`・`Checkbox`・`RadioGroup`・`Field`・`Combobox`・`Pagination`・
168
+ `Avatar`・`Kbd`・`HoverCard`・`AlertDialog`・`Drawer`・`Toaster` + `toast.add()` ほか)。
168
169
  - **複合パーツ**は `@squadbase/vantage/components` から(`PageShell`・`DashboardCardPreset`・
169
- `DataTablePreset`・`EChart` ほか)。
170
+ `DataTablePreset`・型付きチャート(下の「グラフ」)・`EChart` ほか)。
170
171
  - **どの名前が import 可能か / props の詳細は `vantage docs` で引く。** ガイドとコンポーネント
171
172
  リファレンスはパッケージに同梱されていて、オフラインでも読める(→ `AGENTS.md` の
172
173
  「ドキュメントを引く」)。**名前が分からないとき**はやりたいことで `vantage search` する
173
174
  (→ 同節)。
174
- - **UI は import して使うのが既定。取り出す(eject)必要はない。** `vantage add ui|block` は
175
- ソースを手元にコピーして**改造したいとき専用**のコマンドで、取り出せるのは
176
- `ui: data-table` と `block: sales-overview` の 2 つだけ。それ以外の名前は import 専用で
177
- `add` の対象ではない(未知名で実行すると候補が一覧表示される)。
175
+ - **UI は import して使うのが既定。取り出す(eject)必要はない。** `vantage add ui <name>` は
176
+ ソースを手元にコピーして**改造したいとき専用**のコマンド。`/ui` のプリミティブも
177
+ `/components` の複合パーツも全部取り出せる(名前は kebab-case: `add ui bar-chart`。
178
+ ブロックは `add block sales-overview`。未知名で実行すると候補が一覧表示される)。
179
+
180
+ ### グラフはまず型付きチャートで描く
181
+
182
+ - 推移は `LineChart` / `AreaChart`、比較は `BarChart`、構成比は `DonutChart`。`data`(行の配列)・
183
+ `index`(x 軸の列)・`categories`(系列の列)を渡すだけで、option は書かない
184
+ (`DonutChart` は `category` / `value`)。
185
+ - 上位 N 件は `BarList`、判定帯や予算消化は `CategoryBar`、達成率は `ProgressCircle`、
186
+ 日ごとの状態は `Tracker`。
187
+ - `EChart` + `EChartsOption` は、二軸・散布図・ヒートマップ・注釈線など型付きチャートの props で
188
+ 表せないときだけ使う。
189
+ - 色は省略してテーマトークンに任せる。指定するなら `"chart-1"`〜`"chart-5"` か
190
+ `"var(--destructive)"` などの CSS 色。hex の直書きや Tailwind クラスは使わない。
191
+ - 数値の書式(`¥`・`%`・桁区切り)は `valueFormatter` に渡す。
178
192
 
179
193
  ### ダークモードは opt-in
180
194
 
@@ -28,6 +28,7 @@
28
28
  - **複数シートに対応**しています。シートのタブは下端に並び、切り替えて閲覧できます。
29
29
  - 数式・グラフ・セル書式は再現されません(値として読めれば十分、という設計)。ブラウザでパースするので
30
30
  25MB を超えるファイルはそのページにエラーが出ます —— 大きいデータは `server/api/` から配って
31
- `DataTable` で描いてください
31
+ `DataTable` で描いてください。20 万行を超えると先頭
32
+ 20 万行だけが表示されます(残りはダウンロードして見る)
32
33
  - **ビューアの無い拡張子(`.xls`・`.ods` など)はルートになりません。** `vantage check` の
33
34
  `UNSUPPORTED_PAGE_FILE` 警告が知らせます
@@ -1,6 +0,0 @@
1
- export { add, syncAgentsFile } from './chunk-U2M6HGKQ.js';
2
- import './chunk-ZVANIULZ.js';
3
- import './chunk-QI3XQKHS.js';
4
- import './chunk-C2CX6GLX.js';
5
- //# sourceMappingURL=add-DY4AXANK.js.map
6
- //# sourceMappingURL=add-DY4AXANK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"add-DY4AXANK.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/query/client.ts"],"names":[],"mappings":";;;;AAOO,SAAS,iBAAA,GAAiC;AAC/C,EAAA,OAAO,IAAI,WAAA,CAAY;AAAA,IACrB,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,GAAA;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP,oBAAA,EAAsB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOtB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,WAAA,EAAa;AAAA;AACf;AACF,GACD,CAAA;AACH","file":"chunk-DTDVSFRY.js","sourcesContent":["import { QueryClient } from \"@tanstack/react-query\"\n\n/**\n * Create the QueryClient with Vantage defaults. Individual queries may override\n * these, but replacing the QueryClient wholesale is intentionally not exposed —\n * Squadbase relies on a single managed client for auth, logging and telemetry.\n */\nexport function createQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n retry: 1,\n refetchOnWindowFocus: false,\n // A dashboard talks to its own origin (or the configured API base), so\n // the browser's offline heuristic says nothing useful about whether a\n // request can succeed. Under the default \"online\" mode a failed request\n // is *paused* rather than retried whenever that heuristic reads\n // offline, and the page sits on its loading state forever instead of\n // showing the error.\n networkMode: \"always\",\n },\n mutations: {\n networkMode: \"always\",\n },\n },\n })\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/generate.ts"],"names":["require"],"mappings":"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","file":"chunk-LMUACBMA.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { MANIFEST_SCHEMA_VERSION, VANTAGE_DIR } from \"./constants\"\nimport { filePageKind, filePageModuleName } from \"./file-page\"\nimport { timed } from \"./profile\"\nimport { buildRouteTree } from \"./route-tree\"\nimport type { BuiltPage, BuiltTree } from \"./route-tree\"\nimport type { RouteModel, Segment } from \"./types\"\n\nconst PKG = \"@squadbase/vantage\"\n\n/** Subdirectory of `.vantage/` holding one wrapper module per data-file page. */\nconst FILE_PAGES_DIR = \"file-pages\"\n\n/**\n * Vite inlines an asset under 4 KB as a base64 data URL, which would bury a\n * small `.csv` inside a JS chunk and leave the download link pointing at it.\n * `?no-inline` is checked before the size limit, so it always wins.\n */\nconst ASSET_QUERY = \"?url&no-inline\"\n\n/**\n * Resolve the absolute directory of the installed @squadbase/vantage package.\n * Memoized per root: module resolution is comparatively expensive and the answer\n * cannot change while the process lives.\n */\nconst vantageDirCache = new Map<string, string | null>()\n\nfunction resolveVantageDir(root: string): string | null {\n const hit = vantageDirCache.get(root)\n if (hit !== undefined) return hit\n let dir: string | null\n try {\n const require = createRequire(path.join(root, \"noop.js\"))\n dir = path.dirname(require.resolve(`${PKG}/package.json`))\n } catch {\n dir = null\n }\n vantageDirCache.set(root, dir)\n return dir\n}\n\n/** POSIX import specifier from `.vantage/` to a project-relative file. */\nfunction importFromVantage(relFile: string): string {\n return `../${relFile}`\n}\n\n/**\n * POSIX import specifier from `.vantage/file-pages/` to a project-relative\n * file — one level deeper than `importFromVantage`. Do not mix the two up. The\n * \".vantage/ sits exactly one level below the project root\" invariant still\n * holds for the directory itself; this is a second, explicit depth used only\n * by the generated wrappers.\n */\nfunction importFromFilePages(relFile: string): string {\n return `../../${relFile}`\n}\n\nfunction ensureDir(dir: string): void {\n fs.mkdirSync(dir, { recursive: true })\n}\n\nfunction writeIfChanged(file: string, content: string): void {\n try {\n if (fs.existsSync(file) && fs.readFileSync(file, \"utf8\") === content) return\n } catch {\n /* fall through to write */\n }\n fs.writeFileSync(file, content)\n}\n\nfunction serializeSegments(segments: Segment[]): string {\n return (\n \"[\" +\n segments\n .map((s) => {\n if (s.kind === \"static\") return `{ kind: \"static\", value: ${JSON.stringify(s.value)} }`\n if (s.kind === \"param\") return `{ kind: \"param\", name: ${JSON.stringify(s.name)} }`\n return `{ kind: \"catchall\", name: ${JSON.stringify(s.name)} }`\n })\n .join(\", \") +\n \"]\"\n )\n}\n\nconst BANNER =\n \"// AUTO-GENERATED by @squadbase/vantage. Do not edit — regenerated on every run.\\n\"\n\nfunction renderRouteTree(tree: BuiltTree): string {\n const lines: string[] = []\n lines.push(BANNER)\n lines.push(`import type { ClientManifest } from \"${PKG}/client\"`)\n lines.push(\"\")\n lines.push(\"export const manifest: ClientManifest = {\")\n lines.push(\n ` rootLayout: ${tree.rootLayout ? `() => import(${JSON.stringify(importFromVantage(tree.rootLayout))})` : \"null\"},`,\n )\n lines.push(\n ` notFound: ${tree.notFound ? `() => import(${JSON.stringify(importFromVantage(tree.notFound))})` : \"null\"},`,\n )\n lines.push(\n ` error: ${tree.error ? `() => import(${JSON.stringify(importFromVantage(tree.error))})` : \"null\"},`,\n )\n lines.push(\" layouts: [\")\n for (const l of tree.layouts) {\n lines.push(\n ` { id: ${JSON.stringify(l.id)}, parentId: ${JSON.stringify(l.parentId)}, path: ${JSON.stringify(\n l.path,\n )}, load: () => import(${JSON.stringify(importFromVantage(l.file))}) },`,\n )\n }\n lines.push(\" ],\")\n lines.push(\" pages: [\")\n for (const p of tree.pages) {\n const extra: string[] = []\n if (p.title) extra.push(`title: ${JSON.stringify(p.title)}`)\n if (p.description) extra.push(`description: ${JSON.stringify(p.description)}`)\n if (p.navLabel) extra.push(`navLabel: ${JSON.stringify(p.navLabel)}`)\n if (p.kind !== \"module\") extra.push(`kind: ${JSON.stringify(p.kind)}`)\n if (p.variant) extra.push(`variant: ${JSON.stringify(p.variant)}`)\n // A data file is not a module, so the manifest loads the wrapper generated\n // for it instead. Everything else about the entry is unchanged, which is\n // why the client manifest shape stays the same.\n const specifier =\n p.kind === \"file\"\n ? `./${FILE_PAGES_DIR}/${filePageModuleName(p)}`\n : importFromVantage(p.file)\n lines.push(\n ` { parentLayoutId: ${JSON.stringify(p.parentLayoutId)}, path: ${JSON.stringify(\n p.path,\n )}, index: ${p.index}, routePath: ${JSON.stringify(p.routePath)}${\n extra.length ? \", \" + extra.join(\", \") : \"\"\n }, load: () => import(${JSON.stringify(specifier)}) },`,\n )\n }\n lines.push(\" ],\")\n lines.push(\"}\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\nfunction renderServerRoutes(model: RouteModel): string {\n const lines: string[] = []\n lines.push(BANNER)\n lines.push(`import type { ProdApiRoute } from \"${PKG}/server/node\"`)\n model.apis.forEach((a, i) => {\n lines.push(`import * as m${i} from ${JSON.stringify(importFromVantage(a.file))}`)\n })\n lines.push(\"\")\n lines.push(\"export const apiRoutes: ProdApiRoute[] = [\")\n model.apis.forEach((a, i) => {\n lines.push(\n ` { routePath: ${JSON.stringify(a.routePath)}, segments: ${serializeSegments(\n a.segments,\n )}, module: m${i} },`,\n )\n })\n lines.push(\"]\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\nfunction renderIndexHtml(): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Vantage</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/.vantage/client-entry.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction renderClientEntry(): string {\n return `${BANNER}import { bootstrap } from \"${PKG}/client\"\nimport { manifest } from \"./route-tree.gen\"\nimport \"./runtime.css\"\n\nbootstrap(manifest)\n`\n}\n\nfunction renderRuntimeCss(root: string, pageDir: string): string {\n const parts: string[] = []\n parts.push('@import \"tailwindcss\";')\n parts.push(`@import \"${PKG}/theme.css\";`)\n // The global stylesheet lives next to the pages: styles.css at the project\n // root, or src/styles.css once src/ exists (`SRC_DIR_SPLIT` catches a leftover\n // root-level one instead of importing both).\n const stylesRel = pageDir === \"\" ? \"styles.css\" : `${pageDir}/styles.css`\n if (fs.existsSync(path.join(root, stylesRel))) {\n parts.push(`@import \"../${stylesRel}\";`)\n }\n // Tailwind auto-detects the Vite project root; the packaged components live\n // in node_modules, which Tailwind skips by default, so register them here.\n // The whole of dist/ has to be scanned, not just dist/ui and dist/components:\n // tsup hoists code shared between entries into top-level dist/chunk-*.js, and\n // that is where most of the component class strings end up.\n const vantageDir = resolveVantageDir(root)\n if (vantageDir) {\n parts.push(`@source ${JSON.stringify(path.join(vantageDir, \"dist\"))};`)\n }\n return parts.join(\"\\n\") + \"\\n\"\n}\n\nfunction renderEnvTypes(): string {\n return `${BANNER}\ninterface ImportMetaEnv {\n readonly MODE: string\n readonly DEV: boolean\n readonly PROD: boolean\n readonly SSR: boolean\n readonly BASE_URL: string\n readonly [key: \\`PUBLIC_\\${string}\\`]: string | undefined\n}\n\ninterface ImportMeta {\n readonly env: ImportMetaEnv\n}\n\ndeclare module \"*.css\" {\n const content: string\n export default content\n}\n\n// Generated data-file pages import their source with Vite's asset query. The\n// app's tsconfig includes .vantage/**/*.tsx, so the wrappers are type-checked\n// alongside the app and need this declaration to resolve.\ndeclare module \"*?url&no-inline\" {\n const src: string\n export default src\n}\n`\n}\n\nfunction renderInternalManifest(model: RouteModel): string {\n return (\n JSON.stringify(\n {\n schemaVersion: MANIFEST_SCHEMA_VERSION,\n pageDir: model.pageDir,\n pages: model.pages.map((p) => ({ file: p.file, route: p.routePath })),\n apis: model.apis.map((a) => ({ file: a.file, route: a.routePath })),\n hasServer: model.hasServer,\n },\n null,\n 2,\n ) + \"\\n\"\n )\n}\n\n/**\n * The wrapper module standing in for one data-file page. Thin on purpose: the\n * asset import is what puts the file through Vite's pipeline (hashed in the\n * build, a stable URL in dev), and everything else lives in the viewer.\n */\nfunction renderFilePageWrapper(page: BuiltPage): string {\n const fileName = path.posix.basename(page.file)\n const props = [\n `kind=${JSON.stringify(filePageKind(page))}`,\n \"src={src}\",\n `fileName={${JSON.stringify(fileName)}}`,\n ...(page.title ? [`title={${JSON.stringify(page.title)}}`] : []),\n ]\n return `${BANNER}import { FilePageView } from \"${PKG}/table\"\nimport src from ${JSON.stringify(importFromFilePages(page.file) + ASSET_QUERY)}\n\n// ${page.file} -> ${page.routePath}\nexport default function FilePage() {\n return <FilePageView ${props.join(\" \")} />\n}\n`\n}\n\n/**\n * One wrapper module per data-file page. `writeIfChanged` never deletes, so\n * orphans are pruned explicitly: a renamed `.csv` would otherwise leave behind\n * a wrapper importing a file that no longer exists — invisible to the build\n * (rollup only follows the manifest) but a hard error in the app's own `tsc`.\n */\nfunction writeFilePages(vantageDir: string, tree: { pages: BuiltPage[] }): void {\n const dir = path.join(vantageDir, FILE_PAGES_DIR)\n const filePages = tree.pages.filter((p) => p.kind === \"file\")\n if (filePages.length === 0) {\n fs.rmSync(dir, { recursive: true, force: true })\n return\n }\n ensureDir(dir)\n const keep = new Set<string>()\n for (const page of filePages) {\n const name = filePageModuleName(page)\n keep.add(name)\n writeIfChanged(path.join(dir, name), renderFilePageWrapper(page))\n }\n for (const entry of fs.readdirSync(dir)) {\n if (!keep.has(entry)) fs.rmSync(path.join(dir, entry), { force: true })\n }\n}\n\n/** Options controlling artifact generation. */\nexport interface GenerateOptions {\n root: string\n model: RouteModel\n}\n\n/**\n * Regenerate the `.vantage/` directory from a route model. Idempotent and\n * content-stable so it does not thrash file watchers.\n */\nexport function generateArtifacts({ root, model }: GenerateOptions): string {\n return timed(\"generate\", () => {\n const vantageDir = path.join(root, VANTAGE_DIR)\n ensureDir(vantageDir)\n ensureDir(path.join(vantageDir, \"types\"))\n\n // Everything in .vantage is generated and git/agent/search invisible.\n writeIfChanged(path.join(vantageDir, \".gitignore\"), \"*\\n\")\n writeIfChanged(path.join(vantageDir, \"index.html\"), renderIndexHtml())\n writeIfChanged(path.join(vantageDir, \"client-entry.tsx\"), renderClientEntry())\n // Built once and shared: `renderRouteTree` and `writeFilePages` need the\n // same tree, and building it twice re-reads every page module for metadata.\n const tree = buildRouteTree(model)\n writeIfChanged(path.join(vantageDir, \"route-tree.gen.ts\"), renderRouteTree(tree))\n writeIfChanged(path.join(vantageDir, \"runtime.css\"), renderRuntimeCss(root, model.pageDir))\n writeIfChanged(path.join(vantageDir, \"types\", \"env.d.ts\"), renderEnvTypes())\n writeIfChanged(path.join(vantageDir, \"manifest.json\"), renderInternalManifest(model))\n\n writeFilePages(vantageDir, tree)\n\n if (model.hasServer) {\n writeIfChanged(path.join(vantageDir, \"server-routes.gen.ts\"), renderServerRoutes(model))\n }\n\n return vantageDir\n })\n}\n"]}