ワンクリックで
creative-tv-ui
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Template repo file structure: where screens, navigation, theme, data, and platform entries live in the monorepo
Android TV build and D-pad QA using Android CLI first, with bounded Gradle and ADB fallbacks
Expo Application Services cloud build configuration for TV app APK and IPA generation
Expo TV configuration: app.json plugins, prebuild settings, platform-specific config for react-native-tvos
Fire TV leanback manifest configuration: banner icons, LEANBACK_LAUNCHER intent filter, TV-specific Android settings
Gradle build commands: assembleDebug, assembleRelease, APK output paths, and emulator installation
| name | creative-tv-ui |
| description | Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities |
| applies_to | ["creative_ui"] |
Every generated app MUST look different from every other. The template provides structure — your job is to give it SOUL. A viewer should never think "this looks like that other app." Visual diversity comes from:
TV design is NOT web design zoomed in. At 10 feet (3 meters — the standard viewing distance), users perceive:
TV panels render colors MORE saturated and vibrant than computer screens. The color gamut is narrower, contrast is higher. This means:
#D4A574 not #FFAA00).#F5F5F5 or #EBEBEB) to reduce glare in dark rooms.D-pad navigation is sequential — users pass through ALL elements on the path. This constrains creative layout:
Choose fonts with HIGH x-height and BOLD weight. Condensed fonts work exceptionally well on TV because they allow large point sizes without wrapping:
Best categories:
Must be:
Good body fonts: DM Sans, Nunito Sans, Source Sans Pro, Lato, Inter (400-500 weight only)
const typography = {
display: { fontSize: scaledPixels(72), fontWeight: '800', letterSpacing: -1 },
heading: { fontSize: scaledPixels(44), fontWeight: '700', letterSpacing: 0 },
title: { fontSize: scaledPixels(32), fontWeight: '600', letterSpacing: 0.2 },
body: { fontSize: scaledPixels(26), fontWeight: '400', lineHeight: scaledPixels(36) },
caption: { fontSize: scaledPixels(20), fontWeight: '500', letterSpacing: 0.5, textTransform: 'uppercase' },
};
TV apps almost always use dark themes. Flat black is BORING. Add depth:
background: #0A0A0F (deepest)
surface-1: #12121A (cards, containers)
surface-2: #1A1A24 (elevated cards, modals)
surface-3: #22222E (active/focused backgrounds)
Derive these from the brand's background color — not hardcoded. Add 5%, 10%, 15% white to the background.
// Warm app (cooking/lifestyle):
atmosphere: 'rgba(255, 180, 60, 0.04)' // golden warmth everywhere
// Cool app (tech/sports):
atmosphere: 'rgba(60, 130, 255, 0.04)' // ice-blue undertone
// Electric app (music/entertainment):
atmosphere: 'rgba(180, 60, 255, 0.05)' // neon purple haze
// Natural app (documentary/nature):
atmosphere: 'rgba(60, 180, 100, 0.03)' // forest green whisper
Apply the atmosphere color as a full-screen overlay or gradient tint on backgrounds.
The accent color should feel like a LIGHT SOURCE:
focusGlow: {
shadowColor: accentColor,
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.7,
shadowRadius: scaledPixels(20),
elevation: 20,
}
Every hero/featured section MUST have a scrim — a gradient overlay between the background image and foreground text. This is the single most important readability pattern in TV UI. Android TV documents it as a required architectural element.
┌─────────────────────────────────────┐
│ Background Image (full-bleed) │
│ ┌───────────────────────────────┐ │
│ │ Cinematic Scrim (gradient) │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ Poster + Title + CTA │ │ │
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
Immersive Hero (full-bleed, Netflix/Disney+ style):
const cinematicScrim = {
position: 'absolute',
bottom: 0, left: 0, right: 0,
height: '70%',
// Gradient from transparent at top to near-opaque at bottom
// Use LinearGradient: ['transparent', 'rgba(bg, 0.6)', 'rgba(bg, 0.95)']
};
Card Hero (contained within a card shape):
const cardScrim = {
position: 'absolute',
bottom: 0, left: 0, right: 0,
height: '50%',
borderBottomLeftRadius: cardBorderRadius,
borderBottomRightRadius: cardBorderRadius,
// Gradient: ['transparent', 'rgba(0,0,0,0.8)']
};
The focus indicator is the single most-seen UI element on TV. It MUST be distinctive.
const cardFocused = {
transform: [{ scale: 1.08 }],
borderWidth: scaledPixels(4),
borderColor: accentColor,
shadowColor: accentColor,
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.8,
shadowRadius: scaledPixels(24),
elevation: 20,
};
Apple tvOS adds a specular highlight — a simulated light reflection that moves across the focused element. Approximate this with a positioned semi-transparent gradient overlay:
const specularHighlight = {
position: 'absolute',
top: 0, left: 0, right: 0,
height: '40%',
borderTopLeftRadius: cardBorderRadius,
borderTopRightRadius: cardBorderRadius,
backgroundColor: 'transparent',
// Simulate light hitting the top edge of the elevated card
borderTopWidth: 1,
borderTopColor: 'rgba(255, 255, 255, 0.15)',
};
Only show the specular highlight when focused — it reinforces that the card has "lifted" toward the viewer. Combine with scale + shadow for the full effect: scale lifts, shadow grounds, specular catches light.
Production apps don't just highlight the focused card — they change the SURROUNDING environment:
Implementation pattern:
// In the rail/row component, track which item is focused:
const [focusedIndex, setFocusedIndex] = useState(0);
const focusedItem = items[focusedIndex];
// Pass focusedItem to a parent context or screen-level component
// that renders the background and metadata area
This is the single biggest differentiator between "template" and "production" TV UI. Even a simple version (background color tint changes on focus) elevates the experience dramatically.
TV navigation drawers are fundamentally different from mobile. They have TWO always-visible states:
When focus is on content, the drawer collapses to a narrow rail showing only icons:
const collapsedDrawer = {
width: scaledPixels(72), // Just enough for icon + padding
backgroundColor: surfaceColor,
paddingVertical: scaledPixels(24),
};
const collapsedItem = {
width: scaledPixels(72),
height: scaledPixels(56),
alignItems: 'center',
justifyContent: 'center',
};
When focus moves to the drawer, it expands to show full labels:
const expandedDrawer = {
width: scaledPixels(280),
backgroundColor: surfaceColor,
};
const expandedItem = {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: scaledPixels(20),
height: scaledPixels(56),
gap: scaledPixels(16),
};
Standard drawer (Netflix, Prime Video): Content pushes aside when drawer expands. Moving focus between nav items auto-updates the page content (focus-triggers-navigation). Best for apps where users browse between sections frequently.
Modal drawer (less common): Overlays content with a semi-transparent scrim. Requires explicit selection (press Enter/Select) to navigate. Better when the drawer is rarely used or has many items.
Choose Standard for content-browsing apps (streaming, media). Choose Modal for utility-heavy apps (settings-focused, deep hierarchies).
After creative_ui phase, the app MUST have: