表示

表示の概要

表示系コンポーネントは、情報の構造、人物、状態、メディアを読み取りやすく整理するための部品です。まず用途を俯瞰し、必要な個別コンポーネントへ移動できます。

構造を見せる

情報を折りたたむ、カード化する、一覧として並べるための表示コンポーネントです。

Accordion

縦積みの開閉セクション

FAQ、設定項目、長い説明を段階的に見せたい時。

詳細を見る
設定

AccordionGroup

全展開操作付きの開閉グループ

設定項目やFAQをまとめ、すべて展開・すべて閉じる操作を付けたい時。

詳細を見る
2 / 2 件を表示All

SearchableAccordion

検索とカテゴリ付きの開閉リスト

FAQ やヘルプ項目を検索・カテゴリで絞り込みたい時。

詳細を見る
campaign_visual.png
4.5
campaign_visual.png
1200 x 900 / PNG 1.2MB / 2026-05-18

AssetCard

メディアや制作物の単体カード

選択、お気に入り、評価、プレビュー操作を持つ素材カード。

詳細を見る
campaign_visual.png
4.5
campaign_visual.png
1200 x 900 / PNG 1.2MB / 2026-05-18
product_square.png
3.5
product_square.png
1200 x 900 / PNG 1.2MB / 2026-05-18
story_mock.png
story_mock.png
1200 x 900 / PNG 1.2MB / 2026-05-18

AssetGrid

アセットカードのレスポンシブ一覧

メディアライブラリや制作物一覧をグリッドで確認する時。

詳細を見る
campaign_visual.png

ImagePreview

枠付きの画像プレビュー面

アセットカードや選択ダイアログで画像面だけを再利用したい時。

詳細を見る

人物や状態を見せる

ユーザー、参加者、分類、状態を短く伝えるためのコンポーネントです。

GU

Avatar

ユーザー画像とフォールバック

プロフィール、担当者、コメント投稿者を表す時。

詳細を見る
AK
ST
YY
+1

AvatarGroup

複数ユーザーの重なり表示

参加者、共同編集者、担当チームを省スペースで示す時。

詳細を見る
有効デザインP2

Badge

状態、分類、タグの短いラベル

状態、重要度、カテゴリ、フィルター条件を小さく表示する時。

詳細を見る

Icon

アイコンのサイズと線幅の統一

アイコンを GunjoUI の共通ルールで表示する時。

詳細を見る

表示系の共通ルール

意味がある情報はテキストでも伝え、装飾だけに頼らない。表示密度は用途に合わせて揃えます。

状態色だけで意味を伝えず、ラベルや補助テキストを併用します。

カードやグリッドは、タイトル、メタ情報、操作の位置を揃えます。

迷いやすい使い分け

似ている表示コンポーネントは、情報の単位と操作の有無で選びます。

メディア単体は AssetCard、複数一覧は AssetGrid を使います。

人物単体は Avatar、参加者のまとまりは AvatarGroup を使います。

まとめて使う見本

この分類のコンポーネントをまとめて、素材レビューの1画面を組んだ例です。そのまま貼り付けて動きます。

import {
    Badge,
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
    MetadataList,
    PersonCell,
    Separator,
    StatGroup,
    StatusLevel,
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
    Tag,
    Timeline,
} from "@gunjo/ui";

const REVIEW_LEVELS = [
    { value: "draft", label: "下書き" },
    { value: "review", label: "レビュー中" },
    { value: "approved", label: "承認済み" },
];

const METRICS = [
    { label: "未処理の素材", value: "12" },
    { label: "今週の承認", value: "5" },
    { label: "法務の確認待ち", value: "2" },
];

const ASSETS = [
    {
        id: "AS-1042",
        title: "春キャンペーンのメインビジュアル",
        tag: "デザイン",
        level: "review",
    },
    { id: "AS-1043", title: "製品ツアーのナレーション", tag: "コピー", level: "draft" },
    { id: "AS-1044", title: "料金ページのヒーロー", tag: "デザイン", level: "approved" },
];

const FACTS = [
    { label: "担当", value: "ブランド制作" },
    { label: "期日", value: "2026-06-12" },
    { label: "配信先", value: "サイトとメール" },
];

const HISTORY = [
    {
        time: "09:20",
        title: "下書きを提出",
        description: "3点がレビューに入りました。",
    },
    {
        time: "11:05",
        title: "法務からの指摘",
        description: "料金の書き方を1箇所直します。",
    },
    { time: "14:40", title: "メインビジュアルを承認", description: "配信の予約に進めます。" },
];

export function AssetReviewBoard() {
    return (
        <Card>
            <CardHeader className="gap-4">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <div className="space-y-1">
                        <CardTitle>春キャンペーンのレビュー</CardTitle>
                        <CardDescription>
                            承認する前にレビュー担当が見るものを1画面にまとめています。
                        </CardDescription>
                    </div>
                    <Badge variant="secondary">レビュー中</Badge>
                </div>
                <PersonCell
                    name="近藤 彩"
                    secondary="ブランド制作"
                    tertiary="この一括レビューの担当"
                />
            </CardHeader>
            <CardContent className="space-y-6">
                <StatGroup items={METRICS} cols={{ base: 1, sm: 3 }} />
                <Separator />
                <Table>
                    <TableHeader>
                        <TableRow>
                            <TableHead>素材</TableHead>
                            <TableHead>種別</TableHead>
                            <TableHead>状態</TableHead>
                        </TableRow>
                    </TableHeader>
                    <TableBody>
                        {ASSETS.map((asset) => (
                            <TableRow key={asset.id}>
                                <TableCell>
                                    <span className="font-medium">{asset.title}</span>
                                    <span className="block text-xs text-muted-foreground">
                                        {asset.id}
                                    </span>
                                </TableCell>
                                <TableCell>
                                    <Tag>{asset.tag}</Tag>
                                </TableCell>
                                <TableCell>
                                    <StatusLevel levels={REVIEW_LEVELS} value={asset.level} />
                                </TableCell>
                            </TableRow>
                        ))}
                    </TableBody>
                </Table>
                <div className="grid gap-6 md:grid-cols-2">
                    <MetadataList items={FACTS} />
                    <Timeline items={HISTORY} />
                </div>
            </CardContent>
        </Card>
    );
}

設計の判断

この分類のコンポーネントをいつ使い、いつ使わないかは、UIXHERO の「UIコンポーネント完全ガイド」にある「カテゴリ 03|リスト・データ表示」の節にまとめています。まとめて見せる情報の単位と、その場で操作させるかどうかで、選ぶコンポーネントが変わります。

いつ・なぜ使うか(UIXHERO)

「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。