Skip to content

feat: UI/UX全面リデザイン — Resonance デザインシステム#4

Merged
kwrkb merged 2 commits intomainfrom
feat/ui-redesign-resonance
Feb 25, 2026
Merged

feat: UI/UX全面リデザイン — Resonance デザインシステム#4
kwrkb merged 2 commits intomainfrom
feat/ui-redesign-resonance

Conversation

@kwrkb
Copy link
Copy Markdown
Owner

@kwrkb kwrkb commented Feb 25, 2026

Summary

  • デザイン基盤: ve-* カラーパレット(暖色系オフホワイト + 深紫アクセント)、シャドウ3段階、fade-up/ripple/shimmer アニメーションを globals.csstailwind.config.ts に定義
  • 共通UIコンポーネント: Button(primary/secondary/ghost)、Card(hover対応)、Badge(ステータス表示)、SkeletonPageHeader(タイトル+戻るリンク+アクション)、Containercomponents/ui/ に新規作成
  • NavBar: sticky + backdrop-blur、アクティブリンクハイライト付きナビゲーションを layout.tsx に組込み
  • 全19ページ/コンポーネントをデザインシステムに統一: ホームページ(SVG波紋モチーフ)、ギャラリー、画像詳細(ヒーロー画像+引用ブロック)、生成中(波紋アニメーション+ステッパーUI)、結果(Before/After比較)、作成、ツリービュー
  • ImageLineage: 縦タイムライン → 横スクロールフィルムストリップに変更
  • アクセシビリティ: aria-labelfocus-visible:ringprefers-reduced-motion 対応

変更ファイル(26ファイル)

新規作成(7ファイル)

  • components/ui/Button.tsx, Card.tsx, Badge.tsx, Skeleton.tsx, PageHeader.tsx, Container.tsx
  • components/NavBar.tsx

