基盤
全ページで共有する色、文字、余白、幅、配置のルールを確認できます。部品ごとに値を直接指定する前に、用途に合うトークンを選びます。画面幅やテーマを変えて、情報の意味と優先順位が保たれることを確認します。
1. トークン
色、文字、余白、角丸、影などの値に用途を表す名前を付け、ページと部品で共有します。値の直接指定を減らし、変更時にブログ全体の意味と見た目を同じ基準で更新できるようにします。
1-1. 色の役割
色は情報の役割、操作可能性、状態を伝えるために使います。
- Token
- Light / Darkで同じ意味を保つsemantic tokenを選ぶ
- 用途
- ニュートラルは面と文字
- 青は遷移
- 赤は破壊的状態
- 4色は記事内Callout
- 色以外の手がかり
- 色だけを唯一の手がかりにしない
var(--background) ページと面 var(--foreground) 本文と主要情報 var(--primary) 主要操作 var(--link) 遷移可能な情報 var(--secondary) 補助操作と弱い面 var(--muted-foreground) 補助情報 var(--border) 領域の境界 var(--destructive) 破壊的な操作とエラー Source src/styles/globals.css
1-2. 記事コールアウト色
Callout色は、本文から補足の種類を識別するためだけに使います。
- 適用する場所
- 面全体を塗らない
- 左2pxの境界とタイトル文字へ適用する
- 色以外の手がかり
- 色が分からなくても、見出しから意味を判断できるようにする
var(--callout-note) 追加の背景情報や参照 var(--callout-tip) 実装を進めるためのヒント var(--callout-warning) 注意が必要な条件 var(--callout-danger) 破壊的・危険な操作 Source src/styles/globals.css
1-3. 文字階層
書体、サイズ、太さ、行高で、情報の階層を伝えます。下の標本は固定段のトークンです。ページタイトルと記事タイトルには、それぞれ専用の可変サイズを使います。
- 書体
- Headerはsystem sans
- 本文と見出しはNoto Sans JP
- コードとトークン名はJetBrains Mono
- サイズと行高
- 役割ごとに黄金比φを基準に定義する
- 太さ
- 見出しはh4からh1まで、1段上がるごとに100ずつ太くする。h1は900、h2は800、h3は700、h4とルール見出しは600とし、本文は400とする
- 上位の見出しを、下位の見出しやラベルと同じ太さにしない
- 欧文・数字の大見出し(
.type-display)は、見出しの階層とは別に800とする
- Display
--font-size-display- 太さ
--font-weight-display- 用途
- 404など単一状態の強調
- Title 1
--font-size-title1- 太さ
--font-weight-section- 用途
- 固定サイズの見出し。ページタイトルは--text-page-title、記事タイトルは--text-article-titleを使う
- Title 2
--font-size-title2- 太さ
--font-weight-section- 用途
- セクション見出し
- Title 3
--font-size-title3- 太さ
--font-weight-subsection- 用途
- 小見出し
- Body
--font-size-body- 太さ
--font-weight-body- 用途
- 本文
- Small
--font-size-small- 太さ
--font-weight-body- 用途
- 補助テキスト・メタ情報
- Caption
--font-size-caption- 太さ
--font-weight-body- 用途
- 短い補足
1-4. 黄金比スペーシング
余白は、要素どうしの関係と情報の区切りを伝えるために使います。
- 値の選び方
- 黄金比φのscaleから選ぶ
- 局所的な数値を追加する前に、既存tokenで関係を表せるか確認する
- 広げる順序
- 同一要素内、部品間、セクション間、ページ外周の順に広げる
φ⁻³ --phi-neg3 var(--phi-neg3) φ⁻² --phi-neg2 var(--phi-neg2) φ⁻¹ --phi-neg1 var(--phi-neg1) φ⁰ --phi-0 var(--phi-0) φ¹ --phi-1 var(--phi-1) φ² --phi-2 var(--phi-2) φ³ --phi-3 var(--phi-3) φ⁴ --phi-4 var(--phi-4) Source src/styles/globals.css
1-5. 角丸・影
- 角丸
- 同じ面に属する情報のまとまりを伝える
- 基準は0.618rem
- 装飾だけを目的に丸めない
- 影
- 面の区切りには使わず、罫線と余白で示す
- Dialog・Popover・Menuなど、本文の前面に重なる面にだけ使う
--radius-sm--radius-md--radius-lg9999px--shadow-overlayDialog・Popover・Menuなど、本文の前面に浮く面1-6. モーション
UIの動きは短く規則的にし、表現的な動きはヒーローとくりに限ります。
- トークン
- UIのカーブとdurationは
globals.css、くりの値はKuri.astroのトークンを正本とする - くりの動きには、UIのトークンを流用しない
- UIのカーブとdurationは
- 標本
- 各カーブは現在のトークン値から描画する
- 再生すると、同じ値の動きを確認できる
UIのモーション
状態・階層・遷移を短く規則的に伝え、操作には即応します。
イージング
--ease-enter 内容の入場。減速して止まる --ease-exit 退場。加速して短く消える --ease-move 位置の移動、下線 --ease-emphasis ヒーローの見出しなど、表現的な入場 --ease-in-out 往復する動き Duration
--duration-quick ポインターへの即時反応 --duration-fast Hover、矢印 --duration-base 下線、部品の状態変化 --duration-slow 内容の入場 --duration-hero ヒーローの見出し、伸び キャラクターのモーション
くりの人格を、ポーズ、重心、間で表します。体は重く動かず、目だけが素早く動きます。
イージング
--ease-emerge 登場。罫線の下から出て、行き過ぎた位置で止まる --ease-touchdown 登場。行き過ぎた位置から足を罫線へ下ろす --ease-recover 登場。着地でつぶれた形から戻る --ease-anticipate ジャンプ前に沈む --ease-push 押し出し。離陸の速度を空中の初速へつなぐ --ease-impact 着地の反動。すぐに止まる --ease-settle 反動から静止へ。呼吸の吸う・吐く --ease-eye-lag ジャンプ中、目が体に遅れて動く --ease-eye-catch-up 遅れた目が体に追いつく --ease-eye-drop 着地の衝撃で目が落ちる --ease-blink-close まぶたは速く閉じる --ease-blink-open まぶたはゆっくり開く --ease-doze まぶたが重くなり、一度持ち直す --ease-drift-off 持ち直したまぶたが力尽きて閉じきる --ease-relax 寝入って体の力が抜ける --ease-eye-swap 開いた目の縁と眠った目の弧を入れ替える --ease-zzz-fade 起きるとzzzが消える --ease-zzz-float zzzが浮かんで消える Duration
--duration-blink-close まばたき: 閉じる --duration-blink-hold まばたき: 閉じたまま --duration-blink-open まばたき: 開く --duration-kuri-wake 起きる --duration-kuri-eye-swap 目の縁と眠った目の弧の入れ替え --duration-kuri-enter 罫線の下からの登場 --duration-kuri-jump ジャンプ --duration-kuri-doze うとうとして眠る --duration-kuri-zzz-fade 起きたときにzzzが消える --duration-kuri-zzz-float zzzが浮かんで消える1周期 --duration-kuri-breathe 呼吸の1周期 アクション
2. レイアウト原則
ページの幅、列、余白、読み順を示します。画面幅に合わせて配置を変えます。情報の優先順位とDOM順は保ちます。
2-1. ページシェル
- 構成
- Sticky Header → Main → Footerで構成する
- くりの配置
- ホームと記事一覧では、見出し下の罫線上へ置く。記事詳細には置かない
Source src/layouts/BaseLayout.astro
2-2. 16列グリッド
- 列
- Wideでは、シェルの内容幅を16列と列間の余白へ分割する。列間の余白は
--grid-gutterで16〜24pxに補間する - 主要領域の幅と位置を列で決める
- 列は配置をそろえる座標系で、CSS Gridの使用は要件にしない
- Wideでは、シェルの内容幅を16列と列間の余白へ分割する。列間の余白は
- 部品の内部
- spacing tokenで配置する
Specification docs/design/grid-system.md
2-3. Breakpoints
- 段階
- Tailwindのmdとlgに合わせた3段階
- 判定
- viewport全体の幅で判定する
- 上限は
47.999remと63.999remで書く
- 部品内部
- 3段階はページの主要領域の構成だけに使う
- 切り替えなしに収まる配置を優先する
- 切り替える場合は、内容が収まらなくなる幅を境目にし、その理由をCSSのコメントに書く
- 置き場所で幅が変わる部品は、コンテナクエリで部品の幅を判定する
| Mode | Viewport | Tailwind | 左右余白 | 主要領域 |
|---|---|---|---|---|
| Compact | 48rem未満 | 既定 | --shell-pad | 縦積み |
| Medium | 48rem以上・64rem未満 | md | --shell-pad | 縦積み |
| Wide | 64rem以上 | lg | --shell-pad | 主領域+補助領域 |
2-4. 共通のページシェル
- 最大幅
- 確認用カタログを除く全ページで同じシェルを使う。最大幅は左右の内側余白を含めて1280pxとする
- 列の分割
- 16列へ分割するのはシェルの内容幅
| 対象 | 決めること | 指定 |
|---|---|---|
| 全ページ | 外側の最大幅 | --shell-max |
| 全ページ | 左右の内側余白。画面幅に合わせて16〜40pxに補間する | --shell-pad |
| Privacy Policy | シェル幅を保ち、本文の行長を抑える | 主領域の列数とmax-inline-size |
| 検索 | シェルとは独立した重なり領域 | Command Paletteの実装 |
| 確認用カタログ | 独自のシェルにSidebarと本文を並べる。56rem未満ではSidebarを本文の上に折りたたむ | .book-shell |
2-5. 配置パターン
- Wide
- 記事詳細の本文は1〜12列、ホームの記事一覧は1〜11列へ置く
- 補助領域は13〜16列
- Medium以下
- DOM順を保ったまま全幅で縦積みする
- 記事詳細の目次は折りたたみ表示へ切り替える
2-6. 幅トークン
- 指定方法
- ページシェルは共通のCSS変数で指定する。重なり領域の幅は対応する部品で指定する
- 採用値
- シェルと列の配置は
docs/design/grid-system.mdを参照する
- シェルと列の配置は
2-7. 余白の階層
情報の関係が強いほど狭く、セクションやページの境界ほど広い余白を使います。
| 関係 | 主な値 | 実装例 |
|---|---|---|
| 同一要素内 | φ⁻³〜φ⁻¹ | ナビ間隔、タイトルと補足、カード行間 |
| 関連要素間 | φ⁰〜φ¹ | カードpadding、見出しと一覧 |
| セクション間 | φ¹〜φ² | Posts / Notes、記事header |
| ページ外周 | 左右は--shell-pad、上下は用途別のspacing token | 一覧・記事詳細・ヒーロー |
2-8. 見出しと強調の階層
ページタイトル → セクション見出し → カードタイトル → メタ情報の順に、サイズ・太さ・色を弱めます。
10. レスポンシブ・アクセシビリティ
画面幅、入力方法、動きの設定が変わっても、同じ情報と操作へ到達できるようにします。配置、キーボード操作、ARIA、Motionの最低条件を定義します。
10-1. レスポンシブ規則
- ナビゲーション
- 48rem未満では、水平ナビゲーションをMobileMenuへ切り替える
- 記事目次
- 64rem未満では、記事ヘッダー直後の折りたたみ領域へ置く
- 画像・コード・表
- 画像は親の領域幅に収める
- コードと表が親幅を超える場合は、その領域内で横スクロールできるようにする
- リンクカード
- 置き場所の幅28.5remを境に、OG画像の幅とaspect-ratioを切り替える
10-2. キーボード・ARIA
- フォーカス
- Button / Input / Navigationは視認可能なfocus ringを表示する
- Command Palette
- HTMLの
dialog要素を使う - 入力はcombobox、結果一覧はlistbox、各結果はoptionで表す
- HTMLの
- 開閉と現在地
- Mobile MenuとTOCの開閉状態は
aria-expandedで示す - 目次の現在地は
aria-current="location"で示す
- Mobile MenuとTOCの開閉状態は
- アイコン
- icon-only buttonにはaria-labelを付ける
- 装飾iconにはaria-hiddenを付ける
10-3. Motion / Loading
- 役割
- 動きで要素の関係と状態の変化を伝える
- 依存させないもの
- 情報の理解や操作の成立を、animationへ依存させない
- Reduced motion
prefers-reduced-motion: reduceでは不要なanimationを停止する
- 画像の読み込み
- Cosense画像は表示領域へ近づいてから読み込み、opacity transitionで表示する