◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-06-15中級

再生成のたびに色と余白が崩れる問題を、デザイントークンの単一情報源で止める

Rorkに画面を再生成させるたびにボタンの色や余白が少しずつ変わる問題を、デザイントークンの単一情報源で止める設計です。トークンを1か所に固定して生成物に参照させる方法、CIでの逸脱検出、複数アプリで一貫性を保つ注意点まで、本番で効いた数値とともにまとめます。

Rork577デザイントークン3Expo213デザインシステム5保守性

✦ プレミアム記事

ある日、リリース済みのアプリのスクリーンショットを並べて見ていて、妙な違和感を覚えました。同じアプリの中なのに、設定画面のボタンだけ角丸が一回り大きいのです。原因をたどると、その画面だけ前の週に Rork で一度作り直していました。生成のたびに、角丸の半径が 12 から 16 へ、主要色の青がほんの少し明るいほうへ、と静かにずれていたのです。

一画面なら手で直せます。けれど個人開発で複数のアプリを抱えていると、この「じわじわ」が積み重なって、いつの間にかブランドの輪郭がぼやけます。生成 AI は指示の外側を埋めるのが得意で、色や余白のような「言わなかった部分」を毎回それらしく補完します。その補完こそが、再生成のたびの揺れの正体でした。

なぜ生成物の見た目は毎回ずれるのか

Rork が生成する Expo アプリのスタイルは、多くの場合コンポーネントの中に直接数値で書き込まれます。borderRadius: 12、padding: 16、color: "#2563EB" のような形です。これらはどの画面にも散らばっていて、再生成のときに AI が文脈から「だいたいこのくらい」と推定し直します。指示に明示されていない数値は、毎回わずかに違う値で再構成されます。

つまり揺れの根本は、見た目の決定権が無数のコンポーネントに分散していることです。決定権が散らばっている限り、再生成は揺れます。直す方向は1つで、見た目の決定を1か所に集めることです。

トークンを単一情報源にまとめる

最初の一歩は、色・余白・角丸・タイポグラフィといった「デザインの語彙」を、1つのファイルに固定することです。このファイルだけは AI に再生成させず、人間が管理します。

// tokens.ts — このアプリの見た目を決める唯一の場所
// AI に再生成させない。変更は必ずここを手で編集する
export const tokens = {
  color: {
    brand: "#2563EB",
    brandPressed: "#1D4ED8",
    bg: "#FFFFFF",
    text: "#0F172A",
    textMuted: "#64748B",
    danger: "#DC2626",
  },
  radius: { sm: 8, md: 12, lg: 16, pill: 999 },
  space: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24, xxl: 32 },
  font: { body: 16, title: 22, caption: 13 },
} as const;
 
export type Tokens = typeof tokens;

コンポーネント側は、もう生の数値を持ちません。必ずトークンを経由します。

// PrimaryButton.tsx — 生の数値を一切書かない。すべてトークン参照
import { Pressable, Text, StyleSheet } from "react-native";
import { tokens } from "../tokens";
 
export function PrimaryButton({ label, onPress }: {
  label: string; onPress: () => void;
}) {
  return (
    <Pressable onPress={onPress} style={styles.btn}>
      <Text style={styles.label}>{label}</Text>
    </Pressable>
  );
}
 
const styles = StyleSheet.create({
  btn: {
    backgroundColor: tokens.color.brand,
    borderRadius: tokens.radius.md,
    paddingVertical: tokens.space.md,
    paddingHorizontal: tokens.space.lg,
    alignItems: "center",
  },
  label: { color: "#FFFFFF", fontSize: tokens.font.body, fontWeight: "600" },
});

これで「青ボタンの角丸を 12 にする」という決定は、世界に1か所しか存在しなくなります。再生成が borderRadius を勝手に推定する余地が消えます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦再生成で色・余白・角丸がじわじわ変わる原因と、トークン単一情報源で止める設計が手に入ります
✦生成 AI に毎回トークンを参照させるためのプロンプト規約と、逸脱を検出する CI スクリプトを持ち帰れます
✦6本のアプリでブランドの一貫性を保ちながら、画面の再生成スピードを落とさない運用基準がわかります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-10-07
日本語の見出しだけ太字にならない — Android で fontWeight が効かないときの切り分けと直し方
Rork で作ったアプリで、iPhone では太字なのに Android では日本語の見出しが細いままになる症状の切り分け記事です。原因の見分け方、fontFamily を重みごとに分ける直し方、確認用コードを載せています。
⬡ 開発ツール2026-09-21
exit code 0 で止まるビルド — ログを黙らせていた設定と、空ファイルを通した存在チェック
eas build --local が exit code 0 but produced no further output で止まる件と、0 バイトのスタブが埋め込まれず dyld で落ちる件。どちらも原因は出力を減らす設定でした。自分のスクリプトを棚卸しする手順まで書き残します。
⬡ 開発ツール2026-09-07
.easignore を置くと .gitignore は読まれなくなります — EAS Build に上がるファイルを手元で数える
EAS Build がアップロードする範囲は .gitignore で決まり、.easignore を置いた時点で入れ替わります。同梱ファイルを送信前に数える手順と、親ディレクトリを除外すると感嘆符では戻せないという実測結果をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます