import { useState } from "react";
import {
Badge,
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@godxjp/ui/data-display";
import { Button, Text } from "@godxjp/ui/general";
import {
Flex,
OrgSwitcher,
type OrgSwitcherLabels,
PageContainer,
ResponsiveGrid,
} from "@godxjp/ui/layout";
const organizations = [
{
id: "godx",
name: "Godx株式会社",
meta: "Owner",
// `badgeLabel` is what a screen reader announces — the trigger's accessible name comes from
// `labels.trigger`, so the visual Badge alone would never reach assistive technology.
badge: Trial,
badgeLabel: "トライアルプラン",
},
{
id: "platform",
name: "非常に長い組織名株式会社プラットフォーム開発本部",
meta: "Member",
badge: Enterprise,
badgeLabel: "エンタープライズプラン",
},
{ id: "suspended", name: "Archived Workspace", meta: "利用停止", disabled: true },
];
const labels: OrgSwitcherLabels = {
trigger: (name) => `現在の組織: ${name}`,
title: "組織を選択",
search: "組織を検索",
empty: "組織が見つかりません。",
loading: "組織を読み込み中",
retry: "再試行",
};
/**
* OrgSwitcher — controlled organization selection plus explicit loading and recoverable error
* states. Use the responsive mode to inspect the popover contract without viewport inference.
*/
export default function Demo() {
const [value, setValue] = useState("godx");
const [error, setError] = useState("組織一覧を取得できませんでした。");
return (
デスクトップの組織選択
検索可能なpopover。選択状態はconsumerが保持します。`responsive="auto"`は共有
トークン `--sheet-responsive-breakpoint-width`(48rem)で popover と bottom sheet
を切り替えます。badgeはtriggerとmenu行の末尾に並びます(collapsed時は非表示)。
選択中: {organizations.find((organization) => organization.id === value)?.name}
非同期状態
loadingとerrorは選択操作の代わりに同じ所有surfaceへ表示されます。
setError(undefined)}
responsive="popover"
/>
{!error ? (
) : null}
);
}