@squadbase/vantage 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -4
- package/dist/{chunk-ZGDU5YLH.js → chunk-5L2MH2NG.js} +16 -7
- package/dist/chunk-5L2MH2NG.js.map +1 -0
- package/dist/chunk-7IPAXPPY.js +51 -0
- package/dist/chunk-7IPAXPPY.js.map +1 -0
- package/dist/chunk-A2UUGASH.js +12 -0
- package/dist/chunk-A2UUGASH.js.map +1 -0
- package/dist/chunk-DTDVSFRY.js +29 -0
- package/dist/chunk-DTDVSFRY.js.map +1 -0
- package/dist/chunk-WQZYXXQW.js +2249 -0
- package/dist/chunk-WQZYXXQW.js.map +1 -0
- package/dist/{chunk-73J5ZD4C.js → chunk-YLAB6UQS.js} +17 -3
- package/dist/chunk-YLAB6UQS.js.map +1 -0
- package/dist/cli.js +607 -36
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/components/index.d.ts +575 -0
- package/dist/components/index.js +2097 -0
- package/dist/components/index.js.map +1 -0
- package/dist/{define-page-B6y9TOfZ.d.ts → define-page-BfhrK99G.d.ts} +5 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown/index.d.ts +9 -0
- package/dist/markdown/index.js +26 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/query/index.d.ts +95 -2
- package/dist/query/index.js +102 -1
- package/dist/query/index.js.map +1 -1
- package/dist/router/index.d.ts +86 -1
- package/dist/router/index.js +71 -7
- package/dist/router/index.js.map +1 -1
- package/dist/server/node.js +6 -1
- package/dist/server/node.js.map +1 -1
- package/dist/ui/index.d.ts +316 -200
- package/dist/ui/index.js +566 -511
- package/dist/ui/index.js.map +1 -1
- package/dist/vite/index.js +2 -2
- package/docs/en/agent-skills.md +89 -0
- package/docs/en/api-and-server.md +84 -0
- package/docs/en/build-and-deploy.md +280 -0
- package/docs/en/cli-reference.md +311 -0
- package/docs/en/components.md +235 -0
- package/docs/en/data-fetching.md +142 -0
- package/docs/en/environment-variables.md +69 -0
- package/docs/en/getting-started.md +95 -0
- package/docs/en/index.md +65 -0
- package/docs/en/markdown/markdown-renderer.md +44 -0
- package/docs/en/pages-and-metadata.md +59 -0
- package/docs/en/parts/app-shell.md +54 -0
- package/docs/en/parts/dashboard-card.md +64 -0
- package/docs/en/parts/data-table.md +86 -0
- package/docs/en/parts/date-range-picker.md +41 -0
- package/docs/en/parts/echart.md +53 -0
- package/docs/en/parts/filter-bar.md +66 -0
- package/docs/en/parts/funnel-steps.md +33 -0
- package/docs/en/parts/metric-value.md +23 -0
- package/docs/en/parts/multi-select.md +27 -0
- package/docs/en/parts/page-shell.md +45 -0
- package/docs/en/parts/placeholder.md +38 -0
- package/docs/en/parts/searchable-select.md +47 -0
- package/docs/en/parts/section-header.md +20 -0
- package/docs/en/parts/segmented-control.md +25 -0
- package/docs/en/parts/sparkline.md +47 -0
- package/docs/en/parts/status-badge.md +44 -0
- package/docs/en/parts/trend-indicator.md +26 -0
- package/docs/en/routing.md +177 -0
- package/docs/en/ui/accordion.md +36 -0
- package/docs/en/ui/alert.md +31 -0
- package/docs/en/ui/badge.md +23 -0
- package/docs/en/ui/breadcrumb.md +38 -0
- package/docs/en/ui/button.md +39 -0
- package/docs/en/ui/calendar.md +28 -0
- package/docs/en/ui/card.md +35 -0
- package/docs/en/ui/checkbox.md +34 -0
- package/docs/en/ui/cn.md +34 -0
- package/docs/en/ui/collapsible.md +21 -0
- package/docs/en/ui/command.md +37 -0
- package/docs/en/ui/dialog.md +52 -0
- package/docs/en/ui/dropdown-menu.md +50 -0
- package/docs/en/ui/empty.md +22 -0
- package/docs/en/ui/error-state.md +50 -0
- package/docs/en/ui/input-group.md +30 -0
- package/docs/en/ui/input.md +28 -0
- package/docs/en/ui/label.md +19 -0
- package/docs/en/ui/loading.md +19 -0
- package/docs/en/ui/popover.md +34 -0
- package/docs/en/ui/progress.md +28 -0
- package/docs/en/ui/scroll-area.md +23 -0
- package/docs/en/ui/select.md +63 -0
- package/docs/en/ui/separator.md +15 -0
- package/docs/en/ui/sheet.md +28 -0
- package/docs/en/ui/sidebar.md +92 -0
- package/docs/en/ui/skeleton.md +16 -0
- package/docs/en/ui/slider.md +21 -0
- package/docs/en/ui/spinner.md +14 -0
- package/docs/en/ui/switch.md +19 -0
- package/docs/en/ui/table.md +24 -0
- package/docs/en/ui/tabs.md +23 -0
- package/docs/en/ui/textarea.md +15 -0
- package/docs/en/ui/toggle-group.md +26 -0
- package/docs/en/ui/toggle.md +19 -0
- package/docs/en/ui/tooltip.md +22 -0
- package/docs/en/ui/use-is-mobile.md +18 -0
- package/docs/en/ui-and-theming.md +95 -0
- package/docs/index.json +1346 -0
- package/docs/ja/agent-skills.md +87 -0
- package/docs/ja/api-and-server.md +84 -0
- package/docs/ja/build-and-deploy.md +279 -0
- package/docs/ja/cli-reference.md +305 -0
- package/docs/ja/components.md +231 -0
- package/docs/ja/data-fetching.md +142 -0
- package/docs/ja/environment-variables.md +68 -0
- package/docs/ja/getting-started.md +95 -0
- package/docs/ja/index.md +65 -0
- package/docs/ja/markdown/markdown-renderer.md +43 -0
- package/docs/ja/pages-and-metadata.md +59 -0
- package/docs/ja/parts/app-shell.md +54 -0
- package/docs/ja/parts/dashboard-card.md +64 -0
- package/docs/ja/parts/data-table.md +85 -0
- package/docs/ja/parts/date-range-picker.md +41 -0
- package/docs/ja/parts/echart.md +52 -0
- package/docs/ja/parts/filter-bar.md +64 -0
- package/docs/ja/parts/funnel-steps.md +33 -0
- package/docs/ja/parts/metric-value.md +25 -0
- package/docs/ja/parts/multi-select.md +27 -0
- package/docs/ja/parts/page-shell.md +45 -0
- package/docs/ja/parts/placeholder.md +37 -0
- package/docs/ja/parts/searchable-select.md +47 -0
- package/docs/ja/parts/section-header.md +20 -0
- package/docs/ja/parts/segmented-control.md +26 -0
- package/docs/ja/parts/sparkline.md +47 -0
- package/docs/ja/parts/status-badge.md +44 -0
- package/docs/ja/parts/trend-indicator.md +26 -0
- package/docs/ja/routing.md +175 -0
- package/docs/ja/ui/accordion.md +37 -0
- package/docs/ja/ui/alert.md +31 -0
- package/docs/ja/ui/badge.md +23 -0
- package/docs/ja/ui/breadcrumb.md +38 -0
- package/docs/ja/ui/button.md +39 -0
- package/docs/ja/ui/calendar.md +28 -0
- package/docs/ja/ui/card.md +35 -0
- package/docs/ja/ui/checkbox.md +34 -0
- package/docs/ja/ui/cn.md +34 -0
- package/docs/ja/ui/collapsible.md +21 -0
- package/docs/ja/ui/command.md +36 -0
- package/docs/ja/ui/dialog.md +51 -0
- package/docs/ja/ui/dropdown-menu.md +50 -0
- package/docs/ja/ui/empty.md +22 -0
- package/docs/ja/ui/error-state.md +50 -0
- package/docs/ja/ui/input-group.md +30 -0
- package/docs/ja/ui/input.md +28 -0
- package/docs/ja/ui/label.md +19 -0
- package/docs/ja/ui/loading.md +19 -0
- package/docs/ja/ui/popover.md +34 -0
- package/docs/ja/ui/progress.md +28 -0
- package/docs/ja/ui/scroll-area.md +24 -0
- package/docs/ja/ui/select.md +64 -0
- package/docs/ja/ui/separator.md +15 -0
- package/docs/ja/ui/sheet.md +28 -0
- package/docs/ja/ui/sidebar.md +92 -0
- package/docs/ja/ui/skeleton.md +16 -0
- package/docs/ja/ui/slider.md +21 -0
- package/docs/ja/ui/spinner.md +14 -0
- package/docs/ja/ui/switch.md +19 -0
- package/docs/ja/ui/table.md +24 -0
- package/docs/ja/ui/tabs.md +24 -0
- package/docs/ja/ui/textarea.md +15 -0
- package/docs/ja/ui/toggle-group.md +27 -0
- package/docs/ja/ui/toggle.md +19 -0
- package/docs/ja/ui/tooltip.md +22 -0
- package/docs/ja/ui/use-is-mobile.md +18 -0
- package/docs/ja/ui-and-theming.md +95 -0
- package/package.json +29 -4
- package/registry/blocks/sales-overview.tsx +43 -19
- package/registry/ui/data-table.tsx +702 -102
- package/skills/vantage-add-feature/SKILL.md +153 -0
- package/skills/vantage-app/SKILL.md +291 -0
- package/skills/vantage-pitfalls/SKILL.md +139 -0
- package/templates/AGENTS.md +313 -0
- package/theme.css +178 -40
- package/dist/chunk-73J5ZD4C.js.map +0 -1
- package/dist/chunk-ATYZ45XL.js +0 -19
- package/dist/chunk-ATYZ45XL.js.map +0 -1
- package/dist/chunk-ZGDU5YLH.js.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Alert
|
|
2
|
+
|
|
3
|
+
> ページ内に置く通知。中身は表示したまま注意を促す。
|
|
4
|
+
|
|
5
|
+
ページの中に置く通知です。「この画面は失敗した」を表す
|
|
6
|
+
[`ErrorState`](ui/error-state) と違い、中身が表示できている上での注意喚起に使います。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { Alert, AlertTitle, AlertDescription, AlertAction } from "@squadbase/vantage/ui";
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## パーツと variant
|
|
13
|
+
|
|
14
|
+
| パーツ | 役割 |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `Alert` | 枠。`variant`: `default` \| `destructive` |
|
|
17
|
+
| `AlertTitle` | 見出し |
|
|
18
|
+
| `AlertDescription` | 本文 |
|
|
19
|
+
| `AlertAction` | 右端に寄せるアクション |
|
|
20
|
+
|
|
21
|
+
アイコンは `Alert` の直下に置くだけで、グリッドが自動で 2 列になります。`lucide-react` から直接
|
|
22
|
+
import して構いません。
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Info } from "lucide-react";
|
|
26
|
+
|
|
27
|
+
<Alert>
|
|
28
|
+
<Info />
|
|
29
|
+
<AlertTitle>読み取り専用です</AlertTitle>
|
|
30
|
+
</Alert>;
|
|
31
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Badge
|
|
2
|
+
|
|
3
|
+
> 小さなラベル。件数・状態・タグに。
|
|
4
|
+
|
|
5
|
+
テキストの横に添える小さなラベルです。行の状態を色付きのドットで示したいときは
|
|
6
|
+
[`StatusBadge`](parts/status-badge) を使ってください。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { Badge, badgeVariants } from "@squadbase/vantage/ui";
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Variant
|
|
13
|
+
|
|
14
|
+
`default` / `secondary` / `destructive` / `outline` / `ghost` / `link`。
|
|
15
|
+
|
|
16
|
+
`badgeVariants` はクラス文字列を返す関数で、`<a>` など別の要素にバッジの見た目を移したいときに
|
|
17
|
+
使います。
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
<a href="/docs" className={badgeVariants({ variant: "outline" })}>
|
|
21
|
+
ドキュメント
|
|
22
|
+
</a>
|
|
23
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Breadcrumb
|
|
2
|
+
|
|
3
|
+
> 階層を示すパンくずリスト。
|
|
4
|
+
|
|
5
|
+
いま見ているページが階層のどこにあるかを示します。ドリルダウンする詳細ページ
|
|
6
|
+
(`/sales/$customerId` など)で特に効きます。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import {
|
|
10
|
+
Breadcrumb,
|
|
11
|
+
BreadcrumbList,
|
|
12
|
+
BreadcrumbItem,
|
|
13
|
+
BreadcrumbLink,
|
|
14
|
+
BreadcrumbPage,
|
|
15
|
+
BreadcrumbSeparator,
|
|
16
|
+
BreadcrumbEllipsis,
|
|
17
|
+
} from "@squadbase/vantage/ui";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## パーツ
|
|
21
|
+
|
|
22
|
+
| パーツ | 役割 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `BreadcrumbLink` | 途中の階層(リンク) |
|
|
25
|
+
| `BreadcrumbPage` | 現在地。リンクにしない |
|
|
26
|
+
| `BreadcrumbSeparator` | 区切り。中身を渡せば記号を差し替えられる |
|
|
27
|
+
| `BreadcrumbEllipsis` | 省略した中間階層 |
|
|
28
|
+
|
|
29
|
+
## ルーターのリンクと組み合わせる
|
|
30
|
+
|
|
31
|
+
`BreadcrumbLink` は `render` プロップで別のコンポーネントに置き換えられます。Vantage の
|
|
32
|
+
[`Link`](routing) を渡せばクライアントサイド遷移になります。
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { Link } from "@squadbase/vantage/router";
|
|
36
|
+
|
|
37
|
+
<BreadcrumbLink render={<Link to="/sales" />}>売上</BreadcrumbLink>;
|
|
38
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+
> 6 つの variant と 8 つの size を持つボタン。
|
|
4
|
+
|
|
5
|
+
いちばんよく使うコンポーネントです。`variant` で意味づけを、`size` で大きさを決めます。
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { Button, buttonVariants } from "@squadbase/vantage/ui";
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | 説明 |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| `variant` | `"default" \| "secondary" \| "outline" \| "ghost" \| "destructive" \| "link"` | `"default"` | 見た目と意味づけ。 |
|
|
14
|
+
| `size` | `"default" \| "xs" \| "sm" \| "lg" \| "icon" \| "icon-xs" \| "icon-sm" \| "icon-lg"` | `"default"` | 高さと余白。`icon` 系は正方形になる。 |
|
|
15
|
+
| `render` | `ReactElement` | | 別の要素として描画する(Radix の `asChild` に相当)。 |
|
|
16
|
+
|
|
17
|
+
アイコンは子要素として置くだけでサイズと余白が揃います。アイコンだけのボタンには
|
|
18
|
+
`size="icon"` と `aria-label` を必ず付けてください。
|
|
19
|
+
|
|
20
|
+
## リンクをボタンに見せる
|
|
21
|
+
|
|
22
|
+
`render` に要素を渡します。`asChild` は Base UI にはありません。
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Link } from "@squadbase/vantage/router";
|
|
26
|
+
|
|
27
|
+
<Button render={<Link to="/sales" />}>売上を見る</Button>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
クラス文字列だけが欲しいときは `buttonVariants({ variant, size })` を使います。
|
|
31
|
+
|
|
32
|
+
## 処理中の表示
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<Button disabled={isPending}>
|
|
36
|
+
{isPending && <Spinner />}
|
|
37
|
+
保存
|
|
38
|
+
</Button>
|
|
39
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Calendar
|
|
2
|
+
|
|
3
|
+
> react-day-picker ベースの日付カレンダー。
|
|
4
|
+
|
|
5
|
+
単日・複数日・期間を選べるカレンダーです。ダッシュボードで期間を選ばせたい場合は、これを直接
|
|
6
|
+
使うより [`DateRangePicker`](parts/date-range-picker) の方が手早く済みます。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { Calendar, CalendarDayButton } from "@squadbase/vantage/ui";
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
props は [react-day-picker](https://daypicker.dev) の `DayPicker` そのままで、Vantage 側で足して
|
|
13
|
+
いるのは次の 3 つだけです。
|
|
14
|
+
|
|
15
|
+
| Prop | Type | Default | 説明 |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `captionLayout` | `"label" \| "dropdown" \| "dropdown-months" \| "dropdown-years"` | `"label"` | 月・年の見出しをテキストにするかセレクトにするか。 |
|
|
18
|
+
| `buttonVariant` | `Button の variant` | `"ghost"` | 前後の月へ送るボタンの見た目。 |
|
|
19
|
+
| `showOutsideDays` | `boolean` | `true` | 前後の月の日を薄く表示するか。 |
|
|
20
|
+
|
|
21
|
+
`mode` は `"single"` / `"multiple"` / `"range"` で、`selected` と `onSelect` の型がそれに追従
|
|
22
|
+
します。`CalendarDayButton` は 1 日分のセルで、日付の下にドットやラベルを描きたいときに差し
|
|
23
|
+
替えます。
|
|
24
|
+
|
|
25
|
+
> [!NOTE]
|
|
26
|
+
> ロケールは `locale` プロップに `date-fns` のロケールを渡して切り替えます。`date-fns` は
|
|
27
|
+
> Vantage の依存に含まれていますが、アプリからの直接 import は避け、必要なら
|
|
28
|
+
> [`DateRangePicker`](parts/date-range-picker) 側で完結させるのが安全です。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Card
|
|
2
|
+
|
|
3
|
+
> 汎用のカード。ダッシュボードのタイルには DashboardCard を。
|
|
4
|
+
|
|
5
|
+
汎用のカードです。ダッシュボードのタイルには、余白とスケルトンまで組んである
|
|
6
|
+
[`DashboardCard`](parts/dashboard-card) の方が向いています。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import {
|
|
10
|
+
Card,
|
|
11
|
+
CardHeader,
|
|
12
|
+
CardTitle,
|
|
13
|
+
CardDescription,
|
|
14
|
+
CardAction,
|
|
15
|
+
CardContent,
|
|
16
|
+
CardFooter,
|
|
17
|
+
} from "@squadbase/vantage/ui";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## パーツ
|
|
21
|
+
|
|
22
|
+
| パーツ | 役割 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `Card` | 枠。`size`: `default` \| `sm`(内側の余白が変わる) |
|
|
25
|
+
| `CardHeader` | 見出し行 |
|
|
26
|
+
| `CardTitle` / `CardDescription` | 見出しと補足 |
|
|
27
|
+
| `CardAction` | 見出し行の右端。置くとヘッダーが自動で 2 列になる |
|
|
28
|
+
| `CardContent` | 本文 |
|
|
29
|
+
| `CardFooter` | 下端。置くとカード下部の余白が自動で詰まる |
|
|
30
|
+
|
|
31
|
+
余白は `--card-spacing` という CSS 変数 1 つで決まっているので、個別に上書きできます。
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<Card className="[--card-spacing:--spacing(6)]">…</Card>
|
|
35
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Checkbox
|
|
2
|
+
|
|
3
|
+
> チェックボックス。中間状態は indeterminate プロップで。
|
|
4
|
+
|
|
5
|
+
オン/オフの入力です。Base UI 版では `checked` が `boolean` のみを取り、中間状態は別プロップに
|
|
6
|
+
分かれています — Radix 版から移ってきた場合の最大の違いです。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { Checkbox } from "@squadbase/vantage/ui";
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
| Prop | Type | 説明 |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| `checked` | `boolean` | チェック状態。`"indeterminate"` は受け付けない。 |
|
|
15
|
+
| `indeterminate` | `boolean` | 中間状態(一部だけ選択)。`checked` とは独立。 |
|
|
16
|
+
| `onCheckedChange` | `(checked: boolean) => void` | 変更時。値は必ず boolean。 |
|
|
17
|
+
| `disabled` | `boolean` | 操作を無効にする。 |
|
|
18
|
+
|
|
19
|
+
> [!WARNING]
|
|
20
|
+
> Radix 版の `checked={"indeterminate"}` は型エラーになります。Base UI では `indeterminate` を
|
|
21
|
+
> 独立したプロップとして渡してください。
|
|
22
|
+
|
|
23
|
+
## テーブルの全選択
|
|
24
|
+
|
|
25
|
+
[`DataTable`](parts/data-table) の選択列がこの形です。
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
<Checkbox
|
|
29
|
+
checked={table.getIsAllPageRowsSelected()}
|
|
30
|
+
indeterminate={table.getIsSomePageRowsSelected()}
|
|
31
|
+
onCheckedChange={(checked) => table.toggleAllPageRowsSelected(checked)}
|
|
32
|
+
aria-label="全て選択"
|
|
33
|
+
/>
|
|
34
|
+
```
|
package/docs/ja/ui/cn.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# cn()
|
|
2
|
+
|
|
3
|
+
> 条件付きでクラスを組み立て、競合を解決するヘルパー。
|
|
4
|
+
|
|
5
|
+
`className` を条件付きで組み立てるヘルパーです。`clsx` で条件を解決し、`tailwind-merge` で競合
|
|
6
|
+
するユーティリティを解決します。
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { cn } from "@squadbase/vantage/ui";
|
|
10
|
+
import type { ClassValue } from "@squadbase/vantage/ui";
|
|
11
|
+
|
|
12
|
+
<div className={cn("p-4", isActive && "bg-accent", className)} />;
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 後から渡したクラスが勝つ
|
|
16
|
+
|
|
17
|
+
`tailwind-merge` を通しているので、競合するユーティリティは**後ろが勝ちます**。
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
cn("p-2", "p-4"); // → "p-4"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
これが効くおかげで、コンポーネントに渡した `className` が既定のスタイルを確実に上書きできます。
|
|
24
|
+
組み込みコンポーネントはすべて内部で `cn()` を使っているので、`className` は常に上書きとして
|
|
25
|
+
機能します。
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
// 既定の bg-primary を確実に打ち消せる
|
|
29
|
+
<Button className="bg-emerald-600 hover:bg-emerald-700">実行</Button>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> [!NOTE]
|
|
33
|
+
> `clsx` や `tailwind-merge` を直接 import する必要はありません(アプリからの直接 import は
|
|
34
|
+
> 避けてください)。両方まとめてこの `cn()` が公開の入り口です。
|
|
@@ -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
|
+
適しています。
|