このログでわかること#
- サイト全体のタイポを「型(Utility)」で統一する進め方
kns-*ユーティリティを追加して、ページ見出し・トップ・詳細ページまで揃える手順- トークン
--muted-foregroundを明示して、色ブレの原因(フォールバック)を潰す方法
前提#
- Next.js 16.1.3(App Router / Webpack)
- Tailwind v4(CSS-first)で
app/globals.cssは@import "tailwindcss"; styles/components.cssに@utility text-muted-foregroundを登録済み
→color: var(--muted-foreground, var(--muted));の形で@apply可能
ゴール#
目的は「タイポの統一」を最後まで仕上げること。
方針は C:個人色を少し(スタジオらしさ)。
やったことは大きく3ステップ:
- ページ見出しの型を作る
- トップの統一を完成させる
- tokens.css を整理して色ブレをなくす
Step1:ページ見出しの型を作る#
追加したユーティリティ(styles/components.css)#
ページ(Blog/Works/Tags/Search/404/Error)で使う見出しを「型」にしました。
kns-page-kickerkns-page-titlekns-lead
code block
css/* KNS Page Heading(一覧 / 検索 / エラー等) */
.kns-page-kicker {
@apply uppercase text-xs tracking-[0.28em] text-muted;
}
.kns-page-title {
@apply text-3xl font-semibold tracking-[0.04em] text-foreground sm:text-4xl;
}
.kns-lead {
@apply max-w-2xl text-sm leading-8 text-muted-foreground sm:text-base sm:leading-9;
}置換したページ#
app/blog/page.tsxapp/works/page.tsxapp/tags/page.tsxapp/search/page.tsxapp/not-found.tsxapp/error.tsx
ポイントは「どのページでも kicker → title → lead の並び」を固定し、余白の違いだけに集中できるようにしたこと。
Step2:トップの統一を完成させる#
トップ(Home)は、同じ「型」を使って揃えるのが一番効きます。
統一対象#
HeroSectionHeroLeadSectionLatestWorksSectionLatestPostsSection
揃えたルール#
- ラベル:
kns-section-label - 本文:
kns-body
code block
css.kns-section-label {
@apply uppercase text-xs tracking-[0.28em] text-muted sm:text-sm;
}
.kns-body {
@apply text-sm leading-8 text-muted-foreground sm:text-base sm:leading-9;
}Homeの各ブロックが「同じ空気」で揃うので、ページ全体の統一感が一気に上がりました。
Step3:tokens.css を整理して色ブレをなくす#
text-muted-foreground は、これまで var(--muted-foreground, var(--muted)) のフォールバックを使っていました。
ここを「明示定義」にして、色ブレの種を潰すのがStep3。
code block
css:root {
--muted: color-mix(in oklab, var(--foreground) 72%, var(--background));
--muted-foreground: var(--muted); /* ✅ 明示定義(フォールバック卒業) */
}さらに Tailwind v4 の @theme inline にも流し込み:
code block
css@theme inline {
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
}これで muted-foreground を軸にした設計が安定します。
追加改善:文字間隔が「詰まりすぎる」問題の調整#
見た目の最終チェックで「文字間隔が詰まりすぎる」感覚が出たため、ServiceSectionの気持ち良さを基準に合わせました。
kns-page-titleをtracking-tightから外し、少し余裕のある tracking に- さらに、詳細ページの header も
kns-page-*に寄せて統一 - ServiceSection も
kns-*で実装し直して「基準」をコード側に固定
この調整で、「ページ間で急に詰まった感じがする」違和感が解消しました。
変更したファイル一覧#
styles/components.cssstyles/tokens.cssapp/blog/page.tsxapp/works/page.tsxapp/tags/page.tsxapp/search/page.tsxapp/not-found.tsxapp/error.tsxapp/blog/[slug]/page.tsxapp/works/[slug]/page.tsxcomponents/sections/HeroLeadSection.tsxcomponents/sections/LatestWorksSection.tsxcomponents/sections/LatestPostsSection.tsxcomponents/sections/ServiceSection.tsx
作業のコツ#
- 「型(kns-*)」は増やしすぎない
→ 一覧/詳細/トップで本当に共通化できるところだけ作る - 詰まり/余白の違和感は「1箇所のユーティリティ」を直す
→ ページ側にtext-smなどが散ると、全体調整が難しくなる - 色は tokens 側に戻す
→ CSSの小手先より、tokenの一貫性が最終的に勝ちます
コミットログ(要点)#
style: kns-page-* を追加し Search/404/Error の見出しタイポを統一style: Blog/Works/Tags のページ見出しを kns-page-* に統一style: トップの HeroLead/Latest* を kns-section-label と kns-body に統一style: tokens に --muted-foreground を明示定義してフォールバックを卒業style: kns-page-title の tracking を緩めてタイポの詰まりを解消
次のステップでやること(優先度順・3つ)#
- “最終の基準”を決める:
kns-page-titleの tracking を0.03〜0.05emで最終固定(好みで微調整) - MDX本文(prose)側の統一:見出し/段落/コードブロックの見え方をチェックして、必要なら
proseの token を整備 - Lightテーマを本気で入れるなら:
data-theme="light"を設計して--muted-foregroundの light 値を確定
「タイポの型」が決まると、サイト全体の“統一感”は一気に安定します。ここからは、微調整が気持ちよくなるフェーズ。
