セクションリストSectionListExperimental

事前にグループ化された行を、見出し、本文、小計フッター付きのセクションとして並べます。

プレビュー

2026年6月締め

3社
¥562,000
青山商事

広告素材 / 確認済み

確認済み¥248,000
北浜デザイン

LP制作 / レビュー中

レビュー中¥186,000
神田食品

商品撮影 / 未提出

未提出¥128,000

2026年7月締め

2社
¥418,000
渋谷出版

SNS運用 / 進行中

進行中¥96,000
西新宿物流

配送管理UI / 確認待ち

確認待ち¥322,000

状態とバリエーション

グループ別

月や荷主など、呼び出し側でまとめた区切りを表示します。

2026年6月締め

3社
¥562,000
青山商事

広告素材 / 確認済み

確認済み¥248,000
北浜デザイン

LP制作 / レビュー中

レビュー中¥186,000
神田食品

商品撮影 / 未提出

未提出¥128,000

2026年7月締め

2社
¥418,000
渋谷出版

SNS運用 / 進行中

進行中¥96,000
西新宿物流

配送管理UI / 確認待ち

確認待ち¥322,000

各セクションの footer に小計行を置けます。

2026年6月締め

3社
¥562,000
青山商事

広告素材 / 確認済み

確認済み¥248,000
北浜デザイン

LP制作 / レビュー中

レビュー中¥186,000
神田食品

商品撮影 / 未提出

未提出¥128,000
締め小計¥562,000

2026年7月締め

2社
¥418,000
渋谷出版

SNS運用 / 進行中

進行中¥96,000
西新宿物流

配送管理UI / 確認待ち

確認待ち¥322,000
締め小計¥418,000

固定見出し

実際にスクロールする領域で stickyHeaders を使います。

2026年6月締め

3社
¥562,000
青山商事

広告素材 / 確認済み

確認済み¥248,000
北浜デザイン

LP制作 / レビュー中

レビュー中¥186,000
神田食品

商品撮影 / 未提出

未提出¥128,000

2026年7月締め

2社
¥418,000
渋谷出版

SNS運用 / 進行中

進行中¥96,000
西新宿物流

配送管理UI / 確認待ち

確認待ち¥322,000

プロパティ

表は横にスクロールできます
プロパティ初期値説明
sectionsSectionListSection[]-事前にグループ化したセクションです。groupBy と小計計算は呼び出し側が持ちます。
stickyHeadersbooleanfalseスクロールコンテナ内で見出しを上部固定します。
labelReactNode-グループ全体のアクセシブル名です。
SectionListSection.title / sublabelReactNode-見出しと補助説明です。
SectionListSection.metaReactNode-見出し右側の集計表示です。
SectionListSection.contentReactNode-呼び出し側が所有する行本文です。
SectionListSection.footerReactNode-セクションごとの小計フッターです。

使い方

import { Badge, ListCard, SectionList, type SectionListSection } from "@gunjo/ui";

const sections: SectionListSection[] = [
  {
    key: "june",
    title: "2026年6月締め",
    sublabel: "3社",
    meta: "¥562,000",
    content: (
      <div className="divide-y divide-border/70">
        <ListCard title="青山商事" description="広告素材 / 確認済み" meta="¥248,000" status={<Badge variant="secondary">確認済み</Badge>} className="rounded-none border-0 bg-background px-3 py-3 shadow-none" />
        <ListCard title="北浜デザイン" description="LP制作 / レビュー中" meta="¥186,000" status={<Badge variant="secondary">レビュー中</Badge>} className="rounded-none border-0 bg-background px-3 py-3 shadow-none" />
      </div>
    ),
    footer: <><span>締め小計</span><span>¥562,000</span></>,
  },
];

export function InvoiceSectionList() {
  return (
    <div className="w-full max-w-2xl rounded-lg border bg-card p-4">
      <SectionList sections={sections} label="締め別 請求一覧" />
    </div>
  );
}

設計の判断

  • まとめ方と小計の計算を部品に持たせない。sections は既にまとまった形で渡します。何でまとめるか(取引先か、月か)も、小計の出し方も画面ごとに違うので、部品が持つのは見出しの帯・本文の置き場・小計の帯という共通の枠だけです。
  • 中身の形を決めない。content には ListCard の並びでも、Table でも、台帳の行でも入ります。資料は「7項目以上ならセパレータや見出しでまとまりを作る」を挙げていますが、そのまとまりの中身までは決めていません。GUNJO もそこを開けたままにしました。
  • 見出しを貼り付けるかどうかは宣言で選ぶ。stickyHeaders を渡したときだけ、見出しの帯がスクロール中に上へ残ります。既定で貼り付けにしていないのは、短いまとまりが多数並ぶ画面では、帯が次々に積み替わって読みにくくなるためです。
    一般のリストの設計は UIXHERO の「リスト」にあります。 UIXHERO: リスト(List)

使用コンポーネント