import { BookOpen, Boxes, Calendar, Clock3, Database, FileText, LayoutGrid, Mail, PlugZap, ReceiptText, Server, ShieldCheck, } from "lucide-react"; import { ServiceCatalogCta, ServiceLauncherCard, ServiceLauncherCardSkeleton, } from "@godxjp/ui/data-display"; import { Button, Text } from "@godxjp/ui/general"; import { Flex, PageContainer, ResponsiveGrid } from "@godxjp/ui/layout"; /** * ServiceLauncherCard — one tile for one application in an organization's launcher. * * WHY THIS PAGE IS GENERIC. It used to render this product's own service catalogue — * `attendance.godx.jp`, plans `Standard/Enterprise/Free`, a 「カタログを見る」 link — which made a * reader ask whether the component belonged in a UI framework at all. A fair question: a page that * demonstrates a product cannot demonstrate a component. The data here is therefore ANY * organization's internal tools, on RFC 2606 reserved domains, with no plan names of ours. * * WHAT IS NOT NEGOTIABLE is the state set — available / restricted / suspended / archived / * loading / catalog entry. Those ARE the component's API surface, because the component infers * nothing: `statusLabel`, `statusTone`, `disabledReason` and `action` all come from the consumer's * own entitlement contract. There is no `href`, no `available`, no `entitlement` prop to find. * * ResponsiveGrid owns the 3 → 2 → 1 ladder. The page writes no grid tracks and no page-local CSS. */ /** A section heading. Headings are headings, not Cards — a Card here would nest borders. */ function Section({ title, why, children, }: { title: string; why: string; children: React.ReactNode; }) { return ( {title} {why} {children} ); } export default function Demo() { return (
サービスを開く} /> サービスを開く} /> サービスを開く} />
サービスを開く} /> 状況を見る} /> 履歴を見る} /> 権限を確認} /> 設定を開く} /> アーカイブを見る} />
サービスを開く} /> サービスを開く} /> サービスを開く} />
申請フォームを開く} /> 一覧を開く} />
サービスを開く} /> サービスを開く} /> Open service} />
開く} /> 開く} /> 開く} />
); }