ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-03-29上級

デザインシステム × AI開発の — UI Stack・AutoLayout・Variables で迷わない開発体制を構築する

UI Stack・AutoLayout・Variables・VRTを統合したデザインシステムとAI開発の完全体系。マルチエージェント自動化パイプライン構築、デザイン制作の委譲、VRT自動化までの実装ガイド。

デザインシステムUI StackAutoLayoutVariablesVRTAI開発12

プレミアム記事

デザインシステムとAIの融合は、現代的な開発組織の最前線です。UI Stack・AutoLayout・Variables・VRTを体系的に統合することで、デザイナー・エンジニア・AIエージェントが完全に調和した開発体制が実現します。本ガイドは、その完全な実装パターンと運用哲学を解説します。

UI Stack とは:5つの状態管理

UI Stack は Scott Hurff が提唱した設計思想で、すべての UI は以下の 5 つの状態を必ず持つという考え方です:

  1. Ideal State(理想状態): データが充分にあり、すべてが正常に機能している状態
  2. Loading State(読み込み状態): データ取得中で、スケルトンやスピナーが表示されている状態
  3. Empty State(空状態): データが存在しない、または初期化時の状態
  4. Error State(エラー状態): API呼び出しやバリデーション失敗時の状態
  5. Partial State(部分的状態): 一部データのみ利用可能、または段階的読み込み中の状態

Ideal State の実装パターン

// components/ProductCard.tsx
interface ProductCardProps {
  product: Product;
  isLoading?: false;
  isEmpty?: false;
  error?: undefined;
}
 
export const ProductCard: React.FC<ProductCardProps> = ({ product }) => {
  return (
    <div style={{ padding: '12px', borderRadius: '8px', border: '1px solid #E5E7EB' }}>
      <img src={product.image} alt={product.name} />
      <h3>{product.name}</h3>
      <p>{product.description}</p>
      <span style={{ color: '#2563EB', fontWeight: 'bold' }}>
        ${product.price.toFixed(2)}
      </span>
    </div>
  );
};

Loading State の実装パターン

interface ProductCardProps {
  product?: undefined;
  isLoading: true;
  isEmpty?: false;
  error?: undefined;
}
 
export const ProductCardSkeleton: React.FC = () => {
  return (
    <div style={{ padding: '12px', borderRadius: '8px', backgroundColor: '#F3F4F6' }}>
      <div style={{ width: '100%', height: '200px', backgroundColor: '#E5E7EB', borderRadius: '4px' }} />
      <div style={{ marginTop: '8px', height: '20px', backgroundColor: '#E5E7EB', borderRadius: '4px' }} />
      <div style={{ marginTop: '8px', height: '16px', backgroundColor: '#E5E7EB', width: '80%', borderRadius: '4px' }} />
    </div>
  );
};

Empty State の実装パターン

interface ProductCardProps {
  product?: undefined;
  isLoading?: false;
  isEmpty: true;
  error?: undefined;
}
 
export const ProductCardEmpty: React.FC = () => {
  return (
    <div style={{ textAlign: 'center', padding: '32px 12px' }}>
      <p style={{ color: '#6B7280', fontSize: '14px' }}>
        商品がまだ登録されていません。
      </p>
      <p style={{ color: '#9CA3AF', fontSize: '12px' }}>
        新しい商品を追加してください。
      </p>
    </div>
  );
};

Error State の実装パターン

interface ProductCardProps {
  product?: undefined;
  isLoading?: false;
  isEmpty?: false;
  error: Error;
}
 
export const ProductCardError: React.FC<{ error: Error }> = ({ error }) => {
  return (
    <div style={{ padding: '12px', borderRadius: '8px', backgroundColor: '#FEE2E2', borderLeft: '4px solid #EF4444' }}>
      <p style={{ color: '#991B1B', fontWeight: 'bold' }}>エラーが発生しました</p>
      <p style={{ color: '#7F1D1D', fontSize: '14px' }}>
        {error.message}
      </p>
      <button onClick={() => window.location.reload()} style={{ marginTop: '8px', padding: '6px 12px', backgroundColor: '#EF4444', color: '#FFFFFF', borderRadius: '4px', border: 'none', cursor: 'pointer' }}>
        再試行
      </button>
    </div>
  );
};

Partial State の実装パターン

interface ProductCardProps {
  product: Partial<Product>;
  isLoading?: false;
  isEmpty?: false;
  error?: undefined;
}
 
export const ProductCardPartial: React.FC<{ product: Partial<Product> }> = ({ product }) => {
  return (
    <div style={{ padding: '12px', borderRadius: '8px', border: '1px solid #FCD34D' }}>
      {product.image && <img src={product.image} alt={product.name} />}
      <h3>{product.name || '読み込み中...'}</h3>
      {product.description ? <p>{product.description}</p> : <p style={{ color: '#9CA3AF' }}>説明を読み込み中...</p>}
    </div>
  );
};

VRT(Visual Regression Testing)活用:UI Stack とログイン状態の掛け合わせ

VRT は、UI の見た目が意図した通りか、レグレッションがないかを自動検証するテスト手法です。UI Stack の 5 状態に加えて、ログイン状態・言語設定・ダークモード等の掛け合わせを考慮すると、テストシナリオは組み合わせ的に増加します。

VRT テストシナリオ設計例

ProductCard コンポーネント
├─ Ideal State
│  ├─ 日本語 × Light モード
│  ├─ 日本語 × Dark モード
│  ├─ English × Light モード
│  └─ English × Dark モード
├─ Loading State
│  ├─ Light モード
│  └─ Dark モード
├─ Empty State
│  ├─ Light モード
│  └─ Dark モード
├─ Error State
│  ├─ Light モード
│  └─ Dark モード
└─ Partial State
   ├─ Light モード
   └─ Dark モード

計 14 パターン

Playwright + Percy(VRT SaaS)による自動化

// e2e/product-card.spec.ts
import { test } from '@playwright/test';
import percySnapshot from '@percy/playwright';
 
test.describe('ProductCard VRT Suite', () => {
  test('Ideal State - Light Mode JP', async ({ page }) => {
    await page.goto('/components/product-card?state=ideal&lang=ja&theme=light');
    await percySnapshot(page, 'ProductCard-Ideal-Light-JP');
  });
 
  test('Loading State - Dark Mode', async ({ page }) => {
    await page.goto('/components/product-card?state=loading&theme=dark');
    await percySnapshot(page, 'ProductCard-Loading-Dark');
  });
 
  test('Error State - Light Mode', async ({ page }) => {
    await page.goto('/components/product-card?state=error&theme=light');
    await percySnapshot(page, 'ProductCard-Error-Light');
  });
});

CI/CD パイプラインに統合すれば、毎回の PR 時に視覚的差分が自動検出される仕組みになります。

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

この記事の続きを読む

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

この記事で得られること
UI Stackの5状態管理とそれぞれの実装パターン・テストシナリオ設計
デザインシステム × AI統合戦略:エージェントがデザイン仕様を理解する仕組み
VRT自動化パイプライン構築とCI/CD統合:ビジュアル品質を絶対視する運用体制
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Agents & Manager2026-04-07
Antigravity × LangGraph: ステートフルAIエージェント実装の実践ガイド
LangGraphとAntigravityを組み合わせてステートフルなAIエージェントを構築する完全ガイド。グラフ構造のワークフロー設計、状態管理、チェックポイント、ヒューマンインザループまで実践的に解説します。
Agents & Manager2026-07-18
エージェントに任せるコード検索を契約として書く — /codesearch の正規表現既定を実測で読み直す
Antigravity CLI 1.1.3 の /codesearch はクエリを既定で正規表現として解釈します。979本のMDXを抱えるリポジトリで正規表現とリテラルの差を実測し、過剰ヒット・4.5MBの出力・静かなずれを避けるクエリ設計をまとめました。
Agents & Manager2026-07-17
エージェントに渡した参照メモの7割は届いていませんでした — head で切る運用の限界を測った記録
定期実行のエージェントに参照メモを cat と head で渡していたところ、肝心な行が黙って落ちていました。切り取り位置を実測し、行数ではなくセクション単位の契約に置き換えるまでの記録です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →