agentsclimarketplace

Ios typography

Skill ajwadrana/skills/ios-design/skills/ios-typography

Provide reusable skills, agents, and commands for Claude Code to improve workflow and iOS UX design with clear structure and integration.

Install
npx -y skills add ajwadrana/skills --skill ios-typography

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

iOS typography guidance. Triggers on: typography, fonts, type scale, text styling, iOS fonts, open source fonts, custom fonts, Dynamic Type, font pairing.

SKILL.md

6.4 KB, as published. Nobody here has run it

iOS Typography — Type Scale, Custom Fonts & Readability


1. Open-Source Font Recommendations

All fonts listed are free for commercial use.

Sans-Serif Display (Headlines, Large Titles)

FontCharacterSource
SatoshiGeometric, modern, confidentFontshare
Cabinet GroteskDistinctive, editorial feelFontshare
OutfitClean, geometric, versatileGoogle Fonts
General SansNeutral, contemporaryFontshare
SwitzerSwiss-inspired, professionalFontshare

Sans-Serif Body (Body Text, UI)

FontCharacterSource
Plus Jakarta SansWarm, rounded, highly readableGoogle Fonts
DM SansClean, low-contrast geometricGoogle Fonts
Nunito SansFriendly, balancedGoogle Fonts
Source Sans 3Adobe's workhorse sansGoogle Fonts
InterDesigned for screens, excellent at small sizesGoogle Fonts

Monospace (Code, Data, Tabular)

FontCharacterSource
JetBrains MonoDeveloper-friendly, ligaturesJetBrains
Fira CodeLigatures, wide language supportGoogle Fonts
IBM Plex MonoCorporate-clean monospaceGoogle Fonts

Serif (Editorial Apps Only)

FontCharacterSource
FrauncesVariable, quirky soft-serifGoogle Fonts
LoraElegant, well-balanced text serifGoogle Fonts
Source Serif 4Adobe's companion to Source SansGoogle Fonts

Font sources: Google Fonts, Fontshare (Indian Type Foundry — high quality, free)


2. iOS Type Scale

Map custom fonts to iOS text styles for automatic Dynamic Type scaling:

Text StyleDefault SizeWeightTypical Usage
.largeTitle34ptRegularScreen titles (NavigationStack large title)
.title28ptRegularSection headers
.title222ptRegularSubsection headers
.title320ptRegularCard titles
.headline17ptSemiboldEmphasized body text
.body17ptRegularPrimary content
.callout16ptRegularSecondary content
.subheadline15ptRegularMetadata, captions above content
.footnote13ptRegularTimestamps, auxiliary info
.caption12ptRegularLabels, badges
.caption211ptRegularFine print, legal

Using Custom Fonts with Dynamic Type

// CORRECT — scales with Dynamic Type
.font(.custom("Satoshi-Bold", size: 28, relativeTo: .title))

// WRONG — fixed size, ignores Dynamic Type
.font(.custom("Satoshi-Bold", fixedSize: 28))

Always use relativeTo: to bind custom fonts to a text style. This ensures your font scales when the user changes their preferred text size.


3. Typography Rules

Hierarchy

  • Use one display font (for titles/headers) and one body font (for everything else). Two fonts max.
  • If using a custom display font, SF Pro (system font) works well as the body font — no registration needed.
  • Create hierarchy through weight and color, not just size:
    Text("Title")
        .font(.custom("Satoshi-Bold", size: 20, relativeTo: .title3))
    Text("Subtitle")
        .font(.subheadline)
        .foregroundStyle(.secondary)
    

Line Length

  • Constrain body text to roughly 65 characters per line for readability
  • Use .frame(maxWidth: 600) on text-heavy content for iPad
  • lineLimit(_:) for truncation, .lineSpacing() for vertical rhythm

Weight Spectrum

  • Use at minimum 3 weights to create clear hierarchy: Bold/Semibold for titles, Regular for body, Regular + .secondary color for metadata
  • Avoid using Light/Thin weights for body text — they're hard to read on small screens

Spacing

// Adjust line spacing for readability
Text(longParagraph)
    .font(.body)
    .lineSpacing(4)

// Letter spacing for uppercase labels
Text("SECTION")
    .font(.caption)
    .kerning(1.2)
    .foregroundStyle(.secondary)

4. Readability on Glass

Liquid Glass surfaces are translucent — text must remain readable against variable backgrounds.

  • Increase font weight on glass surfaces. Where you'd normally use Regular, use Medium or Semibold.
  • Use .foregroundStyle(.primary) — the system applies vibrancy to maintain contrast.
  • Avoid .foregroundStyle(.tertiary) or .quaternary on glass — too faint against translucent backgrounds.
  • Don't manually set opacity on text over glass — let the vibrancy system handle it.
// Text on glass surface
VStack {
    Text("Card Title")
        .font(.headline)           // Already semibold
    Text("Supporting text")
        .font(.subheadline)
        .foregroundStyle(.secondary) // System handles vibrancy
}
.padding()
.glassEffect(in: .rect(cornerRadius: 12))

5. Custom Font Registration

Step 1: Add Font Files

Add .ttf or .otf files to your Xcode project. Ensure they're included in the app target (check Target Membership).

Step 2: Register in Info.plist

<key>UIAppFonts</key>
<array>
    <string>Satoshi-Regular.otf</string>
    <string>Satoshi-Medium.otf</string>
    <string>Satoshi-Bold.otf</string>
</array>

Or in Xcode: Target → Info → "Fonts provided by application" → add each filename.

Step 3: Verify Font Name

The font name in code may differ from the filename. Print available fonts to find the exact name:

// Debug helper — remove before shipping
for family in UIFont.familyNames.sorted() {
    for name in UIFont.fontNames(forFamilyName: family) {
        print(name)
    }
}

Step 4: Create a Type Scale Extension

extension Font {
    static func display(_ style: Font.TextStyle = .title) -> Font {
        .custom("Satoshi-Bold", size: UIFont.preferredFont(
            forTextStyle: style.uiKit).pointSize, relativeTo: style)
    }

    static func bodyText(_ style: Font.TextStyle = .body) -> Font {
        .custom("PlusJakartaSans-Regular", size: UIFont.preferredFont(
            forTextStyle: style.uiKit).pointSize, relativeTo: style)
    }
}

// Usage
Text("Welcome").font(.display(.largeTitle))
Text("Content").font(.bodyText())

This centralizes your type scale and ensures every use respects Dynamic Type.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.