UI typography on Apple platforms — text styles and Dynamic Type, the San Francisco family (Pro/Rounded/Compact/Mono/New York + width axis), optical sizes, tracking vs kerning, leading adjustments, and custom-font scaling. Use when choosing fonts, building type hierarchy, fixing truncation/legibility, or making custom fonts respect Dynamic Type.
npx skills add https://github.com/rshankras/claude-code-apple-skills --skill typography
Type is most of your UI. The system does the hard parts — optical sizes, tracking tables,
Dynamic Type — *if* you use its APIs. This skill covers when to trust the system, how to build
hierarchy deliberately, and what custom fonts owe you back.
Predefined styles (Large Title → Caption 2) are weight + size + leading combos with Dynamic
Type support built in — and different styles scale *differently* (body grows more than
footnote), which manual font sizes can't replicate.
varies per style: some go medium→semibold, others bold→heavy) before reaching for new fonts.
scaling assumptions.
letterforms, looser tracking for legibility; above: tighter, more refined). System font APIs do
this automatically — hardcoded single-cut fonts don't.
disable clashing features (ligatures). Override system tracking only in exceptional cases.
allowsTightening (default-tightening-for-truncation) instead ofmanually squeezing — and prefer wrapping to truncating (line limit 0 on labels that matter).
system adds leading automatically for tall scripts (Arabic, Devanagari).
12 sizes: 7 default + 5 accessibility (AX1–AX5). .body runs 17pt at default up to 53pt
at AX5 — roughly 3× taller, and layouts must expect that. Escalate in order:
.font(.title) / preferredFont(forTextStyle:) +adjusts-for-content-size, line count 0 so text wraps instead of truncating.
@ScaledMetric for the non-text riding alongside (icon frames, spacing); SFSymbols scale via UIImage.SymbolConfiguration(textStyle:). Prioritize scaling
essential content over decoration.
dynamicTypeSize.isAccessibilitySize with AnyLayout(HStackLayout()) /
AnyLayout(VStackLayout()) (UIKit: flip the stack axis on
preferredContentSizeCategory.isAccessibilityCategory); give text the full line
width and relax lineLimit.
under 10% of screen height, and scaled to accessibility sizes it would eat almost a
quarter (WWDC24 10074). Scaling is always preferred; the viewer is the fallback, not
the fix.
Test at all 12 sizes (Xcode Previews → Variants → Dynamic Type Variants), not just the
biggest — mid-range accessibility sizes catch different wrap points.
| Face | Job |
|---|---|
| SF Pro | The default; UI text everywhere |
| SF Pro Rounded | Friendlier numerals/labels — widgets, health/fitness data |
| SF Compact | watchOS (space-efficient counterpart) |
| SF Mono | Code, tabular alignment |
| New York | Serif — reading experiences, editorial contrast |
| SF Arabic / SF Arabic Rounded | Arabic script with its own optical sizes |
The width axis (Condensed / Regular / Compressed / Expanded):
vertical proportions, so mixing them never misaligns baselines. 2–3 styles are enough —
pair one width with contrasting weights, one weight with contrasting widths, or oppose both
for maximum display contrast.
System fonts get Dynamic Type free; a brand font makes *you* the type engine:
UIFontMetrics(forTextStyle:).scaledFont(for:) + adjusts-for-content-size, orSwiftUI Font.custom(_:size:relativeTo:); scale layout constants with @ScaledMetric.
font doesn't cover (the system stacks: system-ui, ui-rounded, ui-serif, ui-monospace
on the web).
does that a licensed font usually doesn't.
❌ Anti-patterns: hardcoded point sizes on user-facing text · kerning APIs for tracking jobs ·
custom font without relativeTo: (frozen size) · Compressed body text · truncation where
wrapping was possible.
Type review: Element | Current (font/size/style) | Issue (hierarchy/scaling/legibility) | Fix
— check Dynamic Type at XXL + AX sizes before signing off; pairs with the contrast rules in
generators/accessibility-generator.
design/sf-symbols (symbols align to text styles), foundation/attributed-string (rich text mechanics), generators/accessibility-generatorToolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
Take rshankras/typography from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.