10ft-ui
10-foot UI design guidelines: safe zones, font sizes, contrast, focus indicators for TV viewing distance
Skill by giolaq
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/giolaq-10ft-ui
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/10ft-ui
What's inside
- Skill name
10ft-ui- Description
- 10-foot UI design guidelines: safe zones, font sizes, contrast, focus indicators for TV viewing distance
- License
- MIT-0
- Instructions
- 119 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# 10-foot UI
> TV is a 10-foot UI: viewer sits 8–12 ft from a 1080p–4K screen. Decisions that are fine on phone (12pt text, 4:1 contrast, dense layouts) are broken on TV. This skill is the checklist for new screens that don't reuse the template's vetted ones.
If you're reusing `Home`, `Detail`, etc., **you don't need this skill** — they already comply. Load this only when generating something genuinely new.
## The numbers
| Spec | TV minimum | Phone minimum (for contrast) |
|------|------------|------------------------------|
| Body text size | 24pt | 14pt |
| Heading 1 | 48–64pt | 24–28pt |
| Line height | 1.4× font size | 1.2× |
| Touch / focus target | 96×96pt | 44×44pt |
| Body text contrast | 7:1 (AAA) | 4.5:1 (AA) |
| Focus ring thickness | 4px+ | n/a |
| Safe area margin | 5% of width/height each edge (overscan) | n/a |
The phone column is there to make the deltas obvious. On TV, everything is bigger, thicker, more contrasted.
## Overscan / safe area
TVs historically cropped 5% of the image edges. Modern flatscreens mostly don't, but the convention persists, and the platforms (especially Apple TV) enforce safe areas in their HIG. Practical rules:
- Don't put critical content within 5% of any edge.
- Don't anchor focus rings exactly to the edge — they'll get clipped on some screens.
- Use `useSafeAreaInsets()` (from `react-native-safe-area-context`) and offset all root containers.
The template's screen wrappers handle this. For a brand-new screen, replicate that pattern — don't put a `<View>` at `top: 0` and call it done.
## Focus is everything
A 10-ft UI is navigated by D-pad, not by pointing. Every interactive element must:
1. Be focusable (`<SpatialNavigationFocusableView>` or themed `<Pressable>`).
2. Have a visible focus state (focus ring, scale, glow — at least one, clearly visible at 10 ft).
3. Be reachable from at least one direction (no orphans).
If you can't D-pad to it, it doesn't exist.
See `spatial-navigation.md` for the focus tree primitives. This skill is about *visual* focus, not the focus tree.
## Layout density
Phone designers cram. TV designers don't.
- **Cards (tiles):** target 240–320px wide, 360–480px tall (16:9 thumbnail + label). Smaller → unreadable. Bigger → too few per row.
- **Rails:** 5–7 visible tiles per row on a 1080p layout. More = each tile becomes a postage stamp.
- **Grids:** 4–6 columns on 1080p. Same logic.
- **Whitespace:** generous. The user is 10 ft away, not 12 inches. Cramming reads as noise.
When in doubt, fewer-larger over more-smaller.
## Typography for TV
- **Font:** sans-serif. Serifs blur at distance. The template defaults to a clean sans; respect that.
- **Weight:** 400 for body, 700 for headings. Thin / hairline disappears.
- **Tracking:** very slight positive tracking helps legibility (1–2% letter-spacing). Not required, but improves polish.
- **Multiple lines:** avoid stacking more than 3 lines of body text without a break. Long-form reading on TV is a known failure mode.
## Color and contrast
Lower-quality TVs and bright rooms compress contrast. Account for the worst case:
- **Body text on background:** 7:1 minimum. If your brand says white on dark gray, check the actual ratio. `#FFFFFF on #1F1F1F` = 13:1, fine. `#CCCCCC on #1F1F1F` = 9.2:1, also fine. `#888888 on #1F1F1F` = 4.5:1, **not** fine for body.
- **Muted / secondary text:** 4.5:1 minimum. Below this it's invisible.
- **Focus ring vs background:** if the focus ring is 4px and high-contrast, it works. If you've themed it to a brand color that's too close to background, fix it (see `theming.md` focus ring decision rule).
## Motion
Motion is great on TV — large screens, dramatic feel — but with rules:
- **Focus transitions:** 150–250ms, ease-out. Faster feels jittery, slower feels sluggish.
- **Screen transitions:** 250–400ms.
- **Hero crossfades:** 300–500ms.
- **Avoid parallax / scroll-jacking** for the primary navigation. D-pad expects predictable, snap-style focus moves.
Animations that work on phone (subtle bounce, slide-in-from-bottom) often feel cheap on TV. Bigger, calmer motion reads better.
## Empty states
A screen with no content is a real possibility (empty watchlist, search with no results, category with no items). Don't let it render blank:
- Show a clear illustration or large icon.
- Headline at H2 size.
- One-sentence explanation.
- A CTA back to a populated screen ("Browse home", "Search").
This is the difference between "looks broken" and "looks intentional."
## Accessibility — non-optional even on TV
- **Captions / subtitles:** if content has them, they must be available (see `video-player.md`).
- **Screen reader:** Apple TV has VoiceOver; Android TV has TalkBack. Set `accessibilityLabel` on focusables. The template's components do this — preserve it when extending.
- **Reduced motion:** respect the system setting on Apple TV; gracefully skip non-essential animations.
- **Contrast:** see above; already covered.
## Decision tree: I need a new screen layout
1. **Can I describe it as one of `Home`, `Category`, `Detail`, `Player`, `Search`, `Settings`?** → Use that screen with different data. Stop.
2. **Is it a variation of one of those?** → Copy the closest screen as a starting file. Modify carefully. Keep its `SpatialNavigationRoot`, safe area, focus model.
3. **Is it genuinely new (live TV, profiles, browse-by-mood, etc.)?** → Apply this skill from scratch. Specifically:
- Wrap in `<SpatialNavigationRoot>` + safe-area-aware container.
- Use theme tokens for every color, size, spacing.
- Compose from `Hero`, `Rail`, `Grid`, `Tile` where possible.
- Run `run_focus_check` before considering it done.
- Add an empty state.
## Anti-patterns
- **Small text "to fit more on screen".** Less content visible is better than unreadable content.
- **Hover states.** TV has no hover. Use focus states.
- **Mouse-sized buttons (44pt).** Too small. 96pt+ visible targets.
- **Edge-anchored content.** Overscan eats it. Use safe-area insets.
- **High-density grids (8+ columns).** Tiles become postage stamps.
- **Long forms with virtual keyboard.** TV text entry is painful. Minimize fields; offer voice / phone-handoff if the platform supports it.
- **Dense data tables.** TV is not a spreadsheet medium. Re-shape to lists, cards, or summary screens.From giolaq/tv-build-harness, MIT-0.
More from giolaq/tv-build-harness
- 0.563score
meta
giolaq
Meta skill loaded for all phases: project conventions, file modification rules, code quality standards
SkillBFreshness: B★ 4Claude Code +9 - 0.516score
kmp-data-layer
giolaq
Kotlin data layer patterns: data classes in shared-core, repository pattern, StateFlow, CatalogService, and content wiring
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-navigation
giolaq
Compose Navigation for TV: state-based screen switching, BackHandler, focus-aware transitions, and drawer/sidebar patterns
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-compose-tv
giolaq
Compose for TV patterns: TvLazyRow/Column, focusable cards, FocusRequester, D-pad navigation, and 10-foot UI composables
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-template-anatomy
giolaq
KMP TV template repo structure: shared-core, androidtv-app, appletv-app modules and where screens, theme, data, and navigation live
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
creative-tv-ui
giolaq
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
eas-build
giolaq
Expo Application Services cloud build configuration for TV app APK and IPA generation
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-build-commands
giolaq
Gradle build commands: assembleDebug, assembleRelease, APK output paths, and emulator installation
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-theming
giolaq
Compose MaterialTheme patterns: Color.kt, Typography, darkColorScheme, and TV-specific theming for KMP apps
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
kmp-verify-patterns
giolaq
How to verify KMP builds: compile checks, lint, common Compose compiler errors, Gradle dependency resolution issues
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
rn-manifest-wiring
giolaq
Content manifest wiring: how to connect content.json data to React Native data hooks and screen components
SkillCFreshness: C★ 4Claude Code +9 - 0.513score
rn-shared-ui-catalog
giolaq
Catalog of available shared-ui components: what exists in the template, how to reuse vs create new
SkillCFreshness: C★ 4Claude Code +9
Signals
- Stars
- 4
- Forks
- 0
- Open issues
- 3
- Last commit (this folder)
- Jun 22, 2026 (4 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT-0
- Repository
- github.com/giolaq/tv-build-harness
- Website
- tv-build-harness.vercel.app
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from giolaq
- 0.563score
meta
giolaq
Meta skill loaded for all phases: project conventions, file modification rules, code quality standards
SkillBFreshness: B★ 4Claude Code +9 - 0.516score
creative-tv-ui
giolaq
Creative visual design patterns for TV apps: typography, color depth, focus states, animations, per-content-type personalities
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-data-layer
giolaq
Kotlin data layer patterns: data classes in shared-core, repository pattern, StateFlow, CatalogService, and content wiring
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-navigation
giolaq
Compose Navigation for TV: state-based screen switching, BackHandler, focus-aware transitions, and drawer/sidebar patterns
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-compose-tv
giolaq
Compose for TV patterns: TvLazyRow/Column, focusable cards, FocusRequester, D-pad navigation, and 10-foot UI composables
SkillCFreshness: C★ 4Claude Code +9 - 0.516score
kmp-template-anatomy
giolaq
KMP TV template repo structure: shared-core, androidtv-app, appletv-app modules and where screens, theme, data, and navigation live
SkillCFreshness: C★ 4Claude Code +9
Cite this page
10ft-ui skill. Agent Mart. https://agentmart.dev/skills/giolaq-10ft-ui (last updated 2026-10-24)