@squadbase/vantage 0.6.1-dev2.5f947f1 → 0.6.2-dev1.25d59a0
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.
- package/dist/add-4GHF2TX2.js +6 -0
- package/dist/add-4GHF2TX2.js.map +1 -0
- package/dist/{build-O5TVNH4E.js → build-X5NVCQKT.js} +9 -9
- package/dist/{build-O5TVNH4E.js.map → build-X5NVCQKT.js.map} +1 -1
- package/dist/{check-WFBEDHDR.js → check-ZBIH422T.js} +7 -7
- package/dist/{check-WFBEDHDR.js.map → check-ZBIH422T.js.map} +1 -1
- package/dist/chunk-2ICNHUG6.js +1820 -0
- package/dist/chunk-2ICNHUG6.js.map +1 -0
- package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
- package/dist/chunk-2N72FKLB.js.map +1 -0
- package/dist/{chunk-BCE22JSM.js → chunk-7DZGJQ3P.js} +33 -14
- package/dist/chunk-7DZGJQ3P.js.map +1 -0
- package/dist/{chunk-QDZA5JSL.js → chunk-AABMKHEU.js} +4 -4
- package/dist/{chunk-QDZA5JSL.js.map → chunk-AABMKHEU.js.map} +1 -1
- package/dist/{chunk-KLEIVDUV.js → chunk-CEXAQQ5W.js} +150 -11
- package/dist/chunk-CEXAQQ5W.js.map +1 -0
- package/dist/{chunk-3G43C6OL.js → chunk-GNXCX4WE.js} +46 -3
- package/dist/chunk-GNXCX4WE.js.map +1 -0
- package/dist/chunk-HKSVYMYJ.js +7919 -0
- package/dist/chunk-HKSVYMYJ.js.map +1 -0
- package/dist/{chunk-JGRMRXXZ.js → chunk-JKLLFVEU.js} +3 -3
- package/dist/{chunk-JGRMRXXZ.js.map → chunk-JKLLFVEU.js.map} +1 -1
- package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
- package/dist/chunk-PDOBHMUQ.js.map +1 -0
- package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
- package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
- package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
- package/dist/chunk-U736PVHY.js.map +1 -0
- package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
- package/dist/chunk-V3LF7BE7.js.map +1 -0
- package/dist/{chunk-EP6JHXSR.js → chunk-WAMZWZJB.js} +54 -9
- package/dist/chunk-WAMZWZJB.js.map +1 -0
- package/dist/{chunk-RPZAALCX.js → chunk-XPQSTZUU.js} +254 -164
- package/dist/chunk-XPQSTZUU.js.map +1 -0
- package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
- package/dist/chunk-XQUSGIDG.js.map +1 -0
- package/dist/cli.js +15 -11
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +32 -3
- package/dist/client/index.js +205 -12
- package/dist/client/index.js.map +1 -1
- package/dist/components/index.d.ts +1983 -29
- package/dist/components/index.js +4 -4
- package/dist/{dev-NZRLOQCL.js → dev-4XEDTELV.js} +24 -13
- package/dist/dev-4XEDTELV.js.map +1 -0
- package/dist/doc/index.js +4 -2
- package/dist/doc/index.js.map +1 -1
- package/dist/{docs-ZGDJUHJI.js → docs-JVP4RPKT.js} +3 -3
- package/dist/{docs-ZGDJUHJI.js.map → docs-JVP4RPKT.js.map} +1 -1
- package/dist/{doctor-VFKEMR54.js → doctor-5E2VEZPK.js} +8 -8
- package/dist/doctor-5E2VEZPK.js.map +1 -0
- package/dist/markdown/index.js +1 -1
- package/dist/markdown/index.js.map +1 -1
- package/dist/{preview-QDCIVVSR.js → preview-T6CLSQVX.js} +12 -4
- package/dist/preview-T6CLSQVX.js.map +1 -0
- package/dist/query/index.d.ts +0 -11
- package/dist/query/index.js +2 -2
- package/dist/{routes-RHP5FVGD.js → routes-3SGAFDMC.js} +6 -6
- package/dist/{routes-RHP5FVGD.js.map → routes-3SGAFDMC.js.map} +1 -1
- package/dist/{search-RFBELGY7.js → search-5LC4XPB5.js} +3 -3
- package/dist/{search-RFBELGY7.js.map → search-5LC4XPB5.js.map} +1 -1
- package/dist/slide/index.js +63 -17
- package/dist/slide/index.js.map +1 -1
- package/dist/table/index.js +11 -10
- package/dist/table/index.js.map +1 -1
- package/dist/ui/index.d.ts +144 -11
- package/dist/ui/index.js +1339 -87
- package/dist/ui/index.js.map +1 -1
- package/dist/{upgrade-GF2P67M6.js → upgrade-JHXZBGQS.js} +7 -7
- package/dist/{upgrade-GF2P67M6.js.map → upgrade-JHXZBGQS.js.map} +1 -1
- package/dist/vite/index.d.ts +10 -0
- package/dist/vite/index.js +4 -4
- package/docs/en/changelog.md +24 -0
- package/docs/en/cli-reference.md +30 -0
- package/docs/en/components.md +29 -15
- package/docs/en/parts/data-table.md +22 -0
- package/docs/en/parts/delta.md +50 -0
- package/docs/en/parts/format.md +43 -0
- package/docs/en/parts/kpi-card.md +57 -0
- package/docs/en/parts/metric-value.md +3 -2
- package/docs/en/parts/page-shell.md +1 -1
- package/docs/en/parts/sparkline.md +1 -1
- package/docs/en/parts/trend-indicator.md +17 -1
- package/docs/en/ui-and-theming.md +1 -1
- package/docs/index.json +366 -76
- package/docs/ja/changelog.md +55 -0
- package/docs/ja/cli-reference.md +29 -0
- package/docs/ja/components.md +57 -101
- package/docs/ja/page-types/csv.md +83 -0
- package/docs/ja/page-types/doc.md +83 -0
- package/docs/ja/page-types/excel.md +82 -0
- package/docs/ja/page-types/slide.md +132 -0
- package/docs/ja/page-types.md +47 -0
- package/docs/ja/parts/area-chart.md +61 -0
- package/docs/ja/parts/bar-chart.md +69 -0
- package/docs/ja/parts/bar-list.md +35 -0
- package/docs/ja/parts/category-bar.md +36 -0
- package/docs/ja/parts/data-table.md +22 -0
- package/docs/ja/parts/delta.md +50 -0
- package/docs/ja/parts/donut-chart.md +47 -0
- package/docs/ja/parts/echart.md +3 -0
- package/docs/ja/parts/format.md +44 -0
- package/docs/ja/parts/kpi-card.md +55 -0
- package/docs/ja/parts/line-chart.md +58 -0
- package/docs/ja/parts/metric-value.md +3 -2
- package/docs/ja/parts/page-shell.md +1 -1
- package/docs/ja/parts/progress-circle.md +34 -0
- package/docs/ja/parts/sparkline.md +2 -2
- package/docs/ja/parts/tracker.md +32 -0
- package/docs/ja/parts/trend-indicator.md +17 -1
- package/docs/ja/routing.md +8 -86
- package/docs/ja/ui/alert-dialog.md +41 -0
- package/docs/ja/ui/avatar.md +31 -0
- package/docs/ja/ui/combobox.md +74 -0
- package/docs/ja/ui/drawer.md +41 -0
- package/docs/ja/ui/field.md +42 -0
- package/docs/ja/ui/hover-card.md +21 -0
- package/docs/ja/ui/kbd.md +16 -0
- package/docs/ja/ui/pagination.md +36 -0
- package/docs/ja/ui/radio-group.md +21 -0
- package/docs/ja/ui/toast.md +46 -0
- package/docs/ja/ui-and-theming.md +14 -7
- package/package.json +43 -29
- package/registry/ui/accordion.tsx +76 -0
- package/registry/ui/alert-dialog.tsx +189 -0
- package/registry/ui/alert.tsx +80 -0
- package/registry/ui/app-shell.tsx +287 -0
- package/registry/ui/area-chart.tsx +3675 -0
- package/registry/ui/attention-list.tsx +303 -0
- package/registry/ui/avatar.tsx +110 -0
- package/registry/ui/badge.tsx +56 -0
- package/registry/ui/bar-chart.tsx +3672 -0
- package/registry/ui/bar-list.tsx +3716 -0
- package/registry/ui/box-plot-chart.tsx +3880 -0
- package/registry/ui/breadcrumb.tsx +128 -0
- package/registry/ui/button.tsx +62 -0
- package/registry/ui/calendar.tsx +223 -0
- package/registry/ui/card.tsx +107 -0
- package/registry/ui/category-bar.tsx +1263 -0
- package/registry/ui/chart-frame.tsx +1366 -0
- package/registry/ui/checkbox.tsx +30 -0
- package/registry/ui/collapsible.tsx +23 -0
- package/registry/ui/combobox.tsx +310 -0
- package/registry/ui/command.tsx +198 -0
- package/registry/ui/dashboard-card.tsx +217 -0
- package/registry/ui/data-table.tsx +693 -146
- package/registry/ui/date-range-picker.tsx +390 -0
- package/registry/ui/delta.tsx +188 -0
- package/registry/ui/dialog.tsx +161 -0
- package/registry/ui/donut-chart.tsx +3724 -0
- package/registry/ui/drawer.tsx +229 -0
- package/registry/ui/dropdown-menu.tsx +274 -0
- package/registry/ui/echart.tsx +923 -0
- package/registry/ui/field.tsx +240 -0
- package/registry/ui/filter-bar.tsx +392 -0
- package/registry/ui/funnel-steps.tsx +3569 -0
- package/registry/ui/heatmap.tsx +1760 -0
- package/registry/ui/histogram-chart.tsx +3960 -0
- package/registry/ui/hover-card.tsx +52 -0
- package/registry/ui/input-group.tsx +160 -0
- package/registry/ui/input.tsx +24 -0
- package/registry/ui/kbd.tsx +30 -0
- package/registry/ui/kpi-card.tsx +699 -0
- package/registry/ui/label.tsx +22 -0
- package/registry/ui/legend.tsx +3536 -0
- package/registry/ui/line-chart.tsx +3673 -0
- package/registry/ui/metric-value.tsx +62 -0
- package/registry/ui/multi-select.tsx +232 -0
- package/registry/ui/page-shell.tsx +282 -0
- package/registry/ui/pagination.tsx +140 -0
- package/registry/ui/paired-chart.tsx +3801 -0
- package/registry/ui/placeholder.tsx +36 -0
- package/registry/ui/popover.tsx +92 -0
- package/registry/ui/progress-circle.tsx +867 -0
- package/registry/ui/progress.tsx +85 -0
- package/registry/ui/radio-group.tsx +39 -0
- package/registry/ui/sample-data.tsx +86 -0
- package/registry/ui/scatter-chart.tsx +4186 -0
- package/registry/ui/scroll-area.tsx +56 -0
- package/registry/ui/searchable-select.tsx +214 -0
- package/registry/ui/section-header.tsx +43 -0
- package/registry/ui/segmented-control.tsx +76 -0
- package/registry/ui/select.tsx +255 -0
- package/registry/ui/separator.tsx +27 -0
- package/registry/ui/sheet.tsx +139 -0
- package/registry/ui/sidebar.tsx +725 -0
- package/registry/ui/skeleton.tsx +17 -0
- package/registry/ui/slider.tsx +56 -0
- package/registry/ui/sparkline.tsx +230 -0
- package/registry/ui/spinner.tsx +14 -0
- package/registry/ui/states.tsx +90 -0
- package/registry/ui/status-badge.tsx +121 -0
- package/registry/ui/switch.tsx +34 -0
- package/registry/ui/table.tsx +118 -0
- package/registry/ui/tabs.tsx +84 -0
- package/registry/ui/textarea.tsx +22 -0
- package/registry/ui/toast.tsx +250 -0
- package/registry/ui/toggle-group.tsx +91 -0
- package/registry/ui/toggle.tsx +47 -0
- package/registry/ui/tooltip.tsx +68 -0
- package/registry/ui/tracker.tsx +843 -0
- package/registry/ui/trend-indicator.tsx +74 -0
- package/registry/ui/updated-at.tsx +122 -0
- package/registry/ui/waterfall-chart.tsx +4222 -0
- package/skills/vantage-add-feature/SKILL.md +9 -7
- package/skills/vantage-design/SKILL.md +12 -2
- package/skills/vantage-design/references/format.md +1 -1
- package/skills/vantage-pitfalls/SKILL.md +5 -1
- package/skills/vantage-slide/SKILL.md +17 -0
- package/templates/AGENTS.md +22 -1
- package/templates/agents/api.md +29 -0
- package/templates/agents/csv.md +2 -1
- package/templates/agents/doc.md +4 -3
- package/templates/agents/page.md +32 -8
- package/templates/agents/slide.md +13 -1
- package/templates/agents/xlsx.md +2 -1
- package/theme.css +249 -130
- package/dist/add-EISGSZAH.js +0 -6
- package/dist/add-EISGSZAH.js.map +0 -1
- package/dist/chunk-3G43C6OL.js.map +0 -1
- package/dist/chunk-5ZOP4SQR.js.map +0 -1
- package/dist/chunk-A2UUGASH.js.map +0 -1
- package/dist/chunk-BCE22JSM.js.map +0 -1
- package/dist/chunk-DTDVSFRY.js.map +0 -1
- package/dist/chunk-EP6JHXSR.js.map +0 -1
- package/dist/chunk-KLEIVDUV.js.map +0 -1
- package/dist/chunk-LSRMRIXA.js +0 -2227
- package/dist/chunk-LSRMRIXA.js.map +0 -1
- package/dist/chunk-PVTHHV7X.js.map +0 -1
- package/dist/chunk-PXRX5PEC.js.map +0 -1
- package/dist/chunk-RPZAALCX.js.map +0 -1
- package/dist/chunk-T3FLAGI6.js +0 -316
- package/dist/chunk-T3FLAGI6.js.map +0 -1
- package/dist/dev-NZRLOQCL.js.map +0 -1
- package/dist/doctor-VFKEMR54.js.map +0 -1
- package/dist/preview-QDCIVVSR.js.map +0 -1
|
@@ -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> #
|
|
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
|
-
-
|
|
125
|
-
|
|
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,
|
|
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` に渡す)。
|
|
@@ -77,17 +77,27 @@ Vantage アプリの見た目は 2 つのファイルで決まる。
|
|
|
77
77
|
|
|
78
78
|
```css
|
|
79
79
|
body {
|
|
80
|
-
font-family: "<Font>",
|
|
80
|
+
font-family: "<Font>", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Noto Sans JP", Meiryo, ui-sans-serif, system-ui, sans-serif;
|
|
81
81
|
}
|
|
82
82
|
:root {
|
|
83
|
-
--slide-font-display: "<Font>",
|
|
83
|
+
--slide-font-display: "<Font>", -apple-system, BlinkMacSystemFont, "Segoe UI", "Hiragino Kaku Gothic ProN", "Hiragino Sans", "Yu Gothic", Meiryo, system-ui, sans-serif;
|
|
84
84
|
--slide-font-body: var(--slide-font-display);
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
欧文の Web フォントだけを先頭に足すときも、日本語の system face(`"Hiragino Sans"` 〜 `Meiryo`)は
|
|
89
|
+
必ず残す。消すとカナ・漢字がブラウザ任せのフォールバックになり、細く表示される。
|
|
90
|
+
`ui-sans-serif` / `system-ui` は日本語の face より**後ろ**に置く。日本語の Windows ではどちらも
|
|
91
|
+
Yu Gothic UI(UI のリサイズを避けるために字幅を詰めた書体)に解決され、カナがここで決まって
|
|
92
|
+
半角風に見える。macOS の Chrome は `-apple-system` を解釈しないので `BlinkMacSystemFont` も並べる。
|
|
93
|
+
既存アプリの `styles.css` に `ui-sans-serif, system-ui, …` が先頭にある、または `"Yu Gothic UI"` が
|
|
94
|
+
残っているときは、`body` の `font-family` を上の並びに直す(ほかの行は書き換えない)。
|
|
88
95
|
日本語の Web フォントは face が 100 を超えるので原則使わない(pptx 書き出しも壊れる。
|
|
89
96
|
`vantage-slide` の `references/tokens.md` 参照)。
|
|
90
97
|
|
|
98
|
+
長い表(ダッシュボード): カードに `max-h-*` + `overflow-y-auto` の縦スクロール領域を作らず、
|
|
99
|
+
ページング付きの `DataTablePreset`(`enablePagination`)にする(ホイールや End キーがページに届かなくなるため)。
|
|
100
|
+
|
|
91
101
|
`DESIGN.md`: `references/format.md` の書式で書く。**色コードを書かない**(トークン名だけ)。
|
|
92
102
|
150 行を超えない(超えると `vantage check` が `DESIGN_MD_TOO_LONG` を出す)。ロゴなどの素材は
|
|
93
103
|
`public/brand/logo.svg` のように `public/` 配下のパスで「ブランド素材」行に書く。
|
|
@@ -119,7 +119,7 @@ DESIGN.md — このアプリの「見た目の意図」を書くファイルで
|
|
|
119
119
|
|
|
120
120
|
| 用途 | 指定 | 備考 |
|
|
121
121
|
| --- | --- | --- |
|
|
122
|
-
| 見出し・本文 |
|
|
122
|
+
| 見出し・本文 | 日本語を含むシステムフォント(`body` の `font-family`) | Web フォントは使わない |
|
|
123
123
|
| 数字 | 同上 + `tabular-nums` | 桁がそろうように必ず付ける |
|
|
124
124
|
| スライドの見出し | `--slide-font-display` | 既定は日本語を含むシステムフォント |
|
|
125
125
|
| スライドの本文 | `--slide-font-body` | 既定は見出しと同じ |
|
|
@@ -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
|
|
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
|
書き換えやテーマプリセットの適用にも追従する。
|
|
@@ -49,6 +49,9 @@ export default function JuneDeck() {
|
|
|
49
49
|
- **`.slide` を付けられるのはルートになるページモジュールだけ。** `_layout.slide.tsx` や
|
|
50
50
|
`deck.slide.ts` は `INVALID_PAGE_VARIANT` エラーになります。
|
|
51
51
|
- **`june.slide.tsx` と `june.tsx` は同じ URL** になるので `ROUTE_CONFLICT` です。どちらかを消すこと。
|
|
52
|
+
- **ルート `/` がすでに他のページ(`index.tsx` など)で使われている場合、スライドは `index.slide.tsx` ではなく、タイトルから作った slug でファイル名を付ける。** `index.slide.tsx` と `index.tsx` は同じ `/` に解決して `ROUTE_CONFLICT` になる。
|
|
53
|
+
- 例: "Label check" → `src/label-check.slide.tsx` → `/label-check`
|
|
54
|
+
- 例: "Monthly Report" → `src/monthly-report.slide.tsx` → `/monthly-report`
|
|
52
55
|
- **デッキファイル以外を作らない。** ヘルパーコンポーネントも定数も同じ `.slide.tsx` の中に書く。
|
|
53
56
|
スライド専用のコンポーネントを `components/` に切り出すと、デッキ 1 本を読むのに 2 ファイル
|
|
54
57
|
追わせることになります。
|
|
@@ -194,6 +197,17 @@ pptx 書き出しのために描き終わりを待たせる必要があります
|
|
|
194
197
|
チャートに色をハードコードしないこと(`option.color` / `itemStyle.color` / `theme`)。
|
|
195
198
|
`EChart` はテーマトークンに追従します。
|
|
196
199
|
|
|
200
|
+
## 説明と図表を同じデータ時点へ揃える
|
|
201
|
+
|
|
202
|
+
分析を共有するデッキでは、本文・数値・図表が**同じ対象期間と同じ取得時点の結果**を参照していることを
|
|
203
|
+
確かめます。
|
|
204
|
+
|
|
205
|
+
- 対象期間とデータ取得時点を、該当ページかフッターに短く表示する(例: 「2026年6月 / 7月1日 9:00 取得」)
|
|
206
|
+
- **固定した説明文に対して図表だけが最新値へ変わる構成を避ける。** ライブ更新を意図するなら、本文の
|
|
207
|
+
数値・結論も同じ取得結果から導いて、図表と一緒に変わる構成にする
|
|
208
|
+
- 同一時点の結果を保持・参照できない場合は、スナップショットとして保存できたとは報告しない。
|
|
209
|
+
必要な保持の仕組みと、現在保証できない範囲(例: 再表示すると図表だけ最新値になる)を伝える
|
|
210
|
+
|
|
197
211
|
## 実行時に無料で付いてくるもの
|
|
198
212
|
|
|
199
213
|
- `src/june.slide.tsx` → `/june`。ナビ(`useRoutes()`)に通常のページと同格で並ぶ
|
|
@@ -244,6 +258,7 @@ pptx 書き出しのために描き終わりを待たせる必要があります
|
|
|
244
258
|
- [ ] 繰り返す視覚要素が `array.map` ではなく明示的な `<Component />` になっている
|
|
245
259
|
- [ ] ページ番号が `useSlideNumber()` から来ている(ハードコードしていない)
|
|
246
260
|
- [ ] チャートが `data-waitfor="canvas"` で包まれている
|
|
261
|
+
- [ ] 本文・数値・図表が同じ対象期間と取得時点の結果を参照し、その期間と時点が表示されている
|
|
247
262
|
- [ ] `<Steps>` を使ったページが、`?p=` で直接開いても完成した絵として読める
|
|
248
263
|
- [ ] トランジションを宣言したなら、全ページが 1 つの family に収まっている(→ `references/transitions.md`)
|
|
249
264
|
- [ ] `definePage` の値がリテラルである
|
|
@@ -262,3 +277,5 @@ pptx 書き出しのために描き終わりを待たせる必要があります
|
|
|
262
277
|
- ❌ スライド用のコンポーネントを別ファイルに切り出す
|
|
263
278
|
- ❌ チャートに `data-waitfor="canvas"` を付け忘れる(pptx が白紙になる)
|
|
264
279
|
- ❌ プリミティブを `references/*.md` を読まずに使う
|
|
280
|
+
- ❌ 説明文を固定したまま図表だけライブデータで描く(再表示すると本文と図表の時点がずれる)
|
|
281
|
+
- ❌ 同一時点の結果を保持できていないのに「スナップショットとして保存した」と報告する
|
package/templates/AGENTS.md
CHANGED
|
@@ -93,13 +93,25 @@ 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`、KPI の `KpiCard`・`Delta`、型付きチャート `LineChart`・`BarChart`・`AreaChart`・`DonutChart`・`BarList` ほか、`EChart`、書式の `formatValue`) |
|
|
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 要素に見出し・表などのスタイルが当たる) |
|
|
100
100
|
| `@squadbase/vantage/markdown` | `MarkdownRenderer`(Shiki を隔離するための専用サブパス) |
|
|
101
101
|
| `@squadbase/vantage/server` | `ApiContext`・`ApiHandler`・`HttpError`・`isHttpError`・`json`(server/ 側でのみ使う) |
|
|
102
102
|
|
|
103
|
+
**KPI は `KpiCard`、増減は `Delta`(`comparison` と `polarity` を渡す)。** 向き・率・色は値から計算
|
|
104
|
+
されるので手で渡さない。`TrendIndicator` は非推奨(`direction` を手で渡すので値と食い違いうる)。props は
|
|
105
|
+
`vantage docs kpi-card` / `vantage docs delta` を引く。
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
import { KpiCard, Delta } from "@squadbase/vantage/components";
|
|
109
|
+
|
|
110
|
+
<KpiCard label="売上" value={48_200_000} format="currency"
|
|
111
|
+
comparison={{ previous: 42_900_000, vs: "prior-period" }} />
|
|
112
|
+
<Delta value={0.021} comparison={{ previous: 0.026, vs: "prior-period" }} polarity="lower-is-better" />
|
|
113
|
+
```
|
|
114
|
+
|
|
103
115
|
## モードは 2 つ、切り替えるのは `server/` の有無だけ
|
|
104
116
|
|
|
105
117
|
`server/` ディレクトリがあれば **fullstack**、無ければ **SPA**。`vantage-manifest.json` の
|
|
@@ -137,6 +149,15 @@ root/
|
|
|
137
149
|
| `.xlsx` ページ | `agents/xlsx.md` |
|
|
138
150
|
| `.csv` ページ | `agents/csv.md` |
|
|
139
151
|
|
|
152
|
+
**ページになるのは `.tsx` / `.jsx`(`.slide.tsx`・`.doc.tsx` を含む)・`.csv`・`.xlsx` だけ。**
|
|
153
|
+
|
|
154
|
+
- `.xls`・`.xlsm`・`.xlsb`・`.ods`・`.tsv`・`.numbers`・`.parquet` はルートにならず、404 にもならない。
|
|
155
|
+
`vantage check` の `UNSUPPORTED_PAGE_FILE` 警告だけが知らせる。`.xlsx` / `.csv` に変換して置く
|
|
156
|
+
- `.md`・`.json`・`.txt` は何も言わずに無視される。Markdown を見せたいときは `.tsx` のページで
|
|
157
|
+
`MarkdownRenderer`(`@squadbase/vantage/markdown`)に渡す
|
|
158
|
+
- `.csv` / `.xlsx` はブラウザでパースする。25MB を超えるとそのページにエラーが出る
|
|
159
|
+
(`FILE_PAGE_TOO_LARGE` 警告)。20 万行を超えるシートは先頭 20 万行だけが表示される
|
|
160
|
+
|
|
140
161
|
## 環境変数
|
|
141
162
|
|
|
142
163
|
- **クライアントで読めるのは `import.meta.env.PUBLIC_*` と `MODE`/`DEV`/`PROD`/`SSR`/`BASE_URL`
|
package/templates/agents/api.md
CHANGED
|
@@ -25,6 +25,11 @@ export async function GET({ params, env }: ApiContext) {
|
|
|
25
25
|
エクスポートする。それ以外の名前は `INVALID_API_EXPORT` エラー。
|
|
26
26
|
- 動的 API も `[id].ts` 記法: `server/api/customers/[id].ts` → `GET /api/customers/:id`。
|
|
27
27
|
`params.id` で取り出す(`noUncheckedIndexedAccess` が効くので narrowing が要る)。
|
|
28
|
+
- **`noUncheckedIndexedAccess` は配列・レコードの添字すべてに効く。** `arr[0]` も `obj[key]` も
|
|
29
|
+
`T | undefined` になる。最初に書く前に、添字アクセスと `useApiQuery` の `data` が
|
|
30
|
+
undefined を扱っているかを頭の中で型検査してから書く。上流の生の応答の値は
|
|
31
|
+
`Number(row.metricValues?.[0]?.value ?? "0")` のように `?.` と `??` で取り出す
|
|
32
|
+
(`!` で黙らせない)。
|
|
28
33
|
- **クライアントに見せたいエラーは `HttpError(status, msg)` を throw する。** それ以外の throw は
|
|
29
34
|
ログに記録され汎用の 500 に丸められる。
|
|
30
35
|
- **シークレットは `ApiContext.env` にだけ届く**(クライアントには決して届かない)。
|
|
@@ -34,9 +39,12 @@ export async function GET({ params, env }: ApiContext) {
|
|
|
34
39
|
|
|
35
40
|
```tsx
|
|
36
41
|
import { useApiQuery, useApiMutation } from "@squadbase/vantage/query"
|
|
42
|
+
import { Loading, ErrorState } from "@squadbase/vantage/ui"
|
|
37
43
|
|
|
38
44
|
const q = useApiQuery<Customer>(`/api/customers/${customerId}`)
|
|
45
|
+
if (q.isPending) return <Loading />
|
|
39
46
|
if (q.isError) return <ErrorState message={q.error.message} /> // HttpError のメッセージ
|
|
47
|
+
q.data // ここで初めて Customer(undefined ではない)
|
|
40
48
|
|
|
41
49
|
// クエリ文字列は search で。undefined の項目は落ちる
|
|
42
50
|
const rows = useApiQuery<Row[]>("/api/customers", { search: { segment } })
|
|
@@ -45,5 +53,26 @@ const rows = useApiQuery<Row[]>("/api/customers", { search: { segment } })
|
|
|
45
53
|
const save = useApiMutation<Customer, Payload>("/api/customers", { method: "POST" })
|
|
46
54
|
```
|
|
47
55
|
|
|
56
|
+
**`data` は、同じ結果オブジェクトで `isPending` と `isError` を判定したあとでしか
|
|
57
|
+
narrowing されない。** 判定前や、配列の `.find` などでまとめた判定のあとでは `T | undefined` のまま。
|
|
58
|
+
複数のクエリは 1 本ずつ判定してから `data` を使う(`data!` で黙らせない):
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
const sessions = useApiQuery<SessionsDaily[]>("/api/sessions-daily")
|
|
62
|
+
const metrics = useApiQuery<MetricsDaily[]>("/api/metrics-daily")
|
|
63
|
+
|
|
64
|
+
if (sessions.isPending || metrics.isPending) return <Loading />
|
|
65
|
+
if (sessions.isError) return <ErrorState message={sessions.error.message} />
|
|
66
|
+
if (metrics.isError) return <ErrorState message={metrics.error.message} />
|
|
67
|
+
// ここから sessions.data: SessionsDaily[] / metrics.data: MetricsDaily[]
|
|
68
|
+
return <Chart sessions={sessions.data} metrics={metrics.data} />
|
|
69
|
+
|
|
70
|
+
// NG: const failed = [sessions, metrics].find((q) => q.isError) のように配列でまとめて判定すると
|
|
71
|
+
// 各 q.data は narrowing されず、`T[] | undefined` を T[] の props に渡して型エラーになる
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
カードごとに別々に読み込み中・エラーを出すなら、`data` を渡す側で `q.data ?? []` にするか、
|
|
75
|
+
カードのコンポーネントの中で上と同じ判定をする。
|
|
76
|
+
|
|
48
77
|
`ApiError` は `message`・`status`・`body`・`requestId` を持つ。hook が使えない場所では
|
|
49
78
|
`apiJson(path, init)`、生の `Response` が要るときは `apiFetch`。
|
package/templates/agents/csv.md
CHANGED
|
@@ -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` 警告が知らせます
|
package/templates/agents/doc.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
```tsx
|
|
14
14
|
import { definePage } from "@squadbase/vantage"
|
|
15
|
-
import {
|
|
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
|
-
<
|
|
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
|
-
-
|
|
45
|
+
- **チャートは型付きチャート(`BarChart`・`LineChart` など。`@squadbase/vantage/components`)を
|
|
46
|
+
文中に置く**(選び方は `agents/page.md` の「グラフはまず型付きチャートで描く」)。`figure` で囲めば
|
|
46
47
|
`figcaption` がキャプションになります。
|
|
47
48
|
- **PDF の保存ボタンは作らない。** `<Document>` が右下に PDF 保存のボタンを出し、印刷時は
|
|
48
49
|
本文だけをライトの配色で出します。
|
package/templates/agents/page.md
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@squadbase/vantage": "^0.5.0",
|
|
29
|
-
"react": "^19.
|
|
30
|
-
"react-dom": "^19.
|
|
29
|
+
"react": "^19.3.1",
|
|
30
|
+
"react-dom": "^19.3.1"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
```
|
|
@@ -164,17 +164,41 @@ 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
|
|
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
|
|
175
|
-
|
|
176
|
-
`
|
|
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
|
+
- 行が多い表は `DataTablePreset`(または `DataTable`)に `enablePagination` を付けて**ページング**する
|
|
183
|
+
(既定は 10 行 / ページ。ページングは既定で無効なので、付け忘れると全行が並ぶ)。素の `<table>` を
|
|
184
|
+
手書きして全行を流し込まない。
|
|
185
|
+
- カードの中に `max-h-*` + `overflow-y-auto` の**縦スクロール領域を作らない**。ホイールやキー
|
|
186
|
+
(End / Space)がその箱に吸われ、ページ全体がスクロールしなくなる。高さは内容に任せる。
|
|
187
|
+
- 横に広い表の `overflow-x-auto` は構わない。`SheetGrid`(`.csv` / `.xlsx` のビューア)は
|
|
188
|
+
グリッドとして意図した入れ子スクロールなので対象外。
|
|
189
|
+
|
|
190
|
+
### グラフはまず型付きチャートで描く
|
|
191
|
+
|
|
192
|
+
- 推移は `LineChart` / `AreaChart`、比較は `BarChart`、構成比は `DonutChart`。`data`(行の配列)・
|
|
193
|
+
`index`(x 軸の列)・`categories`(系列の列)を渡すだけで、option は書かない
|
|
194
|
+
(`DonutChart` は `category` / `value`)。
|
|
195
|
+
- 上位 N 件は `BarList`、判定帯や予算消化は `CategoryBar`、達成率は `ProgressCircle`、
|
|
196
|
+
日ごとの状態は `Tracker`。
|
|
197
|
+
- `EChart` + `EChartsOption` は、二軸・散布図・ヒートマップ・注釈線など型付きチャートの props で
|
|
198
|
+
表せないときだけ使う。
|
|
199
|
+
- 色は省略してテーマトークンに任せる。指定するなら `"chart-1"`〜`"chart-5"` か
|
|
200
|
+
`"var(--destructive)"` などの CSS 色。hex の直書きや Tailwind クラスは使わない。
|
|
201
|
+
- 数値の書式(`¥`・`%`・桁区切り)は `valueFormatter` に渡す。
|
|
178
202
|
|
|
179
203
|
### ダークモードは opt-in
|
|
180
204
|
|
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
`src/monthly-report.slide.tsx` → `/monthly-report`。中身は `<SlideDeck>` を返す普通の React
|
|
12
12
|
コンポーネントで、`definePage` もナビも通常のページと同じように効きます。
|
|
13
13
|
|
|
14
|
+
**ファイル名の決め方:**
|
|
15
|
+
|
|
16
|
+
- **ルート `/` がすでに他のページ(`index.tsx`など)で使われている場合は、スライドのタイトルから slug を作ってファイル名にする。** `index.slide.tsx` は `index.tsx` と同じ `/` に解決するので `ROUTE_CONFLICT` になる。
|
|
17
|
+
- 例: "Label check" というスライド → `src/label-check.slide.tsx` → `/label-check`
|
|
18
|
+
- 例: "Monthly Report" というスライド → `src/monthly-report.slide.tsx` → `/monthly-report`
|
|
19
|
+
- 新規プロジェクトでまだ `/` が空いている場合のみ、`index.slide.tsx` を使ってよい。
|
|
20
|
+
|
|
14
21
|
```tsx
|
|
15
22
|
import { Slide, SlideDeck } from "@squadbase/vantage/slide"
|
|
16
23
|
|
|
@@ -34,7 +41,12 @@ export default function Deck() {
|
|
|
34
41
|
送れ、左のスライド一覧(サムネイル列)は `L` で開閉、`F` で全画面、ツールバーから pptx を
|
|
35
42
|
書き出せます。**書き方の作法は同梱 Skill の
|
|
36
43
|
`vantage-slide`** にあります(キャンバスの縦方向の予算、段階表示、トランジション、モーフ、
|
|
37
|
-
pptx
|
|
44
|
+
pptx が壊れる条件、説明と図表のデータ時点の揃え方)。
|
|
45
|
+
|
|
46
|
+
**分析を共有するデッキでは、本文・数値・図表を同じ対象期間と同じ取得時点の結果に揃え、その期間と
|
|
47
|
+
時点を短く表示する。** 説明文を固定したまま図表だけが最新値へ変わる構成にしない(ライブ更新を
|
|
48
|
+
意図するなら本文も同じ取得結果から導く)。同一時点の結果を保持できない場合は、スナップショットとして
|
|
49
|
+
保存できたとは報告せず、必要な保持の仕組みと保証できない範囲を伝える。
|
|
38
50
|
|
|
39
51
|
`.slide` を付けられるのはルートになるページモジュールだけで、`_layout.slide.tsx` などは
|
|
40
52
|
`INVALID_PAGE_VARIANT` エラーになります。`june.slide.tsx` と `june.tsx` は同じ URL に解決するので
|
package/templates/agents/xlsx.md
CHANGED
|
@@ -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` 警告が知らせます
|