Apple HIG
The visual and structural half of Apple design: what things look like, what size they are, what
they're called, and how they're composed. For motion, gestures, and interaction physics, use the
apple-design skill instead — the two are complements, not overlaps.
Target: iOS/iPadOS 26+ (Liquid Glass). Corpus crawled from developer.apple.com, most pages
stamped 2025-12-16 or later. Every reference file carries its own source URL and update date.
How to use this skill
references/ holds 171 verbatim HIG pages (1.8 MB). Never read them all. Read the specific
pages the task needs, and prefer the four digests below for anything numeric.
Digests — read these first for hard values
| File |
Contains |
references/_specs-typography.md |
Full Dynamic Type scale (xSmall→xxxLarge, AX1–AX5), SF Pro tracking per point size, minimum/default sizes |
references/_specs-color.md |
Every system color + gray as hex, light/dark/increased-contrast |
references/_specs-layout.md |
Device dimensions pt+px, size classes, margins, safe areas |
references/_specs-geometry.md |
Button sizes/padding/radii, Liquid Glass layer stack, sheet radii, standard margins. Figma-derived — second-tier provenance, see the file header |
references/_index.json |
Machine-readable map of all 171 pages: slug, title, platforms, update date, table count, abstract |
Full pages — read on demand
Slug maps directly to filename: references/buttons.md, references/sheets.md,
references/tab-bars.md. Grep _index.json when unsure which page owns a topic.
Non-negotiable specs
These are the values most often gotten wrong. All verified against Apple source.
Type — iOS default (Large) Dynamic Type. Size / leading in points:
| Style |
Weight |
Size |
Leading |
| Large Title |
Regular |
34 |
41 |
| Title 1 |
Regular |
28 |
34 |
| Title 2 |
Regular |
22 |
28 |
| Title 3 |
Regular |
20 |
25 |
| Headline |
Semibold |
17 |
22 |
| Body |
Regular |
17 |
22 |
| Callout |
Regular |
16 |
21 |
| Subhead |
Regular |
15 |
20 |
| Footnote |
Regular |
13 |
18 |
| Caption 1 |
Regular |
12 |
16 |
| Caption 2 |
Regular |
11 |
13 |
Tracking is size-specific — never one value. 17pt → −0.43pt; positive below 12pt, negative
above. Full table in the typography digest.
Colors changed in iOS 26. The "unified" palette revised several system colors. systemBlue is
now #0088FF (light), not the pre-26 #007AFF. systemRed is #FF383C, not #FF3B30. Do not
carry over older constants. Grays are unchanged: systemGray #8E8E93, systemGray6 #F2F2F7 light /
#1C1C1E dark.
Minimum tap target is 44×44 pt. Non-negotiable, including on web.
Body text minimum 11pt, default 17pt on iOS/iPadOS.
Buttons are capsules, not squircles. corner-radius: 1000 — fully rounded. Heights 50 / 34 / 28
for Large / Medium / Small. Continuous corner curvature does not apply to them. Sheets do use large
radii: 34 top on iPhone, 38 on iPad. Standard content margin is 16 iPhone / 20 iPad. Full geometry
in references/_specs-geometry.md.
The most important rule
On native, these specs are for auditing — not for typing in.
Every number in the digests is something the system already produces. SwiftUI and UIKit give you the
50pt button, the 34pt sheet radius, the 17pt body text, the correct system blue. Reproducing those
values by hand does not make the UI more Apple-native — it makes it less so, because you have
frozen a value that is supposed to move. Hardcoded sizes break under Dynamic Type, break across
device classes, break in split view, and break when Apple revises the system next OS.
The failure looks like this:
// Wrong — freezes what the system should decide
Text("Continue").font(.system(size: 17)).frame(height: 50)
Button("Save") { }.background(Color(hex: "#0088FF")).cornerRadius(1000)
// Right — the system supplies the same values, and keeps supplying correct ones
Text("Continue").font(.body)
Button("Save") { }.buttonStyle(.glassProminent)
Use the specs to verify what you're rendering, to build on the web where nothing is given,
and to reason about proportion. Do not use them to reimplement what the framework ships. If you
are hardcoding a value from these tables on native, the fix is almost always to delete the modifier.
The exception is web work, where you must supply every value yourself — see §Web caveat.
Working rules
- Semantic over literal. Use
Color.primary, .secondarySystemBackground, .tint — not raw
hex — in native code. The hex table exists for web work and for verifying what the system
produces, not for hardcoding into SwiftUI.
- Support Dynamic Type properly. Scale layout with the text: spacing in relative units, no
fixed-height text containers. Test at AX5 — that's where layouts break.
- Light and dark are both first-class. Every color decision needs both. Increased-contrast
variants exist and are in the digest.
- Liquid Glass is a material, not a color. Translucent layers over content, with the content
scrolling underneath. Never stack one translucent surface on another. See
references/materials.md.
- Use SF Symbols for iconography before drawing anything custom; match symbol weight to
adjacent text weight. See
references/sf-symbols.md.
- Respect the accessibility settings: reduced motion, reduced transparency, increased contrast,
bold text. See
references/accessibility.md.
- Name things the way Apple names them. A sheet is not a modal; a tab bar is not a nav bar.
Correct vocabulary makes the rest of the guidance findable.
Two workflows
A. New build — designing from scratch
- Read
references/designing-for-ios.md and references/design-principles.md for posture.
- Establish the token layer first, from the digests: type scale, color roles (light+dark), spacing,
and the 44pt target. Everything downstream depends on it.
- Pick navigation structure before screens —
references/tab-bars.md, references/sidebars.md,
references/split-views.md. This is the hardest thing to change later.
- Compose from documented components. For each one used, read its page: correct anatomy, states,
and platform behavior are all specified.
- Check patterns for the flows involved —
references/onboarding.md,
references/modality.md, references/feedback.md, references/entering-data.md.
- Verify against §Non-negotiable specs, then accessibility.
B. Retrofit — converting an existing app
Produce a gap report before changing any code.
- Inventory. List every screen, component, and token currently in use. Identify what each
maps to in HIG vocabulary — this reveals both non-standard components and misused standard ones.
- Audit against the digests, in this order (highest visual payoff first):
- Type: is there a real scale, does it match Dynamic Type, does it respond to user text size?
- Color: semantic roles or hardcoded hex? Does dark mode exist and is it correct?
- Targets and spacing: anything under 44pt, inconsistent spacing?
- Components: custom reimplementations of things the system already provides.
- Materials and depth: opaque bars where translucent layers belong.
- Accessibility: the four settings above.
- Classify each finding as:
token (cheap, global, high impact), component (medium, local),
structure (expensive — navigation model, information architecture).
- Phase the plan. Tokens first — they change everything at once and are low-risk. Components
second. Structure last, and only where it earns the cost. State explicitly what you're not
changing and why.
- Report as a table: finding, HIG reference, current state, target state, effort, phase.
Cite the reference file for every claim.
On native, the target state is almost always "delete code", not "change the number". A screen
with a hardcoded 44pt row height and #007AFF is not fixed by rewriting them to 50pt and #0088FF
— that repeats the original mistake with fresher values. It is fixed by removing the literals so
the system supplies them, and the value stops being your problem at the next OS release. Prefer, in
order: use the system component → use the semantic token → use the system value → hardcode (last
resort, and note why).
A good retrofit usually reduces the amount of styling code. If your plan adds spec constants
everywhere, you have translated Apple's system into your own dialect instead of adopting it.
Web caveat
When targeting the browser rather than native, these do not transfer cleanly — say so rather than
faking it:
- SF Pro is not licensed for general web use. Use
-apple-system, BlinkMacSystemFont, system-ui
so Apple platforms get the real font and others fall back gracefully.
- Continuous corner curvature (Apple's squircle) has no CSS equivalent.
border-radius is an
approximation; a slightly larger radius reads closer.
- Liquid Glass approximates as
backdrop-filter: blur() saturate() over a semi-transparent
background. It is not the same material and will not match on non-Apple hardware.
- Points are not pixels. 1pt = 1 CSS px at 1x, but Apple's specs assume 2x/3x rendering.
- Dynamic Type maps to
rem plus @media (prefers-*) queries, not to the OS text-size setting.
Provenance
Crawled from developer.apple.com/tutorials/data/design/human-interface-guidelines/*.json —
Apple's own backing API for the HIG site, so the prose is verbatim rather than reconstructed.
Color hex values are not published as text; they were recovered by sampling Apple's published
swatch images at 2x, and validated against known constants (systemGray #8E8E93,
systemGray6 #F2F2F7, systemGreen dark #30D158 — all exact matches).
Refreshing after a WWDC: re-run the crawl and diff. Each page's Change log section and the
updated field in _index.json show what Apple revised and when.
1---2name: apple-hig3description: Apple Human Interface Guidelines as a working reference — the visual and structural design system for iOS/iPadOS 26+ (Liquid Glass). Verbatim HIG corpus (171 pages) plus recovered hard specs — Dynamic Type scale, SF Pro tracking, system color hex, device metrics, layout margins. Use when building, reviewing, or converting UI that must look and behave Apple-native, on SwiftUI/UIKit or on the web. Covers components (buttons, sheets, tab bars, toolbars, lists, pickers), foundations (typography, color, layout, materials, icons, accessibility), and patterns (navigation, modality, onboarding, feedback, data entry). Trigger on "make this look like iOS", "Apple design", "HIG", "native iOS UI", "Liquid Glass", "system colors", "Dynamic Type", or any iOS design audit or spec question.4---56# Apple HIG78The visual and structural half of Apple design: what things look like, what size they are, what9they're called, and how they're composed. For motion, gestures, and interaction physics, use the10**apple-design** skill instead — the two are complements, not overlaps.1112**Target: iOS/iPadOS 26+ (Liquid Glass).** Corpus crawled from developer.apple.com, most pages13stamped `2025-12-16` or later. Every reference file carries its own source URL and update date.1415## How to use this skill1617`references/` holds 171 verbatim HIG pages (1.8 MB). **Never read them all.** Read the specific18pages the task needs, and prefer the four digests below for anything numeric.1920### Digests — read these first for hard values2122| File | Contains |23| --- | --- |24| `references/_specs-typography.md` | Full Dynamic Type scale (xSmall→xxxLarge, AX1–AX5), SF Pro tracking per point size, minimum/default sizes |25| `references/_specs-color.md` | Every system color + gray as hex, light/dark/increased-contrast |26| `references/_specs-layout.md` | Device dimensions pt+px, size classes, margins, safe areas |27| `references/_specs-geometry.md` | Button sizes/padding/radii, Liquid Glass layer stack, sheet radii, standard margins. **Figma-derived — second-tier provenance, see the file header** |28| `references/_index.json` | Machine-readable map of all 171 pages: slug, title, platforms, update date, table count, abstract |2930### Full pages — read on demand3132Slug maps directly to filename: `references/buttons.md`, `references/sheets.md`,33`references/tab-bars.md`. Grep `_index.json` when unsure which page owns a topic.3435## Non-negotiable specs3637These are the values most often gotten wrong. All verified against Apple source.3839**Type — iOS default (Large) Dynamic Type.** Size / leading in points:4041| Style | Weight | Size | Leading |42| --- | --- | --- | --- |43| Large Title | Regular | 34 | 41 |44| Title 1 | Regular | 28 | 34 |45| Title 2 | Regular | 22 | 28 |46| Title 3 | Regular | 20 | 25 |47| Headline | Semibold | 17 | 22 |48| Body | Regular | 17 | 22 |49| Callout | Regular | 16 | 21 |50| Subhead | Regular | 15 | 20 |51| Footnote | Regular | 13 | 18 |52| Caption 1 | Regular | 12 | 16 |53| Caption 2 | Regular | 11 | 13 |5455Tracking is **size-specific** — never one value. 17pt → −0.43pt; positive below 12pt, negative56above. Full table in the typography digest.5758**Colors changed in iOS 26.** The "unified" palette revised several system colors. `systemBlue` is59now `#0088FF` (light), not the pre-26 `#007AFF`. `systemRed` is `#FF383C`, not `#FF3B30`. Do not60carry over older constants. Grays are unchanged: `systemGray #8E8E93`, `systemGray6 #F2F2F7` light /61`#1C1C1E` dark.6263**Minimum tap target is 44×44 pt.** Non-negotiable, including on web.6465**Body text minimum 11pt, default 17pt** on iOS/iPadOS.6667**Buttons are capsules, not squircles.** `corner-radius: 1000` — fully rounded. Heights 50 / 34 / 2868for Large / Medium / Small. Continuous corner curvature does not apply to them. Sheets do use large69radii: 34 top on iPhone, 38 on iPad. Standard content margin is 16 iPhone / 20 iPad. Full geometry70in `references/_specs-geometry.md`.7172## The most important rule7374**On native, these specs are for auditing — not for typing in.**7576Every number in the digests is something the system already produces. SwiftUI and UIKit give you the7750pt button, the 34pt sheet radius, the 17pt body text, the correct system blue. Reproducing those78values by hand does not make the UI more Apple-native — it makes it *less* so, because you have79frozen a value that is supposed to move. Hardcoded sizes break under Dynamic Type, break across80device classes, break in split view, and break when Apple revises the system next OS.8182The failure looks like this:8384```swift85// Wrong — freezes what the system should decide86Text("Continue").font(.system(size: 17)).frame(height: 50)87Button("Save") { }.background(Color(hex: "#0088FF")).cornerRadius(1000)8889// Right — the system supplies the same values, and keeps supplying correct ones90Text("Continue").font(.body)91Button("Save") { }.buttonStyle(.glassProminent)92```9394Use the specs to **verify** what you're rendering, to **build on the web** where nothing is given,95and to **reason about proportion**. Do not use them to reimplement what the framework ships. If you96are hardcoding a value from these tables on native, the fix is almost always to delete the modifier.9798The exception is web work, where you must supply every value yourself — see §Web caveat.99100## Working rules1011021. **Semantic over literal.** Use `Color.primary`, `.secondarySystemBackground`, `.tint` — not raw103 hex — in native code. The hex table exists for web work and for verifying what the system104 produces, not for hardcoding into SwiftUI.1052. **Support Dynamic Type properly.** Scale layout with the text: spacing in relative units, no106 fixed-height text containers. Test at AX5 — that's where layouts break.1073. **Light and dark are both first-class.** Every color decision needs both. Increased-contrast108 variants exist and are in the digest.1094. **Liquid Glass is a material, not a color.** Translucent layers over content, with the content110 scrolling underneath. Never stack one translucent surface on another. See `references/materials.md`.1115. **Use SF Symbols for iconography** before drawing anything custom; match symbol weight to112 adjacent text weight. See `references/sf-symbols.md`.1136. **Respect the accessibility settings**: reduced motion, reduced transparency, increased contrast,114 bold text. See `references/accessibility.md`.1157. **Name things the way Apple names them.** A sheet is not a modal; a tab bar is not a nav bar.116 Correct vocabulary makes the rest of the guidance findable.117118## Two workflows119120### A. New build — designing from scratch1211221. Read `references/designing-for-ios.md` and `references/design-principles.md` for posture.1232. Establish the token layer first, from the digests: type scale, color roles (light+dark), spacing,124 and the 44pt target. Everything downstream depends on it.1253. Pick navigation structure before screens — `references/tab-bars.md`, `references/sidebars.md`,126 `references/split-views.md`. This is the hardest thing to change later.1274. Compose from documented components. For each one used, read its page: correct anatomy, states,128 and platform behavior are all specified.1295. Check patterns for the flows involved — `references/onboarding.md`,130 `references/modality.md`, `references/feedback.md`, `references/entering-data.md`.1316. Verify against §Non-negotiable specs, then accessibility.132133### B. Retrofit — converting an existing app134135Produce a gap report before changing any code.1361371. **Inventory.** List every screen, component, and token currently in use. Identify what each138 maps to in HIG vocabulary — this reveals both non-standard components and misused standard ones.1392. **Audit against the digests**, in this order (highest visual payoff first):140 - Type: is there a real scale, does it match Dynamic Type, does it respond to user text size?141 - Color: semantic roles or hardcoded hex? Does dark mode exist and is it correct?142 - Targets and spacing: anything under 44pt, inconsistent spacing?143 - Components: custom reimplementations of things the system already provides.144 - Materials and depth: opaque bars where translucent layers belong.145 - Accessibility: the four settings above.1463. **Classify each finding** as: `token` (cheap, global, high impact), `component` (medium, local),147 `structure` (expensive — navigation model, information architecture).1484. **Phase the plan.** Tokens first — they change everything at once and are low-risk. Components149 second. Structure last, and only where it earns the cost. State explicitly what you're not150 changing and why.1515. **Report as a table**: finding, HIG reference, current state, target state, effort, phase.152 Cite the reference file for every claim.153154**On native, the target state is almost always "delete code", not "change the number".** A screen155with a hardcoded 44pt row height and `#007AFF` is not fixed by rewriting them to 50pt and `#0088FF`156— that repeats the original mistake with fresher values. It is fixed by removing the literals so157the system supplies them, and the value stops being your problem at the next OS release. Prefer, in158order: use the system component → use the semantic token → use the system value → hardcode (last159resort, and note why).160161A good retrofit usually *reduces* the amount of styling code. If your plan adds spec constants162everywhere, you have translated Apple's system into your own dialect instead of adopting it.163164## Web caveat165166When targeting the browser rather than native, these do not transfer cleanly — say so rather than167faking it:168169- **SF Pro is not licensed for general web use.** Use `-apple-system, BlinkMacSystemFont, system-ui`170 so Apple platforms get the real font and others fall back gracefully.171- **Continuous corner curvature** (Apple's squircle) has no CSS equivalent. `border-radius` is an172 approximation; a slightly larger radius reads closer.173- **Liquid Glass** approximates as `backdrop-filter: blur() saturate()` over a semi-transparent174 background. It is not the same material and will not match on non-Apple hardware.175- **Points are not pixels.** 1pt = 1 CSS px at 1x, but Apple's specs assume 2x/3x rendering.176- Dynamic Type maps to `rem` plus `@media (prefers-*)` queries, not to the OS text-size setting.177178## Provenance179180Crawled from `developer.apple.com/tutorials/data/design/human-interface-guidelines/*.json` —181Apple's own backing API for the HIG site, so the prose is verbatim rather than reconstructed.182Color hex values are not published as text; they were recovered by sampling Apple's published183swatch images at 2x, and validated against known constants (`systemGray #8E8E93`,184`systemGray6 #F2F2F7`, `systemGreen` dark `#30D158` — all exact matches).185186**Refreshing after a WWDC:** re-run the crawl and diff. Each page's `Change log` section and the187`updated` field in `_index.json` show what Apple revised and when.