@squadbase/vantage 0.6.2-dev1.b332e5a → 0.6.2-dev1.d7c0911

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 (212) 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-X5NVCQKT.js} +7 -7
  4. package/dist/{build-TVKFIVFQ.js.map → build-X5NVCQKT.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-2ICNHUG6.js +1820 -0
  8. package/dist/chunk-2ICNHUG6.js.map +1 -0
  9. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  10. package/dist/chunk-2N72FKLB.js.map +1 -0
  11. package/dist/{chunk-P7W4LR3Z.js → chunk-7DZGJQ3P.js} +3 -3
  12. package/dist/{chunk-P7W4LR3Z.js.map → chunk-7DZGJQ3P.js.map} +1 -1
  13. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  14. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  15. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  16. package/dist/chunk-GNXCX4WE.js.map +1 -0
  17. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  18. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  19. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  20. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  21. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  22. package/dist/chunk-U736PVHY.js.map +1 -0
  23. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  24. package/dist/chunk-V3LF7BE7.js.map +1 -0
  25. package/dist/{chunk-LMUACBMA.js → chunk-WAMZWZJB.js} +53 -8
  26. package/dist/chunk-WAMZWZJB.js.map +1 -0
  27. package/dist/chunk-WRSX2MDK.js +7866 -0
  28. package/dist/chunk-WRSX2MDK.js.map +1 -0
  29. package/dist/{chunk-RPZAALCX.js → chunk-XPQSTZUU.js} +254 -164
  30. package/dist/chunk-XPQSTZUU.js.map +1 -0
  31. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  32. package/dist/chunk-XQUSGIDG.js.map +1 -0
  33. package/dist/cli.js +12 -11
  34. package/dist/cli.js.map +1 -1
  35. package/dist/client/index.d.ts +32 -3
  36. package/dist/client/index.js +205 -12
  37. package/dist/client/index.js.map +1 -1
  38. package/dist/components/index.d.ts +1975 -28
  39. package/dist/components/index.js +4 -4
  40. package/dist/{dev-GDKATCC7.js → dev-4XEDTELV.js} +8 -8
  41. package/dist/dev-4XEDTELV.js.map +1 -0
  42. package/dist/doc/index.js +2 -2
  43. package/dist/doc/index.js.map +1 -1
  44. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  45. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  46. package/dist/{doctor-WQXPXP6K.js → doctor-5E2VEZPK.js} +5 -5
  47. package/dist/{doctor-WQXPXP6K.js.map → doctor-5E2VEZPK.js.map} +1 -1
  48. package/dist/markdown/index.js +1 -1
  49. package/dist/markdown/index.js.map +1 -1
  50. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  51. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  52. package/dist/query/index.d.ts +0 -11
  53. package/dist/query/index.js +2 -2
  54. package/dist/{routes-MWBWWOJ2.js → routes-3SGAFDMC.js} +4 -4
  55. package/dist/{routes-MWBWWOJ2.js.map → routes-3SGAFDMC.js.map} +1 -1
  56. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  57. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  58. package/dist/table/index.js +10 -9
  59. package/dist/table/index.js.map +1 -1
  60. package/dist/ui/index.d.ts +144 -11
  61. package/dist/ui/index.js +1339 -87
  62. package/dist/ui/index.js.map +1 -1
  63. package/dist/{upgrade-HCANX4GQ.js → upgrade-JHXZBGQS.js} +6 -6
  64. package/dist/{upgrade-HCANX4GQ.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  65. package/dist/vite/index.d.ts +10 -0
  66. package/dist/vite/index.js +3 -3
  67. package/docs/en/components.md +29 -15
  68. package/docs/en/parts/data-table.md +22 -0
  69. package/docs/en/parts/delta.md +50 -0
  70. package/docs/en/parts/format.md +43 -0
  71. package/docs/en/parts/kpi-card.md +57 -0
  72. package/docs/en/parts/metric-value.md +3 -2
  73. package/docs/en/parts/sparkline.md +1 -1
  74. package/docs/en/parts/trend-indicator.md +17 -1
  75. package/docs/en/ui-and-theming.md +1 -1
  76. package/docs/index.json +366 -76
  77. package/docs/ja/changelog.md +31 -0
  78. package/docs/ja/components.md +57 -101
  79. package/docs/ja/page-types/csv.md +83 -0
  80. package/docs/ja/page-types/doc.md +83 -0
  81. package/docs/ja/page-types/excel.md +82 -0
  82. package/docs/ja/page-types/slide.md +132 -0
  83. package/docs/ja/page-types.md +47 -0
  84. package/docs/ja/parts/area-chart.md +61 -0
  85. package/docs/ja/parts/bar-chart.md +69 -0
  86. package/docs/ja/parts/bar-list.md +35 -0
  87. package/docs/ja/parts/category-bar.md +36 -0
  88. package/docs/ja/parts/data-table.md +22 -0
  89. package/docs/ja/parts/delta.md +50 -0
  90. package/docs/ja/parts/donut-chart.md +47 -0
  91. package/docs/ja/parts/echart.md +3 -0
  92. package/docs/ja/parts/format.md +44 -0
  93. package/docs/ja/parts/kpi-card.md +55 -0
  94. package/docs/ja/parts/line-chart.md +58 -0
  95. package/docs/ja/parts/metric-value.md +3 -2
  96. package/docs/ja/parts/progress-circle.md +34 -0
  97. package/docs/ja/parts/sparkline.md +2 -2
  98. package/docs/ja/parts/tracker.md +32 -0
  99. package/docs/ja/parts/trend-indicator.md +17 -1
  100. package/docs/ja/routing.md +8 -86
  101. package/docs/ja/ui/alert-dialog.md +41 -0
  102. package/docs/ja/ui/avatar.md +31 -0
  103. package/docs/ja/ui/combobox.md +74 -0
  104. package/docs/ja/ui/drawer.md +41 -0
  105. package/docs/ja/ui/field.md +42 -0
  106. package/docs/ja/ui/hover-card.md +21 -0
  107. package/docs/ja/ui/kbd.md +16 -0
  108. package/docs/ja/ui/pagination.md +36 -0
  109. package/docs/ja/ui/radio-group.md +21 -0
  110. package/docs/ja/ui/toast.md +46 -0
  111. package/docs/ja/ui-and-theming.md +14 -7
  112. package/package.json +13 -4
  113. package/registry/ui/accordion.tsx +76 -0
  114. package/registry/ui/alert-dialog.tsx +189 -0
  115. package/registry/ui/alert.tsx +80 -0
  116. package/registry/ui/app-shell.tsx +287 -0
  117. package/registry/ui/area-chart.tsx +3639 -0
  118. package/registry/ui/avatar.tsx +110 -0
  119. package/registry/ui/badge.tsx +56 -0
  120. package/registry/ui/bar-chart.tsx +3636 -0
  121. package/registry/ui/bar-list.tsx +3680 -0
  122. package/registry/ui/breadcrumb.tsx +128 -0
  123. package/registry/ui/button.tsx +62 -0
  124. package/registry/ui/calendar.tsx +223 -0
  125. package/registry/ui/card.tsx +107 -0
  126. package/registry/ui/category-bar.tsx +1255 -0
  127. package/registry/ui/chart-frame.tsx +1358 -0
  128. package/registry/ui/checkbox.tsx +30 -0
  129. package/registry/ui/collapsible.tsx +23 -0
  130. package/registry/ui/combobox.tsx +310 -0
  131. package/registry/ui/command.tsx +198 -0
  132. package/registry/ui/dashboard-card.tsx +217 -0
  133. package/registry/ui/data-table.tsx +693 -146
  134. package/registry/ui/date-range-picker.tsx +390 -0
  135. package/registry/ui/delta.tsx +188 -0
  136. package/registry/ui/dialog.tsx +161 -0
  137. package/registry/ui/donut-chart.tsx +3688 -0
  138. package/registry/ui/drawer.tsx +229 -0
  139. package/registry/ui/dropdown-menu.tsx +274 -0
  140. package/registry/ui/echart.tsx +890 -0
  141. package/registry/ui/field.tsx +240 -0
  142. package/registry/ui/filter-bar.tsx +392 -0
  143. package/registry/ui/funnel-steps.tsx +3541 -0
  144. package/registry/ui/heatmap.tsx +1752 -0
  145. package/registry/ui/hover-card.tsx +52 -0
  146. package/registry/ui/input-group.tsx +160 -0
  147. package/registry/ui/input.tsx +24 -0
  148. package/registry/ui/kbd.tsx +30 -0
  149. package/registry/ui/kpi-card.tsx +677 -0
  150. package/registry/ui/label.tsx +22 -0
  151. package/registry/ui/legend.tsx +3500 -0
  152. package/registry/ui/line-chart.tsx +3637 -0
  153. package/registry/ui/metric-value.tsx +62 -0
  154. package/registry/ui/multi-select.tsx +232 -0
  155. package/registry/ui/page-shell.tsx +282 -0
  156. package/registry/ui/pagination.tsx +140 -0
  157. package/registry/ui/placeholder.tsx +36 -0
  158. package/registry/ui/popover.tsx +92 -0
  159. package/registry/ui/progress-circle.tsx +867 -0
  160. package/registry/ui/progress.tsx +85 -0
  161. package/registry/ui/radio-group.tsx +39 -0
  162. package/registry/ui/sample-data.tsx +86 -0
  163. package/registry/ui/scatter-chart.tsx +4150 -0
  164. package/registry/ui/scroll-area.tsx +56 -0
  165. package/registry/ui/searchable-select.tsx +214 -0
  166. package/registry/ui/section-header.tsx +43 -0
  167. package/registry/ui/segmented-control.tsx +76 -0
  168. package/registry/ui/select.tsx +255 -0
  169. package/registry/ui/separator.tsx +27 -0
  170. package/registry/ui/sheet.tsx +139 -0
  171. package/registry/ui/sidebar.tsx +725 -0
  172. package/registry/ui/skeleton.tsx +17 -0
  173. package/registry/ui/slider.tsx +56 -0
  174. package/registry/ui/sparkline.tsx +230 -0
  175. package/registry/ui/spinner.tsx +14 -0
  176. package/registry/ui/states.tsx +90 -0
  177. package/registry/ui/status-badge.tsx +121 -0
  178. package/registry/ui/switch.tsx +34 -0
  179. package/registry/ui/table.tsx +118 -0
  180. package/registry/ui/tabs.tsx +84 -0
  181. package/registry/ui/textarea.tsx +22 -0
  182. package/registry/ui/toast.tsx +250 -0
  183. package/registry/ui/toggle-group.tsx +91 -0
  184. package/registry/ui/toggle.tsx +47 -0
  185. package/registry/ui/tooltip.tsx +68 -0
  186. package/registry/ui/tracker.tsx +843 -0
  187. package/registry/ui/trend-indicator.tsx +74 -0
  188. package/registry/ui/updated-at.tsx +122 -0
  189. package/registry/ui/waterfall-chart.tsx +4186 -0
  190. package/skills/vantage-add-feature/SKILL.md +9 -7
  191. package/skills/vantage-pitfalls/SKILL.md +5 -1
  192. package/templates/AGENTS.md +22 -1
  193. package/templates/agents/csv.md +2 -1
  194. package/templates/agents/doc.md +4 -3
  195. package/templates/agents/page.md +20 -6
  196. package/templates/agents/xlsx.md +2 -1
  197. package/theme.css +237 -136
  198. package/dist/add-DY4AXANK.js +0 -6
  199. package/dist/add-DY4AXANK.js.map +0 -1
  200. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  201. package/dist/chunk-A2UUGASH.js.map +0 -1
  202. package/dist/chunk-DTDVSFRY.js.map +0 -1
  203. package/dist/chunk-LMUACBMA.js.map +0 -1
  204. package/dist/chunk-NKFBFDRZ.js +0 -2241
  205. package/dist/chunk-NKFBFDRZ.js.map +0 -1
  206. package/dist/chunk-PVTHHV7X.js.map +0 -1
  207. package/dist/chunk-PXRX5PEC.js.map +0 -1
  208. package/dist/chunk-QI3XQKHS.js.map +0 -1
  209. package/dist/chunk-RPZAALCX.js.map +0 -1
  210. package/dist/chunk-VA776YE5.js +0 -316
  211. package/dist/chunk-VA776YE5.js.map +0 -1
  212. package/dist/dev-GDKATCC7.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ # ページの種類
2
+
3
+ > 通常ページ・スライド・ドキュメント・CSV・Excel の 5 種類。それぞれの置き方とできること、ページにならないファイル。
4
+
5
+ Vantage のページは **5 種類**あります。どれもファイルを置くだけでページになり、URL の作り方は同じ
6
+ です([ファイルベースルーティング](routing))。違うのは「何が描かれるか」だけです。
7
+
8
+ | 種類 | 置き方 | できること |
9
+ |---|---|---|
10
+ | 通常ページ | `sales.tsx` | ダッシュボード。表・チャート・フィルタを自由に組む |
11
+ | [スライド](page-types/slide) | `june.slide.tsx` | 発表用のスライドデッキ。段階表示・トランジション・pptx 書き出し |
12
+ | [ドキュメント](page-types/doc) | `june-summary.doc.tsx` | 上から読む報告書。クラス無しで組版され、PDF として保存できる |
13
+ | [CSV](page-types/csv) | `sales-export.csv` | ファイルを置くだけで表として読める |
14
+ | [Excel](page-types/excel) | `june.xlsx` | CSV と同じ表ビューアに、シートの切り替えが付く |
15
+
16
+ - **`.slide` / `.doc` と拡張子は URL に出ません。** `june.slide.tsx`・`june.csv`・`june.tsx` は
17
+ どれも `/june` です。同じ URL に 2 つ置くと `vantage check` が `ROUTE_CONFLICT` エラーを出します。
18
+ - **ナビにも同格で並びます。** `vantage routes` と `useRoutes()` には 5 種類が区別なく出て、
19
+ `kind`(`"module"` / `"file"`)と `variant`(`"slide"` / `"doc"`)で見分けられます。
20
+ - 通常ページ・スライド・ドキュメントは React コンポーネントなので
21
+ [`definePage`](pages-and-metadata) が効きます。CSV と Excel はファイル名がタイトルになります。
22
+
23
+ どれにするか迷ったら、**繰り返し見に来る数字はダッシュボード、誰かに伝える結論はスライド、
24
+ 残しておく説明はドキュメント、受け取ったデータをそのまま見せたいなら CSV / Excel** です。
25
+
26
+ ## ページにならないファイル
27
+
28
+ ページ走査のルート(`src/` があればその中)に置いても、次のファイルはページになりません。
29
+
30
+ | ファイル | どうなるか |
31
+ |---|---|
32
+ | `.xls`・`.xlsm`・`.xlsb`・`.ods`・`.tsv`・`.numbers`・`.parquet` | ルートにならない。`vantage check` が `UNSUPPORTED_PAGE_FILE` 警告を出す |
33
+ | `.md`・`.json`・`.txt` など | 何も言わずに無視される(コードから読む用途があるため) |
34
+ | `_` で始まるファイル(`_draft.tsx`・`_june.xlsx`) | プライベート。`_layout` などの予約名を除き、ルートにならない |
35
+ | `~$june.xlsx` | Excel が開いている間に作るロックファイル。無視される |
36
+ | `components/`・`hooks/`・`lib/` の中のファイル | 走査されない(`server/`・`public/` も同じ) |
37
+
38
+ ビューアの無い表計算ファイルは、404 にすらならず**黙って消えます**。ナビにも `vantage routes` にも
39
+ 出ないので、`vantage check` の警告が唯一の手がかりです。`.xlsx` か `.csv` に変換して置き直すか、
40
+ `.tsx` のページから [`TableViewer`](page-types/excel) で描いてください。
41
+
42
+ Markdown(`.md`)はページになりません。Markdown を見せたいときは `.tsx` のページで
43
+ [`MarkdownRenderer`](markdown/markdown-renderer) に文字列を渡します。
44
+
45
+ > [!WARNING]
46
+ > `.slide` / `.doc` を付けられるのは**ルートになるページモジュール(`.tsx` / `.jsx`)だけ**です。
47
+ > `_layout.slide.tsx` や `deck.slide.ts`、`notes.doc.css` は `INVALID_PAGE_VARIANT` エラーになります。
@@ -0,0 +1,61 @@
1
+ # AreaChart
2
+
3
+ > 推移を面で見せる型付きグラフ。行・x 軸の列・系列の列を渡すだけ。
4
+
5
+ 時系列の推移を面で描きます。ECharts の option を組む代わりに、**行の配列(`data`)・x 軸の列名(`index`)・
6
+ 系列の列名(`categories`)**を渡すだけで、凡例・ツールチップ・軸の書式まで揃います。配色は
7
+ `--chart-1`〜`--chart-5` のトークンに追従し、ライト / ダークを切り替えても追いかけます。中身は
8
+ [`EChart`](parts/echart) です。
9
+
10
+ ```tsx
11
+ import { AreaChart } from "@squadbase/vantage/components";
12
+ import type { AreaChartProps, ChartColor, ChartEventPayload } from "@squadbase/vantage/components";
13
+ ```
14
+
15
+ | Prop | Type | Default | 説明 |
16
+ | --- | --- | --- | --- |
17
+ | `data` | `Record<string, unknown>[]` | | 行の配列。**必須**。1 行が x 軸の 1 点。数値の列は number か数値文字列(SQL の DECIMAL など)で、それ以外は欠損として扱う。 |
18
+ | `index` | `string` | | x 軸に使う列名。**必須**。 |
19
+ | `categories` | `string[]` | | 系列として描く列名。**必須**。この順が凡例と配色の順になる。 |
20
+ | `colors` | `ChartColor[]` | `["chart-1", …, "chart-5"]` | 系列色。`"chart-1"`〜`"chart-5"`(ライト / ダークに追従)か CSS カラー。足りなければ繰り返す。 |
21
+ | `valueFormatter` | `(value: number) => string` | | 値軸の目盛りとツールチップの書式。既定は 3 桁区切り。 |
22
+ | `type` | `"default" \| "stacked" \| "percent"` | `"default"` | `stacked` は積み上げ、`percent` は各点の合計を 100% にした積み上げ(ツールチップは元の値)。 |
23
+ | `curveType` | `"linear" \| "smooth" \| "step"` | `"linear"` | 線の形。 |
24
+ | `connectNulls` | `boolean` | `false` | 欠損した点をまたいで線をつなぐ。 |
25
+ | `fill` | `"gradient" \| "solid" \| "none"` | `"gradient"` | 面の塗り。 |
26
+ | `showLegend` | `boolean` | `true` | 右上に凡例を出す。 |
27
+ | `showTooltip` | `boolean` | `true` | ホバーでツールチップを出す。 |
28
+ | `showGridLines` | `boolean` | `true` | 値軸の目盛り線。 |
29
+ | `showXAxis` | `boolean` | `true` | x 軸を出す。 |
30
+ | `showYAxis` | `boolean` | `true` | y 軸を出す。 |
31
+ | `startEndOnly` | `boolean` | `false` | x 軸のラベルを最初と最後だけにする。 |
32
+ | `yAxisWidth` | `number` | | y 軸ラベルの幅(px)。縦に並べた複数のグラフでプロット領域を揃えたいときに固定する。 |
33
+ | `minValue` | `number` | | 値軸の下限。 |
34
+ | `maxValue` | `number` | | 値軸の上限。 |
35
+ | `autoMinValue` | `boolean` | `false` | 値軸を 0 からではなくデータの範囲に合わせる。 |
36
+ | `allowDecimals` | `boolean` | `true` | `false` で目盛りを整数に限る。 |
37
+ | `xAxisLabel` | `string` | | x 軸の名前。 |
38
+ | `yAxisLabel` | `string` | | y 軸の名前。 |
39
+ | `onValueChange` | `(value: ChartEventPayload) => void` | | 点のクリックで呼ばれる。クリックした行に `eventType` と `categoryClicked`(系列名)を足して渡し、同じ点をもう一度押すと `null`。渡すと選択以外が薄くなる。 |
40
+ | `height` | `string \| number` | | 高さ。数値は px。省略時は `h-80`(320px)。`className` の高さクラスでも決められる。 |
41
+ | `loading` | `boolean` | | ローディング表示を出す。 |
42
+ | `ariaLabel` | `string` | | チャートの説明(スクリーンリーダー向け)。 |
43
+ | `className` | `string` | | 足すクラス。 |
44
+
45
+ > [!NOTE]
46
+ > `colors` は Tailwind のクラスではなく**色の値**です(キャンバスに描くため)。`"chart-2"` のような
47
+ > トークン名ならライト / ダークに追従します。軸・凡例・ツールチップの色はいつもテーマから入ります。
48
+
49
+ ## 構成比の推移を見る
50
+
51
+ `type="percent"` にすると、各点の合計を 100% として積み上げます。値軸は 0〜100% に固定され、
52
+ ツールチップには**元の値**が `valueFormatter` で出ます。
53
+
54
+ ```tsx
55
+ <AreaChart data={rows} index="month" categories={["オンライン", "店舗"]} type="percent" />
56
+ ```
57
+
58
+ ## EChart との使い分け
59
+
60
+ まずこの型付きグラフで描き、二軸・散布図・ヒートマップ・注釈線など**この props で表せないもの
61
+ だけ** [`EChart`](parts/echart) に option を書いてください。
@@ -0,0 +1,69 @@
1
+ # BarChart
2
+
3
+ > 比較を棒で見せる型付きグラフ。横並び・積み上げ・横棒に切り替えられる。
4
+
5
+ カテゴリごとの値を棒で比べます。**行の配列(`data`)・カテゴリの列名(`index`)・系列の列名(`categories`)**
6
+ を渡すだけで描け、`type` で横並び / 積み上げ / 100% 積み上げ、`layout` で縦棒 / 横棒を切り替えます。
7
+ 配色はトークンに追従します。中身は [`EChart`](parts/echart) です。
8
+
9
+ ```tsx
10
+ import { BarChart } from "@squadbase/vantage/components";
11
+ import type { BarChartProps, ChartColor, ChartEventPayload } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `data` | `Record<string, unknown>[]` | | 行の配列。**必須**。1 行が x 軸の 1 点。数値の列は number か数値文字列(SQL の DECIMAL など)で、それ以外は欠損として扱う。 |
17
+ | `index` | `string` | | x 軸に使う列名。**必須**。 |
18
+ | `categories` | `string[]` | | 系列として描く列名。**必須**。この順が凡例と配色の順になる。 |
19
+ | `colors` | `ChartColor[]` | `["chart-1", …, "chart-5"]` | 系列色。`"chart-1"`〜`"chart-5"`(ライト / ダークに追従)か CSS カラー。足りなければ繰り返す。 |
20
+ | `valueFormatter` | `(value: number) => string` | | 値軸の目盛りとツールチップの書式。既定は 3 桁区切り。 |
21
+ | `type` | `"default" \| "stacked" \| "percent"` | `"default"` | `default` は横並び、`stacked` は積み上げ、`percent` は各カテゴリの合計を 100% にした積み上げ。 |
22
+ | `layout` | `"horizontal" \| "vertical"` | `"horizontal"` | `vertical` はカテゴリを縦に並べた**横棒**(先頭の行が一番上)。ラベルの長いランキング向け。 |
23
+ | `barCategoryGap` | `string \| number` | | カテゴリ間の隙間(`"30%"` や px)。 |
24
+ | `showLegend` | `boolean` | `true` | 右上に凡例を出す。 |
25
+ | `showTooltip` | `boolean` | `true` | ホバーでツールチップを出す。 |
26
+ | `showGridLines` | `boolean` | `true` | 値軸の目盛り線。 |
27
+ | `showXAxis` | `boolean` | `true` | x 軸を出す。 |
28
+ | `showYAxis` | `boolean` | `true` | y 軸を出す。 |
29
+ | `startEndOnly` | `boolean` | `false` | x 軸のラベルを最初と最後だけにする。 |
30
+ | `yAxisWidth` | `number` | | y 軸ラベルの幅(px)。縦に並べた複数のグラフでプロット領域を揃えたいときに固定する。 |
31
+ | `minValue` | `number` | | 値軸の下限。 |
32
+ | `maxValue` | `number` | | 値軸の上限。 |
33
+ | `autoMinValue` | `boolean` | `false` | 値軸を 0 からではなくデータの範囲に合わせる。 |
34
+ | `allowDecimals` | `boolean` | `true` | `false` で目盛りを整数に限る。 |
35
+ | `xAxisLabel` | `string` | | x 軸の名前。 |
36
+ | `yAxisLabel` | `string` | | y 軸の名前。 |
37
+ | `onValueChange` | `(value: ChartEventPayload) => void` | | 棒のクリックで呼ばれる。クリックした行に `eventType` と `categoryClicked`(系列名)を足して渡し、同じ点をもう一度押すと `null`。渡すと選択以外が薄くなる。 |
38
+ | `height` | `string \| number` | | 高さ。数値は px。省略時は `h-80`(320px)。`className` の高さクラスでも決められる。 |
39
+ | `loading` | `boolean` | | ローディング表示を出す。 |
40
+ | `ariaLabel` | `string` | | チャートの説明(スクリーンリーダー向け)。 |
41
+ | `className` | `string` | | 足すクラス。 |
42
+
43
+ > [!NOTE]
44
+ > `colors` は Tailwind のクラスではなく**色の値**です(キャンバスに描くため)。`"chart-2"` のような
45
+ > トークン名ならライト / ダークに追従します。軸・凡例・ツールチップの色はいつもテーマから入ります。
46
+
47
+ ## 横棒のランキング
48
+
49
+ ラベルが長いときは `layout="vertical"` で横棒にします。`yAxisWidth` でラベル幅を固定すると、
50
+ 長いラベルは省略されます。行の順に上から並ぶので、並べ替えは `data` 側で済ませてください。
51
+
52
+ ```tsx
53
+ <BarChart
54
+ data={stores}
55
+ index="store"
56
+ categories={["売上"]}
57
+ layout="vertical"
58
+ yAxisWidth={96}
59
+ showLegend={false}
60
+ />
61
+ ```
62
+
63
+ 数件のランキングを軸なしで並べるだけなら、[`BarList`](parts/bar-list) のほうが軽く、
64
+ カードにも収まります。
65
+
66
+ ## EChart との使い分け
67
+
68
+ まずこの型付きグラフで描き、二軸・散布図・ヒートマップ・注釈線など**この props で表せないもの
69
+ だけ** [`EChart`](parts/echart) に option を書いてください。
@@ -0,0 +1,35 @@
1
+ # BarList
2
+
3
+ > 名前と値を横棒で並べるランキング。軸なしで、カードに収まる軽さ。
4
+
5
+ 名前と値の組を、値に比例した淡い横棒で並べます。アクセスの多いページ・店舗別の売上・
6
+ エラーの種類別件数のような**上位 N 件**に向きます。ECharts を使わない HTML なので、カードの中に
7
+ いくつ置いても軽く、配色はテーマに追従します。
8
+
9
+ ```tsx
10
+ import { BarList } from "@squadbase/vantage/components";
11
+ import type { BarListItem, ChartColor } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `data` | `BarListItem[]` | | `{ name: string; value: number; href?: string; key?: string; color?: ChartColor }` の配列。**必須**。 |
17
+ | `valueFormatter` | `(value: number) => string` | | 右端の数値の書式。既定は 3 桁区切り。 |
18
+ | `sortOrder` | `"descending" \| "ascending" \| "none"` | `"descending"` | 並べ順。`none` は渡した順。 |
19
+ | `color` | `ChartColor` | `"chart-1"` | バーの色(淡く塗る)。行ごとに変えるなら `data[].color`。 |
20
+ | `showAnimation` | `boolean` | `false` | マウント時にバーを伸ばす。 |
21
+ | `onValueChange` | `(item: BarListItem) => void` | | 渡すと行がボタンになり、クリックした行を受け取る(絞り込みの起点に)。 |
22
+ | `className` | `string` | | 足すクラス。 |
23
+
24
+ 残りの props は外側の `<div>` にそのまま渡ります。
25
+
26
+ ## リンクにする
27
+
28
+ `href` を持つ行は名前がリンクになります。`http(s)://` で始まるものは新しいタブで開きます。
29
+
30
+ ```tsx
31
+ <BarList data={pages.map((p) => ({ name: p.path, value: p.views, href: p.url }))} />
32
+ ```
33
+
34
+ 棒の長さは**最大値に対する比**です。全体に対する割合を見せたいなら
35
+ [`CategoryBar`](parts/category-bar) か [`DonutChart`](parts/donut-chart) を使います。
@@ -0,0 +1,36 @@
1
+ # CategoryBar
2
+
3
+ > 1 本の棒を区間に色分けし、現在値をマーカーで示す。
4
+
5
+ 1 本の棒を `values` の比で色分けし、区切りに累計値を出します。`marker` を渡すと、その値の位置に
6
+ 目印が立ちます。スコアの判定帯(要改善 / 標準 / 良好)・予算の消化・構成比の 1 本表示に向きます。
7
+ ECharts を使わない HTML で、配色はテーマに追従します。
8
+
9
+ ```tsx
10
+ import { CategoryBar } from "@squadbase/vantage/components";
11
+ import type { CategoryBarMarker, ChartColor } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `values` | `number[]` | | 各区間の幅(相対値)。**必須**。合計が 100 である必要はない。負の値は 0 扱い。 |
17
+ | `colors` | `ChartColor[]` | `["chart-1", …, "chart-5"]` | 区間の色(順に対応)。`"chart-1"`〜`"chart-5"` か CSS カラー。 |
18
+ | `marker` | `CategoryBarMarker` | | `{ value: number; tooltip?: string; showAnimation?: boolean }`。`value` は `values` の合計と同じ尺度。 |
19
+ | `showLabels` | `boolean` | `true` | 棒の上に区切りの累計値を出す。狭い区間のラベルは省く。 |
20
+ | `valueFormatter` | `(value: number) => string` | | 区切りの数値の書式。 |
21
+ | `className` | `string` | | 足すクラス。 |
22
+
23
+ 残りの props は外側の `<div>` にそのまま渡ります。
24
+
25
+ ## 判定帯に色を合わせる
26
+
27
+ `colors` は区間の順に対応します。「悪い → 良い」の帯なら、暖色から寒色へ並べると読みやすく
28
+ なります。マーカーの色は、乗っている区間の色になります。
29
+
30
+ ```tsx
31
+ <CategoryBar
32
+ values={[60, 20, 20]}
33
+ colors={["chart-5", "chart-3", "chart-2"]}
34
+ marker={{ value: 72, tooltip: "今月のスコア: 72" }}
35
+ />
36
+ ```
@@ -55,6 +55,28 @@ import type { ColumnDef, SortingState, PaginationState } from "@squadbase/vantag
55
55
 
56
56
  `useDataTable()` を使うと、子コンポーネントから TanStack の `table` インスタンスを直接触れます。
57
57
 
58
+ ## 列の書式と CSV 書き出し
59
+
60
+ `cell` を書かない列は `meta.format` で数値を整形できます(右寄せ・tabular-nums、null は `meta.nullLabel`、既定 `—`)。行ごとに通貨が変わるときは関数で渡します。`DataTableExport` は画面と同じ並べ替え・絞り込み後の順で、BOM 付き UTF-8 の CSV を書き出します。`DataTablePreset` なら `exportable` だけで toolbar に置けます。
61
+
62
+ ```tsx
63
+ const columns: ColumnDef<Row>[] = [
64
+ { accessorKey: "month", header: "月" },
65
+ {
66
+ accessorKey: "revenue",
67
+ header: "売上",
68
+ meta: { format: (row) => ({ type: "currency", currency: row.currency, notation: "standard" }) },
69
+ },
70
+ ];
71
+
72
+ <DataTable columns={columns} data={rows}>
73
+ <DataTableToolbar toolbar={<DataTableExport fileName="sales.csv" />} />
74
+ <DataTableContent />
75
+ </DataTable>;
76
+ ```
77
+
78
+ `values="raw"` で生の値、`scope="page"` で表示中のページだけを書き出せます。サーバー側でページングするときは `rowCount`(総件数)・`manualSorting`・`manualFiltering`・`isLoading` も使えます。
79
+
58
80
  ## サーバー側でページングする
59
81
 
60
82
  `pagination` と `onPaginationChange` を自分で持ち、`pageCount` に総ページ数を渡します。
@@ -0,0 +1,50 @@
1
+ # Delta
2
+
3
+ > 比較相手に対する増減。矢印・符号付きの率・比較ラベルを値から導く。
4
+
5
+ 値の変化を「↑ +12.4% 前期比」の 1 行で示します。**向き・率・色・文言はすべて `value` と `comparison`
6
+ から計算**され、外から渡すことはできません — そのため矢印と色が食い違うことがありません。色だけに
7
+ 頼らず、矢印と符号が必ず付きます。解約率のように上がると悪い指標は `polarity="lower-is-better"` を
8
+ 渡してください。
9
+
10
+ 非推奨の [`TrendIndicator`](parts/trend-indicator) の置き換えです。
11
+
12
+ ```tsx
13
+ import { Delta } from "@squadbase/vantage/components";
14
+ import type { DeltaProps, Comparison, Polarity } from "@squadbase/vantage/components";
15
+ ```
16
+
17
+ | Prop | Type | Default | 説明 |
18
+ | --- | --- | --- | --- |
19
+ | `value` | `number \| null \| undefined` | | 現在の値。**必須**。前の値は `comparison` から取る。 |
20
+ | `comparison` | `Comparison` | | 比較の相手。**必須**(増減に必ずラベルが付くように)。下の表を参照。 |
21
+ | `polarity` | `"higher-is-better" \| "lower-is-better"` | `"higher-is-better"` | 上がることが良いか。 |
22
+ | `neutralBand` | `number` | `0.01` | 変化率の絶対値がこれ未満なら横ばい(–)として扱う。既定は 1%。 |
23
+ | `variant` | `"badge" \| "inline"` | `"badge"` | 枠付きのバッジか、文中に置く素の文字か。 |
24
+ | `locale` | `string` | `"ja-JP"` | 率の書式のロケール。 |
25
+ | `showLabel` | `boolean` | `true` | 率のあとに比較ラベル(「前期比」)を出すか。 |
26
+ | `className` | `string` | | 足すクラス。 |
27
+
28
+ ## Comparison
29
+
30
+ | Prop | Type | 説明 |
31
+ | --- | --- | --- |
32
+ | `previous` | `number \| null \| undefined` | 比較相手の値。`null` や `0` のときは率が出せないので「—」になる。 |
33
+ | `vs` | `"prior-period" \| "prior-year" \| "target"` | 比較の種類。ラベルは順に「前期比」「前年同期比」「目標比」。 |
34
+ | `label` | `string` | ラベルを差し替える(「先週比」など)。 |
35
+
36
+ ## TrendIndicator からの置き換え
37
+
38
+ ```tsx
39
+ // 旧: 向きと色を手で決めていた
40
+ <TrendIndicator value={12.4} direction="up" />
41
+
42
+ // 新: 今期と前期の値を渡すだけ
43
+ <Delta value={1_240_000} comparison={{ previous: 1_103_000, vs: "prior-period" }} />
44
+
45
+ // 下がる方が良い指標
46
+ <Delta value={0.021} comparison={{ previous: 0.026, vs: "prior-period" }} polarity="lower-is-better" />
47
+ ```
48
+
49
+ 色は `--positive` / `--negative` / `--neutral` のトークンで決まります。KPI を 1 枚のカードで見せる
50
+ なら [`KpiCard`](parts/kpi-card) が中で `Delta` を使います。
@@ -0,0 +1,47 @@
1
+ # DonutChart
2
+
3
+ > 構成比を見せる型付きのドーナツ / 円グラフ。中央に合計を出す。
4
+
5
+ 構成比をドーナツ(または円)で描きます。**行の配列(`data`)・名前の列(`category`)・値の列(`value`)**
6
+ を渡すだけで描け、ドーナツの穴には合計(または `label`)が出ます。中央のラベルはキャンバスではなく
7
+ HTML なので、ページの文字色・書体のまま表示されます。配色はトークンに追従します。
8
+
9
+ ```tsx
10
+ import { DonutChart } from "@squadbase/vantage/components";
11
+ import type { DonutChartProps, ChartColor, ChartEventPayload } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `data` | `Record<string, unknown>[]` | | 行の配列。**必須**。1 行が 1 切片。 |
17
+ | `category` | `string` | | 切片の名前に使う列名。**必須**。 |
18
+ | `value` | `string` | | 切片の大きさに使う列名。**必須**。number か数値文字列。0 以下と欠損は 0 扱い。 |
19
+ | `colors` | `ChartColor[]` | `["chart-1", …, "chart-5"]` | 切片の色(行の順)。`"chart-1"`〜`"chart-5"` か CSS カラー。足りなければ繰り返す。 |
20
+ | `variant` | `"donut" \| "pie"` | `"donut"` | 穴あき(中央ラベルあり)か、円か。 |
21
+ | `valueFormatter` | `(value: number) => string` | | ツールチップと中央ラベルの書式。 |
22
+ | `label` | `ReactNode` | | 中央ラベル。省略時は合計を `valueFormatter` で書いたもの。 |
23
+ | `showLabel` | `boolean` | `true` | 中央ラベルを出す(donut のみ)。 |
24
+ | `showTooltip` | `boolean` | `true` | ホバーで名前・値・構成比を出す。 |
25
+ | `onValueChange` | `(value: ChartEventPayload) => void` | | 切片のクリックで呼ばれる。行に `eventType: "slice"` と `categoryClicked`(切片名)を足して渡し、同じ切片をもう一度押すと `null`。 |
26
+ | `loading` | `boolean` | | ローディング表示を出す。 |
27
+ | `ariaLabel` | `string` | | チャートの説明。 |
28
+ | `className` | `string` | `"size-40"` | 外枠のクラス。大きさはここで決める。 |
29
+
30
+ ## 凡例を添える
31
+
32
+ 凡例は持ちません(切片が 5 つ程度ならツールチップで足りるため)。並べて見せたいときは、
33
+ 行ごとに同じ色を当てた [`BarList`](parts/bar-list) や表を隣に置いてください。
34
+
35
+ ```tsx
36
+ <div className="flex items-center gap-6">
37
+ <DonutChart data={rows} category="channel" value="sessions" label="9.7万" className="size-48" />
38
+ <BarList
39
+ data={rows.map((r, i) => ({ name: r.channel, value: r.sessions, color: `chart-${(i % 5) + 1}` }))}
40
+ sortOrder="none"
41
+ className="flex-1"
42
+ />
43
+ </div>
44
+ ```
45
+
46
+ > [!NOTE]
47
+ > 切片が 6 つを超えると色が繰り返されます。小さい切片は「その他」にまとめてから渡してください。
@@ -7,6 +7,9 @@ Apache ECharts をそのまま使えるようにした薄いラッパーです
7
7
  系列色は `--chart-1` 〜 `--chart-5`、軸・凡例・ツールチップは文字色と境界色のトークンから組まれ、
8
8
  ライト / ダークの切り替えにも追いかけます。
9
9
 
10
+ > [!TIP]
11
+ > まず型付きグラフ([`AreaChart`](parts/area-chart)・[`BarChart`](parts/bar-chart)・[`LineChart`](parts/line-chart)・[`DonutChart`](parts/donut-chart))を使い、二軸・散布図・ヒートマップなど細かい制御が要るときだけ `EChart` に option を書いてください。
12
+
10
13
  ```tsx
11
14
  import { EChart } from "@squadbase/vantage/components";
12
15
  import type { EChartsOption } from "@squadbase/vantage/components";
@@ -0,0 +1,44 @@
1
+ # format / comparison
2
+
3
+ > KPI・表・グラフで共有する数値の書式(formatValue)と、増減の計算(computeComparison)。
4
+
5
+ `KpiCard` / `Delta` が内部で使っている数値の書式と比較の計算を、そのまま関数として使えます。表の
6
+ セルやグラフの `valueFormatter` を KPI と同じ書式に揃えたいときに使ってください。短縮(「4.8億」
7
+ など)は `Intl.NumberFormat` に任せており、単位の文字列を自前で持ちません。
8
+
9
+ ```tsx
10
+ import {
11
+ formatValue,
12
+ formatDelta,
13
+ toValueFormatter,
14
+ computeComparison,
15
+ } from "@squadbase/vantage/components";
16
+ import type { ValueFormat, Comparison, ComparisonResult } from "@squadbase/vantage/components";
17
+ ```
18
+
19
+ ## ValueFormat
20
+
21
+ `"number" | "compact" | "currency" | "percent" | "multiple"` のどれか、または
22
+ `{ type, digits?, currency? }`。既定は `"compact"`、通貨の既定は `JPY`、ロケールの既定は `"ja-JP"`。
23
+ `percent` は比率(`0.124` → 12.4%)を受け取ります。値が `null` / `undefined` / `NaN` のときは「—」を
24
+ 返します。
25
+
26
+ | Prop | Type | 説明 |
27
+ | --- | --- | --- |
28
+ | `formatValue(value, format?, locale?)` | `string` | 値を書式化する。 |
29
+ | `formatDelta(value, format?, locale?)` | `string` | 差分用。0 以外は常に符号が付く(`+12.4%`)。 |
30
+ | `toValueFormatter(format?, locale?)` | `(value) => string` | 書式とロケールを束ねた 1 引数の関数。グラフの `valueFormatter` に渡せる。 |
31
+
32
+ ```tsx
33
+ formatValue(48_200_000, "currency"); // "¥48,200,000"
34
+ formatValue(0.021, { type: "percent", digits: 1 }); // "2.1%"
35
+ <LineChart valueFormatter={toValueFormatter("compact")} … />
36
+ ```
37
+
38
+ ## computeComparison
39
+
40
+ `computeComparison(current, comparison, { polarity?, neutralBand? })` が
41
+ `{ current, previous, difference, ratio, direction, sentiment, label, vs }` を返します。率は前の値が
42
+ 0 でない数のときだけ出し、`neutralBand`(既定 0.01)未満の変化は `direction: "flat"` になります。
43
+ `sentiment`(`"positive" | "negative" | "neutral"`)は `polarity` で決まります。表示は
44
+ [`Delta`](parts/delta) に任せ、自前で矢印や色を組まないでください。
@@ -0,0 +1,55 @@
1
+ # KpiCard
2
+
3
+ > KPI 1 つ分のカード。値・増減・前期実績・結論の 1 文までを数値から組み立てる。
4
+
5
+ KPI を 1 つ見せるカードです。**数値と列挙値だけを渡せば**、上から「指標名 → 値 → 増減
6
+ ([`Delta`](parts/delta))→ 前期の実績 → 結論の 1 文」の順に組み立てます。増減の向き・率・
7
+ 色・目標までの残り・達成率・記録更新はすべてカードの中で計算するので、props どうしが食い違うことは
8
+ ありません。KPI タイルは `DashboardCardPreset` + `MetricValue` で組むより、まずこれを使ってください。
9
+
10
+ ```tsx
11
+ import { KpiCard } from "@squadbase/vantage/components";
12
+ import type { KpiCardProps, KpiCardSource, Comparison, Polarity, ValueFormat } from "@squadbase/vantage/components";
13
+ ```
14
+
15
+ | Prop | Type | Default | 説明 |
16
+ | --- | --- | --- | --- |
17
+ | `label` | `string` | | 指標名。**必須**。 |
18
+ | `value` | `number \| null \| undefined` | | 現在の値。**必須**。`null` / `undefined` は「—」と表示する。 |
19
+ | `format` | `ValueFormat` | `"compact"` | 値の書式(→ format / comparison のページ)。前期実績・目標・残りにも同じ書式を使う。 |
20
+ | `locale` | `string` | `"ja-JP"` | 書式のロケール。 |
21
+ | `comparison` | `Comparison` | | 比較の相手(`{ previous, vs, label? }`)。渡すと増減と前期実績の行が出る。 |
22
+ | `polarity` | `"higher-is-better" \| "lower-is-better"` | `"higher-is-better"` | 上がることが良いか。解約率のように下がる方が良い指標は `"lower-is-better"`。 |
23
+ | `neutralBand` | `number` | `0.01` | 変化率の絶対値がこれ未満なら横ばいとして扱う。 |
24
+ | `showPrevious` | `boolean` | `true` | 前期の実績(「前期 400」)を出すか。`comparison` が要る。 |
25
+ | `summary` | `string` | | 結論の 1 文の**テンプレート**。下のプレースホルダをカードが埋める。 |
26
+ | `target` | `number` | | 今期の目標。「目標まであと …(… 達成)」の行が出る。 |
27
+ | `period` | `{ start: Date \| string \| number; end: Date \| string \| number }` | | 今期の期間。`target` と一緒に渡すと、期間中は「見込み」(このペースなら期末いくつ)が出る。 |
28
+ | `history` | `ReadonlyArray<number \| null \| undefined>` | | 今期で終わる系列(最後の点 = `value`)。記録更新のバッジが出る。 |
29
+ | `historyGrain` | `"day" \| "week" \| "month" \| "quarter" \| "year"` | `"month"` | `history` の粒度。 |
30
+ | `source` | `{ period?: string; count?: number; name?: string }` | | データの出所の注記(「2023-04 以降・48,210 件から集計・Snowflake」)。 |
31
+ | `updatedAt` | `Date \| string \| number` | | 最終更新時刻。「3 分前に更新」と出る。 |
32
+ | `now` | `Date \| number` | | 見込みと相対時刻の基準時刻(表示を固定したいとき)。 |
33
+ | `isLoading` | `boolean` | `false` | 値の代わりに、完成形と同じ形のスケルトンを出す。 |
34
+ | `className` | `string` | | 足すクラス。 |
35
+
36
+ ## summary のプレースホルダ
37
+
38
+ `{value}` `{delta}` `{difference}` `{previous}` `{label}` `{target}` `{achievement}` `{remaining}` が
39
+ 使えます。知らない名前はそのまま残り、値が無いものは「—」になります。
40
+
41
+ > [!WARNING]
42
+ > **テンプレートに数値を直接書かないでください。** 数値はすべてプレースホルダで差し込みます —
43
+ > 値が変わっても文が古くならないようにするためです。
44
+
45
+ ```tsx
46
+ <KpiCard
47
+ label="売上"
48
+ value={48_200_000}
49
+ format="currency"
50
+ comparison={{ previous: 42_900_000, vs: "prior-period" }}
51
+ summary="{label}は前月から {difference}({delta})伸びています。"
52
+ />
53
+ ```
54
+
55
+ 増減だけを表やタイルの中に置きたいときは [`Delta`](parts/delta) を単体で使います。
@@ -0,0 +1,58 @@
1
+ # LineChart
2
+
3
+ > 推移を線で見せる型付きグラフ。行・x 軸の列・系列の列を渡すだけ。
4
+
5
+ 時系列の推移を折れ線で描きます。**行の配列(`data`)・x 軸の列名(`index`)・系列の列名(`categories`)**
6
+ を渡すだけで、凡例・ツールチップ・軸の書式まで揃います。配色はトークンに追従します。中身は
7
+ [`EChart`](parts/echart) です。
8
+
9
+ ```tsx
10
+ import { LineChart } from "@squadbase/vantage/components";
11
+ import type { LineChartProps, ChartColor, ChartEventPayload } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `data` | `Record<string, unknown>[]` | | 行の配列。**必須**。1 行が x 軸の 1 点。数値の列は number か数値文字列(SQL の DECIMAL など)で、それ以外は欠損として扱う。 |
17
+ | `index` | `string` | | x 軸に使う列名。**必須**。 |
18
+ | `categories` | `string[]` | | 系列として描く列名。**必須**。この順が凡例と配色の順になる。 |
19
+ | `colors` | `ChartColor[]` | `["chart-1", …, "chart-5"]` | 系列色。`"chart-1"`〜`"chart-5"`(ライト / ダークに追従)か CSS カラー。足りなければ繰り返す。 |
20
+ | `valueFormatter` | `(value: number) => string` | | 値軸の目盛りとツールチップの書式。既定は 3 桁区切り。 |
21
+ | `curveType` | `"linear" \| "smooth" \| "step"` | `"linear"` | 線の形。 |
22
+ | `connectNulls` | `boolean` | `false` | 欠損した点をまたいで線をつなぐ。 |
23
+ | `showLegend` | `boolean` | `true` | 右上に凡例を出す。 |
24
+ | `showTooltip` | `boolean` | `true` | ホバーでツールチップを出す。 |
25
+ | `showGridLines` | `boolean` | `true` | 値軸の目盛り線。 |
26
+ | `showXAxis` | `boolean` | `true` | x 軸を出す。 |
27
+ | `showYAxis` | `boolean` | `true` | y 軸を出す。 |
28
+ | `startEndOnly` | `boolean` | `false` | x 軸のラベルを最初と最後だけにする。 |
29
+ | `yAxisWidth` | `number` | | y 軸ラベルの幅(px)。縦に並べた複数のグラフでプロット領域を揃えたいときに固定する。 |
30
+ | `minValue` | `number` | | 値軸の下限。 |
31
+ | `maxValue` | `number` | | 値軸の上限。 |
32
+ | `autoMinValue` | `boolean` | `false` | 値軸を 0 からではなくデータの範囲に合わせる。 |
33
+ | `allowDecimals` | `boolean` | `true` | `false` で目盛りを整数に限る。 |
34
+ | `xAxisLabel` | `string` | | x 軸の名前。 |
35
+ | `yAxisLabel` | `string` | | y 軸の名前。 |
36
+ | `onValueChange` | `(value: ChartEventPayload) => void` | | 点のクリックで呼ばれる。クリックした行に `eventType` と `categoryClicked`(系列名)を足して渡し、同じ点をもう一度押すと `null`。渡すと選択以外が薄くなる。 |
37
+ | `height` | `string \| number` | | 高さ。数値は px。省略時は `h-80`(320px)。`className` の高さクラスでも決められる。 |
38
+ | `loading` | `boolean` | | ローディング表示を出す。 |
39
+ | `ariaLabel` | `string` | | チャートの説明(スクリーンリーダー向け)。 |
40
+ | `className` | `string` | | 足すクラス。 |
41
+
42
+ > [!NOTE]
43
+ > `colors` は Tailwind のクラスではなく**色の値**です(キャンバスに描くため)。`"chart-2"` のような
44
+ > トークン名ならライト / ダークに追従します。軸・凡例・ツールチップの色はいつもテーマから入ります。
45
+
46
+ ## 欠損のある系列
47
+
48
+ 値が `null`・空文字・数値でない文字列の点は欠損として扱い、線が途切れます。`connectNulls` を
49
+ 付けると欠損をまたいでつなぎます。
50
+
51
+ ```tsx
52
+ <LineChart data={rows} index="date" categories={["CVR"]} connectNulls valueFormatter={(v) => `${v}%`} />
53
+ ```
54
+
55
+ ## EChart との使い分け
56
+
57
+ まずこの型付きグラフで描き、二軸・散布図・ヒートマップ・注釈線など**この props で表せないもの
58
+ だけ** [`EChart`](parts/echart) に option を書いてください。
@@ -2,7 +2,8 @@
2
2
 
3
3
  > KPI の数値。単位は MetricUnit で。
4
4
 
5
- KPI の数値を大きく見せるための、字送りを詰めた表示です。単位や補助的な文字は `MetricUnit` で
5
+ KPI の数値を大きく見せるための、字送りを詰めた表示です。KPI のタイルを 1 枚作るなら、増減や前期実績まで
6
+ 出せる [`KpiCard`](parts/kpi-card) を先に検討してください。単位や補助的な文字は `MetricUnit` で
6
7
  添えます。
7
8
 
8
9
  ```tsx
@@ -20,6 +21,6 @@ import { MetricValue, MetricUnit, metricValueVariants } from "@squadbase/vantage
20
21
  ```tsx
21
22
  <DashboardCardPreset title="売上">
22
23
  <MetricValue className="my-0">¥1,240,000</MetricValue>
23
- <TrendIndicator value={12.4} direction="up" />
24
+ <Delta value={1_240_000} comparison={{ previous: 1_103_000, vs: "prior-period" }} />
24
25
  </DashboardCardPreset>
25
26
  ```
@@ -0,0 +1,34 @@
1
+ # ProgressCircle
2
+
3
+ > 目標に対する達成率をリングで示す。中央に任意の内容を置ける。
4
+
5
+ `value / max` の割合だけリングを塗ります。children は中央に置かれるので、達成率の数値や
6
+ アイコンを入れます。単一の `<svg>` で、KPI タイルに並べても軽いままです。
7
+
8
+ ```tsx
9
+ import { ProgressCircle } from "@squadbase/vantage/components";
10
+ import type { ChartColor } from "@squadbase/vantage/components";
11
+ ```
12
+
13
+ | Prop | Type | Default | 説明 |
14
+ | --- | --- | --- | --- |
15
+ | `value` | `number` | `0` | 現在値。`0`〜`max` に丸める。 |
16
+ | `max` | `number` | `100` | 満タンの値。 |
17
+ | `radius` | `number` | `32` | 外側の半径(px)。全体は `radius * 2` 四方。 |
18
+ | `strokeWidth` | `number` | `6` | 線の太さ(px)。 |
19
+ | `color` | `ChartColor` | `"chart-1"` | `"chart-1"`〜`"chart-5"` か CSS カラー。地のリングは同じ色を淡くしたもの。 |
20
+ | `showAnimation` | `boolean` | `true` | マウント時と値の変化をアニメーションする。 |
21
+ | `children` | `ReactNode` | | 中央に置く内容(例: `72%`)。 |
22
+ | `className` | `string` | | 足すクラス。 |
23
+
24
+ 残りの props は外側の `<div>` にそのまま渡ります。`role="progressbar"` と `aria-valuenow` が付きます。
25
+
26
+ ## 値の書式は呼び出し側で
27
+
28
+ 中央の表示は children そのものです。割合ではなく実数を見せたいときも、そのまま書いてください。
29
+
30
+ ```tsx
31
+ <ProgressCircle value={3_400_000} max={5_000_000} radius={40} strokeWidth={8}>
32
+ <span className="text-xs">340万</span>
33
+ </ProgressCircle>
34
+ ```
@@ -38,10 +38,10 @@ import type { SparklineDataPoint, SparklineVariant } from "@squadbase/vantage/co
38
38
 
39
39
  ## EChart との使い分け
40
40
 
41
- 軸・凡例・ツールチップ・複数系列が要るなら [`EChart`](parts/echart) を使います。
41
+ 軸・凡例・ツールチップ・複数系列が要るなら、まず型付きグラフ([`LineChart`](parts/line-chart)・[`AreaChart`](parts/area-chart)・[`BarChart`](parts/bar-chart))を使い、細かい制御が要るときだけ [`EChart`](parts/echart) を使います。
42
42
  `Sparkline` が持つのは「値の並びの形」だけで、**目盛りも数値も出しません**。
43
43
 
44
44
  > [!NOTE]
45
45
  > `aria-hidden="true"` が付いているため、スクリーンリーダーには読まれません。実際の数値は
46
46
  > [`MetricValue`](parts/metric-value) や
47
- > [`TrendIndicator`](parts/trend-indicator) など、テキストとして隣に置いてください。
47
+ > [`Delta`](parts/delta) など、テキストとして隣に置いてください。