@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,305 @@
1
+ # CLI リファレンス
2
+
3
+ > vantage の全コマンド。dev・build・preview・check・routes・add・docs・search・doctor・upgrade。
4
+
5
+ `vantage` はアプリ作者が使う唯一の CLI です。特記がなければプロジェクトルートで実行します。
6
+
7
+ ## コマンド一覧
8
+
9
+ | コマンド | 役割 |
10
+ |---|---|
11
+ | `vantage dev` | 開発サーバー(HMR + オプションの API)。既定 `:5173` |
12
+ | `vantage build` | クライアント + オプションのサーバーをビルド → `dist/` |
13
+ | `vantage preview` | 本番ビルドをローカルで起動(fullstack は既定 `:4173`、spa は Vite プレビュー) |
14
+ | `vantage check` | 静的検査(ルート・境界・禁止ファイル)。エラーがあれば exit 1 |
15
+ | `vantage routes` | ページ + API の URL マップを表示 |
16
+ | `vantage add <kind> <name>` | `page` / `api` / `ui` / `block` / `skill` / `agents` を雛形生成・配置(`--force` で上書き) |
17
+ | `vantage docs [name]` | 同梱のガイド + コンポーネントリファレンスを表示 |
18
+ | `vantage search <query>` | 同じリファレンスを全文検索(自然言語 or `--regex`) |
19
+ | `vantage doctor` | 環境・インストールの健全性を診断 |
20
+ | `vantage upgrade` | 生成成果物を再生成し、配置済みの `AGENTS.md` を正本から同期 |
21
+
22
+ ## クイックモード(パスを直接渡す)
23
+
24
+ `cd` してからコマンドを打つ代わりに、**プロジェクトのパスを直接**渡して起動できます。第 1 引数が
25
+ 既知コマンドではなくファイルシステム上のパスを指す場合、そのパスを root として `dev` を起動します
26
+ (ターミナルに `quick dev → <path>` と表示されます)。
27
+
28
+ ```bash
29
+ vantage ./demo # ディレクトリ → その中で dev を起動
30
+ vantage ./demo/index.tsx # ページファイル → 親ディレクトリを root にして dev
31
+ ```
32
+
33
+ パスの解決ルール:
34
+
35
+ | 渡したパス | root になるもの |
36
+ |---|---|
37
+ | ディレクトリ | そのディレクトリ自身 |
38
+ | `.tsx` / `.jsx` のページファイル | その親ディレクトリ |
39
+ | 存在しないパス・その他 | 該当なし(`Unknown command` エラー) |
40
+
41
+ `add`・`docs`・`search` を除く root スコープの各コマンドも、末尾に path positional を取れます。`dev` を明示しても
42
+ よいですし、`build` / `check` / `routes` などにも同じパスを渡せます。
43
+
44
+ ```bash
45
+ vantage dev ./demo # 明示的なクイック dev
46
+ vantage build ./demo # ./demo をビルド
47
+ vantage check ./demo/index.tsx # ファイル指定でも親ディレクトリを検査
48
+ ```
49
+
50
+ > [!NOTE]
51
+ > `add`・`docs`・`search` はパス引数ではなく positional を自分の引数(`add page dashboard`・
52
+ > `docs button`・`search 日付の選択`)に使うため、この短縮形の対象外です。
53
+
54
+ ## `vantage docs` — ドキュメントを CLI で読む
55
+
56
+ このサイトの内容は**パッケージに同梱**されていて、`vantage docs` でそのまま読めます。ネット接続も
57
+ ブラウザも不要なので、コーディングエージェントが props を確かめるのに向いています。
58
+
59
+ ```bash
60
+ vantage docs # 全ページの一覧(ガイド + コンポーネント)
61
+ vantage docs button # 1 ページ表示(短縮名 → ui/button に解決)
62
+ vantage docs parts/data-table # 完全な slug でも引ける
63
+ vantage docs --all # 全ページを連結して出力
64
+ ```
65
+
66
+ | フラグ | 意味 |
67
+ |---|---|
68
+ | `--list` | ページ名を表示するだけ(本文を出さない) |
69
+ | `--all` | 全ページを連結して出力 |
70
+ | `--json` | 機械可読出力(`{ slug, title, description, section, content }`) |
71
+ | `--lang <ja\|en>` | 言語(既定 `ja`) |
72
+
73
+ 引数なしの `vantage docs` は、セクションごとに **slug と説明**を並べます(左の列がそのまま引数になります)。
74
+
75
+ ```text
76
+ $ vantage docs
77
+
78
+ ガイド
79
+ index 設定ファイル不要(config-free)な React ダッシュボードフレームワーク。書くのは index.tsx だけ。
80
+ getting-started インストールから最初の Vantage アプリを起動するまで。
81
+ routing ファイルを置くだけでルートが生まれる。ページ・レイアウト・動的パラメータ・404/error の規約。
82
+
83
+
84
+ @squadbase/vantage/ui
85
+ ui/accordion 開閉する見出しの縦積み。既定では 1 つだけ開く。
86
+ ui/alert ページ内に置く通知。中身は表示したまま注意を促す。
87
+ ui/badge 小さなラベル。件数・状態・タグに。
88
+
89
+
90
+ vantage docs <name> show one page --json machine-readable
91
+ vantage docs --all show every page --lang ja | en
92
+ ```
93
+
94
+ 名前を渡すと、そのページを **Markdown のまま**出力します(TTY では見出しと引用が色付けされ、パイプ
95
+ すると素の Markdown になります)。props の表は Markdown の表として読めます。
96
+
97
+ ````text
98
+ $ vantage docs button
99
+
100
+ # Button
101
+
102
+ > 6 つの variant と 8 つの size を持つボタン。
103
+
104
+ いちばんよく使うコンポーネントです。`variant` で意味づけを、`size` で大きさを決めます。
105
+
106
+ ```tsx
107
+ import { Button, buttonVariants } from "@squadbase/vantage/ui";
108
+ ```
109
+
110
+ | Prop | Type | Default | 説明 |
111
+ | --- | --- | --- | --- |
112
+ | `variant` | `"default" \| "secondary" \| …` | `"default"` | 見た目と意味づけ。 |
113
+ | `size` | `"default" \| "xs" \| "sm" \| …` | `"default"` | 高さと余白。`icon` 系は正方形になる。 |
114
+ | `render` | `ReactElement` | | 別の要素として描画する(Radix の `asChild` に相当)。 |
115
+
116
+ ````
117
+
118
+ 名前は**短縮形で引けます**。`vantage docs button` は `ui/button` に、`vantage docs data-table` は
119
+ `parts/data-table` に解決されます。曖昧なとき・見つからないときは候補が出て、終了コードは 1 になります。
120
+
121
+ ```text
122
+ $ vantage docs sele
123
+ ✗ No page named "sele". Did you mean: ui/select, parts/multi-select, parts/searchable-select?
124
+ ```
125
+
126
+ `--json` は 1 ページを機械可読にしたものです。`content` にページ全体の Markdown が入ります。
127
+
128
+ ```json
129
+ {
130
+ "slug": "ui/badge",
131
+ "lang": "ja",
132
+ "title": "Badge",
133
+ "description": "小さなラベル。件数・状態・タグに。",
134
+ "section": "components/ui",
135
+ "sectionTitle": "@squadbase/vantage/ui",
136
+ "content": "# Badge\n\n> 小さなラベル。件数・状態・タグに。\n\nテキストの横に添える…"
137
+ }
138
+ ```
139
+
140
+ 本文中のリンクは slug なので、`[DataTable](parts/data-table)` は `vantage docs parts/data-table`
141
+ で開けます。
142
+
143
+ > [!NOTE]
144
+ > 同梱されるのは MDX をプレーンな Markdown に変換したものです。ライブプレビューはこのサイトだけの
145
+ > 機能で、CLI では props の表・コード例・注意書きが読めます。
146
+
147
+ ## `vantage search` — 名前を知らなくても辿り着く
148
+
149
+ `vantage docs <name>` は**名前を知っている**前提の参照です。「日付範囲を選ぶ UI が欲しい」のように
150
+ **やりたいこと**から辿るときは `vantage search` を使います。対象は `vantage docs` と同じ同梱ドキュメント
151
+ (ガイド + `ui` / `parts` / `markdown` のコンポーネント)で、結果はそのまま `vantage docs <name>` に渡せます。
152
+
153
+ ```bash
154
+ vantage search 期間を選ぶ UI が欲しい # 自然言語(クエリは引用符なしでもよい)
155
+ vantage search "pagination" # 英語のドキュメントを引くなら --lang en
156
+ vantage search "enable[A-Z]\w+" --regex # 正規表現で props を横断検索
157
+ vantage search チャート --limit 3 --json # 機械可読
158
+ ```
159
+
160
+ | フラグ | 意味 |
161
+ |---|---|
162
+ | `--regex` | クエリを正規表現として扱う(大文字小文字は区別しない) |
163
+ | `--limit <n>` | 表示件数(既定 `10`) |
164
+ | `--json` | 機械可読出力 |
165
+ | `--lang <ja\|en>` | 言語(既定 `ja`) |
166
+
167
+ 既定は **BM25 による全文検索**です。ページ名・タイトル・説明文を本文より重く見て並べ、ヒットした
168
+ ページごとに**一致した箇所のスニペット**を表示します。日本語は字種の切れ目(漢字・カタカナ・ひらがな)
169
+ で区切って索引を作るので、「テーブルにページングを付けたい」のような文のままのクエリでも引けます。
170
+
171
+ ```text
172
+ $ vantage search 期間を選ぶ UI が欲しい --limit 3
173
+
174
+ parts/date-range-picker DateRangePicker · @squadbase/vantage/components
175
+ > プリセット付きの期間選択。
176
+ ui/calendar Calendar · @squadbase/vantage/ui
177
+ 単日・複数日・期間を選べるカレンダーです。ダッシュボードで期間を選ばせたい場合は、これを直接
178
+ ui/accordion Accordion · @squadbase/vantage/ui
179
+ 常に開いている単独の折りたたみが欲しいだけなら
180
+ ```
181
+
182
+ 左の列がそのまま `vantage docs <name>` に渡せる slug、右がタイトルと import 元、その下が一致箇所の
183
+ スニペットです。実際にはこの前後に `55 results for "…" ja · bm25` の見出しと、`--limit` で隠れた
184
+ 件数・フラグのヒントが付きます(上の例では省略)。**件数は索引に 1 語でも一致したページの数**なので、
185
+ 下位はほとんど関係ありません。上から数件だけを見て、足りなければ `--limit` を上げてください。
186
+
187
+ `--json` は同じ結果を機械可読にしたものです。`score` は BM25 のスコア、`command` はそのまま実行できる
188
+ 形です(以下は `vantage search 期間選択 --limit 1 --json` の出力)。
189
+
190
+ ```json
191
+ {
192
+ "query": "期間選択",
193
+ "mode": "bm25",
194
+ "lang": "ja",
195
+ "count": 14,
196
+ "results": [
197
+ {
198
+ "slug": "parts/date-range-picker",
199
+ "title": "DateRangePicker",
200
+ "description": "プリセット付きの期間選択。",
201
+ "section": "components/parts",
202
+ "sectionTitle": "@squadbase/vantage/components",
203
+ "command": "vantage docs parts/date-range-picker",
204
+ "score": 18.033,
205
+ "snippet": "> プリセット付きの期間選択。"
206
+ }
207
+ ]
208
+ }
209
+ ```
210
+
211
+ `--regex` は名前・タイトル・説明・本文を正規表現で走査し、**行番号付き**で一致行を出します。props の
212
+ 綴りを横断で確かめたいときに向いています。
213
+
214
+ ```text
215
+ $ vantage search "enable(Sorting|Filtering)" --regex
216
+
217
+ parts/data-table DataTable 4 matches
218
+ 30 | `enableSorting` | `boolean` | ヘッダークリックで並べ替える。 |
219
+ 31 | `enableFiltering` | `boolean` | ツールバーに検索欄を出す。 |
220
+ 49 <DataTable columns={columns} data={data} enableSorting enableFiltering>
221
+ ```
222
+
223
+ 1 ページにつき最初の 3 行までを表示しますが、`4 matches` の件数は正確です。名前・タイトル・説明だけが
224
+ 一致したページは `name match` と表示され、本文の行は出ません。ヒットが 0 件でもエラーにはならず
225
+ (終了コード 0、`--json` なら `"count": 0`)、不正な正規表現のときだけ終了コード 1 になります。
226
+
227
+ > [!NOTE]
228
+ > 索引は実行時に組み立てられます(同梱ドキュメントの読み込み込みで数十ミリ秒)。事前生成された索引を
229
+ > 同梱しないので、ドキュメントと検索結果がずれることはありません。
230
+ >
231
+ > **このページ自身も検索対象です。** 上の例のクエリをそのまま実行すると、例文を含むこの「CLI リファレンス」
232
+ > もヒットに混ざります(上の出力例では省いています)。
233
+
234
+ ## `--json`
235
+
236
+ `check` / `routes` / `doctor` / `build` / `upgrade` / `docs` / `search` は `--json` を受け付けます。CI や
237
+ エージェントの自動処理に使えます。
238
+
239
+ ```bash
240
+ vantage check --json
241
+ ```
242
+
243
+ ```json
244
+ {
245
+ "code": "ROUTE_CONFLICT",
246
+ "severity": "error",
247
+ "message": "2 files resolve to /sales",
248
+ "files": ["sales.tsx", "sales/index.tsx"],
249
+ "fix": "Rename or remove one route file so each route is unique."
250
+ }
251
+ ```
252
+
253
+ > [!NOTE]
254
+ > `build --json` は**コンパクトな 1 行**で出力されます。他のコマンドの `--json` は 2 スペース
255
+ > インデントで整形されます。
256
+
257
+ ## `build --api-base-url`
258
+
259
+ `vantage build` は、クライアントが `/api` を呼ぶベースURLを指定する `--api-base-url` を受け付けます。
260
+ フロントとサーバーを別オリジンにデプロイするときに使います。
261
+
262
+ ```bash
263
+ vantage build --api-base-url https://api.example.com
264
+ ```
265
+
266
+ このフラグは `.env` の `PUBLIC_API_BASE_URL` より優先されます。未指定なら空(同一オリジンの
267
+ 相対パス)。詳細は[ビルドとデプロイ](build-and-deploy)を参照してください。
268
+
269
+ ## 静的診断(`check`)
270
+
271
+ `vantage check` が検出する診断は次の 6 種類です(エラー 5・警告 1)。
272
+
273
+ | コード | 深刻度 | 意味 |
274
+ |---|---|---|
275
+ | `FORBIDDEN_FILE` | エラー | 禁止された設定ファイルがルートに存在する |
276
+ | `ROUTE_CONFLICT` | エラー | 2 つのファイルが同じルートに解決される |
277
+ | `MISSING_DEFAULT_EXPORT` | エラー | ページに default export がない |
278
+ | `INVALID_API_EXPORT` | エラー | API が有効な HTTP メソッドをエクスポートしていない |
279
+ | `CLIENT_IMPORTS_SERVER` | エラー | クライアントが `server/` から import している |
280
+ | `PUBLIC_ENV_MISUSE` | 警告 | クライアントが `PUBLIC_` 以外の env を読んでいる |
281
+
282
+ いずれもユーザーコードを import・実行しません(純粋に静的な検査です)。
283
+
284
+ ## 生成物と成果物
285
+
286
+ `dist/` の中身:
287
+
288
+ ```text
289
+ dist/
290
+ ├── client/ クライアント(index.html + ハッシュ付きアセット)
291
+ ├── server/index.mjs server/ がある場合のみ
292
+ └── vantage-manifest.json デプロイ契約(mode: "spa" | "fullstack")
293
+ ```
294
+
295
+ `vantage preview` はこの `vantage-manifest.json` の `mode` を読んで、Node サーバーを起動するか
296
+ 静的プレビューにするかを決めます。デプロイ手順は[ビルドとデプロイ](build-and-deploy)で詳しく
297
+ 解説します。
298
+
299
+ ## 完了
300
+
301
+ 以上でアプリ作者向けガイドは終わりです。最小の `index.tsx` から始めて、必要に応じて
302
+ ページ・API・UI を足していってください。
303
+
304
+ AI エージェントに手順ごと渡したいときは、同梱の [エージェントと Skills](agent-skills) を
305
+ `vantage add skill` で、アプリの地図となる `AGENTS.md` を `vantage add agents` で配置してください。
@@ -0,0 +1,229 @@
1
+ # コンポーネント
2
+
3
+ > Vantage に同梱される shadcn/ui (Base UI) キットと、ダッシュボード用の複合コンポーネントのリファレンス。
4
+
5
+ Vantage は **shadcn/ui** をそのまま同梱しています。インストールもコピーも不要で、import するだけで
6
+ 使えます。公開されている入り口は 3 つで、**サイドバーもこの 3 つで区切ってあります**。
7
+
8
+ | サブパス | 中身 | 件数 |
9
+ | --- | --- | --- |
10
+ | [`@squadbase/vantage/ui`](ui/button) | shadcn/ui のプリミティブ(Base UI 版)と、`cn()` などのユーティリティ | 37 |
11
+ | [`@squadbase/vantage/components`](parts/page-shell) | それらを組み上げたダッシュボード部品 | 15 |
12
+ | [`@squadbase/vantage/markdown`](markdown/markdown-renderer) | Markdown の描画だけ(重いので分離) | 1 |
13
+
14
+ ```tsx
15
+ import { Button, Card, Badge } from "@squadbase/vantage/ui";
16
+ import { PageShell, DashboardCardPreset, EChart } from "@squadbase/vantage/components";
17
+ import { MarkdownRenderer } from "@squadbase/vantage/markdown";
18
+ ```
19
+
20
+ > [!NOTE]
21
+ > UI キットは**パッケージから import して使う**のが基本です(コピーしません)。中身を書き換えたい
22
+ > ときだけ [`vantage add`](cli-reference) で編集可能なソースを取り出します。
23
+
24
+ ## Base UI ベースであること
25
+
26
+ 同梱しているのは shadcn/ui の **Base UI 版**です。2026 年 7 月に shadcn/ui は既定のプリミティブを
27
+ Radix UI から [Base UI](https://base-ui.com) へ切り替えており、Vantage はその新しい方を採用して
28
+ います。Radix 版から来た場合、主な違いは次の 4 点です。
29
+
30
+ - **`asChild` はありません。** 代わりに `render` プロップに要素を渡します。
31
+
32
+ ```tsx
33
+ // Radix 版
34
+ <PopoverTrigger asChild><Button>開く</Button></PopoverTrigger>
35
+
36
+ // Base UI 版(Vantage)
37
+ <PopoverTrigger render={<Button />}>開く</PopoverTrigger>
38
+ ```
39
+
40
+ - **[`Checkbox`](ui/checkbox) の `checked` は `boolean` のみ。** 中間状態は
41
+ `indeterminate` プロップで表します。
42
+ - **[`ToggleGroup`](ui/toggle-group) の `value` は配列。** 単一選択にしたいときは
43
+ [`SegmentedControl`](parts/segmented-control) を使ってください。
44
+ - **[`Select`](ui/select) の `onValueChange` は `string | null`。** `null` のガードが
45
+ 要ります。また `SelectValue` は既定で選択中の値をそのまま表示するので、ラベルを出すには
46
+ `items` に対応表を渡します。
47
+
48
+ 状態は `data-state="open"` ではなく `data-open` / `data-checked` のような属性で表現されます。
49
+ Vantage の `theme.css` は両方の綴りを受ける custom variant を定義しているので、
50
+ `data-open:animate-in` のようなクラスはどちらの流儀でも書けます。
51
+
52
+ ## `@squadbase/vantage/ui`
53
+
54
+ shadcn/ui のプリミティブです。名前も props も shadcn/ui のものと同じなので、
55
+ [shadcn/ui のドキュメント](https://ui.shadcn.com/docs/components) もそのまま参考になります。
56
+ サイドバーはアルファベット順ですが、ここでは用途で並べています。
57
+
58
+ ### フォームと入力
59
+
60
+ [`Button`](ui/button) ·
61
+ [`Input`](ui/input) ·
62
+ [`InputGroup`](ui/input-group) ·
63
+ [`Textarea`](ui/textarea) ·
64
+ [`Label`](ui/label) ·
65
+ [`Select`](ui/select) ·
66
+ [`Checkbox`](ui/checkbox) ·
67
+ [`Switch`](ui/switch) ·
68
+ [`Slider`](ui/slider) ·
69
+ [`Toggle`](ui/toggle) ·
70
+ [`ToggleGroup`](ui/toggle-group) ·
71
+ [`Calendar`](ui/calendar) ·
72
+ [`Command`](ui/command)
73
+
74
+ ### レイアウトとナビゲーション
75
+
76
+ [`Card`](ui/card) ·
77
+ [`Tabs`](ui/tabs) ·
78
+ [`Separator`](ui/separator) ·
79
+ [`ScrollArea`](ui/scroll-area) ·
80
+ [`Sidebar`](ui/sidebar) ·
81
+ [`Breadcrumb`](ui/breadcrumb) ·
82
+ [`Accordion`](ui/accordion) ·
83
+ [`Collapsible`](ui/collapsible)
84
+
85
+ ### データ表示
86
+
87
+ [`Table`](ui/table) ·
88
+ [`Badge`](ui/badge) ·
89
+ [`Progress`](ui/progress)
90
+
91
+ ### オーバーレイ
92
+
93
+ [`Dialog`](ui/dialog) ·
94
+ [`Sheet`](ui/sheet) ·
95
+ [`Popover`](ui/popover) ·
96
+ [`Tooltip`](ui/tooltip) ·
97
+ [`DropdownMenu`](ui/dropdown-menu)
98
+
99
+ ### 状態表示
100
+
101
+ [`Alert`](ui/alert) ·
102
+ [`Skeleton`](ui/skeleton) ·
103
+ [`Spinner`](ui/spinner) ·
104
+ [`Loading`](ui/loading) ·
105
+ [`Empty`](ui/empty) ·
106
+ [`ErrorState`](ui/error-state)
107
+
108
+ `Loading` / `Empty` / `ErrorState` の 3 つだけは shadcn/ui にはなく、Vantage が足したものです。
109
+
110
+ ### ユーティリティ
111
+
112
+ [`cn()`](ui/cn) · [`useIsMobile()`](ui/use-is-mobile)
113
+
114
+ ## `@squadbase/vantage/components`
115
+
116
+ `ui/` を組み上げた、ダッシュボード向けの複合部品です。
117
+
118
+ | コンポーネント | 概要 |
119
+ | --- | --- |
120
+ | [`PageShell`](parts/page-shell) | ヘッダー帯・サマリー・本文からなるページ枠 |
121
+ | [`AppShell`](parts/app-shell) | ナビゲーション定義を渡すだけのアプリ枠 |
122
+ | [`SectionHeader`](parts/section-header) | セクション見出しとアクション |
123
+ | [`DashboardCard`](parts/dashboard-card) | ダッシュボードのタイル(プリセットとスケルトン付き) |
124
+ | [`DataTable`](parts/data-table) | 並べ替え・検索・ページング・選択を備えた表 |
125
+ | [`EChart`](parts/echart) | Apache ECharts のラッパー |
126
+ | [`FunnelSteps`](parts/funnel-steps) | ファネルの棒表示 |
127
+ | [`FilterBar`](parts/filter-bar) | フィルタ一式を 1 つの値で扱う行 |
128
+ | [`DateRangePicker`](parts/date-range-picker) | プリセット付きの期間選択 |
129
+ | [`SegmentedControl`](parts/segmented-control) | 単一選択のセグメント |
130
+ | [`SearchableSelect`](parts/searchable-select) | 検索できる単一選択 |
131
+ | [`MultiSelect`](parts/multi-select) | 検索できる複数選択 |
132
+ | [`MetricValue`](parts/metric-value) | KPI の数値と単位 |
133
+ | [`TrendIndicator`](parts/trend-indicator) | 増減の矢印と変化率 |
134
+ | [`StatusBadge`](parts/status-badge) | ドット付きステータスバッジ |
135
+
136
+ ## `@squadbase/vantage/markdown`
137
+
138
+ [`MarkdownRenderer`](markdown/markdown-renderer) だけが置かれた独立のサブパスです。
139
+ Markdown 描画は Shiki の全言語文法を抱えており、`components` のバレルに混ぜるとビルド出力が
140
+ 10 MB 以上増えるため、意図的に分けてあります。
141
+
142
+ ## 組み合わせる
143
+
144
+ ```tsx
145
+ import { Button } from "@squadbase/vantage/ui";
146
+ import {
147
+ PageShell,
148
+ PageShellHeader,
149
+ PageShellHeading,
150
+ PageShellTitle,
151
+ PageShellDescription,
152
+ PageShellHeaderEnd,
153
+ PageShellActions,
154
+ PageShellContent,
155
+ DashboardCardPreset,
156
+ MetricValue,
157
+ TrendIndicator,
158
+ EChart,
159
+ type EChartsOption,
160
+ } from "@squadbase/vantage/components";
161
+
162
+ const option: EChartsOption = {
163
+ xAxis: { type: "category", data: monthly.map((m) => m.month) },
164
+ yAxis: { type: "value" },
165
+ series: [{ type: "bar", data: monthly.map((m) => m.revenue) }],
166
+ };
167
+
168
+ export default function Overview() {
169
+ return (
170
+ <PageShell>
171
+ <PageShellHeader>
172
+ <PageShellHeading>
173
+ <PageShellTitle>売上ダッシュボード</PageShellTitle>
174
+ <PageShellDescription>直近 6 か月の推移</PageShellDescription>
175
+ </PageShellHeading>
176
+ <PageShellHeaderEnd>
177
+ <PageShellActions>
178
+ <Button variant="outline">エクスポート</Button>
179
+ </PageShellActions>
180
+ </PageShellHeaderEnd>
181
+ </PageShellHeader>
182
+
183
+ <PageShellContent>
184
+ <div className="grid gap-4 md:grid-cols-3">
185
+ <DashboardCardPreset title="売上">
186
+ <MetricValue className="my-0">¥1,240,000</MetricValue>
187
+ <TrendIndicator value={12.4} direction="up" />
188
+ </DashboardCardPreset>
189
+ <DashboardCardPreset title="新規顧客">
190
+ <MetricValue className="my-0">128</MetricValue>
191
+ <TrendIndicator value={3.1} direction="down" />
192
+ </DashboardCardPreset>
193
+ <DashboardCardPreset title="解約率">
194
+ <MetricValue className="my-0">2.1%</MetricValue>
195
+ </DashboardCardPreset>
196
+ </div>
197
+
198
+ <DashboardCardPreset title="月次売上" className="mt-4">
199
+ <EChart option={option} height={320} />
200
+ </DashboardCardPreset>
201
+ </PageShellContent>
202
+ </PageShell>
203
+ );
204
+ }
205
+ ```
206
+
207
+ ## テーマ
208
+
209
+ 見た目は CSS 変数(デザイントークン)で決まります。色や角丸を変えたいときは、プロジェクトルートの
210
+ `styles.css` で変数だけを上書きします — 詳しくは [UI とテーマ](ui-and-theming) を参照してください。
211
+
212
+ ## ソースを編集したいとき
213
+
214
+ コンポーネントの中身そのものを変えたい場合は、編集可能なコピーを取り出します。
215
+
216
+ ```bash
217
+ vantage add ui data-table # 編集可能な DataTable を components/ へ
218
+ vantage add block sales-overview
219
+ ```
220
+
221
+ > [!NOTE]
222
+ > 現行プロトタイプで `vantage add` がコピーできるのは `data-table`(ui)と `sales-overview`(block)
223
+ > のみです。その他のコンポーネントは import 専用です。
224
+
225
+ ## このページの読み方
226
+
227
+ 各コンポーネントのページには、**動くプレビュー**とその**ソース**がタブで並んでいます。
228
+ プレビューのソース先頭にある `export const client = "only";` はドキュメントサイト側の指定で、
229
+ アプリのコードには要りません。
@@ -0,0 +1,78 @@
1
+ # データ取得
2
+
3
+ > 管理された TanStack Query(useQuery)でサーバー状態を扱う。
4
+
5
+ Vantage はサーバー状態のために **管理された TanStack Query** を同梱しています。`QueryClient` の
6
+ セットアップは不要で、`@squadbase/vantage/query` から `useQuery` などを import するだけです。
7
+
8
+ ```tsx
9
+ import { useQuery } from "@squadbase/vantage/query";
10
+
11
+ export default function Customers() {
12
+ const { data, isLoading, error } = useQuery({
13
+ queryKey: ["customers"],
14
+ queryFn: async () => {
15
+ const res = await fetch("/api/customers");
16
+ if (!res.ok) throw new Error("failed to load");
17
+ return res.json();
18
+ },
19
+ });
20
+
21
+ if (isLoading) return <p>読み込み中…</p>;
22
+ if (error) return <p>エラーが発生しました</p>;
23
+ return (
24
+ <ul>
25
+ {data.map((c: { id: string; name: string }) => (
26
+ <li key={c.id}>{c.name}</li>
27
+ ))}
28
+ </ul>
29
+ );
30
+ }
31
+ ```
32
+
33
+ ## 単一の管理された QueryClient
34
+
35
+ Vantage が用意する `QueryClient` は 1 つだけで、次のデフォルトを持ちます。
36
+
37
+ | 設定 | 値 |
38
+ |---|---|
39
+ | `staleTime` | 30 秒 |
40
+ | `retry` | 1 |
41
+ | `refetchOnWindowFocus` | `false` |
42
+
43
+ カスタマイズは**クエリごとのオプションで上書き**します。`QueryClient` 丸ごとの差し替えは、
44
+ 管理されたスタックを保つため意図的に公開していません。
45
+
46
+ ```tsx
47
+ // このクエリだけ挙動を変える
48
+ useQuery({
49
+ queryKey: ["metrics"],
50
+ queryFn: fetchMetrics,
51
+ staleTime: 5 * 60 * 1000, // 5 分
52
+ retry: 3,
53
+ });
54
+ ```
55
+
56
+ > [!NOTE]
57
+ > `@tanstack/react-query` を直接 import しないでください。`@squadbase/vantage/query` の
58
+ > キュレートされた再エクスポートを使うことで、Vantage が下層ライブラリを安全に進化させられます。
59
+
60
+ ## API との組み合わせ
61
+
62
+ `queryFn` の中で `/api/*` を呼べば、[オプションのサーバー](api-and-server)と自然につながります。
63
+ `server/` を持たないクライアントのみのアプリでも、外部 API を `fetch` して同じように扱えます。
64
+
65
+ > [!TIP]
66
+ > 組み込みの `/api` を呼ぶときは、`@squadbase/vantage/query` の `apiFetch` を使うと、ベースURLを
67
+ > env で切り替えられます(フロントとサーバーを別オリジンにデプロイする場合)。詳しくは
68
+ > [ビルドとデプロイ](build-and-deploy)を参照してください。
69
+ >
70
+ > ```tsx
71
+ > import { apiFetch } from "@squadbase/vantage/query";
72
+ >
73
+ > queryFn: () => apiFetch("/api/customers").then((r) => r.json());
74
+ > ```
75
+
76
+ ## 次に読む
77
+
78
+ - [API とサーバー](api-and-server) — バックエンドを書く
@@ -0,0 +1,68 @@
1
+ # 環境変数
2
+
3
+ > PUBLIC_ 接頭辞の env だけがクライアントに届く。シークレットはサーバーの env から読む。
4
+
5
+ Vantage は、環境変数を**クライアントに漏らさない**ことを既定にしています。境界は接頭辞で決まります。
6
+
7
+ ## クライアントに届くのは `PUBLIC_` だけ
8
+
9
+ `PUBLIC_` で始まる変数だけがクライアントバンドルに入り、`import.meta.env` から読めます。
10
+
11
+ ```tsx
12
+ // クライアントコード
13
+ const analyticsId = import.meta.env.PUBLIC_ANALYTICS_ID;
14
+ ```
15
+
16
+ クライアントで参照できるのは次だけです。
17
+
18
+ - `PUBLIC_*`(あなたが定義した公開値)
19
+ - `MODE` / `DEV` / `PROD` / `SSR` / `BASE_URL`(Vite の標準)
20
+
21
+ > [!WARNING]
22
+ > `PUBLIC_` 接頭辞の**付いていない** env をクライアントで読もうとすると、`vantage check` が
23
+ > `PUBLIC_ENV_MISUSE` 警告を出します。ユーザー向けの `VITE_` API は存在しません。
24
+
25
+ ## シークレットはサーバーの `env` から
26
+
27
+ API キーやトークンなどの秘密情報は、**クライアントに出さず**サーバーの `ApiContext.env` から
28
+ 読みます。これらは接頭辞を付けません。
29
+
30
+ ```ts
31
+ // server/api/report.ts
32
+ import type { ApiContext } from "@squadbase/vantage/server";
33
+
34
+ export async function GET({ env }: ApiContext) {
35
+ const apiKey = env.SECRET_API_KEY; // クライアントには決して届かない
36
+ // …外部サービスを呼ぶ
37
+ return Response.json({ ok: true });
38
+ }
39
+ ```
40
+
41
+ ## `.env` の例
42
+
43
+ ```bash
44
+ # .env
45
+ PUBLIC_ANALYTICS_ID=UA-XXXX # クライアントに届く
46
+ SECRET_API_KEY=sk_live_xxx # サーバー専用(ApiContext.env)
47
+ ```
48
+
49
+ > [!NOTE]
50
+ > dev サーバーはリクエストごとに env を読み直します。本番の Node サーバーは起動時に一度だけ
51
+ > `process.env` をスナップショットします。
52
+
53
+ ## デプロイで使う env
54
+
55
+ フロントとサーバーを別オリジンにデプロイするときは、次の env が関わります。
56
+
57
+ | 変数 | 側 | 役割 |
58
+ |---|---|---|
59
+ | `PUBLIC_API_BASE_URL` | クライアント(公開) | クライアントが `/api` を呼ぶベースURL。`--api-base-url` でも上書き可 |
60
+ | `CORS_ORIGIN` | サーバー | `/api` に対して許可するオリジン。未設定なら CORS 無効 |
61
+ | `CORS_CREDENTIALS` | サーバー | `true` で資格情報(Cookie 等)を許可 |
62
+
63
+ 使い方は[ビルドとデプロイ](build-and-deploy)で詳しく解説します。
64
+
65
+ ## 次に読む
66
+
67
+ - [ビルドとデプロイ](build-and-deploy) — 本番の env と別オリジン構成
68
+ - [UI とテーマ](ui-and-theming) — 見た目を整える