Design System
5層の合成階層で構造化された、形式検証済みデザインシステム。
すべてのトークンは閉じた語彙として全量定義され、自動ゲートで違反を検出する。
Formal Verification
10 DOMAINS VERIFIEDClosed Vocabulary
Violation Detection
Theme Customizer
Quality Loop
Diagram Vocabulary
DTCG Tokens
Intentional Constraints
8 CONSTRAINTSDo / Don't
Compliance Evidence
5 PROJECTS VERIFIEDQuick Access
Getting Started
Hover Utilities
4 UTILITIESTouch Targets
WCAG 2.5.5Interaction Media Queries
3 QUERIESResponsive Spacing
6 SIZES x 3 BREAKPOINTSBreakpoints
4 BREAKPOINTS — SSoTFoundationファウンデーション
設計のすべての判断に先立って確定する、制約(Principle)と素材(Reference)を定める。
Principleプリンシプル
設計判断を制約する、破ることが許されないルール。「推奨」や「ベストプラクティス」は含まない。Principle は守らなければ設計が壊れるものだけを定める。
Brandブランド
視覚的な同一性を維持するための不変の制約。使用可能な色の範囲、書体の指定、形状のルール(radius 2値制限等)を含む。
Accessibilityアクセシビリティ
すべての利用者が情報にアクセスできることを保証する最低基準。コントラスト比、タップターゲットサイズ、reduce-motion 対応、フォーカス可視化を含む。
Touch Targetsタッチターゲット
インタラクティブ要素の最低タップ領域。WCAG 2.5.5 に準拠し、最低 44px、推奨 48px、ターゲット間隔 8px 以上を保証する。
Interaction Mediaインタラクションメディア
デバイスの入力方式とユーザー設定に応じてインタラクションを自動切替するメディアクエリ。hover: hover / hover: none / prefers-contrast: more の3種。
Qualityクオリティ
設計と実装の間の翻訳ロスを構造的に防止するルール。TIP、SIA、ハードコード禁止、単一真実源の原則を含む。
Disabledディスエイブルド
操作不可状態の視覚表現。テキスト gray-400、背景 gray-100/200、cursor not-allowed。opacity ではなく固定色で制御する。
Referenceリファレンス
Principle に従って許可された、意味を持たない生の値の一覧。Token から参照される元の値であり、ここに定義されていない値はシステム内で使用できない。
Colorカラー
使用が許可された色の値の全量。グレースケール(gray-50〜950)、白、黒を含む。これ以外の色値はシステム内に存在しない。
Typographyタイポグラフィ
使用が許可された書体・サイズ・ウェイトの全量。フォントファミリー(base / accent / mono)、フォントサイズ(12〜96px の12段階)、フォントウェイト(400 / 500 / 700 / 800)を含む。
Spacingスペーシング
使用が許可された余白の値の全量。0, 2, 4, 8, 12, 16, 24, 32, 48, 64, 96px の11段階を含む。これ以外の余白値はシステム内に存在しない。
Shapeシェイプ
要素の輪郭を決定する値の全量。角丸(0px / 9999px の2値)、線幅(0px / 1px)、影(none / sm / md / lg)を含む。
Motionモーション
時間的変化を制御する値の全量。持続時間(0 / 75 / 150 / 300 / 500ms)、イージング関数、reduce-motion フラグを含む。
Breakpointブレークポイント
レスポンシブ切り替えが発生する画面幅。DS Foundation は sm(480) / md(640) / lg(1024) / xl(1440) の4段階。max-width 禁止、全画面幅 + padding + fluid grid で対応する。
Iconアイコン
使用が許可されたアイコンの全量。Lucide React(SVGベース)から選択する。カスタムSVGは最終手段。
Tech Boundary技術境界
Tailwind CSS / shadcn/ui / 独自定義の境界。何がフレームワーク提供で、何が SEEHUB 独自の「顔」かを明示する。
Tokenトークン
Foundation の値を基に、設計意図を伝える名前付きの値を定める。値の「存在」は Foundation が定め、値の「実装」は Component が行う。Token は両者の間で意味の橋渡しを担う。
Colorカラー
色の値に「何のための色か」という役割を与える。背景(surface)、テキスト(on-surface)、浮上面(surface-raised)、境界線(border)、補助(muted)を含む。
surfaceサーフェス
ページやコンポーネントの背景として使われる色。テキストや要素はこの上に載る。on-surface とペアで機能する。
on-surfaceオンサーフェス
surface の上に載るテキスト・アイコンの色。surface との組み合わせで WCAG AA コントラスト比を保証する。
surface-raisedサーフェスレイズド
surface より視覚的に手前にある面の色。Card, Dialog, Sheet の背景に使う。surface とは影または境界線で区別される。
borderボーダー
要素の境界や区切り線の色。surface 上で視認でき、on-surface より控えめな濃度を持つ。
mutedミューテッド
補助的なテキストや無効状態の色。on-surface より低いコントラストで、情報の優先度が低いことを示す。
Typographyタイポグラフィ
書体・サイズ・ウェイト・行間・字間を1つの役割名にまとめた、テキストの見え方の定義。各ロールは5つの属性のセットである。
displayディスプレイ
ページ内で最も大きく、最も重い見出し。Hero セクションの一行タイトルに限定して使用する。
headlineヘッドライン
ページ内の主要な区切りを示すセクション見出し。display より小さく、title より大きい。HTML の h2 相当。
titleタイトル
コンポーネント内の小見出し(Card のタイトル、List のグループ名等)。headline より小さく、body より大きい。
bodyボディ
本文テキスト。読みやすさを最優先に設計された既定のテキストスタイル。ページ内で最も多く使われる。
body-smボディスモール
body より小さい本文。補足説明やテーブルセルなど、情報密度を高めたい箇所に使う。
labelラベル
UI 要素に付随するラベルやキャプション。body-sm より小さく、ウェイトと字間で body 系と視覚的に区別される。
Spacingスペーシング
余白の値に「要素間の関係性」という意味を与える。4段階の関係性を定義し、「近さ = 関係の強さ」という原則を体現する。
inlineインライン
同一の Component 内部で使われる間隔。Component の境界の内側に限定される。
blockブロック
異なる Component 間で、同一の Pattern 内に属する要素間の間隔。Pattern の内側、Component の外側。
groupグループ
異なる Pattern 間の間隔。関連はあるが別のまとまりであることを視覚的に示す。
sectionセクション
ページ内の大きな区切りを示す間隔。異なる話題・機能・コンテキストの境界に使う。
Responsiveレスポンシブ
画面幅に応じた非線形余白圧縮。大きな値ほど圧縮率が高く(最大50%)、小さな値は維持。3段階のブレークポイント(<480/480-639/640+)で4pxグリッド上の値に変換。
Component Tokenコンポーネントトークン
特定のコンポーネントに固有の設計値を名前付きで定義する。Color / Typography / Spacing のロールでは表現できないコンポーネント固有の判断を含む。
Hover Utilitiesホバーユーティリティ
4種類のホバーユーティリティクラス。hover-invert(ボタン・ナビ)、hover-elevate(カード)、hover-deepen(暗背景)、ds-card-hover(リスト項目)。メディアクエリで pointer / touch を自動切替。
Componentコンポーネント
Token の値を使って画面上に表示される、単一の責務を持つ独立した UI 部品を定義する。複数の Component の組み合わせ方は Pattern の責務であり、Component は「それ以上分割すると役割を失う単位」を定義する。
Actionアクション
操作を受けて状態変化やイベントを発火させる部品。コンテンツを内部に持たず、移動先を構造的に提示しない。
LinkリンクWCAG AA
テキストベースのクリック可能な要素。Navigation コンポーネント内で使用される場合もある。
import { LinkButton } from "@/components/client/LinkButton"
<LinkButton href="/about" variant="primary">詳細</LinkButton>| Prop | Type | Default | Description |
|---|---|---|---|
| href* | string | — | リンク先URL |
| children* | ReactNode | — | リンクテキスト |
| external | boolean | false | 新しいタブで開く |
Containerコンテナー
他のコンテンツを内部に持ち、視覚的な境界や表示制御で中身の存在場所を管理する部品。
CardカードWCAG AA
視覚的な境界で囲まれた、自己完結したコンテンツのまとまり。
import { Card, CardHeader, CardContent, CardFooter } from "@/components/ui/card"
<Card>
<CardHeader>タイトル</CardHeader>
<CardContent>内容</CardContent>
</Card>| Prop | Type | Default | Description |
|---|---|---|---|
| variant | "default" | "outline" | "elevated" | "default" | カードスタイル |
| children* | ReactNode | — | カード内容 |
DialogダイアログWCAG AA
モーダルなオーバーレイ。ユーザーの注意を排他的に要求する。
import { Dialog, DialogTrigger, DialogContent } from "@/components/ui/dialog"
<Dialog>
<DialogTrigger>開く</DialogTrigger>
<DialogContent>モーダル内容</DialogContent>
</Dialog>| Prop | Type | Default | Description |
|---|---|---|---|
| open | boolean | — | 制御モード: 開閉状態 |
| onOpenChange | (open: boolean) => void | — | 開閉時コールバック |
| children* | ReactNode | — | Trigger + Content |
SheetシートWCAG AA
画面端からスライドするパネル。Dialog より軽量な割り込み。
import { Sheet, SheetTrigger, SheetContent } from "@/components/ui/sheet"
<Sheet>
<SheetTrigger>開く</SheetTrigger>
<SheetContent>パネル内容</SheetContent>
</Sheet>| Prop | Type | Default | Description |
|---|---|---|---|
| side | "left" | "right" | "top" | "bottom" | "right" | スライド方向 |
| open | boolean | — | 制御モード: 開閉状態 |
| onOpenChange | (open: boolean) => void | — | 開閉時コールバック |
| children* | ReactNode | — | パネル内容 |
AccordionアコーディオンWCAG AA
展開/折りたたみでコンテンツの表示を制御する。排他的でない独立開閉。
import { Accordion, AccordionGroup } from "@/components/sia/Accordion"
<AccordionGroup>
<Accordion label="セクション1">内容1</Accordion>
<Accordion label="セクション2">内容2</Accordion>
</AccordionGroup>| Prop | Type | Default | Description |
|---|---|---|---|
| label* | string | — | 開閉トリガーのテキスト |
| defaultOpen | boolean | false | 初期開閉状態 |
| children* | ReactNode | — | 折りたたみ内容 |
Drawerドロワー
画面下部からスライドするモバイル向けパネル。Sheet のモバイル特化版。
Displayディスプレイ
情報の視覚的な提示を主目的とする部品。操作は補助的に付随しうる。
BadgeバッジWCAG AA
ステータスやカウントを小さなラベルで表示する。
import { Badge } from "@/components/ui/badge"
<Badge variant="default">ラベル</Badge>| Prop | Type | Default | Description |
|---|---|---|---|
| variant | "default" | "outline" | "subtle" | "default" | バッジスタイル |
| children* | ReactNode | — | ラベルテキスト |
TableテーブルWCAG AA
構造化データを行と列で表示する。ソート等の操作を補助的に持つ。
import { Table } from "@/components/sia/Table"
<Table
headers={["名前", "値"]}
rows={[
["色", "gray-900"],
["間隔", "16px"]
]}
/>| Prop | Type | Default | Description |
|---|---|---|---|
| headers* | string[] | — | 列見出し |
| rows* | string[][] | — | 行データ |
| striped | boolean | true | 行ストライプ |
ListリストWCAG AA
関連する項目を縦に並べて表示する。
import { List } from "@/components/sia/List"
<List items={["項目1", "項目2", "項目3"]} ordered={false} />| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | リスト項目 |
| divider | boolean | true | 項目間の区切り線 |
AvatarアバターWCAG AA
ユーザーやエンティティを画像またはイニシャルで表す。
import { Avatar } from "@/components/ui/avatar"
<Avatar src="/avatar.png" alt="ユーザー名" size="md" />| Prop | Type | Default | Description |
|---|---|---|---|
| src | string | — | 画像URL |
| alt* | string | — | 代替テキスト |
| size | "lg" | "md" | "sm" | "md" | サイズ |
| fallback | string | — | 画像なし時のイニシャル |
TooltipツールチップWCAG AA
ホバーまたはフォーカスで補足情報を一時的に表示する。
import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip"
<Tooltip>
<TooltipTrigger>ホバー</TooltipTrigger>
<TooltipContent>補足情報</TooltipContent>
</Tooltip>| Prop | Type | Default | Description |
|---|---|---|---|
| delayDuration | number | 300 | 表示遅延(ms) |
| children* | ReactNode | — | Trigger + Content |
EmptyStateエンプティステートWCAG AA
データが存在しない状態を視覚的に伝え、次のアクションを案内する。
import { ErrorDisplay } from "@/components/mirror/ErrorDisplay"
<ErrorDisplay message="データがありません" />| Prop | Type | Default | Description |
|---|---|---|---|
| title* | string | — | 空状態のタイトル |
| description | string | — | 詳細テキスト |
| action | ReactNode | — | CTAボタン等 |
DividerディバイダーWCAG AAA
コンテンツ間の視覚的な区切り線。水平と垂直がある。
TagタグWCAG AA
カテゴリやフィルター条件を表すラベル。削除可能なバリアントを持つ。
PopoverポップオーバーWCAG AA
クリックで表示される浮遊パネル。Tooltip より多くの内容を持つ。
Feedbackフィードバック
システムの状態変化を一時的にユーザーに通知する部品。表示の開始と終了が時間的に制御される。
ToastトーストWCAG AA
一時的な通知メッセージ。自動で消える。
import { toast } from "@/components/ui/toast"
toast({ title: "保存しました", duration: 3000 })| Prop | Type | Default | Description |
|---|---|---|---|
| title* | string | — | 通知タイトル |
| description | string | — | 詳細テキスト |
| duration | number | 3000 | 自動消去時間(ms) |
ProgressプログレスWCAG AA
処理の進行状況をバーまたはスピナーで表示する。
import { Progress } from "@/components/ui/progress"
<Progress value={60} max={100} />| Prop | Type | Default | Description |
|---|---|---|---|
| value* | number | — | 現在値 |
| max | number | 100 | 最大値 |
SkeletonスケルトンWCAG AA
コンテンツ読み込み中にレイアウトの骨格を表示する。
import { LoadingSpinner } from "@/components/mirror/LoadingSpinner"
<LoadingSpinner />| Prop | Type | Default | Description |
|---|---|---|---|
| width | string | number | "100%" | 幅 |
| height | string | number | 20 | 高さ |
| variant | "text" | "rectangular" | "circular" | "text" | 形状バリアント |
AlertアラートWCAG AA
重要な情報を目立つ形式でインラインに表示する。Toast と異なりページ内に留まる。
Inputインプット
ユーザーからの値の入力を受け取る部品。フォーム送信に使用されるデータの入力手段を提供する。
TextFieldテキストフィールドWCAG AA
テキストの入力・編集を受け付ける。単行と複数行がある。
import { Input } from "@/components/ui/input"
<Input
type="text"
placeholder="名前を入力"
size="md"
/>| Prop | Type | Default | Description |
|---|---|---|---|
| type | "text" | "email" | "password" | "number" | "text" | 入力タイプ |
| size | "lg" | "md" | "sm" | "md" | 高さ: lg=48px, md=40px, sm=32px |
| placeholder | string | — | プレースホルダーテキスト |
| error | string | — | エラーメッセージ(表示時にborder変化) |
| disabled | boolean | false | 操作不可状態 |
SelectセレクトWCAG AA
定義済みの選択肢から1つまたは複数を選ぶ。
import { Select, SelectTrigger, SelectContent, SelectItem } from "@/components/ui/select"
<Select>
<SelectTrigger>選択</SelectTrigger>
<SelectContent>
<SelectItem value="a">オプションA</SelectItem>
</SelectContent>
</Select>| Prop | Type | Default | Description |
|---|---|---|---|
| value | string | — | 選択値(制御モード) |
| onValueChange | (value: string) => void | — | 選択変更コールバック |
| placeholder | string | — | 未選択時テキスト |
| disabled | boolean | false | 操作不可状態 |
CheckboxチェックボックスWCAG AA
複数の選択肢から任意の数を選ぶ。独立した boolean 値。
import { Checkbox } from "@/components/ui/checkbox"
<Checkbox id="agree" label="同意する" />| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | — | チェック状態 |
| onCheckedChange | (checked: boolean) => void | — | 変更コールバック |
| label | string | — | ラベルテキスト |
| disabled | boolean | false | 操作不可状態 |
RadioラジオWCAG AA
複数の選択肢から排他的に1つを選ぶ。
import { RadioGroup, RadioItem } from "@/components/ui/radio"
<RadioGroup>
<RadioItem value="a" label="オプションA" />
<RadioItem value="b" label="オプションB" />
</RadioGroup>| Prop | Type | Default | Description |
|---|---|---|---|
| value* | string | — | 選択値 |
| onValueChange | (value: string) => void | — | 選択変更コールバック |
| children* | ReactNode | — | RadioGroup.Item 要素 |
SwitchスイッチWCAG AA
ON/OFF の二値を即時に切り替える。Toggle と同義。
import { Switch } from "@/components/ui/switch"
<Switch id="notify" label="通知を有効にする" />| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | — | ON/OFF状態 |
| onCheckedChange | (checked: boolean) => void | — | 変更コールバック |
| label | string | — | ラベルテキスト |
| disabled | boolean | false | 操作不可状態 |
SliderスライダーWCAG AA
範囲内の連続値をドラッグで選択する。
import { Slider } from "@/components/ui/slider"
<Slider min={0} max={100} step={1} defaultValue={[50]} />| Prop | Type | Default | Description |
|---|---|---|---|
| value | number[] | — | 現在値 |
| onValueChange | (value: number[]) => void | — | 値変更コールバック |
| min | number | 0 | 最小値 |
| max | number | 100 | 最大値 |
| step | number | 1 | ステップ幅 |
| disabled | boolean | false | 操作不可状態 |
Structureストラクチャー
コンテンツの配置方向と間隔を制御する構造部品。視覚的な境界を持たない。
Wrapperラッパー
コンテンツに max-width と padding を与える構造的な囲み。視覚的な境界を持たない。
import { PageLayout } from "@/components/mirror/PageLayout"
<PageLayout>ページコンテンツ</PageLayout>| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | ラップ対象 |
| padding | "sm" | "md" | "lg" | "md" | 内部余白サイズ |
Stackスタック
子要素を縦方向に積む。gap で間隔を制御する。
// CSS flex-direction: column
<div className="flex flex-col gap-4">
<div>Item 1</div>
<div>Item 2</div>
</div>| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | 積む対象 |
| gap | number | 16 | 子要素間の間隔(px) |
| align | "start" | "center" | "end" | "stretch" | "stretch" | 水平揃え |
Clusterクラスター
子要素を横方向に並べる。折り返しを許容する。
// CSS flex-wrap: wrap
<div className="flex flex-wrap gap-2">
<Badge>Tag 1</Badge>
<Badge>Tag 2</Badge>
</div>| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | 並べる対象 |
| gap | number | 8 | 子要素間の間隔(px) |
| justify | "start" | "center" | "end" | "between" | "start" | 水平配置 |
| wrap | boolean | true | 折り返し許可 |
Gridグリッド
子要素を行と列の格子状に配置する。レスポンシブなカラム数を制御する。
// CSS Grid
<div style={{
display: "grid",
gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))",
gap: 24
}}>
<Card />
<Card />
</div>| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | 配置対象 |
| columns | "1" | "2" | "3" | "4" | "auto" | "auto" | カラム数 |
| gap | number | 16 | セル間の間隔(px) |
Sectionセクション
ページ内の意味的な区画。section spacing を上下に持つ。
| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | セクション内容 |
| spacing | "sm" | "md" | "lg" | "md" | 上下余白サイズ |
ScrollAreaスクロールエリアWCAG AA
カスタムスクロールバーを持つスクロール可能な領域。ネイティブスクロールのアクセシビリティを維持する。
AspectRatioアスペクトレシオWCAG AAA
子要素のアスペクト比を固定する構造部品。画像・動画の表示に使用する。
Patternパターン
複数の Component を特定の順序・間隔・関係性で組み合わせた、再利用可能な構成の型を定義する。定義されていない新しい組み合わせは L1-L2 の制約内で許容される。
Formフォーム
Input 系 Component をラベル・ヘルパーテキスト・エラー表示と組み合わせ、データ入力の一連の流れを構成する。
Heroヒーロー
ページ冒頭で最大のタイポグラフィと CTA を組み合わせ、ページの主題を伝える構成。display トークンを使用する唯一の Pattern。
CardGridカードグリッド
同種の Card を Grid 上に均等配置し、一覧性を提供する構成。
PageHeaderページヘッダー
Breadcrumb・ページタイトル・サブタイトルを縦に積み、ページの見出し領域を構成する。
DataTableデータテーブル
Table Component にヘッダー・行・ページネーションを組み合わせ、構造化データの閲覧手段を構成する。
ContentSectionコンテントセクション
見出し・本文・(任意の)CTA を縦に積み、ページ内の1つの話題を構成する。最も頻繁に繰り返される Pattern。
Diagramダイアグラム
関係構造を可視化する図表パターン。10型の閉じた語彙(contain / overlap / position / hierarchy / flow / fork / degree / timeline / spatial / cycle)から関係型に対応する図型を選ぶ。
Layoutレイアウト
Pattern と Component をページ全体に配置する空間構造を定義する。各領域に「何を置くか」は Pattern とアプリケーションの責務であり、Layout は「どこに空間があるか」だけを定義する。
Defaultデフォルト
Header・Main・Footer を縦に積む最も基本的な1カラム構造。他の Layout が適用されないすべてのページに適用される。
Articleアーティクル
長文コンテンツに最適化した構造。Main の幅を制限し、任意で目次を側面に配置する。
Dashboardダッシュボード
情報密度の高いデータ表示に最適化した構造。Main 内部に Grid による複数パネル配置を前提とする。