agentsclimarketplace

Ios typography

Skill skullninja/skills/ios-design/skills/ios-typography

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

Install
npx -y skills add skullninja/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

  • 1 stars1 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.

SKILL.md

6.4 KB, ~1.6k tokens by cl100k_base, 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.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Gives 0 of the 12 instructions most design systems skills give in ~1.6k tokens

Counted across 528 of the 534 authors here whose files we hold, read 2026-08-07

  • Create a custom theme if neededin 54 of 528, across 10 files
  • Read the corresponding theme filein 54 of 528, across 10 files
  • Ask which theme to applyin 53 of 528, across 9 files
  • Show the theme showcasein 53 of 528, across 9 files
  • Maintain visual identity across all slidesin 50 of 528, across 6 files
  • Apply the specified colors and fontsin 47 of 528, across 3 files
  • Get explicit confirmationin 45 of 528, across 1 file
  • Generate a design system before codingin 19 of 528, across 6 files
  • Maintain at least 4.5:1 color contrast ratioin 19 of 528, across 8 files
  • Describe component shapes, colors, shadows, and interaction statesin 18 of 528, across 4 files
  • Check Python installation and install if missingin 17 of 528, across 4 files
  • Default to html-tailwind if stack is unspecifiedin 17 of 528, across 4 files

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 326,764. 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.