デザインを実装に落とす

更新: 2026-08-29
claude-codenextjsworkflow

/design で見た目が決まったあと、実装に渡すまでにやったことの記録。 順番を間違えると作り直しになる箇所がいくつかあった。

先に決めておくと手戻りが減るもの

1. セクションの順番

見た目より先に決める。うちのトップページは最初、

ヒーロー → 作ったもの → WIKIと開発日記の2カラム → フッター

だったのを、

ヒーロー → WIKIと開発日記の2カラム → 作ったもの → フッター
BEFOREヒーロープロダクトWIKI / 開発日記フッターAFTERヒーローWIKI / 開発日記プロダクトフッター開いた時点で読み物が目に入るようにした。カードだけが並ぶとリンク集に見える。
セクションの順番を入れ替えた。これは見た目が固まる前に決めておくべきだった。

に入れ替えた。ページを開いた時点で読み物が目に入るほうがいい、という判断だ。 これを見た目が固まったあとにやると、3案とも全部直すことになる。実際そうなった。

2. データの持ち方

デザインの段階では文字はベタ書きだが、実装では外から入る。 先に決めておくのは次の3つ。

  • どこに置くか(うちは content/works/*.mdxcontent/wiki/*.mdx)
  • 必須項目は何か
  • 空だったときに何を出すか

3つめを決め忘れると詰む。WIKIの記事が0本のとき、 左カラムに何も出さないと2カラムのバランスが崩れる。 「準備中」と出すことにした。ただしリンクにはしない。 存在しないページへ飛ばすと読者にも検索エンジンにも損になる。

3. 1行に収めたい文字がどこか

見出しを1行で見せると決めたので white-space: nowrap を当てた。 これはデスクトップ幅の話で、狭い画面では折り返させないと読めなくなる。

.hero h1 { font-size: 62px; white-space: nowrap; }

@media (max-width: 900px) {
  /* 1行に収まらない幅では折り返しを許す。詰まって読めないより良い。 */
  .hero h1 { font-size: 40px; white-space: normal; }
}

静的書き出しで踏んだ穴

Next.js を output: export で書き出している場合、 generateStaticParams() が空配列を返す動的ルートはビルドできない。

Error: Page "/wiki/[slug]" is missing "generateStaticParams()"
so it cannot be used with "output: export" config.

WIKIの記事が1本も無い状態で app/wiki/[slug]/page.tsx を置いたら、 これでビルドが止まった。関数は書いてあるのだが、返り値が空だと 「無い」と同じ扱いになる。

記事が揃うまでファイルの拡張子を変えて無効化しておき、 最初の1本を書いたら戻す、という運用にした。

一覧ページのほうは記事0本でも成立するように作ってあるので、 個別ページのルートだけ止めておけば穴は開かない。

旧デザインのトークンをどう捨てるか

CSSを全面的に書き換えると、古い変数名を参照しているページが取り残される。 うちは --slate-500 のようなインラインスタイルが /about に残っていた。

全ページを一度に書き直すと壊す範囲が広がるので、 古い変数名を新しい変数への別名として残した。

/* 旧デザインのトークン別名。ページ側を書き直すまでの互換。 */
:root {
  --slate-500: var(--ink-5);
  --slate-700: var(--ink-3);
  --slate-900: var(--ink);
}

見た目は新しい配色に寄り、ビルドも通る。 残っているページを直したら別名ごと消す。

消す前提のものは、消す条件をコメントに書いておかないと永久に残る。

WIKI一覧へ