Skip to content

04. StitchのデザインをExpoで作れる形に分解する

Google Stitchで画面とデザインシステム(配色・共通パーツ)が決まったら、いよいよそれらを**「Expo (React Native) のコードに落とし込める部品単位」に分解する設計作業**に進みます。

Webサイト開発用のHTML/CSSと、スマートフォンアプリ開発用のReact Nativeには、レイアウトの仕組みや制約にいくつかの重要な違いがあります。

Stitchのビジュアルをそのままコード化しようとする前に、React Nativeのコンポーネント構造やStyleSheetの基本ルールに沿って「分解」しておくことで、AIエージェント(GitHub Spec Kit)が迷わずに一発で動作するクリーンなコードを生成できるようになります。


この記事では、ビジュアルデザインをコード可能なコンポーネントへと分解するプロセスを以下の内容で解説します。

  1. ビジュアル要素からReact Native基本コンポーネントへのマッピング
  2. 再利用性を意識したディレクトリ構成とコンポーネント設計(Figmaエクスポート・コード同期含む)
  3. CSSからReact Native StyleSheet(CSS-in-JS)への変換ルール
  4. スマホ開発特有のレイアウト制約と対策(セーフエリア・キーボード)
  5. コンポーネント分解時のセルフチェック
  6. まとめと次のステップ

1. ビジュアル要素からReact Native基本コンポーネントへのマッピング

Section titled “1. ビジュアル要素からReact Native基本コンポーネントへのマッピング”

Stitchで作成したワイヤーフレームを眺め、それぞれの要素がReact Nativeのどのコアコンポーネントに該当するかをマッピングします。

Stitchのビジュアル要素React Nativeのコアコンポーネント主な用途・注意点
画面の土台・四角い枠・仕切り<View>レイアウトの最小単位。HTMLの <div> に相当。
テキスト・数値・ラベル<Text>文字を表示するための唯一のコンポーネント。必ずこのタグで囲む必要があります。
ボタン・タップ可能なリスト・アイコン<TouchableOpacity> または <Pressable>タップ時にフィードバックを与えるためのコンポーネント。
アイコン画像・ユーザーのアバター<Image> または <Expo Vector Icons>ベクターアイコンにはExpo標準の vector-icons ライブラリを使用するのが標準的です。
入力フォーム・テキストエリア<TextInput>ユーザーが文字を入力する部分。

2. 再利用性を意識したディレクトリ構成とコンポーネント設計

Section titled “2. 再利用性を意識したディレクトリ構成とコンポーネント設計”

Stitchで作成した画面から、「複数の画面で共通して使う部品」と「その画面専用の部品」を切り分けます。

  1. Screens(画面・コンテナ)app/ ディレクトリ内のルーティングに対応するファイル。状態(State)を管理し、APIやデータベースと通信します。
  2. Feature Components(機能コンポーネント):特定の画面に依存する複雑なUI(例:components/HabitCard.tsx - ダッシュボードの習慣カード)。
  3. UI Components(共通パーツ):アプリ全体で使い回す汎用的なUI(例:components/ui/Button.tsx, components/ui/Input.tsx)。

これらを切り分けておくことで、AIに「この画面を作って」と指示する際、「すでに作成済みの components/ui/Button を使って実装して」と部品を組み立てる指示が可能になり、コードの重複を防げます。

StitchからFigmaへのエクスポートとAuto Layoutの活用

Section titled “StitchからFigmaへのエクスポートとAuto Layoutの活用”

Stitchで決定したレイアウトは、Figmaへエクスポート(「Copy to Figma」または html.to.design 等の変換プラグインを使用)することができます。

  • Auto Layout(オートレイアウト)の維持:StitchからFigmaに送られたデザインは、画像ではなく、Figmaの「Auto Layout」機能が設定された編集可能なレイヤーとして展開されます。
  • React Native Flexboxとの親和性:FigmaのAuto Layoutにおける方向設定(垂直/水平)、アイテムの間隔(Gap)、内側の余白(Padding)は、React Nativeの flexDirectiongappadding スタイルとほぼ1対1で対応しています。

エクスポートしたFigmaのAuto Layout設定値を読み解くことで、StyleSheetへの変換(分解)作業の難易度が大幅に下がり、正確なレイアウト実装が可能になります。

コードベースのインポートと双方向同期

Section titled “コードベースのインポートと双方向同期”

Stitchはデザインを生成するだけでなく、あなたの実際のソースコードと直接「同期」する先進的な機能を備えています。

  • 既存コードベースのインポート:開発中のExpo (React Native) プロジェクトのディレクトリをStitchに直接インポートして読み込ませることができます。AIがソースコード内のコンポーネント定義やStyleSheetを解析し、デザインキャンバス上に対応するビジュアルUIを瞬時に再構築します。
  • ビジュアルとコードの双方向同期(Sync):Stitch上でボタンをドラッグして並べ替えたり、インプレイス編集(In-place Edits)で色や余白を変更すると、Stitchが自動的にローカルのソースコード(TSX/StyleSheet)を直接書き換えて更新します。逆に、コードを手動で修正した場合も、Stitchのデザインキャンバス上にリアルタイムで変更が反映されます。

この同期機能により、「デザインの修正」と「コードの実装」の垣根が完全に消滅し、手戻りのない直感的なアプリ開発(VibeCoding)が可能になります。


3. CSSからReact Native StyleSheet(CSS-in-JS)への変換ルール

Section titled “3. CSSからReact Native StyleSheet(CSS-in-JS)への変換ルール”

React NativeではWebのCSSがそのまま動くわけではありません。JavaScriptのオブジェクトとして記述する StyleSheet.create を用います。Stitchからコードへ変換する際の主要なルールは以下の通りです。

Flexboxの初期値の違い(最重要)

Section titled “Flexboxの初期値の違い(最重要)”
  • Web CSSflex-direction の初期値は row(横並び)。
  • React Nativeflex-direction の初期値は column(縦並び)。スマホは縦長画面が基本であるためです。

React Nativeのスタイルでは、数値は単位なしのピクセル(論理ピクセル:dp / pt)で表します。

  • Webmargin: 16px;
  • React Nativemargin: 16,

Stitchで作成した美しいドロップシャドウをコード化する際、OS間での表現の違いに対応する必要があります。

  • iOSshadowColor, shadowOffset, shadowOpacity, shadowRadius を使って繊細にコントロール。
  • Android:Android OSの仕様上、elevation という単一の数値プロパティのみで制御します。

4. スマホ開発特有のレイアウト制約と対策(セーフエリア・キーボード)

Section titled “4. スマホ開発特有のレイアウト制約と対策(セーフエリア・キーボード)”

Stitchのデザインを実機で再現する際、スマホならではのハードウェアの制約をクリアする必要があります。

セーフエリア(Safe Area)の確保

Section titled “セーフエリア(Safe Area)の確保”

iPhoneのノッチ(画面上部の凹凸)や画面下部のホームバー(黒い線)と、アプリのUIが被らないように設計します。

  • 対策:画面の最外殻は <View> ではなく、expo-routerreact-native-safe-area-context が提供する <SafeAreaView> で囲み、コンテンツが適切な領域内に収まるようにします。

Webブラウザとは異なり、React Nativeの通常の <View> はコンテンツが画面外にはみ出しても自動でスクロールしません。

  • 対策:習慣リストや設定画面など、要素が多くなる可能性がある部分は、必ず <ScrollView> や、大量データの描画に最適化された <FlatList> を用いてコーディングするようAIに指示します。

入力フォーム(<TextInput>)をタップした際、下からせり上がってくるキーボードによって入力欄が隠れてしまう問題が発生します。

  • 対策:キーボードの高さに合わせて画面全体を自動でスライドアップさせる <KeyboardAvoidingView> の組み込みを仕様として定義します。

5. コンポーネント分解時のセルフチェック

Section titled “5. コンポーネント分解時のセルフチェック”

分解図とコンポーネントリストを作成したら、以下の点を確認します。

  • 縦横方向の整合性:各コンポーネントが横並び(flexDirection: 'row')なのか縦並び(flexDirection: 'column')なのか明確に区別できているか?
  • 動的データの考慮:習慣カード内の「習慣の名前の長さ」によってレイアウトが崩れないよう、文字の切り詰め(numberOfLines)などのルールが考慮されているか?
  • 状態遷移の対応:読み込み中(Skelton UI)や、リストが空のときの表示コンポーネントが定義されているか?

この記事では、Google StitchのビジュアルデザインをExpo (React Native) で実装可能なコンポーネント単位やスタイルシート(StyleSheet)の仕様に分解する方法を学びました。

いよいよリデザイン編の最終章です。これまでに作成した画面案、ユーザー導線、スタイルルール、コンポーネント分解の成果物を1つのドキュメント(デザイン企画書・仕様書)に集約し、開発AI(GitHub Spec KitやAntigravity IDE)にインプットする準備を整えましょう。

次の記事では、AI共同開発の司令書を作成する「05. VibeCoding用のデザイン企画書を作る」に進みましょう。