@squadbase/vantage 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +21 -4
  2. package/dist/chunk-A2UUGASH.js +12 -0
  3. package/dist/chunk-A2UUGASH.js.map +1 -0
  4. package/dist/{chunk-ZGDU5YLH.js → chunk-PRFBSQA4.js} +9 -5
  5. package/dist/chunk-PRFBSQA4.js.map +1 -0
  6. package/dist/chunk-WQZYXXQW.js +2249 -0
  7. package/dist/chunk-WQZYXXQW.js.map +1 -0
  8. package/dist/{chunk-73J5ZD4C.js → chunk-YLAB6UQS.js} +17 -3
  9. package/dist/chunk-YLAB6UQS.js.map +1 -0
  10. package/dist/cli.js +607 -36
  11. package/dist/cli.js.map +1 -1
  12. package/dist/components/index.d.ts +554 -0
  13. package/dist/components/index.js +1983 -0
  14. package/dist/components/index.js.map +1 -0
  15. package/dist/markdown/index.d.ts +9 -0
  16. package/dist/markdown/index.js +26 -0
  17. package/dist/markdown/index.js.map +1 -0
  18. package/dist/query/index.d.ts +27 -1
  19. package/dist/query/index.js +18 -0
  20. package/dist/query/index.js.map +1 -1
  21. package/dist/server/node.js +6 -1
  22. package/dist/server/node.js.map +1 -1
  23. package/dist/ui/index.d.ts +316 -200
  24. package/dist/ui/index.js +566 -511
  25. package/dist/ui/index.js.map +1 -1
  26. package/dist/vite/index.js +2 -2
  27. package/docs/en/agent-skills.md +89 -0
  28. package/docs/en/api-and-server.md +84 -0
  29. package/docs/en/build-and-deploy.md +280 -0
  30. package/docs/en/cli-reference.md +311 -0
  31. package/docs/en/components.md +233 -0
  32. package/docs/en/data-fetching.md +78 -0
  33. package/docs/en/environment-variables.md +69 -0
  34. package/docs/en/getting-started.md +95 -0
  35. package/docs/en/index.md +65 -0
  36. package/docs/en/markdown/markdown-renderer.md +44 -0
  37. package/docs/en/pages-and-metadata.md +56 -0
  38. package/docs/en/parts/app-shell.md +54 -0
  39. package/docs/en/parts/dashboard-card.md +64 -0
  40. package/docs/en/parts/data-table.md +86 -0
  41. package/docs/en/parts/date-range-picker.md +41 -0
  42. package/docs/en/parts/echart.md +53 -0
  43. package/docs/en/parts/filter-bar.md +66 -0
  44. package/docs/en/parts/funnel-steps.md +33 -0
  45. package/docs/en/parts/metric-value.md +23 -0
  46. package/docs/en/parts/multi-select.md +27 -0
  47. package/docs/en/parts/page-shell.md +45 -0
  48. package/docs/en/parts/searchable-select.md +47 -0
  49. package/docs/en/parts/section-header.md +20 -0
  50. package/docs/en/parts/segmented-control.md +25 -0
  51. package/docs/en/parts/status-badge.md +44 -0
  52. package/docs/en/parts/trend-indicator.md +26 -0
  53. package/docs/en/routing.md +95 -0
  54. package/docs/en/ui/accordion.md +36 -0
  55. package/docs/en/ui/alert.md +31 -0
  56. package/docs/en/ui/badge.md +23 -0
  57. package/docs/en/ui/breadcrumb.md +38 -0
  58. package/docs/en/ui/button.md +39 -0
  59. package/docs/en/ui/calendar.md +28 -0
  60. package/docs/en/ui/card.md +35 -0
  61. package/docs/en/ui/checkbox.md +34 -0
  62. package/docs/en/ui/cn.md +34 -0
  63. package/docs/en/ui/collapsible.md +21 -0
  64. package/docs/en/ui/command.md +37 -0
  65. package/docs/en/ui/dialog.md +52 -0
  66. package/docs/en/ui/dropdown-menu.md +50 -0
  67. package/docs/en/ui/empty.md +22 -0
  68. package/docs/en/ui/error-state.md +50 -0
  69. package/docs/en/ui/input-group.md +30 -0
  70. package/docs/en/ui/input.md +28 -0
  71. package/docs/en/ui/label.md +19 -0
  72. package/docs/en/ui/loading.md +19 -0
  73. package/docs/en/ui/popover.md +34 -0
  74. package/docs/en/ui/progress.md +28 -0
  75. package/docs/en/ui/scroll-area.md +23 -0
  76. package/docs/en/ui/select.md +63 -0
  77. package/docs/en/ui/separator.md +15 -0
  78. package/docs/en/ui/sheet.md +28 -0
  79. package/docs/en/ui/sidebar.md +92 -0
  80. package/docs/en/ui/skeleton.md +16 -0
  81. package/docs/en/ui/slider.md +21 -0
  82. package/docs/en/ui/spinner.md +14 -0
  83. package/docs/en/ui/switch.md +19 -0
  84. package/docs/en/ui/table.md +24 -0
  85. package/docs/en/ui/tabs.md +23 -0
  86. package/docs/en/ui/textarea.md +15 -0
  87. package/docs/en/ui/toggle-group.md +26 -0
  88. package/docs/en/ui/toggle.md +19 -0
  89. package/docs/en/ui/tooltip.md +22 -0
  90. package/docs/en/ui/use-is-mobile.md +18 -0
  91. package/docs/en/ui-and-theming.md +95 -0
  92. package/docs/index.json +1306 -0
  93. package/docs/ja/agent-skills.md +87 -0
  94. package/docs/ja/api-and-server.md +84 -0
  95. package/docs/ja/build-and-deploy.md +279 -0
  96. package/docs/ja/cli-reference.md +305 -0
  97. package/docs/ja/components.md +229 -0
  98. package/docs/ja/data-fetching.md +78 -0
  99. package/docs/ja/environment-variables.md +68 -0
  100. package/docs/ja/getting-started.md +95 -0
  101. package/docs/ja/index.md +65 -0
  102. package/docs/ja/markdown/markdown-renderer.md +43 -0
  103. package/docs/ja/pages-and-metadata.md +56 -0
  104. package/docs/ja/parts/app-shell.md +54 -0
  105. package/docs/ja/parts/dashboard-card.md +64 -0
  106. package/docs/ja/parts/data-table.md +85 -0
  107. package/docs/ja/parts/date-range-picker.md +41 -0
  108. package/docs/ja/parts/echart.md +52 -0
  109. package/docs/ja/parts/filter-bar.md +64 -0
  110. package/docs/ja/parts/funnel-steps.md +33 -0
  111. package/docs/ja/parts/metric-value.md +25 -0
  112. package/docs/ja/parts/multi-select.md +27 -0
  113. package/docs/ja/parts/page-shell.md +45 -0
  114. package/docs/ja/parts/searchable-select.md +47 -0
  115. package/docs/ja/parts/section-header.md +20 -0
  116. package/docs/ja/parts/segmented-control.md +26 -0
  117. package/docs/ja/parts/status-badge.md +44 -0
  118. package/docs/ja/parts/trend-indicator.md +26 -0
  119. package/docs/ja/routing.md +95 -0
  120. package/docs/ja/ui/accordion.md +37 -0
  121. package/docs/ja/ui/alert.md +31 -0
  122. package/docs/ja/ui/badge.md +23 -0
  123. package/docs/ja/ui/breadcrumb.md +38 -0
  124. package/docs/ja/ui/button.md +39 -0
  125. package/docs/ja/ui/calendar.md +28 -0
  126. package/docs/ja/ui/card.md +35 -0
  127. package/docs/ja/ui/checkbox.md +34 -0
  128. package/docs/ja/ui/cn.md +34 -0
  129. package/docs/ja/ui/collapsible.md +21 -0
  130. package/docs/ja/ui/command.md +36 -0
  131. package/docs/ja/ui/dialog.md +51 -0
  132. package/docs/ja/ui/dropdown-menu.md +50 -0
  133. package/docs/ja/ui/empty.md +22 -0
  134. package/docs/ja/ui/error-state.md +50 -0
  135. package/docs/ja/ui/input-group.md +30 -0
  136. package/docs/ja/ui/input.md +28 -0
  137. package/docs/ja/ui/label.md +19 -0
  138. package/docs/ja/ui/loading.md +19 -0
  139. package/docs/ja/ui/popover.md +34 -0
  140. package/docs/ja/ui/progress.md +28 -0
  141. package/docs/ja/ui/scroll-area.md +24 -0
  142. package/docs/ja/ui/select.md +64 -0
  143. package/docs/ja/ui/separator.md +15 -0
  144. package/docs/ja/ui/sheet.md +28 -0
  145. package/docs/ja/ui/sidebar.md +92 -0
  146. package/docs/ja/ui/skeleton.md +16 -0
  147. package/docs/ja/ui/slider.md +21 -0
  148. package/docs/ja/ui/spinner.md +14 -0
  149. package/docs/ja/ui/switch.md +19 -0
  150. package/docs/ja/ui/table.md +24 -0
  151. package/docs/ja/ui/tabs.md +24 -0
  152. package/docs/ja/ui/textarea.md +15 -0
  153. package/docs/ja/ui/toggle-group.md +27 -0
  154. package/docs/ja/ui/toggle.md +19 -0
  155. package/docs/ja/ui/tooltip.md +22 -0
  156. package/docs/ja/ui/use-is-mobile.md +18 -0
  157. package/docs/ja/ui-and-theming.md +95 -0
  158. package/package.json +29 -4
  159. package/registry/blocks/sales-overview.tsx +43 -19
  160. package/registry/ui/data-table.tsx +702 -102
  161. package/skills/vantage-add-feature/SKILL.md +150 -0
  162. package/skills/vantage-app/SKILL.md +258 -0
  163. package/skills/vantage-pitfalls/SKILL.md +115 -0
  164. package/templates/AGENTS.md +268 -0
  165. package/theme.css +178 -40
  166. package/dist/chunk-73J5ZD4C.js.map +0 -1
  167. package/dist/chunk-ZGDU5YLH.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ # Collapsible
2
+
3
+ > 単独の折りたたみ。スタイルは付かない。
4
+
5
+ 中身をひとつ開閉するだけの、スタイルの付いていないプリミティブです。見出しが縦に並ぶ形なら
6
+ [`Accordion`](ui/accordion) を使ってください。
7
+
8
+ ```tsx
9
+ import { Collapsible, CollapsibleTrigger, CollapsibleContent } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ `open` / `defaultOpen` / `onOpenChange` で制御します。開いているかどうかはトリガーとパネルの
13
+ 両方に `data-open` が付くので、CSS だけで矢印を回せます。
14
+
15
+ ```tsx
16
+ <ChevronRight className="transition-transform data-open:rotate-90" />
17
+ ```
18
+
19
+ > [!NOTE]
20
+ > `data-open` は Vantage の `theme.css` が定義している custom variant です。Radix 流の
21
+ > `data-[state=open]:` も同じ variant で受けられるようにしてあります。
@@ -0,0 +1,36 @@
1
+ # Command
2
+
3
+ > 絞り込み付きのコマンドリスト。⌘K パレットの土台。
4
+
5
+ 入力に応じて候補を絞り込むリストです。[`SearchableSelect`](parts/searchable-select) と
6
+ [`MultiSelect`](parts/multi-select) の中身もこれで、単体では ⌘K パレットに使えます。
7
+
8
+ ```tsx
9
+ import {
10
+ Command,
11
+ CommandDialog,
12
+ CommandInput,
13
+ CommandList,
14
+ CommandEmpty,
15
+ CommandGroup,
16
+ CommandItem,
17
+ CommandShortcut,
18
+ CommandSeparator,
19
+ } from "@squadbase/vantage/ui";
20
+ ```
21
+
22
+ ## パーツ
23
+
24
+ | パーツ | 役割 |
25
+ | --- | --- |
26
+ | `Command` | 全体。絞り込みとキーボード操作を持つ |
27
+ | `CommandDialog` | `Dialog` に入れた版。⌘K パレット向け |
28
+ | `CommandInput` | 検索入力 |
29
+ | `CommandList` | スクロール領域 |
30
+ | `CommandEmpty` | 0 件のときの表示 |
31
+ | `CommandGroup` | `heading` 付きのグループ |
32
+ | `CommandItem` | 1 項目。`value` / `onSelect` |
33
+ | `CommandShortcut` | 右端のキー表示 |
34
+
35
+ 絞り込みは既定で項目のテキストに対して行われます。サーバー側で検索したい場合は
36
+ `shouldFilter={false}` にして、候補そのものを差し替えてください。
@@ -0,0 +1,51 @@
1
+ # Dialog
2
+
3
+ > モーダルダイアログ。
4
+
5
+ 画面中央に出るモーダルです。横から出したいときは [`Sheet`](ui/sheet)、
6
+ 軽い吹き出しなら [`Popover`](ui/popover) を使ってください。
7
+
8
+ ```tsx
9
+ import {
10
+ Dialog,
11
+ DialogTrigger,
12
+ DialogContent,
13
+ DialogHeader,
14
+ DialogTitle,
15
+ DialogDescription,
16
+ DialogFooter,
17
+ DialogClose,
18
+ DialogOverlay,
19
+ DialogPortal,
20
+ } from "@squadbase/vantage/ui";
21
+ ```
22
+
23
+ ## パーツ
24
+
25
+ | パーツ | 役割 |
26
+ | --- | --- |
27
+ | `Dialog` | 状態。`open` / `defaultOpen` / `onOpenChange` |
28
+ | `DialogTrigger` | 開くきっかけ。`render` でボタンにする |
29
+ | `DialogContent` | 本体。`showCloseButton`(既定 `true`)で右上の × を出し分ける |
30
+ | `DialogHeader` / `DialogTitle` / `DialogDescription` | 見出し |
31
+ | `DialogFooter` | ボタン行。`showCloseButton` で閉じるボタンを足せる |
32
+ | `DialogClose` | 閉じるトリガー |
33
+
34
+ `DialogTitle` は支援技術のために必須です。見出しを見せたくない場合も、置いた上で
35
+ `className="sr-only"` にしてください。
36
+
37
+ ## トリガー無しで開く
38
+
39
+ フォーム送信後などプログラムから開く場合は、`open` を自分で持ちます。
40
+
41
+ ```tsx
42
+ const [open, setOpen] = useState(false);
43
+
44
+ <Dialog open={open} onOpenChange={setOpen}>
45
+ <DialogContent>…</DialogContent>
46
+ </Dialog>;
47
+ ```
48
+
49
+ > [!NOTE]
50
+ > `asChild` は Base UI にはありません。`<DialogTrigger render={<Button />}>ラベル</DialogTrigger>`
51
+ > のように書きます(ラベルは `render` に渡す要素ではなく `children` に置きます)。
@@ -0,0 +1,50 @@
1
+ # DropdownMenu
2
+
3
+ > ボタンから開くメニュー。チェック項目・ラジオ・サブメニュー対応。
4
+
5
+ ボタンから開く操作メニューです。行ごとの「…」メニューや、テーブルの表示列切り替えに使います。
6
+
7
+ ```tsx
8
+ import {
9
+ DropdownMenu,
10
+ DropdownMenuTrigger,
11
+ DropdownMenuContent,
12
+ DropdownMenuGroup,
13
+ DropdownMenuLabel,
14
+ DropdownMenuItem,
15
+ DropdownMenuCheckboxItem,
16
+ DropdownMenuRadioGroup,
17
+ DropdownMenuRadioItem,
18
+ DropdownMenuSeparator,
19
+ DropdownMenuShortcut,
20
+ DropdownMenuSub,
21
+ DropdownMenuSubTrigger,
22
+ DropdownMenuSubContent,
23
+ DropdownMenuPortal,
24
+ } from "@squadbase/vantage/ui";
25
+ ```
26
+
27
+ ## よく使うプロップ
28
+
29
+ | プロップ | 置き場所 | 意味 |
30
+ | --- | --- | --- |
31
+ | `align` / `side` / `sideOffset` | `DropdownMenuContent` | 開く位置 |
32
+ | `variant="destructive"` | `DropdownMenuItem` | 破壊的操作の色 |
33
+ | `inset` | `Item` / `Label` / `SubTrigger` | アイコン列の分だけ字下げ |
34
+ | `checked` / `onCheckedChange` | `DropdownMenuCheckboxItem` | チェック状態 |
35
+ | `value` / `onValueChange` | `DropdownMenuRadioGroup` | 単一選択 |
36
+
37
+ ## サブメニュー
38
+
39
+ ```tsx
40
+ <DropdownMenuSub>
41
+ <DropdownMenuSubTrigger>エクスポート</DropdownMenuSubTrigger>
42
+ <DropdownMenuSubContent>
43
+ <DropdownMenuItem>CSV</DropdownMenuItem>
44
+ <DropdownMenuItem>JSON</DropdownMenuItem>
45
+ </DropdownMenuSubContent>
46
+ </DropdownMenuSub>
47
+ ```
48
+
49
+ > [!NOTE]
50
+ > トリガーをボタンにするときは `render` を使います。`asChild` は Base UI にはありません。
@@ -0,0 +1,22 @@
1
+ # Empty
2
+
3
+ > データが 0 件のときの表示。
4
+
5
+ 結果が 1 件も無いときの表示です。アイコン・説明・アクションはすべて任意です。
6
+
7
+ ```tsx
8
+ import { Empty } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ | Prop | Type | Default | 説明 |
12
+ | --- | --- | --- | --- |
13
+ | `title` | `string` | `"Nothing here yet"` | 見出し。 |
14
+ | `description` | `string` | | 見出しの下の補足文。 |
15
+ | `icon` | `ReactNode` | | 見出しの上に置く絵柄。 |
16
+ | `action` | `ReactNode` | | 下部に置く次の一手(ボタンやリンク)。 |
17
+ | `className` | `string` | | 足すクラス。 |
18
+
19
+ > [!NOTE]
20
+ > [`DataTable`](parts/data-table) は行が 0 件のとき、表の中に「データがありません」の
21
+ > 行を自分で描きます。`Empty` はテーブル全体を差し替えたいとき — 例えば「まだ 1 件も登録されて
22
+ > いない」ときの案内 — に使います。
@@ -0,0 +1,50 @@
1
+ # ErrorState
2
+
3
+ > 失敗したときの表示。
4
+
5
+ 読み込みや処理が失敗したときの表示です。`role="alert"` が付き、`destructive` 系の色で囲まれます。
6
+
7
+ ```tsx
8
+ import { ErrorState } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ | Prop | Type | Default | 説明 |
12
+ | --- | --- | --- | --- |
13
+ | `title` | `string` | `"Something went wrong"` | 見出し。 |
14
+ | `message` | `ReactNode` | | 詳細。エラーメッセージをそのまま出せます。 |
15
+ | `action` | `ReactNode` | | 再試行ボタンなど。 |
16
+ | `className` | `string` | | 足すクラス。 |
17
+
18
+ ## 3 つの状態をまとめて使う
19
+
20
+ クエリの状態をそのまま分岐に落とすのが基本形です。
21
+
22
+ ```tsx
23
+ import { useQuery, apiFetch } from "@squadbase/vantage/query";
24
+ import { Button, Loading, Empty, ErrorState } from "@squadbase/vantage/ui";
25
+ import { DataTablePreset } from "@squadbase/vantage/components";
26
+
27
+ export default function Customers() {
28
+ const { data, isLoading, error, refetch } = useQuery({
29
+ queryKey: ["customers"],
30
+ queryFn: () => apiFetch("/api/customers").then((r) => r.json()),
31
+ });
32
+
33
+ if (isLoading) return <Loading label="顧客を読み込んでいます…" />;
34
+ if (error)
35
+ return (
36
+ <ErrorState
37
+ message={error.message}
38
+ action={<Button variant="outline" onClick={() => refetch()}>再試行</Button>}
39
+ />
40
+ );
41
+ if (data.length === 0) return <Empty title="顧客がまだいません" />;
42
+
43
+ return <DataTablePreset columns={columns} data={data} />;
44
+ }
45
+ ```
46
+
47
+ > [!NOTE]
48
+ > API 側で意図的に返したエラーメッセージをクライアントに見せたい場合は、`server/api` で
49
+ > `HttpError(status, message)` を投げます。それ以外の例外は汎用の 500 になります —
50
+ > [API とサーバー](api-and-server) を参照してください。
@@ -0,0 +1,30 @@
1
+ # InputGroup
2
+
3
+ > 入力欄の前後にアイコン・テキスト・ボタンを添える。
4
+
5
+ 入力欄の内側にアイコンや単位、小さなボタンを配置するための枠です。検索欄や「円」「%」といった
6
+ 単位付きの入力に使います。
7
+
8
+ ```tsx
9
+ import {
10
+ InputGroup,
11
+ InputGroupInput,
12
+ InputGroupTextarea,
13
+ InputGroupAddon,
14
+ InputGroupText,
15
+ InputGroupButton,
16
+ } from "@squadbase/vantage/ui";
17
+ ```
18
+
19
+ ## パーツ
20
+
21
+ | パーツ | 役割 |
22
+ | --- | --- |
23
+ | `InputGroup` | 枠。フォーカスリングはここに出る |
24
+ | `InputGroupInput` / `InputGroupTextarea` | 中身の入力。枠線は持たない |
25
+ | `InputGroupAddon` | 添え物の置き場。`align`: `inline-start`(既定)\| `inline-end` \| `block-start` \| `block-end` |
26
+ | `InputGroupText` | 単位などの短いテキスト |
27
+ | `InputGroupButton` | 小さなボタン。`size`: `xs`(既定)\| `sm` \| `icon-xs` \| `icon-sm` |
28
+
29
+ `block-start` / `block-end` は入力欄の上下に置く指定で、`InputGroupTextarea` と組み合わせると
30
+ ツールバー付きのテキストエリアになります。
@@ -0,0 +1,28 @@
1
+ # Input
2
+
3
+ > 1 行のテキスト入力。
4
+
5
+ 素の `<input>` にテーマの枠線とフォーカスリングを付けたものです。props はネイティブの
6
+ `<input>` と同じで、`type` もそのまま使えます。
7
+
8
+ ```tsx
9
+ import { Input } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ ラベルは [`Label`](ui/label) を `htmlFor` で結び付けてください。
13
+
14
+ ## 状態
15
+
16
+ | 書き方 | 見た目 |
17
+ | --- | --- |
18
+ | `disabled` | 薄くなり操作不可 |
19
+ | `aria-invalid` | 枠線とリングが `destructive` 色になる |
20
+ | `readOnly` | 見た目はそのまま、編集不可 |
21
+
22
+ バリデーションエラーの表示は `aria-invalid` を付けるだけで揃います。真偽値をそのまま渡せます。
23
+
24
+ ```tsx
25
+ <Input aria-invalid={Boolean(error)} />
26
+ ```
27
+
28
+ 前後にアイコンやボタンを添えたいときは [`InputGroup`](ui/input-group) を使います。
@@ -0,0 +1,19 @@
1
+ # Label
2
+
3
+ > フォーム項目のラベル。
4
+
5
+ `<label>` に揃った字送りと、無効時の淡色を足したものです。`htmlFor` で入力と結び付けるか、入力を
6
+ そのまま包みます。
7
+
8
+ ```tsx
9
+ import { Label } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ チェックボックスやスイッチは、`Label` で包むとラベル部分のクリックでも切り替わります。
13
+
14
+ ```tsx
15
+ <Label className="flex items-center gap-2">
16
+ <Switch />
17
+ 自動更新
18
+ </Label>
19
+ ```
@@ -0,0 +1,19 @@
1
+ # Loading
2
+
3
+ > ラベル付きの中央寄せスピナー。
4
+
5
+ 画面ぶんの読み込み中を示します。`role="status"` と `aria-live="polite"` が付くので、スクリーン
6
+ リーダーにも読み込み中が伝わります。`Empty` と `ErrorState` と合わせて、Vantage が足している
7
+ 3 つの状態表示のひとつです(shadcn/ui にはありません)。
8
+
9
+ ```tsx
10
+ import { Loading } from "@squadbase/vantage/ui";
11
+ ```
12
+
13
+ | Prop | Type | Default | 説明 |
14
+ | --- | --- | --- | --- |
15
+ | `label` | `string` | `"Loading…"` | スピナーの右に出すテキスト。 |
16
+ | `className` | `string` | | 足すクラス。既定では最小高 30vh で縦横中央に置かれます。 |
17
+
18
+ レイアウトを保ったまま待たせたいときは [`Skeleton`](ui/skeleton)、ボタンの中など
19
+ 狭い場所には [`Spinner`](ui/spinner) を使ってください。
@@ -0,0 +1,34 @@
1
+ # Popover
2
+
3
+ > トリガーに寄り添う吹き出し。
4
+
5
+ 要素に寄り添って開く吹き出しです。フォーカスを奪うモーダルが必要なら
6
+ [`Dialog`](ui/dialog)、説明文だけなら [`Tooltip`](ui/tooltip) を使います。
7
+
8
+ ```tsx
9
+ import {
10
+ Popover,
11
+ PopoverTrigger,
12
+ PopoverContent,
13
+ PopoverHeader,
14
+ PopoverTitle,
15
+ PopoverDescription,
16
+ } from "@squadbase/vantage/ui";
17
+ ```
18
+
19
+ ## 位置
20
+
21
+ `PopoverContent` の `side`(既定 `bottom`)、`align`(既定 `center`)、`sideOffset`(既定 `4`)で
22
+ 決まります。
23
+
24
+ ## トリガーの幅に合わせる
25
+
26
+ Base UI は `--anchor-width` という CSS 変数を出しています(Radix の
27
+ `--radix-popover-trigger-width` に相当)。
28
+
29
+ ```tsx
30
+ <PopoverContent className="w-(--anchor-width)">…</PopoverContent>
31
+ ```
32
+
33
+ > [!NOTE]
34
+ > トリガーをボタンにするときは `render={<Button />}` です。`asChild` は Base UI にはありません。
@@ -0,0 +1,28 @@
1
+ # Progress
2
+
3
+ > 進捗バー。ラベルと値の表示を組める。
4
+
5
+ 0〜100 の進捗を示すバーです。`Progress` の中にラベルや値を置くと、バーはその下に自動で描かれます。
6
+
7
+ ```tsx
8
+ import {
9
+ Progress,
10
+ ProgressTrack,
11
+ ProgressIndicator,
12
+ ProgressLabel,
13
+ ProgressValue,
14
+ } from "@squadbase/vantage/ui";
15
+ ```
16
+
17
+ ## パーツ
18
+
19
+ | パーツ | 役割 |
20
+ | --- | --- |
21
+ | `Progress` | 全体。`value`(`null` で不定) |
22
+ | `ProgressLabel` | 見出し |
23
+ | `ProgressValue` | 現在値。既定でパーセント表示 |
24
+ | `ProgressTrack` / `ProgressIndicator` | バー本体。`Progress` が自動で描くので、普段は書かない |
25
+
26
+ 進捗の総量が分からないときは `value={null}` にすると不定表示になります。読み込み中を示したい
27
+ だけなら [`Skeleton`](ui/skeleton) や [`Spinner`](ui/spinner) の方が
28
+ 適しています。
@@ -0,0 +1,24 @@
1
+ # ScrollArea
2
+
3
+ > OS 依存しないスクロールバーを持つ領域。
4
+
5
+ 高さを固定した領域に、OS 標準ではないスクロールバーを付けます。ドロップダウンの中身や、長い
6
+ ログの表示に使います。
7
+
8
+ ```tsx
9
+ import { ScrollArea, ScrollBar } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ 高さ(または幅)は `className` で指定します。既定は縦スクロールで、横に流したいときは
13
+ `ScrollBar orientation="horizontal"` を子に置きます。
14
+
15
+ ```tsx
16
+ <ScrollArea className="w-96 whitespace-nowrap">
17
+ <div className="flex gap-3">…</div>
18
+ <ScrollBar orientation="horizontal" />
19
+ </ScrollArea>
20
+ ```
21
+
22
+ > [!NOTE]
23
+ > スクロールバー自体を消したいだけなら、`no-scrollbar` ユーティリティが `theme.css` に定義されて
24
+ > います。
@@ -0,0 +1,64 @@
1
+ # Select
2
+
3
+ > 単一選択のセレクト。onValueChange は null を渡しうる。
4
+
5
+ 候補から 1 つ選ぶ入力です。候補が多くて検索したい場合は
6
+ [`SearchableSelect`](parts/searchable-select)、少数を横並びで見せたい場合は
7
+ [`SegmentedControl`](parts/segmented-control) を検討してください。
8
+
9
+ ```tsx
10
+ import {
11
+ Select,
12
+ SelectTrigger,
13
+ SelectValue,
14
+ SelectContent,
15
+ SelectGroup,
16
+ SelectLabel,
17
+ SelectItem,
18
+ SelectSeparator,
19
+ SelectScrollUpButton,
20
+ SelectScrollDownButton,
21
+ } from "@squadbase/vantage/ui";
22
+ ```
23
+
24
+ ## パーツ
25
+
26
+ | パーツ | 役割 |
27
+ | --- | --- |
28
+ | `Select` | 状態。`value` / `defaultValue` / `onValueChange` / `items` |
29
+ | `SelectTrigger` | 閉じているときの見た目。`size`: `default` \| `sm` |
30
+ | `SelectValue` | 選択中の表示。`placeholder` は未選択時 |
31
+ | `SelectContent` | 開いたときのリスト |
32
+ | `SelectGroup` + `SelectLabel` | 見出し付きのグループ |
33
+ | `SelectItem` | 1 項目。`value` は必須 |
34
+
35
+ > [!WARNING]
36
+ > `onValueChange` は **`string | null`** を渡します(Base UI では選択解除がありうるため)。
37
+ > `null` を握りつぶすガードを必ず書いてください。
38
+ >
39
+ > ```tsx
40
+ > <Select onValueChange={(value) => value !== null && setRegion(value)}>
41
+ > ```
42
+
43
+ > [!WARNING]
44
+ > `SelectValue` は既定で**選択中の `value` をそのまま表示します** — `SelectItem` の中身は見ません。
45
+ > `value="kanto"` なら、トリガーには「関東」ではなく `kanto` と出ます。値とラベルの対応を
46
+ > `items` に渡してください。
47
+ >
48
+ > ```tsx
49
+ > const regions = { hokkaido: "北海道", kanto: "関東", kansai: "関西" };
50
+ >
51
+ > <Select items={regions} value={region} onValueChange={…}>
52
+ > <SelectTrigger><SelectValue placeholder="地域を選ぶ" /></SelectTrigger>
53
+ > …
54
+ > </Select>;
55
+ > ```
56
+ >
57
+ > `items` を持たせたくない場合は、`SelectValue` の children に関数を渡しても同じことができます。
58
+ >
59
+ > ```tsx
60
+ > <SelectValue>{(value) => regions[value] ?? "地域を選ぶ"}</SelectValue>
61
+ > ```
62
+
63
+ `SelectContent` は既定で選択中の項目をトリガーに重ねて開きます。素直に下へ開かせたいときは
64
+ `alignItemWithTrigger={false}` を渡します。
@@ -0,0 +1,15 @@
1
+ # Separator
2
+
3
+ > 1 本の区切り線。
4
+
5
+ 内容を分ける線です。`orientation="vertical"` にするときは、親に高さが要ります。
6
+
7
+ ```tsx
8
+ import { Separator } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ | Prop | Type | Default | 説明 |
12
+ | --- | --- | --- | --- |
13
+ | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | 線の向き。 |
14
+
15
+ 装飾目的の線なので、支援技術には読み上げられません。
@@ -0,0 +1,28 @@
1
+ # Sheet
2
+
3
+ > 画面の端から出るパネル。
4
+
5
+ 画面の端から滑り出すパネルです。フィルタ一式や詳細の編集など、モーダルより広い面積が要る場面に
6
+ 向いています。
7
+
8
+ ```tsx
9
+ import {
10
+ Sheet,
11
+ SheetTrigger,
12
+ SheetContent,
13
+ SheetHeader,
14
+ SheetTitle,
15
+ SheetDescription,
16
+ SheetFooter,
17
+ SheetClose,
18
+ } from "@squadbase/vantage/ui";
19
+ ```
20
+
21
+ 構成は [`Dialog`](ui/dialog) と同じで、違うのは出てくる向きだけです。
22
+
23
+ | Prop | Type | Default | 説明 |
24
+ | --- | --- | --- | --- |
25
+ | `side` | `"top" \| "right" \| "bottom" \| "left"` | `"right"` | `SheetContent` に渡す。どの端から出すか。 |
26
+
27
+ `SheetTitle` は支援技術のために必須です。見せたくない場合も置いた上で `className="sr-only"` に
28
+ してください。
@@ -0,0 +1,92 @@
1
+ # Sidebar
2
+
3
+ > 折りたためるアプリのサイドバー一式。
4
+
5
+ アプリ全体のナビゲーションを組むための、20 以上のパーツからなるキットです。ナビゲーションの
6
+ 定義を配列で渡すだけで済ませたいなら、これを直接使うより
7
+ [`AppShell`](parts/app-shell) の方が早く終わります。
8
+
9
+ ```tsx
10
+ import {
11
+ Sidebar,
12
+ SidebarProvider,
13
+ SidebarInset,
14
+ SidebarTrigger,
15
+ SidebarHeader,
16
+ SidebarContent,
17
+ SidebarFooter,
18
+ SidebarGroup,
19
+ SidebarGroupLabel,
20
+ SidebarGroupContent,
21
+ SidebarGroupAction,
22
+ SidebarMenu,
23
+ SidebarMenuItem,
24
+ SidebarMenuButton,
25
+ SidebarMenuAction,
26
+ SidebarMenuBadge,
27
+ SidebarMenuSkeleton,
28
+ SidebarMenuSub,
29
+ SidebarMenuSubItem,
30
+ SidebarMenuSubButton,
31
+ SidebarSeparator,
32
+ SidebarInput,
33
+ SidebarRail,
34
+ useSidebar,
35
+ } from "@squadbase/vantage/ui";
36
+ ```
37
+
38
+ ## 骨組み
39
+
40
+ `SidebarProvider` が開閉の状態を持ち、`Sidebar` と `SidebarInset`(本文側)がその中に並びます。
41
+
42
+ ```tsx
43
+ <SidebarProvider>
44
+ <Sidebar>
45
+ <SidebarHeader>Acme Analytics</SidebarHeader>
46
+ <SidebarContent>
47
+ <SidebarGroup>
48
+ <SidebarGroupLabel>分析</SidebarGroupLabel>
49
+ <SidebarGroupContent>
50
+ <SidebarMenu>
51
+ <SidebarMenuItem>
52
+ <SidebarMenuButton isActive>概要</SidebarMenuButton>
53
+ </SidebarMenuItem>
54
+ <SidebarMenuItem>
55
+ <SidebarMenuButton>売上</SidebarMenuButton>
56
+ <SidebarMenuBadge>12</SidebarMenuBadge>
57
+ </SidebarMenuItem>
58
+ </SidebarMenu>
59
+ </SidebarGroupContent>
60
+ </SidebarGroup>
61
+ </SidebarContent>
62
+ <SidebarRail />
63
+ </Sidebar>
64
+
65
+ <SidebarInset>
66
+ <SidebarTrigger />
67
+ {children}
68
+ </SidebarInset>
69
+ </SidebarProvider>
70
+ ```
71
+
72
+ ## 覚えておくと効くもの
73
+
74
+ | もの | 効果 |
75
+ | --- | --- |
76
+ | `SidebarMenuButton` の `isActive` | 現在地の強調 |
77
+ | `SidebarMenuButton` の `tooltip` | 折りたたみ時にラベルをツールチップで見せる |
78
+ | `SidebarMenuButton` の `render` | リンクコンポーネントに差し替える |
79
+ | `SidebarRail` | 端をドラッグして開閉できる細い帯 |
80
+ | `SidebarMenuSkeleton` | 読み込み中のメニュー |
81
+ | `useSidebar()` | 開閉状態とモバイル判定を読む |
82
+
83
+ ## リンクにする
84
+
85
+ ```tsx
86
+ import { Link } from "@squadbase/vantage/router";
87
+
88
+ <SidebarMenuButton render={<Link to="/sales" />}>売上</SidebarMenuButton>;
89
+ ```
90
+
91
+ > [!NOTE]
92
+ > `asChild` は Base UI にはありません。`render` に要素を渡します。
@@ -0,0 +1,16 @@
1
+ # Skeleton
2
+
3
+ > 中身と同じ形をした読み込み中の箱。
4
+
5
+ あとから入る中身と同じ形の箱を、読み込み中に置いておくためのものです。
6
+ [`Loading`](ui/loading) の全画面スピナーと違い、レイアウトを保ったまま待てます。
7
+
8
+ ```tsx
9
+ import { Skeleton } from "@squadbase/vantage/ui";
10
+ ```
11
+
12
+ 大きさは `className` で決めます(`h-4 w-32` のように)。実際に入る要素と同じ高さにしておくと、
13
+ 読み込み完了時に画面が跳ねません。
14
+
15
+ ダッシュボードのタイルには、同じ形をあらかじめ組んである
16
+ [`DashboardCardSkeleton`](parts/dashboard-card) が使えます。
@@ -0,0 +1,21 @@
1
+ # Slider
2
+
3
+ > つまみで数値を選ぶ。範囲指定にも対応。
4
+
5
+ 数値をつまみで選ぶ入力です。`value` に配列を渡すとつまみが増え、範囲指定になります。
6
+
7
+ ```tsx
8
+ import { Slider } from "@squadbase/vantage/ui";
9
+ ```
10
+
11
+ | Prop | Type | Default | 説明 |
12
+ | --- | --- | --- | --- |
13
+ | `value` | `number \| number[]` | | つまみの位置。配列なら範囲指定になる。 |
14
+ | `defaultValue` | `number \| number[]` | | 非制御時の初期値。 |
15
+ | `onValueChange` | `(value: number \| number[]) => void` | | 変更時。`value` に渡した形と同じ形が返る。 |
16
+ | `min` | `number` | `0` | 下限。 |
17
+ | `max` | `number` | `100` | 上限。 |
18
+ | `step` | `number` | `1` | 刻み。 |
19
+ | `disabled` | `boolean` | | 操作を無効にする。 |
20
+
21
+ つまみは端で内側に収まるよう配置されるので、`min` / `max` のところでトラックからはみ出しません。