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} ); }