DESIGN SYSTEM
Picture-iDesign Guidelines v2.0
このガイドラインに従うことで、一貫性のある美しいUIを維持できます。
例外は認めません。
Design Philosophy
Minimal & Clean
装飾を最小限に。余白を恐れるな。
Consistent
同じ要素には同じスタイル。例外なし。
Intentional
すべてのデザイン決定に理由がある。
Color System
Primary Palette
900
Text, CTA
800
Dark BG
600
Secondary
400
Inactive
200
Border
100
Light BG
Accent Color
ONLY AMBERamber-400
SSR, Primary accent
amber-500
Hover state
yellow-300
Gradient end
blue, purple, pink, cyan などの派手な色は禁止
Background Rules
Light Mode Pages
#F5F3EEWarm gray - 温かみのある背景
Dark Mode Pages
gradient 900→800ガチャ、プレビュー系
Semantic Tokens
NEWハードコードされた色ではなく、意味を持つセマンティックトークンを使用することで、 テーマ切り替えとデザイン変更が容易になります。
Text
--pi-text-primary見出し、本文
neutral-900 / white--pi-text-secondary補足テキスト
neutral-600 / neutral-400--pi-text-muted非活性、プレースホルダー
neutral-400 / neutral-500--pi-text-accent強調、リンク
amber-400Background
--pi-bg-primaryページ背景
#F5F3EE / neutral-950--pi-bg-surfaceカード、パネル
white / neutral-900--pi-bg-elevatedモーダル、ヘッダー
white/80 / neutral-800--pi-bg-accentSSRバッジ、CTA
amber-400Border
--pi-border-default通常のボーダー
neutral-200 / neutral-800--pi-border-subtle控えめなボーダー
neutral-100 / neutral-700--pi-border-focusフォーカス状態
neutral-900 / amber-400State
--pi-state-success成功、完了
green-500--pi-state-warning警告、注意
amber-500--pi-state-errorエラー、危険
red-500--pi-state-info情報
neutral-500Usage Example
/* CSS Variables (globals.css) */
:root {
--pi-text-primary: theme('colors.neutral.900');
--pi-bg-primary: #F5F3EE;
--pi-bg-surface: theme('colors.white');
}
.dark {
--pi-text-primary: theme('colors.white');
--pi-bg-primary: theme('colors.neutral.950');
--pi-bg-surface: theme('colors.neutral.900');
}
/* Tailwind config */
colors: {
'pi-text': 'var(--pi-text-primary)',
'pi-bg': 'var(--pi-bg-primary)',
}Typography
Noto Sans JP
唯一許可されたフォントHeading 1
ページタイトル
Heading 2
セクション
Heading 3
カード見出し
Body
本文
Caption
補足テキスト
Micro
バッジ、ラベル
Do
- font-bold は見出しのみ
- 本文は font-medium または font-normal
- 行間は適度に(leading-relaxed)
- 英語は tracking-wide
Don't
- font-black, font-thin は禁止
- イタリック体は使わない
- アンダーライン装飾は禁止
- text-shadow は禁止
Icon System
CRITICALApproved Icons (Lucide)
以下のアイコンのみ使用可。シンプルで視認性の高いものを厳選。
禁止アイコン・スタイル
アイコンの種類:
- • 絵文字風のアイコン
- • 手書き風アイコン
- • 3D風アイコン
- • グラデーション塗りのアイコン
- • 過度に装飾されたアイコン
使い方:
- • stroke-width を変更しない(デフォルト: 2)
- • アイコンに影をつけない
- • 回転・歪みアニメーション禁止
- • アイコン単体での過度な強調禁止
- • テキストなしのアイコンボタンは最小限に
Icon Sizes
12px
バッジ内
16px
インライン
20px
ボタン、ナビ
24px
リスト
32px
カード
40px
ヒーロー
Spacing & Layout
Spacing Scale (4px base)
4px
8px
12px
16px
24px
32px
40px
48px
Border Radius
lg / 8px
ボタン小
xl / 12px
入力、アイコン背景
2xl / 16px
カード、モーダル
full
バッジ、アバター
rounded-sm, rounded-md は原則禁止。統一感を保つため。
Container Width
max-w-smモーダルmax-w-mdフォームmax-w-2xlコンテンツmax-w-3xlメインレイアウトmax-w-4xlワイドコンテンツResponsive Design
PC/SP対応Breakpoints
モバイルファースト設計。PC最適化には lg: を使用。
default< 640pxモバイル(デフォルト)基準sm:≥ 640px大型モバイル微調整lg:≥ 1024pxデスクトップPC対応xl:≥ 1280px大画面グリッド拡張Container Width(PC拡張)
PCでは横幅を活用。lg:max-w-*xl で拡張。
max-w-2xl→lg:max-w-4xl通常コンテンツ672px → 896pxmax-w-3xl→lg:max-w-5xl写真一覧・LP768px → 1024pxmax-w-sm→lg:max-w-mdモーダル384px → 448pxGrid Columns(PC拡張)
PCではカラム数を増やして一覧性を向上。
grid-cols-1→lg:grid-cols-2カード一覧: 商品カテゴリ、ガチャセット
grid-cols-2→lg:grid-cols-4 xl:grid-cols-5商品グリッド: 写真一覧
grid-cols-3→lg:grid-cols-6サムネイル: フォトギャラリー
Header(PC対応)
SP(モバイル)
flex-col // ナビ縦並び w-[18px] h-[18px] // アイコン text-[9px] // ラベル px-4 py-2.5 // パディング
PC(デスクトップ)
lg:flex-row // ナビ横並び lg:w-5 lg:h-5 // アイコン拡大 lg:text-xs // ラベル拡大 lg:px-6 lg:py-3 // パディング拡大
2カラムレイアウト(PC専用)
ガチャ画面など、PCでは左右分割で情報量を増やす。
<div className="lg:grid lg:grid-cols-2 lg:gap-8 lg:items-start">
{/* 左カラム: 画像(sticky) */}
<div className="lg:sticky lg:top-20">
<Image ... />
</div>
{/* 右カラム: オプション */}
<div className="mt-6 lg:mt-0">
<PlanSelection ... />
</div>
</div>Common Patterns
Grid Columns
grid grid-cols-2 sm:grid-cols-3 grid grid-cols-3 sm:grid-cols-4
写真グリッド: 2列 → 3列
Padding / Gap
px-3 sm:px-4 gap-2 sm:gap-3 p-4 sm:p-5
微調整: 12px → 16px
Text Size
text-2xl sm:text-4xl // 見出し text-sm sm:text-base // 本文 text-[10px] sm:text-xs // キャプション
Icon / Element Size
w-4 h-4 sm:w-5 sm:h-5 // アイコン w-20 h-20 sm:w-24 sm:h-24 // サムネイル
Hidden / Show
hidden sm:inline // sm以上で表示 sm:hidden // smで非表示
テキスト短縮・切り替え
Flex Direction
flex flex-col lg:flex-row
モバイル縦 → PC横
Safe Area (iOS対応)
Header
pt-[env(safe-area-inset-top)]
ノッチ・Dynamic Island対応
Footer
pb-[env(safe-area-inset-bottom)]
ホームインジケータ対応
Do
- モバイルファーストで書く(lg: でPC拡張)
- PCでは max-w を lg:max-w-*xl で拡張
- PCではグリッド列数を増やす(lg:grid-cols-*)
- PCナビは横並び(lg:flex-row)
- safe-area-inset でノッチ対応
- 2カラムレイアウトにはlg:stickyを活用
Don't
- max-w-2xl 固定でPCの横幅を無駄にしない
- PC専用デザインを先に作らない
- モバイルでの見た目を犠牲にしない
- 固定ピクセル幅(w-[500px]等)
- 3段階以上のブレークポイント変更
Standard Layout Template
// コンテナ <div className="max-w-3xl mx-auto px-3 sm:px-4 py-6 sm:py-8"> // セクション見出し <h2 className="text-lg sm:text-xl font-bold mb-3 sm:mb-4"> // グリッド <div className="grid grid-cols-2 sm:grid-cols-3 gap-3 sm:gap-4"> // フレックス <div className="flex items-center gap-2 sm:gap-3"> // ボタン <button className="p-2 sm:p-3 rounded-lg"> // テキスト切り替え <span className="hidden sm:inline">詳細テキスト</span> <span className="sm:hidden">短縮</span> </div>
Z-Index Scale
レイヤーの重なり順を統一するためのスケール。
z-00デフォルト、背景背景画像z-1010浮いた要素カード、ボタンz-2020固定ナビHeader, 固定ボトムバーz-3030ドロワーサイドメニューz-4040オーバーレイ背景の暗転z-5050モーダル確認ダイアログVisual Stack
z-index は 10 単位で使用。中間値(z-15等)は使わない。
Components
Buttons
Button Rules:
- • padding: py-3 px-6 (標準) / py-4 px-8 (大)
- • border-radius: rounded-xl (標準) / rounded-2xl (CTA)
- • font: font-bold (Primary) / font-medium (Secondary)
- • グラデーションボタンは禁止(BorderBeamで代用)
Cards
Light Card
bg-white shadow-sm
Dark Card
bg-neutral-800 border
カードには必ず rounded-2xl を使用。shadow は shadow-sm のみ。
Badges
バッジは rounded-full + text-xs + font-bold で統一
Form Inputs
focus: ring-2 ring-neutral-900 (light) / ring-amber-400 (dark)
Effects & Animation
Glassmorphism

bg-white/80 backdrop-blur-xl border-white/20Header Navigation と特別なUIにのみ使用
Border Beam (SSR専用)
SSRカードの演出にのみ使用。乱用禁止。
Duration & Easing
一貫したアニメーション体験のため、標準化されたデュレーションとイージングを使用。
Duration Scale
100msinstant
ホバー、フォーカス
150msfast
ボタン、トグル
200msnormal
モーダル、ドロワー
300msslow
ページ遷移
Easing Functions
ease-outcubic-bezier(0, 0, 0.2, 1)
デフォルト、要素の出現
ease-in-outcubic-bezier(0.4, 0, 0.2, 1)
位置移動、変形
ease-incubic-bezier(0.4, 0, 1, 1)
要素の退出
springstiffness: 500, damping: 35
カード、インタラクション
// CSS Variables
:root {
--pi-duration-instant: 100ms;
--pi-duration-fast: 150ms;
--pi-duration-normal: 200ms;
--pi-duration-slow: 300ms;
--pi-ease-out: cubic-bezier(0, 0, 0.2, 1);
--pi-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}
// Tailwind Classes
transition-all duration-150 ease-out
transition-transform duration-200 ease-in-outMotion Patterns
Page Transition
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.3, ease: "easeOut" }}Spring Animation
type: "spring" stiffness: 500 damping: 35
Stagger Children
staggerChildren: 0.1 delayChildren: 0.2
Interactive
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.95 }}bounce, elastic, wiggle などの過度なアニメーションは禁止
Loading States
Skeleton Loading
コンテンツ読み込み中は Skeleton で表示。シンプルなパルスアニメーション。
Card Skeleton
List Skeleton
Code
// Skeleton base <div className="bg-neutral-200 rounded animate-pulse" /> // Light mode: bg-neutral-200 // Dark mode: bg-neutral-700
Spinner
ボタン内や小さなローディング表示に使用。
16px
24px
32px
<div className="w-4 h-4 border-2 border-neutral-400 border-t-white rounded-full animate-spin" />
Empty / Error States
データがありません
Empty State
エラーが発生しました
Error State
Golden Rules
MUST READ必ず守ること
- Neutral カラーパレットを使う
- Lucide Icons のみ使用
- rounded-xl / rounded-2xl を使う
- shadow-sm のみ(shadowは控えめに)
- 余白はたっぷり取る
- font-weight は 400-700 の範囲
- アニメーションは subtle に
- 一貫性を最優先する
絶対にやらないこと
- 派手な色(blue, pink, cyan等)を使う
- カスタムアイコン、絵文字を使う
- グラデーションテキスト
- shadow-lg, shadow-2xl の乱用
- 要素を詰め込みすぎる
- font-thin, font-black を使う
- 派手なアニメーション
- デザインシステムの例外を作る
Accessibility
A11YTouch Targets
モバイルファーストのため、タッチターゲットは最小44x44pxを確保。
32px NG
40px 要注意
44px OK
48px 推奨
// ボタン・リンクの最小サイズ min-h-[44px] min-w-[44px] // パディングで確保 p-3 (48px with icon)
Focus States
キーボード操作時のフォーカスリングを必ず表示。
// Focus visible focus-visible:ring-2 focus-visible:ring-amber-400 focus-visible:ring-offset-2
Color Contrast
テキストと背景のコントラスト比 4.5:1 以上を確保。
WCAG 2.1 Level AA 準拠
Web Content Accessibility Guidelines
1.4.3PASSContrast (Minimum)
4.5:1
2.4.7PASSFocus Visible
-
2.5.5PASSTarget Size
44px
Screen Reader Support
スクリーンリーダー対応のための ARIA 属性とセマンティック HTML の使用。
aria-labelアイコンのみボタン
aria-describedby入力フィールドの補足説明
aria-live動的コンテンツの通知
roleカスタム要素の役割定義
// アイコンボタンの例
<button
aria-label="カートに追加"
className="p-3 bg-neutral-900 rounded-xl"
>
<ShoppingCart className="w-5 h-5" />
</button>
// 画像の代替テキスト
<Image
src={photo}
alt="商品名: フォトブック A4サイズ"
/>Reduced Motion Support
motion-reduce メディアクエリで視覚障害やモーション酔いへの配慮。
// Framer Motion での対応
const prefersReducedMotion =
window.matchMedia('(prefers-reduced-motion: reduce)').matches;
<motion.div
initial={prefersReducedMotion ? {} : { opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={prefersReducedMotion ? { duration: 0 } : { duration: 0.3 }}
/>
// CSS での対応
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}Do
- タッチターゲット 44px以上
- フォーカスリングを表示
- コントラスト比 4.5:1 以上
- 適切な alt テキスト
- フォームのラベル明示
- aria-label でアイコンを説明
- prefers-reduced-motion 対応
Don't
- 小さすぎるボタン(32px未満)
- outline: none でフォーカス非表示
- 薄い色のテキスト(neutral-300等)
- 画像の alt を空にする
- 色だけで情報を伝える
- 自動再生動画・点滅要素
- キーボード操作の無効化
Photo Standards
Standard
3:4
Cheki
1:1.35 + margin
Thumbnail
1:1
Artist Themes
8 THEMESアーティストごとに固有のテーマカラーを定義。ヘッダー、ボタン、アクセントに適用。
星野ひかり
artist-001
#ec4899#f472b6月城あおい
artist-002
#3b82f6#60a5fa桜庭りん
artist-003
#a855f7#c084fc天音みく
artist-004
#10b981#34d399紅葉かえで
artist-005
#f97316#fb923c白雪まゆ
artist-006
#94a3b8#cbd5e1灰原しおり
artist-007
#6b7280#9ca3af黒崎れい
artist-008
#171717#262626Theme Usage
適用箇所
- • ヘッダーのアーティスト名(グラデーション)
- • ヘッダー上部のアクセントライン
- • CTAボタン・リンクの色
- • カテゴリアイコンの背景
- • NEWバッジ・タグ
コード参照
// テーマ取得
import { getArtistTheme } from "@/lib/artist-themes";
const theme = getArtistTheme(artistId);
// 使用例
style={{ color: theme.primaryHex }}
className={`bg-gradient-to-r ${theme.gradient}`}