既存修正(19ファイル)

  • globals.css, tailwind.config.ts, layout.tsx
  • 全ページコンポーネント(page.tsx × 9)
  • 全共通コンポーネント(ImageCard, ImageGrid, PromptForm, ImageLineage, ChildImages, TreeView, TreeNode

Test plan

  • npm run lint — エラーなし
  • npm run build — ビルド成功
  • / — ホーム: 波紋モチーフ、新カラー、NavBar表示
  • /gallery — ギャラリー: 新カード表示、統一スタイル
  • /gallery/all — 全画像: PageHeader、Badge
  • /gallery/[id] — 詳細: ヒーロー画像、横フィルムストリップ
  • /create — 作成: 新見出し、デザインシステム適用
  • /gallery/[id]/generating — 生成中: 波紋アニメーション
  • /gallery/[id]/result — 結果: Before/After比較
  • /tree — ツリー: 更新された色・ズームコントロール
  • モバイル表示でのレスポンシブ確認

🤖 Generated with Claude Code

エコー(反響・波紋)のコンセプトを視覚的に体現するプロダクション品質のUIに刷新。

- ve-* カラーパレット・シャドウ・アニメーション基盤をglobals.css/tailwind.configに追加
- Button/Card/Badge/Skeleton/PageHeader/Container の共通UIコンポーネント作成
- NavBar(sticky, backdrop-blur)をlayout.tsxに組込み
- 全ページをデザインシステムに統一(ホーム・ギャラリー・詳細・生成中・結果・作成・ツリー)
- ImageLineageを縦タイムラインから横スクロールフィルムストリップに変更
- 生成中ページに波紋アニメーション+ステッパーUI追加
- prefers-reduced-motion/aria-label等のアクセシビリティ対応

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @kwrkb, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

このプルリクエストは、アプリケーションのUI/UXを全面的に刷新し、一貫性のあるデザインシステム「Resonance」を導入することを目的としています。新しいカラーパレット、タイポグラフィ、シャドウ、アニメーション効果を定義し、それらを活用した共通UIコンポーネント群を構築しました。これにより、アプリケーション全体の視覚的な魅力とユーザーエクスペリエンスが大幅に向上し、将来的な機能追加やデザイン変更の基盤が強化されました。

Highlights

  • デザインシステム基盤の導入: globals.csstailwind.config.tsに、ve-*カラーパレット(暖色系オフホワイトと深紫アクセント)、3段階のシャドウ、fade-uprippleshimmerアニメーションを定義し、新しいUI/UXの基盤を構築しました。
  • 共通UIコンポーネントの新規作成: components/ui/ディレクトリに、Button(primary/secondary/ghost)、Card(ホバー対応)、Badge(ステータス表示)、SkeletonPageHeader(タイトル+戻るリンク+アクション)、Containerといった再利用可能なUIコンポーネントを新規作成しました。
  • ナビゲーションバーの強化: NavBarコンポーネントを新規作成し、layout.tsxに組み込みました。stickyヘッダー、backdrop-blur効果、アクティブリンクのハイライト機能を備えています。
  • 全ページ・コンポーネントのデザイン統一: ホームページ(SVG波紋モチーフ)、ギャラリー、画像詳細(ヒーロー画像+引用ブロック)、生成中(波紋アニメーション+ステッパーUI)、結果(Before/After比較)、作成、ツリービューを含む全19ページ/コンポーネントを新しいデザインシステムに統一しました。
  • ImageLineageの表示改善: 画像系譜の表示を、従来の縦タイムラインから横スクロール可能なフィルムストリップ形式に変更し、視認性と操作性を向上させました。
  • アクセシビリティの向上: aria-labelfocus-visible:ringprefers-reduced-motionといったアクセシビリティ対応を導入し、より多くのユーザーが利用しやすいように改善しました。

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • app/create/page.tsx
    • ページレイアウトを新しいContainerPageHeaderコンポーネントを使用するように更新しました
    • 装飾的な同心円SVGアニメーションを追加しました
    • タイトルとサブタイトルを更新し、新しいデザインシステムに合わせました
  • app/gallery/[id]/components/ChildImages.tsx
    • Badgeコンポーネントをインポートし、生成数表示に適用しました
    • 画像カードのスタイルを新しいデザインシステム(ve-surfaceve-bordershadow-ve-smなど)に更新しました
    • 画像とテキストのカラーリングをve-*変数に合わせました
  • app/gallery/[id]/components/ImageLineage.tsx
    • 画像系譜の表示を縦型から横スクロールのフィルムストリップ形式に再設計しました
    • 各世代の画像にバッジとコネクタSVGを追加しました
    • 画像サイズとホバー効果を更新し、新しいデザインシステムに合わせました
  • app/gallery/[id]/components/PromptForm.tsx
    • Buttonコンポーネントをインポートし、フォームの送信ボタンに適用しました
    • プロンプト入力欄に文字数カウントと動的な文字色表示を追加しました
    • フォーム全体のスタイルを新しいデザインシステムに更新しました
  • app/gallery/[id]/generating/page.tsx
    • ButtonContainerコンポーネントをインポートしました
    • 生成中のステータス表示にリップルアニメーションとカスタムSVGアイコンを導入しました
    • 生成プロセスを示すステッパーUIを追加しました
    • 完了および失敗時のメッセージとボタンのスタイルを更新しました
  • app/gallery/[id]/page.tsx
    • BadgeContainerPageHeaderコンポーネントをインポートしました
    • ページレイアウトをContainerPageHeaderを使用するように再構築しました
    • ヒーロー画像を専用セクションに移動し、object-containスタイルを適用しました
    • プロンプト表示を引用ブロック形式のデザインに更新しました
    • ステータス表示にBadgeコンポーネントを統合しました
  • app/gallery/[id]/result/page.tsx
    • ButtonContainerコンポーネントをインポートしました
    • ページレイアウトをContainerを使用するように再構築しました
    • 結果ページのタイトルとサブタイトルを更新しました
    • 親画像と生成された画像の比較表示に新しいデザインシステムスタイルを適用しました
    • ナビゲーションボタンをButtonコンポーネントに置き換え、「ツリーで見る」オプションを追加しました
  • app/gallery/all/page.tsx
    • ContainerPageHeaderButtonBadgeコンポーネントをインポートしました
    • ページレイアウトをContainerPageHeaderを使用するように再構築しました
    • エラーメッセージのスタイルを更新しました
    • 生成数表示にBadgeコンポーネントを統合しました
    • アクションボタンをButtonコンポーネントに置き換えました
  • app/gallery/components/ImageCard.tsx
    • 画像カードのスタイルを新しいデザインシステムに更新し、ホバー効果を強化しました
    • 画像のアスペクト比をsquareから[3/4]に変更しました
    • ホバー時に表示されるグラデーションオーバーレイを追加しました
  • app/gallery/components/ImageGrid.tsx
    • 画像がない場合のメッセージのスタイルを更新しました
  • app/gallery/page.tsx
    • ContainerPageHeaderButtonコンポーネントをインポートしました
    • ページレイアウトをContainerPageHeaderを使用するように再構築しました
    • エラーメッセージのスタイルを更新しました
    • アクションボタンをButtonコンポーネントに置き換えました
  • app/globals.css
    • 新しいブランドカラー(ve-*)のCSS変数を定義しました
    • ダークモードのメディアクエリを削除しました
    • ボディのフォントと背景色を更新しました
    • fade-uprippleshimmerアニメーションのキーフレームを定義しました
    • 新しいシャドウユーティリティクラス(shadow-ve-smshadow-ve-mdshadow-ve-lg)を追加しました
    • prefers-reduced-motionメディアクエリによるアニメーション制御を追加しました
  • app/layout.tsx
    • NavBarコンポーネントをインポートし、メインコンテンツの上に配置しました
    • メインコンテンツにpt-14を追加し、ナビゲーションバーとの重なりを回避しました
  • app/page.tsx
    • ButtonCardコンポーネントをインポートしました
    • ヒーローセクションの背景にSVGリップルアニメーションを追加しました
    • ヒーローセクションのテキストとボタンのスタイルを新しいデザインシステムに更新しました
    • 特徴グリッドをCardコンポーネントを使用するように再構築し、ホバー効果を追加しました
    • フッターのテキストとリンクを更新しました
  • app/tree/[id]/page.tsx
    • ヘッダーのスタイルをve-surfaceve-borderbackdrop-blur-mdを使用するように更新しました
    • リンクとテキストのカラーリングをve-*変数に合わせました
    • 戻るリンクにSVGアイコンを追加しました
    • ノードが見つからない場合のメッセージのスタイルを更新しました
  • app/tree/page.tsx
    • Buttonコンポーネントをインポートしました
    • ヘッダーのスタイルをve-surfaceve-borderbackdrop-blur-mdを使用するように更新しました
    • リンクとテキストのカラーリングをve-*変数に合わせました
    • 戻るリンクにSVGアイコンを追加しました
    • アクションボタンをButtonコンポーネントに置き換えました
  • components/NavBar.tsx
    • 固定ヘッダー、backdrop-blur、アクティブリンクハイライト機能を備えたナビゲーションバーコンポーネントを新規作成しました
  • components/TreeNode.tsx
    • ノードのステータスに応じたボーダーカラーをve-*変数に更新しました
    • 生成中/失敗状態の背景色とテキスト色を更新しました
    • 生成中ステータスにリップルアニメーションを導入しました
    • ホバーオーバーレイと接続点のスタイルを更新しました
  • components/TreeView.tsx
    • ツリービューの背景色とグリッドのドット色をve-*変数に更新しました
    • ズームコントロールのスタイルを新しいデザインシステムに更新しました
  • components/ui/Badge.tsx
    • 異なるバリアント(default, success, warning, error, accent)を持つ再利用可能なBadgeコンポーネントを新規作成しました
  • components/ui/Button.tsx
    • 異なるバリアント(primary, secondary, ghost)とサイズ(sm, md, lg)を持つ再利用可能なButtonコンポーネントを新規作成しました
    • リンクとしても機能するよう拡張しました
  • components/ui/Card.tsx
    • オプションのホバー効果を持つ再利用可能なCardコンポーネントを新規作成しました
  • components/ui/Container.tsx
    • 一貫した最大幅とパディングを提供する再利用可能なContainerコンポーネントを新規作成しました
  • components/ui/PageHeader.tsx
    • タイトル、サブタイトル、戻るリンク、アクションスロットを持つ再利用可能なPageHeaderコンポーネントを新規作成しました
  • components/ui/Skeleton.tsx
    • シマーアニメーションを持つ再利用可能なSkeletonコンポーネントを新規作成しました
  • tailwind.config.ts
    • 新しいブランドカラー、シャドウ、アニメーションのキーフレームをTailwind CSSの設定に追加しました
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8557c5820e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/layout.tsx
>
{children}
<NavBar />
<main className="pt-14">{children}</main>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Size content area for fixed navbar height

Adding a fixed NavBar plus unconditional pt-14 on the root <main> makes full-screen routes overflow the viewport by 56px, because pages like app/tree/page.tsx and app/tree/[id]/page.tsx still render h-screen containers; this now creates an extra page-level scroll and clips part of the tree canvas until the user scrolls the document. Please account for navbar height in layout sizing (or opt out for full-screen pages) instead of only adding top padding.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new design system with custom colors, shadows, and animations, and refactors the UI to use these new styles. The changes include updating the color scheme, adding new components like Badge, Button, Card, Container, PageHeader, and Skeleton, and modifying existing components to use the new UI elements and styles. Review comments suggest using utility classes for consistent date formatting and error message styling, improving the accuracy of the step progression animation, encapsulating status variant logic, avoiding code duplication in conditional rendering, abstracting shadow definitions, and moving inline styles to CSS classes or Tailwind configuration.

Comment on lines +40 to 47
<p className="text-xs text-ve-text line-clamp-2 leading-relaxed">
{child.prompt}
</p>
<p className="text-xs text-gray-700 mt-1">
{new Date(child.created_at).toLocaleDateString('ja-JP', {
month: 'short',
day: 'numeric',
<p className="text-xs text-ve-text-subtle mt-1">
{new Date(child.created_at).toLocaleDateString("ja-JP", {
month: "short",
day: "numeric",
})}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Consider using the ve-date class or a similar utility class to format dates consistently across the application. This would improve maintainability and ensure a uniform look and feel. Also, the locale is hardcoded as ja-JP. Consider making this configurable or deriving it from user preferences.

Comment on lines +61 to 63
<div className="mb-4 p-3 bg-red-50 border border-red-200 rounded-xl text-ve-error text-sm">
{error}
</div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The error message styling is hardcoded. Consider creating a reusable component or utility class for consistent error message styling across the application. This would improve maintainability and ensure a uniform look and feel.

Comment on lines 27 to +33
useEffect(() => {
params.then(({ id: generationId }) => {
if (status !== "pending") return;
const timer = setInterval(() => {
setActiveStep((s) => (s < 2 ? s + 1 : s));
}, 3000);
return () => clearInterval(timer);
}, [status]);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The setInterval function is used to simulate step progression. While this works, it might be better to control the animation state directly based on the actual backend processing status for better synchronization and a more accurate representation of the generation process. If the backend is slow, the animation might complete before the actual process, leading to a confusing user experience.

Comment thread app/gallery/[id]/page.tsx Outdated
Comment on lines +66 to +71
const statusVariant =
generation.status === "completed"
? "success"
: generation.status === "pending"
? "warning"
: "error";
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The status variant logic is repeated in multiple places. Consider creating a utility function or a component to encapsulate this logic for better maintainability and reusability.

Comment on lines +113 to +127
<div
className="flex flex-col sm:flex-row gap-3 justify-center animate-fade-up"
style={{ animationDelay: "0.2s" }}
>
<Button href={`/gallery/${generation.id}`} size="lg">
続けて生成する
</Button>
<Button href="/gallery" variant="secondary" size="lg">
ギャラリーに戻る
</Link>
</Button>
{parent && (
<Button href={`/tree`} variant="ghost" size="lg">
ツリーで見る
</Button>
)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The conditional rendering of the parent image section and the single image section duplicates the bg-ve-surface rounded-2xl border border-ve-border shadow-ve-md overflow-hidden ring-2 ring-ve-accent ring-offset-2 styling. Consider extracting this into a reusable component or a CSS class to avoid duplication and improve maintainability.

Comment thread app/globals.css
Comment on lines +82 to +92
.shadow-ve-sm {
box-shadow: 0 1px 3px rgba(139, 126, 112, 0.08), 0 1px 2px rgba(139, 126, 112, 0.06);
}

.shadow-ve-md {
box-shadow: 0 4px 12px rgba(139, 126, 112, 0.1), 0 2px 4px rgba(139, 126, 112, 0.06);
}

.shadow-ve-lg {
box-shadow: 0 12px 32px rgba(139, 126, 112, 0.12), 0 4px 8px rgba(139, 126, 112, 0.08);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The shadow definitions are hardcoded. Consider using a more abstract approach, possibly leveraging CSS variables or Tailwind configuration, to allow for easier modification and consistency across the application.

Comment thread components/TreeNode.tsx
Comment on lines +24 to +27
>
<div
className={`relative overflow-hidden rounded-2xl border-2 bg-ve-surface shadow-ve-sm transition-all duration-200 hover:shadow-ve-md ${statusColor}`}
>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The status color styling is hardcoded. Consider creating a utility function or a component to encapsulate this logic for better maintainability and reusability.

Comment thread components/TreeView.tsx
Comment on lines +64 to +68
backgroundImage: `radial-gradient(var(--ve-accent) 0.5px, transparent 0.5px)`,
backgroundSize: "24px 24px",
backgroundPosition: "0 0",
opacity: 1,
}}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The background image style is defined inline. Consider moving this to a CSS class or a Tailwind configuration for better maintainability and consistency.

- ツリーページの h-screen を h-[calc(100dvh-3.5rem)] に変更し、NavBar分のオーバーフローを修正
- ステータスバリアントのロジックを lib/ui/status.ts に共通ユーティリティとして抽出

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@kwrkb kwrkb merged commit 886f904 into main Feb 25, 2026
@kwrkb kwrkb deleted the feat/ui-redesign-resonance branch February 25, 2026 14:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant