@squadbase/vantage 0.6.1 → 0.6.2-dev1.1c9e8bc

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 (237) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-O5TVNH4E.js → build-X5NVCQKT.js} +9 -9
  4. package/dist/{build-O5TVNH4E.js.map → build-X5NVCQKT.js.map} +1 -1
  5. package/dist/{check-WFBEDHDR.js → check-ZBIH422T.js} +7 -7
  6. package/dist/{check-WFBEDHDR.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-BCE22JSM.js → chunk-7DZGJQ3P.js} +33 -14
  12. package/dist/chunk-7DZGJQ3P.js.map +1 -0
  13. package/dist/{chunk-MXI3PZFT.js → chunk-7S52M2SL.js} +257 -210
  14. package/dist/chunk-7S52M2SL.js.map +1 -0
  15. package/dist/{chunk-QDZA5JSL.js → chunk-AABMKHEU.js} +4 -4
  16. package/dist/{chunk-QDZA5JSL.js.map → chunk-AABMKHEU.js.map} +1 -1
  17. package/dist/{chunk-KLEIVDUV.js → chunk-CEXAQQ5W.js} +150 -11
  18. package/dist/chunk-CEXAQQ5W.js.map +1 -0
  19. package/dist/{chunk-3G43C6OL.js → chunk-GNXCX4WE.js} +46 -3
  20. package/dist/chunk-GNXCX4WE.js.map +1 -0
  21. package/dist/chunk-IUPSBD6W.js +7914 -0
  22. package/dist/chunk-IUPSBD6W.js.map +1 -0
  23. package/dist/{chunk-JGRMRXXZ.js → chunk-JKLLFVEU.js} +3 -3
  24. package/dist/{chunk-JGRMRXXZ.js.map → chunk-JKLLFVEU.js.map} +1 -1
  25. package/dist/chunk-PDOBHMUQ.js +54 -0
  26. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  27. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  28. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  29. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  30. package/dist/chunk-U736PVHY.js.map +1 -0
  31. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  32. package/dist/chunk-V3LF7BE7.js.map +1 -0
  33. package/dist/{chunk-EP6JHXSR.js → chunk-WAMZWZJB.js} +54 -9
  34. package/dist/chunk-WAMZWZJB.js.map +1 -0
  35. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  36. package/dist/chunk-XQUSGIDG.js.map +1 -0
  37. package/dist/cli.js +15 -11
  38. package/dist/cli.js.map +1 -1
  39. package/dist/client/index.d.ts +32 -3
  40. package/dist/client/index.js +205 -12
  41. package/dist/client/index.js.map +1 -1
  42. package/dist/components/index.d.ts +1983 -29
  43. package/dist/components/index.js +4 -3
  44. package/dist/{dev-NZRLOQCL.js → dev-4XEDTELV.js} +24 -13
  45. package/dist/dev-4XEDTELV.js.map +1 -0
  46. package/dist/doc/index.d.ts +4 -0
  47. package/dist/doc/index.js +107 -11
  48. package/dist/doc/index.js.map +1 -1
  49. package/dist/{docs-ZGDJUHJI.js → docs-JVP4RPKT.js} +3 -3
  50. package/dist/{docs-ZGDJUHJI.js.map → docs-JVP4RPKT.js.map} +1 -1
  51. package/dist/{doctor-VFKEMR54.js → doctor-5E2VEZPK.js} +8 -8
  52. package/dist/doctor-5E2VEZPK.js.map +1 -0
  53. package/dist/markdown/index.js +1 -1
  54. package/dist/markdown/index.js.map +1 -1
  55. package/dist/{preview-QDCIVVSR.js → preview-T6CLSQVX.js} +12 -4
  56. package/dist/preview-T6CLSQVX.js.map +1 -0
  57. package/dist/query/index.d.ts +0 -11
  58. package/dist/query/index.js +2 -2
  59. package/dist/{routes-RHP5FVGD.js → routes-3SGAFDMC.js} +6 -6
  60. package/dist/{routes-RHP5FVGD.js.map → routes-3SGAFDMC.js.map} +1 -1
  61. package/dist/{search-RFBELGY7.js → search-5LC4XPB5.js} +3 -3
  62. package/dist/{search-RFBELGY7.js.map → search-5LC4XPB5.js.map} +1 -1
  63. package/dist/slide/index.js +63 -17
  64. package/dist/slide/index.js.map +1 -1
  65. package/dist/table/index.js +11 -9
  66. package/dist/table/index.js.map +1 -1
  67. package/dist/ui/index.d.ts +148 -12
  68. package/dist/ui/index.js +1340 -87
  69. package/dist/ui/index.js.map +1 -1
  70. package/dist/{upgrade-GF2P67M6.js → upgrade-JHXZBGQS.js} +7 -7
  71. package/dist/{upgrade-GF2P67M6.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  72. package/dist/vite/index.d.ts +10 -0
  73. package/dist/vite/index.js +4 -4
  74. package/docs/en/changelog.md +24 -0
  75. package/docs/en/cli-reference.md +30 -0
  76. package/docs/en/components.md +29 -15
  77. package/docs/en/parts/data-table.md +22 -0
  78. package/docs/en/parts/delta.md +50 -0
  79. package/docs/en/parts/format.md +43 -0
  80. package/docs/en/parts/kpi-card.md +57 -0
  81. package/docs/en/parts/metric-value.md +3 -2
  82. package/docs/en/parts/page-shell.md +1 -1
  83. package/docs/en/parts/sparkline.md +1 -1
  84. package/docs/en/parts/trend-indicator.md +17 -1
  85. package/docs/en/routing.md +4 -2
  86. package/docs/en/ui-and-theming.md +1 -1
  87. package/docs/index.json +366 -76
  88. package/docs/ja/changelog.md +55 -0
  89. package/docs/ja/cli-reference.md +29 -0
  90. package/docs/ja/components.md +57 -101
  91. package/docs/ja/page-types/csv.md +83 -0
  92. package/docs/ja/page-types/doc.md +83 -0
  93. package/docs/ja/page-types/excel.md +82 -0
  94. package/docs/ja/page-types/slide.md +132 -0
  95. package/docs/ja/page-types.md +47 -0
  96. package/docs/ja/parts/area-chart.md +61 -0
  97. package/docs/ja/parts/bar-chart.md +69 -0
  98. package/docs/ja/parts/bar-list.md +35 -0
  99. package/docs/ja/parts/category-bar.md +36 -0
  100. package/docs/ja/parts/data-table.md +22 -0
  101. package/docs/ja/parts/delta.md +50 -0
  102. package/docs/ja/parts/donut-chart.md +47 -0
  103. package/docs/ja/parts/echart.md +3 -0
  104. package/docs/ja/parts/format.md +44 -0
  105. package/docs/ja/parts/kpi-card.md +55 -0
  106. package/docs/ja/parts/line-chart.md +58 -0
  107. package/docs/ja/parts/metric-value.md +3 -2
  108. package/docs/ja/parts/page-shell.md +1 -1
  109. package/docs/ja/parts/progress-circle.md +34 -0
  110. package/docs/ja/parts/sparkline.md +2 -2
  111. package/docs/ja/parts/tracker.md +32 -0
  112. package/docs/ja/parts/trend-indicator.md +17 -1
  113. package/docs/ja/routing.md +8 -84
  114. package/docs/ja/ui/alert-dialog.md +41 -0
  115. package/docs/ja/ui/avatar.md +31 -0
  116. package/docs/ja/ui/combobox.md +74 -0
  117. package/docs/ja/ui/drawer.md +41 -0
  118. package/docs/ja/ui/field.md +42 -0
  119. package/docs/ja/ui/hover-card.md +21 -0
  120. package/docs/ja/ui/kbd.md +16 -0
  121. package/docs/ja/ui/pagination.md +36 -0
  122. package/docs/ja/ui/radio-group.md +21 -0
  123. package/docs/ja/ui/toast.md +46 -0
  124. package/docs/ja/ui-and-theming.md +14 -7
  125. package/package.json +43 -29
  126. package/registry/ui/accordion.tsx +76 -0
  127. package/registry/ui/alert-dialog.tsx +189 -0
  128. package/registry/ui/alert.tsx +80 -0
  129. package/registry/ui/app-shell.tsx +287 -0
  130. package/registry/ui/area-chart.tsx +3701 -0
  131. package/registry/ui/attention-list.tsx +303 -0
  132. package/registry/ui/avatar.tsx +110 -0
  133. package/registry/ui/badge.tsx +56 -0
  134. package/registry/ui/bar-chart.tsx +3698 -0
  135. package/registry/ui/bar-list.tsx +3743 -0
  136. package/registry/ui/box-plot-chart.tsx +3906 -0
  137. package/registry/ui/breadcrumb.tsx +128 -0
  138. package/registry/ui/button.tsx +62 -0
  139. package/registry/ui/calendar.tsx +223 -0
  140. package/registry/ui/card.tsx +107 -0
  141. package/registry/ui/category-bar.tsx +1290 -0
  142. package/registry/ui/chart-frame.tsx +1393 -0
  143. package/registry/ui/checkbox.tsx +30 -0
  144. package/registry/ui/collapsible.tsx +23 -0
  145. package/registry/ui/combobox.tsx +310 -0
  146. package/registry/ui/command.tsx +198 -0
  147. package/registry/ui/dashboard-card.tsx +217 -0
  148. package/registry/ui/data-table.tsx +693 -146
  149. package/registry/ui/date-range-picker.tsx +390 -0
  150. package/registry/ui/delta.tsx +188 -0
  151. package/registry/ui/dialog.tsx +161 -0
  152. package/registry/ui/donut-chart.tsx +3751 -0
  153. package/registry/ui/drawer.tsx +229 -0
  154. package/registry/ui/dropdown-menu.tsx +274 -0
  155. package/registry/ui/echart.tsx +918 -0
  156. package/registry/ui/field.tsx +240 -0
  157. package/registry/ui/filter-bar.tsx +392 -0
  158. package/registry/ui/funnel-steps.tsx +3569 -0
  159. package/registry/ui/heatmap.tsx +1786 -0
  160. package/registry/ui/histogram-chart.tsx +3986 -0
  161. package/registry/ui/hover-card.tsx +52 -0
  162. package/registry/ui/input-group.tsx +160 -0
  163. package/registry/ui/input.tsx +24 -0
  164. package/registry/ui/kbd.tsx +30 -0
  165. package/registry/ui/kpi-card.tsx +699 -0
  166. package/registry/ui/label.tsx +22 -0
  167. package/registry/ui/legend.tsx +3563 -0
  168. package/registry/ui/line-chart.tsx +3699 -0
  169. package/registry/ui/metric-value.tsx +62 -0
  170. package/registry/ui/multi-select.tsx +232 -0
  171. package/registry/ui/page-shell.tsx +282 -0
  172. package/registry/ui/pagination.tsx +140 -0
  173. package/registry/ui/paired-chart.tsx +3827 -0
  174. package/registry/ui/placeholder.tsx +36 -0
  175. package/registry/ui/popover.tsx +92 -0
  176. package/registry/ui/progress-circle.tsx +867 -0
  177. package/registry/ui/progress.tsx +85 -0
  178. package/registry/ui/radio-group.tsx +39 -0
  179. package/registry/ui/sample-data.tsx +86 -0
  180. package/registry/ui/scatter-chart.tsx +4212 -0
  181. package/registry/ui/scroll-area.tsx +56 -0
  182. package/registry/ui/searchable-select.tsx +214 -0
  183. package/registry/ui/section-header.tsx +43 -0
  184. package/registry/ui/segmented-control.tsx +76 -0
  185. package/registry/ui/select.tsx +255 -0
  186. package/registry/ui/separator.tsx +27 -0
  187. package/registry/ui/sheet.tsx +139 -0
  188. package/registry/ui/sidebar.tsx +725 -0
  189. package/registry/ui/skeleton.tsx +17 -0
  190. package/registry/ui/slider.tsx +56 -0
  191. package/registry/ui/sparkline.tsx +230 -0
  192. package/registry/ui/spinner.tsx +14 -0
  193. package/registry/ui/states.tsx +90 -0
  194. package/registry/ui/status-badge.tsx +121 -0
  195. package/registry/ui/switch.tsx +34 -0
  196. package/registry/ui/table.tsx +118 -0
  197. package/registry/ui/tabs.tsx +84 -0
  198. package/registry/ui/textarea.tsx +22 -0
  199. package/registry/ui/toast.tsx +250 -0
  200. package/registry/ui/toggle-group.tsx +91 -0
  201. package/registry/ui/toggle.tsx +47 -0
  202. package/registry/ui/tooltip.tsx +72 -0
  203. package/registry/ui/tracker.tsx +849 -0
  204. package/registry/ui/trend-indicator.tsx +74 -0
  205. package/registry/ui/updated-at.tsx +122 -0
  206. package/registry/ui/waterfall-chart.tsx +4248 -0
  207. package/skills/vantage-add-feature/SKILL.md +9 -7
  208. package/skills/vantage-design/SKILL.md +12 -2
  209. package/skills/vantage-design/references/format.md +1 -1
  210. package/skills/vantage-pitfalls/SKILL.md +5 -1
  211. package/skills/vantage-slide/SKILL.md +17 -0
  212. package/templates/AGENTS.md +22 -1
  213. package/templates/agents/api.md +29 -0
  214. package/templates/agents/csv.md +2 -1
  215. package/templates/agents/doc.md +6 -3
  216. package/templates/agents/page.md +32 -8
  217. package/templates/agents/slide.md +13 -1
  218. package/templates/agents/xlsx.md +2 -1
  219. package/theme.css +284 -128
  220. package/dist/add-EISGSZAH.js +0 -6
  221. package/dist/add-EISGSZAH.js.map +0 -1
  222. package/dist/chunk-3G43C6OL.js.map +0 -1
  223. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  224. package/dist/chunk-A2UUGASH.js.map +0 -1
  225. package/dist/chunk-BCE22JSM.js.map +0 -1
  226. package/dist/chunk-DTDVSFRY.js.map +0 -1
  227. package/dist/chunk-EP6JHXSR.js.map +0 -1
  228. package/dist/chunk-KLEIVDUV.js.map +0 -1
  229. package/dist/chunk-MXI3PZFT.js.map +0 -1
  230. package/dist/chunk-PLST5Q7T.js +0 -2221
  231. package/dist/chunk-PLST5Q7T.js.map +0 -1
  232. package/dist/chunk-PVTHHV7X.js.map +0 -1
  233. package/dist/chunk-T3FLAGI6.js +0 -316
  234. package/dist/chunk-T3FLAGI6.js.map +0 -1
  235. package/dist/dev-NZRLOQCL.js.map +0 -1
  236. package/dist/doctor-VFKEMR54.js.map +0 -1
  237. package/dist/preview-QDCIVVSR.js.map +0 -1
@@ -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
  ```
@@ -27,7 +27,7 @@ import {
27
27
  | パーツ | 役割 |
28
28
  | --- | --- |
29
29
  | `PageShell` | 全体の縦積み |
30
- | `PageShellHeader` | 下線付きのヘッダー帯。左に見出し、右に `HeaderEnd` の 2 列 |
30
+ | `PageShellHeader` | 下線付きのヘッダー帯。左に見出し、右に `HeaderEnd`。幅が足りないと `HeaderEnd` は見出しの下へ回り込む |
31
31
  | `PageShellHeading` / `PageShellTitle` / `PageShellDescription` | 見出しブロック |
32
32
  | `PageShellHeaderEnd` | 右端の縦積み |
33
33
  | `PageShellMeta` | 「最終更新 10 分前」のような補足 |
@@ -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) など、テキストとして隣に置いてください。
@@ -0,0 +1,32 @@
1
+ # Tracker
2
+
3
+ > 期間ごとの状態を小さなブロックの列で示す。稼働状況やバッチの結果に。
4
+
5
+ 1 期間 = 1 ブロックで状態を色分けして並べます。日ごとの稼働状況・バッチの成否・日次目標の
6
+ 達成 / 未達のような**連続した状態**に向きます。ブロックにホバーすると `tooltip` が出ます。
7
+ ECharts を使わない HTML で、配色はテーマに追従します。
8
+
9
+ ```tsx
10
+ import { Tracker } from "@squadbase/vantage/components";
11
+ import type { TrackerBlock, ChartColor } from "@squadbase/vantage/components";
12
+ ```
13
+
14
+ | Prop | Type | Default | 説明 |
15
+ | --- | --- | --- | --- |
16
+ | `data` | `TrackerBlock[]` | | `{ color?: ChartColor; tooltip?: string; key?: string \| number }` の配列。**必須**。左から古い順。 |
17
+ | `defaultColor` | `ChartColor` | | `color` の無いブロックの色。既定は muted-foreground を淡くした灰色(データ無し・未実行に)。 |
18
+ | `hoverEffect` | `boolean` | `true` | ホバー中のブロックを薄くする。 |
19
+ | `className` | `string` | | 足すクラス。高さは既定 `h-8`。 |
20
+
21
+ 残りの props は外側の `<div>` にそのまま渡ります。
22
+
23
+ ## 状態に色を割り当てる
24
+
25
+ `color` はトークン名か CSS カラーです。失敗に `var(--destructive)` を使うと、テーマの
26
+ 破壊的操作の色と揃います。
27
+
28
+ ```tsx
29
+ const COLOR = { ok: "chart-2", warn: "chart-3", error: "var(--destructive)" } as const;
30
+
31
+ <Tracker data={days.map((d) => ({ color: COLOR[d.status], tooltip: `${d.date} ${d.label}` }))} />
32
+ ```
@@ -1,6 +1,22 @@
1
1
  # TrendIndicator
2
2
 
3
- > 増減の矢印と変化率。良し悪しは positiveIsGood で決まる。
3
+ > 非推奨。新規は Delta を使う。増減の矢印と変化率。
4
+
5
+ > [!WARNING]
6
+ > **非推奨です。新規のコードでは [`Delta`](parts/delta) を使ってください。**
7
+ > `TrendIndicator` は向き(`direction`)と色を手で渡すため、値と矢印が食い違うことがあります。`Delta` は今期と
8
+ > 比較相手の値から向き・率・色・ラベルを計算します。KPI をカードで見せるなら
9
+ > [`KpiCard`](parts/kpi-card) を使います。
10
+
11
+ ```tsx
12
+ // 旧
13
+ <TrendIndicator value={12.4} direction="up" />
14
+ <TrendIndicator value={0.4} direction="down" positiveIsGood={false} />
15
+
16
+ // 新
17
+ <Delta value={1_240_000} comparison={{ previous: 1_103_000, vs: "prior-period" }} />
18
+ <Delta value={0.021} comparison={{ previous: 0.026, vs: "prior-period" }} polarity="lower-is-better" />
19
+ ```
4
20
 
5
21
  前期比などの変化を、矢印と変化率で示します。**「上がった=良い」とは限らない**ので、色は
6
22
  `direction` と `positiveIsGood` の組み合わせで決まります — 解約率のように下がる方が良い指標では
@@ -1,6 +1,6 @@
1
1
  # ファイルベースルーティング
2
2
 
3
- > ファイルを置くだけでルートが生まれる。ページ・レイアウト・動的パラメータ・404/error の規約と、tsx 以外のページ(csv / xlsx / スライド / ドキュメント)。
3
+ > ファイルを置くだけでルートが生まれる。ページ・レイアウト・動的パラメータ・404/error の規約。
4
4
 
5
5
  Vantage のルーティングは **ファイルの配置がそのまま URL** になります。ルーターの設定は書きません。
6
6
 
@@ -46,90 +46,13 @@ Vantage のルーティングは **ファイルの配置がそのまま URL**
46
46
 
47
47
  ## tsx 以外もページになる
48
48
 
49
- ルートになるのは `.tsx` / `.jsx` だけではありません。**`.csv` と `.xlsx`** はそのまま表として
50
- 読めるページになり、**`<name>.slide.tsx`** はスライドデッキに、**`<name>.doc.tsx`** はドキュメントになります。どれも URL の作り方は
51
- tsx と同じで、`vantage routes` にも `useRoutes()` のナビにも同格で並びます。
49
+ ルートになるのは `.tsx` / `.jsx` だけではありません。**`<name>.slide.tsx`** はスライドデッキに、
50
+ **`<name>.doc.tsx`** はドキュメントに、**`.csv` と `.xlsx`** はそのまま表として読めるページに
51
+ なります。どれも URL の作り方は tsx と同じで、`.slide` / `.doc` と拡張子は URL に出ません
52
+ (`june.slide.tsx`・`june.csv` → `/june`)。`vantage routes` にも `useRoutes()` のナビにも同格で並びます。
52
53
 
53
- ### データファイル(`.csv` / `.xlsx`)
54
-
55
- `src/data/june.xlsx` を置いて `/data/june` を開くと、ダウンロードせずブラウザ上で表として
56
- 読めます。xlsx は複数シートを切り替えられ、元ファイルをダウンロードする導線も付きます。
57
-
58
- 描かれるのは**表計算ソフトそのものの見た目**です —— 列は A / B / C、左に行番号、ファイルの
59
- 1 行目はヘッダとして固定され、罫線はデータの外まで続きます。シートのタブは下端に並びます。
60
- 読み取り専用なので編集もソートもできません(セルを選んで `Cmd/Ctrl+C` でコピーはできます)。
61
- 並べ替えや絞り込みが要るデータは、`server/api/` から配って `DataTable` で描いてください。
62
-
63
- - **タイトルはファイル名から導かれます**(`june.xlsx` → 「June」、`index.csv` はディレクトリ名)。
64
- データファイルに `definePage` は書けないので、名前を変えたいときはファイルをリネームします。
65
- - **パースはブラウザで行われます。** dev・ビルド後・デプロイ後で同じコードが同じバイトを読むので、
66
- 同じ URL が同じものを返します。25MB を超えるファイルはそのページにエラーが出ます
67
- (`vantage check` が `FILE_PAGE_TOO_LARGE` で先に警告します)。
68
- - 数式・グラフ・セル書式は再現されません。**値として読めれば十分**という設計です。
69
- - ページにしたくないファイルは `_` を前置します(`_june.xlsx`)。tsx から自分で描きたいときは
70
- こうしてルート化を止め、`@squadbase/vantage/table` の `FilePageView` を使います。
71
-
72
- > [!WARNING]
73
- > **ビューアの無い拡張子はルートになりません。** `.xls` / `.ods` / `.tsv` などを置いても
74
- > 404 にすらならず、ナビにも `vantage routes` にも出ません。`vantage check` の
75
- > `UNSUPPORTED_PAGE_FILE` 警告が唯一の告知点です。
76
-
77
- ### スライド(`.slide.tsx`)
78
-
79
- `.slide` は**ページ種別サフィックス**で、URL には出ません(`src/june.slide.tsx` → `/june`)。
80
- 中身は `<SlideDeck>` を返す普通の React コンポーネントなので、`definePage` もナビも
81
- 通常のページと同じように効きます。
82
-
83
- ```tsx
84
- import { definePage } from "@squadbase/vantage";
85
- import { Slide, SlideDeck } from "@squadbase/vantage/slide";
86
-
87
- export const page = definePage({ title: "6月度レビュー", navLabel: "6月度" });
88
-
89
- export default function Deck() {
90
- return (
91
- <SlideDeck>
92
- <Slide>…</Slide>
93
- <Slide>…</Slide>
94
- </SlideDeck>
95
- );
96
- }
97
- ```
98
-
99
- 1920×1080 の固定キャンバスに書き、画面サイズに合わせて縮小されます。キーボードとクリックで
100
- 送れ、左のスライド一覧は `L` で開閉、`F` で全画面、ツールバーから pptx を書き出せます。詳しくは
101
- [UI とテーマ](ui-and-theming)。
102
-
103
- > [!WARNING]
104
- > `.slide` を付けられるのは**ルートになるページモジュールだけ**です。`_layout.slide.tsx` や
105
- > `deck.slide.ts` は `INVALID_PAGE_VARIANT` エラーになります。また `june.slide.tsx` と
106
- > `june.tsx`、`sales.csv` と `sales.tsx` はいずれも同じ URL に解決するので `ROUTE_CONFLICT` です。
107
-
108
- ### ドキュメント(`.doc.tsx`)
109
-
110
- `.doc` も**ページ種別サフィックス**です(`src/june-summary.doc.tsx` → `/june-summary`)。上から下へ
111
- 読む文章のページで、中身は `<Document>` を返す普通の React コンポーネントです。
112
-
113
- ```tsx
114
- import { definePage } from "@squadbase/vantage";
115
- import { Document } from "@squadbase/vantage/doc";
116
-
117
- export const page = definePage({ title: "6月度サマリー" });
118
-
119
- export default function JuneSummary() {
120
- return (
121
- <Document>
122
- <h1>6月度サマリー</h1>
123
- <p>6月の売上は目標を 5% 上回りました。</p>
124
- <table>…</table>
125
- </Document>
126
- );
127
- }
128
- ```
129
-
130
- `<Document>` の中の見出し・段落・リスト・表・引用・コードには、クラスを書かなくてもスタイルが
131
- 当たります。詳しくは [UI とテーマ](ui-and-theming)。`.slide` と同じく、`.doc` を付けられるのは
132
- ルートになるページモジュールだけです。
54
+ それぞれの書き方・できること・制限、そして**置いてもページにならないファイル**(`.xls`・`.tsv`・
55
+ `.md` など)は [ページの種類](page-types) にまとめてあります。
133
56
 
134
57
  ## ルーティングされないディレクトリ
135
58
 
@@ -289,3 +212,4 @@ setSegments((prev) => [...prev, "enterprise"]);
289
212
  ## 次に読む
290
213
 
291
214
  - [ページと definePage](pages-and-metadata) — ページの契約とメタデータ
215
+ - [ページの種類](page-types) — スライド・ドキュメント・CSV・Excel
@@ -0,0 +1,41 @@
1
+ # Alert Dialog
2
+
3
+ > 取り消せない操作の前に確認するモーダル。
4
+
5
+ 削除など取り消せない操作の前に、ユーザーの明示的な返答を求めるモーダルです。
6
+ [`Dialog`](ui/dialog) と違い、背景のクリックでは閉じません。
7
+
8
+ ```tsx
9
+ import {
10
+ AlertDialog,
11
+ AlertDialogTrigger,
12
+ AlertDialogContent,
13
+ AlertDialogHeader,
14
+ AlertDialogMedia,
15
+ AlertDialogTitle,
16
+ AlertDialogDescription,
17
+ AlertDialogFooter,
18
+ AlertDialogCancel,
19
+ AlertDialogAction,
20
+ } from "@squadbase/vantage/ui";
21
+ ```
22
+
23
+ ## パーツ
24
+
25
+ | パーツ | 役割 |
26
+ | --- | --- |
27
+ | `AlertDialog` | 状態。`open` / `defaultOpen` / `onOpenChange` |
28
+ | `AlertDialogTrigger` | 開くきっかけ。`render` でボタンにする |
29
+ | `AlertDialogContent` | 本体。`size` で幅を選ぶ |
30
+ | `AlertDialogMedia` | 見出し横のアイコン枠 |
31
+ | `AlertDialogHeader` / `AlertDialogTitle` / `AlertDialogDescription` | 見出し |
32
+ | `AlertDialogFooter` | ボタン行 |
33
+ | `AlertDialogCancel` | 閉じるボタン(既定 `variant="outline"`) |
34
+ | `AlertDialogAction` | 実行ボタン。`Button` の props をそのまま取る |
35
+
36
+ | Prop | Type | Default | 説明 |
37
+ | --- | --- | --- | --- |
38
+ | `size` | `"default" \| "sm"` | `"default"` | `AlertDialogContent` に渡す。`sm` はボタンを 2 列に並べる。 |
39
+
40
+ `AlertDialogAction` は**押しても自動では閉じません**。処理が終わったら `open` を `false` に
41
+ するか、閉じてよいなら `AlertDialogCancel` と同じく `render` で包んでください。
@@ -0,0 +1,31 @@
1
+ # Avatar
2
+
3
+ > ユーザーの顔写真またはイニシャル。
4
+
5
+ ユーザーやオーナーを小さな丸で示します。画像が読み込めないとき・`src` が無いときは
6
+ `AvatarFallback` の中身(イニシャルなど)を出します。
7
+
8
+ ```tsx
9
+ import {
10
+ Avatar,
11
+ AvatarImage,
12
+ AvatarFallback,
13
+ AvatarBadge,
14
+ AvatarGroup,
15
+ AvatarGroupCount,
16
+ } from "@squadbase/vantage/ui";
17
+ ```
18
+
19
+ ## パーツ
20
+
21
+ | パーツ | 役割 |
22
+ | --- | --- |
23
+ | `Avatar` | 外枠。`size` で大きさを選ぶ |
24
+ | `AvatarImage` | 画像。読み込みに失敗すると描画されない |
25
+ | `AvatarFallback` | 画像が無いときの中身 |
26
+ | `AvatarBadge` | 右下の小さな丸(オンライン表示など) |
27
+ | `AvatarGroup` / `AvatarGroupCount` | 重ねて並べる。`AvatarGroupCount` は「+4」などの残数 |
28
+
29
+ | Prop | Type | Default | 説明 |
30
+ | --- | --- | --- | --- |
31
+ | `size` | `"default" \| "sm" \| "lg"` | `"default"` | `Avatar` に渡す。`sm` は 24px、`default` は 32px、`lg` は 40px。 |
@@ -0,0 +1,74 @@
1
+ # Combobox
2
+
3
+ > 入力して候補を絞り込むセレクト。
4
+
5
+ テキストを打って候補を絞り込み、1 つ(または複数)を選ぶ入力です。候補が数件なら
6
+ [`Select`](ui/select) のほうが手数が少なくて済みます。Base UI の `Combobox` の上に
7
+ 作っています。
8
+
9
+ ```tsx
10
+ import {
11
+ Combobox,
12
+ ComboboxInput,
13
+ ComboboxContent,
14
+ ComboboxEmpty,
15
+ ComboboxList,
16
+ ComboboxItem,
17
+ ComboboxGroup,
18
+ ComboboxLabel,
19
+ ComboboxCollection,
20
+ ComboboxSeparator,
21
+ ComboboxChips,
22
+ ComboboxChip,
23
+ ComboboxChipsInput,
24
+ ComboboxTrigger,
25
+ ComboboxValue,
26
+ useComboboxAnchor,
27
+ } from "@squadbase/vantage/ui";
28
+ ```
29
+
30
+ ## パーツ
31
+
32
+ | パーツ | 役割 |
33
+ | --- | --- |
34
+ | `Combobox` | 状態。`items` / `value` / `defaultValue` / `onValueChange` / `multiple` |
35
+ | `ComboboxInput` | 入力欄。`showTrigger`(既定 `true`)/ `showClear` で右端のボタンを出す |
36
+ | `ComboboxContent` | 候補のポップアップ。`side` / `align` / `anchor` |
37
+ | `ComboboxList` | 候補の並び。子に関数を渡すと、絞り込み後の `items` が 1 件ずつ渡る |
38
+ | `ComboboxItem` | 1 候補。`value` は必須 |
39
+ | `ComboboxEmpty` | 一致する候補が無いときの表示 |
40
+ | `ComboboxGroup` / `ComboboxLabel` / `ComboboxCollection` / `ComboboxSeparator` | グループ分け |
41
+ | `ComboboxChips` / `ComboboxChip` / `ComboboxChipsInput` | 複数選択をチップで見せる |
42
+ | `ComboboxTrigger` / `ComboboxValue` | 入力欄を使わずボタンで開く形 |
43
+ | `useComboboxAnchor` | チップ枠をポップアップの基準にするための ref |
44
+
45
+ | Prop | Type | Default | 説明 |
46
+ | --- | --- | --- | --- |
47
+ | `items` | `readonly unknown[]` | | `Combobox` に渡す候補。入力に応じて絞り込まれ、`ComboboxList` の関数に渡る。 |
48
+ | `multiple` | `boolean` | `false` | 複数選択にする。 |
49
+ | `onValueChange` | `(value) => void` | | 選択が変わったとき。単一選択では未選択の `null` も渡りうる。 |
50
+
51
+ ## 複数選択
52
+
53
+ `multiple` を付け、`ComboboxChips` の中にチップと `ComboboxChipsInput` を置きます。ポップアップを
54
+ チップ枠の幅に合わせるには `useComboboxAnchor()` の ref を両方に渡します。
55
+
56
+ ```tsx
57
+ const anchor = useComboboxAnchor();
58
+
59
+ <Combobox items={metrics} multiple>
60
+ <ComboboxChips ref={anchor}>
61
+ <ComboboxValue>
62
+ {(values: string[]) =>
63
+ values.map((v) => <ComboboxChip key={v}>{v}</ComboboxChip>)
64
+ }
65
+ </ComboboxValue>
66
+ <ComboboxChipsInput placeholder="指標を追加" />
67
+ </ComboboxChips>
68
+ <ComboboxContent anchor={anchor}>
69
+ <ComboboxList>
70
+ {(item: string) => <ComboboxItem key={item} value={item}>{item}</ComboboxItem>}
71
+ </ComboboxList>
72
+ </ComboboxContent>
73
+ </Combobox>;
74
+ ```
@@ -0,0 +1,41 @@
1
+ # Drawer
2
+
3
+ > 画面の端からスワイプで出し入れするパネル。
4
+
5
+ 画面の下(または上下左右)から出てくるパネルです。スワイプで閉じられるので、モバイルでの
6
+ 詳細表示やアクション一覧に向いています。デスクトップで広い面積のフォームを出すなら
7
+ [`Sheet`](ui/sheet) が素直です。Base UI の `Drawer` の上に作っています。
8
+
9
+ ```tsx
10
+ import {
11
+ Drawer,
12
+ DrawerTrigger,
13
+ DrawerContent,
14
+ DrawerHeader,
15
+ DrawerTitle,
16
+ DrawerDescription,
17
+ DrawerFooter,
18
+ DrawerClose,
19
+ } from "@squadbase/vantage/ui";
20
+ ```
21
+
22
+ ## パーツ
23
+
24
+ | パーツ | 役割 |
25
+ | --- | --- |
26
+ | `Drawer` | 状態。`open` / `defaultOpen` / `onOpenChange`、向き、スナップポイント |
27
+ | `DrawerTrigger` | 開くきっかけ。`render` でボタンにする |
28
+ | `DrawerContent` | 本体。オーバーレイとポータルを内包する |
29
+ | `DrawerHeader` / `DrawerTitle` / `DrawerDescription` | 見出し |
30
+ | `DrawerFooter` | ボタン行 |
31
+ | `DrawerClose` | 閉じるトリガー |
32
+
33
+ | Prop | Type | Default | 説明 |
34
+ | --- | --- | --- | --- |
35
+ | `swipeDirection` | `"down" \| "up" \| "left" \| "right"` | `"down"` | `Drawer` に渡す。閉じるときにスワイプする向き(= 出てくる端)。 |
36
+ | `showSwipeHandle` | `boolean` | `false` | `Drawer` に渡す。つまみ(ハンドル)を表示する。 |
37
+ | `snapPoints` | `(number \| string)[]` | | `Drawer` に渡す。途中で止まる高さ(`0.5` や `"20rem"`)。 |
38
+ | `modal` | `boolean` | `true` | `Drawer` に渡す。`false` で背景を操作可能にし、オーバーレイを出さない。 |
39
+
40
+ `DrawerTitle` は支援技術のために必須です。見せたくない場合も置いた上で `className="sr-only"` に
41
+ してください。
@@ -0,0 +1,42 @@
1
+ # Field
2
+
3
+ > ラベル・説明・エラーを入力と束ねるフォームのレイアウト部品。
4
+
5
+ 入力 1 つぶんのラベル・補足説明・エラーメッセージを、決まった間隔と向きで並べる部品です。
6
+ 入力そのものは [`Input`](ui/input) や [`Switch`](ui/switch) などを
7
+ 中に置きます。
8
+
9
+ ```tsx
10
+ import {
11
+ Field,
12
+ FieldLabel,
13
+ FieldDescription,
14
+ FieldError,
15
+ FieldContent,
16
+ FieldTitle,
17
+ FieldGroup,
18
+ FieldSet,
19
+ FieldLegend,
20
+ FieldSeparator,
21
+ } from "@squadbase/vantage/ui";
22
+ ```
23
+
24
+ ## パーツ
25
+
26
+ | パーツ | 役割 |
27
+ | --- | --- |
28
+ | `Field` | 入力 1 つぶんの外枠。`orientation` で並び方を選ぶ |
29
+ | `FieldLabel` | ラベル(`Label` を使う)。`htmlFor` で入力と結ぶ |
30
+ | `FieldDescription` | 補足説明 |
31
+ | `FieldError` | エラー。`children` か `errors`(`{ message }[]`)を渡す。空なら描画しない |
32
+ | `FieldContent` | 横並びのときにラベルと説明をまとめる列 |
33
+ | `FieldTitle` | `<label>` ではない見出し |
34
+ | `FieldGroup` | 複数の `Field` を縦に並べる |
35
+ | `FieldSet` / `FieldLegend` | `<fieldset>` / `<legend>` |
36
+ | `FieldSeparator` | 区切り線。中に文字も置ける |
37
+
38
+ | Prop | Type | Default | 説明 |
39
+ | --- | --- | --- | --- |
40
+ | `orientation` | `"vertical" \| "horizontal" \| "responsive"` | `"vertical"` | `Field` に渡す。`responsive` はコンテナ幅が広いときだけ横並びにする。 |
41
+ | `data-invalid` | `boolean` | | `Field` に付けるとラベルと説明がエラー色になる。入力には `aria-invalid` を付ける。 |
42
+ | `errors` | `Array<{ message?: string } \| undefined>` | | `FieldError` に渡す。複数あれば箇条書きにし、重複は 1 つにまとめる。 |
@@ -0,0 +1,21 @@
1
+ # Hover Card
2
+
3
+ > リンクにホバーすると出るプレビューカード。
4
+
5
+ リンクや用語にポインタを載せたとき(キーボードではフォーカスしたとき)に、補足の内容を
6
+ カードで見せます。指標の定義やユーザーのプロフィールなど、**読むだけ**の情報向けです。
7
+ 操作を伴うなら [`Popover`](ui/popover)、短い一言なら
8
+ [`Tooltip`](ui/tooltip) を使ってください。Base UI の `PreviewCard` の上に作っています。
9
+
10
+ ```tsx
11
+ import { HoverCard, HoverCardTrigger, HoverCardContent } from "@squadbase/vantage/ui";
12
+ ```
13
+
14
+ `HoverCardTrigger` は既定で `<a>` を描画します。別の要素にしたい場合は `render` を渡します。
15
+
16
+ | Prop | Type | Default | 説明 |
17
+ | --- | --- | --- | --- |
18
+ | `side` | `"top" \| "right" \| "bottom" \| "left"` | `"bottom"` | `HoverCardContent` に渡す。トリガーのどちら側に出すか。 |
19
+ | `align` | `"start" \| "center" \| "end"` | `"center"` | `HoverCardContent` に渡す。 |
20
+ | `sideOffset` | `number` | `4` | `HoverCardContent` とトリガーの距離(px)。 |
21
+ | `delay` | `number` | `600` | `HoverCardTrigger` に渡す。開くまでのミリ秒。 |
@@ -0,0 +1,16 @@
1
+ # Kbd
2
+
3
+ > キーボードのキー表示。
4
+
5
+ ショートカットキーを表示するための小さな部品です。複数のキーは `KbdGroup` で並べます。
6
+
7
+ ```tsx
8
+ import { Kbd, KbdGroup } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ | Prop | Type | 説明 |
12
+ | --- | --- | --- |
13
+ | `Kbd` | `ComponentProps<"kbd">` | 1 つのキー。 |
14
+ | `KbdGroup` | `ComponentProps<"div">` | キーを横に並べる。 |
15
+
16
+ ボタンや [`Tooltip`](ui/tooltip) の中に置くと、周りの文字色に合わせて馴染みます。
@@ -0,0 +1,36 @@
1
+ # Pagination
2
+
3
+ > ページ送りのリンク列。
4
+
5
+ 一覧をページに分けたときのページ送りです。見た目だけの部品で、現在ページや総ページ数は
6
+ 持ちません — 状態は呼び出し側(URL の検索パラメータや `useState`)で管理します。
7
+
8
+ ```tsx
9
+ import {
10
+ Pagination,
11
+ PaginationContent,
12
+ PaginationItem,
13
+ PaginationLink,
14
+ PaginationPrevious,
15
+ PaginationNext,
16
+ PaginationEllipsis,
17
+ } from "@squadbase/vantage/ui";
18
+ ```
19
+
20
+ ## パーツ
21
+
22
+ | パーツ | 役割 |
23
+ | --- | --- |
24
+ | `Pagination` | `<nav>`。`aria-label="pagination"` 付き |
25
+ | `PaginationContent` / `PaginationItem` | `<ul>` / `<li>` |
26
+ | `PaginationLink` | 1 ページ分の `<a>`。`isActive` で現在ページを示す |
27
+ | `PaginationPrevious` / `PaginationNext` | 前後への `<a>`。`text` で文言を変える |
28
+ | `PaginationEllipsis` | 省略記号 |
29
+
30
+ | Prop | Type | Default | 説明 |
31
+ | --- | --- | --- | --- |
32
+ | `isActive` | `boolean` | | `PaginationLink` に渡す。`aria-current="page"` と枠線付きの見た目になる。 |
33
+ | `text` | `string` | `"Previous" / "Next"` | `PaginationPrevious` / `PaginationNext` のラベル(640px 未満では隠れる)。 |
34
+
35
+ リンクは素の `<a>` なので、`href` を渡すとそのまま遷移します。画面内の状態だけを変えたい場合は
36
+ `onClick` で `preventDefault()` してください。
@@ -0,0 +1,21 @@
1
+ # Radio Group
2
+
3
+ > 少数の選択肢から 1 つを選ぶラジオボタン。
4
+
5
+ 選択肢をすべて見せたまま 1 つ選ばせる入力です。選択肢が多いときは
6
+ [`Select`](ui/select)、横並びのボタンで切り替えたいときは
7
+ [`SegmentedControl`](parts/segmented-control) を検討してください。
8
+
9
+ ```tsx
10
+ import { RadioGroup, RadioGroupItem } from "@squadbase/vantage/ui";
11
+ ```
12
+
13
+ `RadioGroupItem` 自体はラベルを持ちません。`id` を振って [`Label`](ui/label) の
14
+ `htmlFor` と結んでください。
15
+
16
+ | Prop | Type | 説明 |
17
+ | --- | --- | --- |
18
+ | `value` | `unknown` | `RadioGroup` の選択値(制御)。 |
19
+ | `defaultValue` | `unknown` | `RadioGroup` の初期値(非制御)。 |
20
+ | `onValueChange` | `(value: unknown) => void` | `RadioGroup` に渡す。選ばれた `RadioGroupItem` の `value` を受け取る。 |
21
+ | `disabled` | `boolean` | グループ全体、または項目単位で無効にする。 |