ALFMOB-266: Integrate typography tokens (Figma-named provider + full call-site migration)#87
ALFMOB-266: Integrate typography tokens (Figma-named provider + full call-site migration)#87khoinguyen-mindera wants to merge 54 commits into
Conversation
…clear stale pulled JSON
…, fix demo dupes, sync plan docs
…onsistent demo Black swatch
…ape) + Environment seam
…leCrossedOutShape directly
There was a problem hiding this comment.
Pull request overview
This PR migrates Alfie iOS typography to be driven by generated design tokens, exposing a new Figma-named typography surface via ThemeProvider.shared.font and updating all call sites to use it, while bundling/registering the brand font and adding unit coverage for token-to-font bridging.
Changes:
- Introduces token-driven typography API (
theme.font.display/heading/body/label/link) backed byThemedTypographyStyle(callAsFunction+.uiFont). - Removes the legacy
header/paragraph/small/tinytypography system and migrates SharedUI, DebugMenu, and feature-module call sites. - Adds Libre Baskerville (license + asset catalog entry) and unit tests validating font resolution and provider/token consistency.
Reviewed changes
Copilot reviewed 107 out of 108 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/scope.md | Documents token contract + legacy system scope |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/red-team.md | Red-team findings and resolutions |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/plan.md | Full migration plan and ACs |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/phase-5-remove-legacy.md | Legacy removal steps/checklist |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/phase-4-migrate-features-tests.md | Feature-module migration steps |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/phase-3-migrate-debugmenu.md | DebugMenu migration steps |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/phase-2-migrate-sharedui.md | SharedUI migration steps |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/phase-1-foundation.md | Foundation bridge/provider plan |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/grill.md | Decision record for rename-now migration |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/dev-foundation.md | Phase-1 implementation summary |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/dev-3.md | Feature-module migration summary |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/dev-2.md | DebugMenu migration summary |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/dev-1.md | SharedUI migration summary |
| Docs/Plans/ALFMOB-266-integrate-typography-tokens/_status.md | Work status checklist and verification notes |
| Alfie/AlfieKit/Tests/SharedUITests/Typography/TypographyStyleFontTests.swift | Tests for token→UIFont mapping + invariants |
| Alfie/AlfieKit/Tests/SharedUITests/Typography/TypographyProviderTokenTests.swift | Tests ensuring provider styles match tokens |
| Alfie/AlfieKit/Sources/Web/UI/WebView.swift | Migrates error view typography call sites |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/TypographyProvider.swift | Replaces legacy provider surface with Figma groups |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/ThemedTypographyStyle.swift | Adds callable style wrapper + .uiFont |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Specifications/TypographyTinyProtocol.swift | Deletes legacy tiny typography spec |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Specifications/TypographySmallProtocol.swift | Deletes legacy small typography spec |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Specifications/TypographyParagraphProtocol.swift | Deletes legacy paragraph typography spec |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Specifications/TypographyHeaderProtocol.swift | Deletes legacy header typography spec |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Specifications/TypographyGroups.swift | Adds Figma group protocols + implementations |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Resources/LibreBaskerville-OFL.txt | Adds OFL license text for bundled font |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Resources/Fonts.xcassets/LibreBaskerville-Regular.dataset/Contents.json | Adds font asset catalog entry |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Helpers/TypographyStyle+Font.swift | Adds typography token bridge + build(style:) |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Typography/Helpers/FontNames.swift | Adds Libre Baskerville font name + filename mapping |
| Alfie/AlfieKit/Sources/SharedUI/Theme/ThemeProvider.swift | Updates appearance setup to new typography API |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Segmented/ThemedSegmentedView.swift | Migrates segmented view typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Modal/ThemedModal.swift | Migrates modal typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Inputs/ThemedInput.swift | Migrates input typography + .uiFont usage |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SizingBanner/SizingSwatchView.swift | Migrates sizing swatch typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SizingBanner/ColorAndSizingSelectorHeaderView.swift | Migrates sizing header typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SearchBar/ThemedSearchBarView.swift | Migrates search bar typography + .uiFont usage |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/RadioButton/RadioButton.swift | Migrates radio button typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Loader/ThemedLoaderView.swift | Migrates loader typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Loader/LoaderView.swift | Migrates loader typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Checkbox/Checkbox.swift | Migrates checkbox typography |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Buttons/ThemedButton.swift | Migrates button typography + underline param |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Accordion/AccordionView.swift | Migrates accordion typography |
| Alfie/AlfieKit/Sources/SharedUI/Helpers/Modifiers/Shimmering/MultilineShimmerEffectModifier.swift | Migrates shimmer modifier typography + .uiFont |
| Alfie/AlfieKit/Sources/SharedUI/Components/Toolbar/ThemedToolbarTitle.swift | Migrates toolbar title typography + .uiFont |
| Alfie/AlfieKit/Sources/SharedUI/Components/Toolbar/ThemedToolbarButton.swift | Migrates toolbar button typography + .uiFont |
| Alfie/AlfieKit/Sources/SharedUI/Components/Tags/Tag.swift | Migrates tag typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/TabControl/TabControl.swift | Migrates tab control typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/SortBy/SortByView.swift | Migrates sort-by typography + static Font usage |
| Alfie/AlfieKit/Sources/SharedUI/Components/Snackbar/SnackbarView.swift | Migrates snackbar typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/ProductCards/VerticalProductCardConfiguration+Extension.swift | Migrates card configuration UIFont access |
| Alfie/AlfieKit/Sources/SharedUI/Components/ProductCards/HorizontalProductCard.swift | Migrates product card typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/Price/PriceComponentView.swift | Migrates price typography + .uiFont sizing |
| Alfie/AlfieKit/Sources/SharedUI/Components/Indicators/PaginatedControl.swift | Migrates pagination typography + .uiFont usage |
| Alfie/AlfieKit/Sources/SharedUI/Components/Indicators/BadgeViewModifier.swift | Migrates badge typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/Indicators/BadgeTabViewModifier.swift | Migrates badge appearance UIFont usage |
| Alfie/AlfieKit/Sources/SharedUI/Components/ErrorView/ErrorView.swift | Migrates optional mapping to callable style |
| Alfie/AlfieKit/Sources/SharedUI/Components/Chips/Chip.swift | Migrates chip typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/Carousel/ProductCarousel/ProductCarouselHeader.swift | Migrates carousel header typography |
| Alfie/AlfieKit/Sources/SharedUI/Components/AppUpdate/ForceAppUpdateView.swift | Migrates app update typography |
| Alfie/AlfieKit/Sources/Search/UI/SearchView.swift | Migrates search empty-state typography |
| Alfie/AlfieKit/Sources/Search/UI/RecentSearchesView.swift | Migrates recent-searches typography + underline param |
| Alfie/AlfieKit/Sources/ProductListing/UI/ProductListingFilterBar.swift | Migrates PLP filter bar typography |
| Alfie/AlfieKit/Sources/ProductListing/UI/ProductListingFilter.swift | Migrates static Font constant to .uiFont |
| Alfie/AlfieKit/Sources/ProductDetails/UI/ProductDetailsView.swift | Migrates PDP typography including ErrorView |
| Alfie/AlfieKit/Sources/ProductDetails/UI/ProductDetailsColorAndSizeSheet.swift | Migrates PDP sheet typography + .uiFont |
| Alfie/AlfieKit/Sources/MyAccount/UI/AccountSectionView.swift | Migrates account section typography |
| Alfie/AlfieKit/Sources/Home/UI/HomeView.swift | Migrates home title typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/FeatureToggle/FeatureToggleView.swift | Migrates feature toggle typography + .uiFont |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Typography/TypographyDemoView.swift | Updates demo to new typography groups |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Toolbar/ToolbarDemoView.swift | Migrates toolbar demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Toggle/ToggleDemoView.swift | Migrates toggle demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Tags/TagDemoView.swift | Migrates tag demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/TabControl/TabControlIntrinsicWidthDemoView.swift | Migrates tab control demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/TabControl/TabControlFixedWidthDemoView.swift | Migrates tab control demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/StyleGuideDemoView.swift | Migrates style guide demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Spacing/SpacingDemoView.swift | Migrates spacing demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Snackbars/SnackbarDemoView.swift | Migrates snackbar demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Shimmering/ShimmerDemoView.swift | Migrates shimmer demo typography + .uiFont |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Shadow/ShadowDemoView.swift | Migrates shadow demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Segments/SegmentsDemoView.swift | Migrates segments demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/SearchBar/SearchBarDemoView.swift | Migrates search bar demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Pricing/PriceComponentDemoView.swift | Migrates pricing demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/PageControl/PageControlDemoView.swift | Migrates page control demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Motion/MotionDemoView.swift | Migrates motion demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Modal/ModalDemoView.swift | Migrates modal demo typography + .uiFont |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Loading/LoadingDemoView.swift | Migrates loading demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Inputs/InputDemoView.swift | Migrates input demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Indicators/BadgeDemoView.swift | Migrates badge demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Iconography/IconographyDemoView.swift | Migrates iconography demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Helper/DemoHelper.swift | Migrates demo helper typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Dividers/DividerDemoView.swift | Migrates divider demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/CornerRadius/CornerRadiusDemoView.swift | Migrates corner radius demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Components/RadioListDemoView.swift | Migrates radio list demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Components/DatePickerDemoView.swift | Migrates date picker demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Components/ChipsDemoView.swift | Migrates chips demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Colors/ColorsDemoView.swift | Migrates colors demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/CarouselDemoView/CarouselDemoView.swift | Migrates carousel demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Buttons/ButtonDemoView.swift | Migrates button demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Accordion/AccordionDemoView.swift | Migrates accordion demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/DeepLinking/DeepLinkDemoView.swift | Migrates deep link demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/DebugMenuView.swift | Migrates debug menu navigation typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Configuration/AppUpdateDemoView.swift | Migrates app update demo typography |
| Alfie/AlfieKit/Sources/DebugMenu/UI/BrazePush/BrazeDemoView.swift | Migrates braze demo typography |
| Alfie/AlfieKit/Sources/CategorySelector/UI/CategoriesView.swift | Migrates categories typography |
| Alfie/AlfieKit/Sources/CategorySelector/UI/BrandsView.swift | Migrates brands typography + .uiFont uses |
| Alfie/AlfieKit/Sources/AppFeature/UI/TabBarItemView.swift | Migrates tab bar item typography |
| Alfie/AlfieKit/Sources/AppFeature/UI/ForceAppUpdateView.swift | Migrates force update typography |
| Alfie/AlfieKit/Package.swift | Adds OFL license file as packaged resource |
…ng/lineHeight tests; collapse dead switch
Adopt Primitives.Colours.* design tokens; delete legacy Colors.primary/ secondary providers + Colors.xcassets. Conflicts resolved by keeping 266's typography API (font.display/heading/body/label/link) and taking 274's color tokens. No legacy Colors.* or old font API remain.
Adopt Primitives.Spacing.* and Sizing.* tokens; rename provider ThemeProvider -> DesignSystem (font + spacing + shape). Conflicts resolved keeping 266 typography (font.body/heading/display) + color tokens, taking 270 spacing/shape tokens + DesignSystem name. No legacy Colors/Spacing/ CornerRadius or old font API remain.
…r.xcassets
ThemedToggleView's ColorToggle now references Primitives.Colours.* (greys ->
neutrals, on-state greens -> semanticSuccess) instead of the ToggleColor.xcassets
asset catalog, which is removed. No asset-catalog Color("...") refs remain in
SharedUI. App-shell AccentColor/LaunchScreenBackground kept (build-setting/
storyboard, outside the token pipeline).
Color.white -> Primitives.Colours.neutrals0 (ColorSwatchView); Color.clear / UIColor.clear -> Primitives.Colours.transparentTransparent(.ui) across app, SharedUI, AppFeature, CategorySelector. Utils leaf module keeps Color.clear (no SharedUI dependency; structural GeometryReader background). Also drop the stale ToggleColor.xcassets resource entry from Package.swift.
7177d70 to
eb29256
Compare
…typography-tokens # Conflicts: # Alfie/AlfieKit/Sources/AppFeature/UI/ForceAppUpdateView.swift # Alfie/AlfieKit/Sources/AppFeature/UI/TabBarItemView.swift # Alfie/AlfieKit/Sources/CategorySelector/UI/BrandsView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Configuration/AppUpdateDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/DeepLinking/DeepLinkDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Buttons/ButtonDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/CarouselDemoView/CarouselDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Colors/ColorsDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/CornerRadius/CornerRadiusDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Dividers/DividerDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Helper/DemoHelper.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Iconography/IconographyDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Inputs/InputDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Loading/LoadingDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Modal/ModalDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Motion/MotionDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Pricing/PriceComponentDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/SearchBar/SearchBarDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Shadow/ShadowDemoView.swift # Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Shimmering/ShimmerDemoView.swift # Alfie/AlfieKit/Sources/ProductDetails/UI/ProductDetailsColorAndSizeSheet.swift # Alfie/AlfieKit/Sources/ProductDetails/UI/ProductDetailsView.swift # Alfie/AlfieKit/Sources/ProductListing/UI/ProductListingFilter.swift # Alfie/AlfieKit/Sources/ProductListing/UI/ProductListingFilterBar.swift # Alfie/AlfieKit/Sources/Search/UI/RecentSearchesView.swift # Alfie/AlfieKit/Sources/Search/UI/SearchView.swift # Alfie/AlfieKit/Sources/SharedUI/Components/AppUpdate/ForceAppUpdateView.swift # Alfie/AlfieKit/Sources/SharedUI/Components/Carousel/ProductCarousel/ProductCarouselHeader.swift # Alfie/AlfieKit/Sources/SharedUI/Components/Chips/Chip.swift # Alfie/AlfieKit/Sources/SharedUI/Components/ErrorView/ErrorView.swift # Alfie/AlfieKit/Sources/SharedUI/Components/Indicators/BadgeViewModifier.swift # Alfie/AlfieKit/Sources/SharedUI/Components/Price/PriceComponentView.swift # Alfie/AlfieKit/Sources/SharedUI/Components/ProductCards/HorizontalProductCard.swift # Alfie/AlfieKit/Sources/SharedUI/Components/ProductCards/VerticalProductCardConfiguration+Extension.swift # Alfie/AlfieKit/Sources/SharedUI/Components/SortBy/SortByView.swift # Alfie/AlfieKit/Sources/SharedUI/Components/Toolbar/ThemedToolbarTitle.swift # Alfie/AlfieKit/Sources/SharedUI/Helpers/Modifiers/Shimmering/MultilineShimmerEffectModifier.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Components/ColorBanner/ColorSwatchView.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Loader/LoaderView.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Loader/ThemedLoaderView.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SearchBar/ThemedSearchBarView.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SizingBanner/ColorAndSizingSelectorHeaderView.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/DesignSystem.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Inputs/ThemedInput.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Modal/ThemedModal.swift # Alfie/AlfieKit/Sources/SharedUI/Theme/Segmented/ThemedSegmentedView.swift # Alfie/AlfieKit/Sources/Web/UI/WebView.swift
… assert all token fields
| override func setUp() { | ||
| super.setUp() | ||
| // Brand (Display) styles resolve via UIFont(name:), so the bundled face must be registered. | ||
| try? FontManager.registerAll() | ||
| } |
| override func setUp() { | ||
| super.setUp() | ||
| // The brand (Display) face resolves through UIFont(name:), so it must be registered. | ||
| try? FontManager.registerAll() | ||
| } |
amccall-mindera
left a comment
There was a problem hiding this comment.
Approving ALFMOB-266. Typography is now token-driven end-to-end: the UIFont bridge resolves SF Pro via systemFont and the brand face via UIFont(name:) with a safe size/weight-preserving fallback; AttributedString builders reuse the existing line-height/kerning path; Libre Baskerville is bundled and registered at launch; and the provider→token unit tests compare all token fields (family/weight/size/lineHeight/letterSpacing), not just point size. The ~250-site migration and removal of the legacy Header/Paragraph/Small/Tiny protocols are per the epic ADR (absorbing ALFMOB-267) — worth updating the AC wording to match. App-wide visual shifts are accepted per the PR description. Prior Copilot threads reviewed; the remaining try? FontManager.registerAll() in test setup is a minor test-robustness nit, not blocking.
ALFMOB-266 — Integrate typography tokens from design token JSON
Ticket: ALFMOB-266 · Epic: ALFMOB-264 · ADR: ALFMOB-293
What & why
Drives the iOS typography system from the generated design tokens (
SharedUI/GeneratedTokens/Typography+Generated.swift) instead of hardcoded constants. Per the epic ADR, the public typography surface now uses the Figma token names verbatim — the legacyheader/paragraph/small/tinysystem is removed. The themed-provider middle layer is kept (DI-injected, mockable); UI code never touchesTypography.*directly.Changes
theme.font.display / heading / body / label / link.*, each aThemedTypographyStylevalue type:theme.font.heading.large("Title")→ styledAttributedString(callAsFunction;underline:/strike:params)theme.font.body.medium.uiFont→UIFontfor UIKit/.font(Font(…))/.withSizesitesTypographyStyle.uiFont:"SF Pro"→UIFont.systemFont(ofSize:weight:)(notUIFont(name:));"Libre Baskerville"→ bundled brand face; weightInt → UIFont.Weight(400→.regular, 500→.medium); token line-height + kerning applied via the existingAttributedString.build.Fonts.xcassets+OFL.txt; registered via the existingAlfieAppFontManager.registerAll()launch hook.Typography{Header,Paragraph,Small,Tiny}protocols/classes; trimmedTypographyProvider;setupAppearance()→heading.small.uiFont.TypographyStyleFontTests+TypographyProviderTokenTests(pointSize/weight/family resolution, system-vs-UIFont(name:), brand registration, provider == token).Token mapping (legacy → Figma)
header.h1→heading.large(36→32) ·h2→heading.medium·h3→heading.small·paragraph.*→body.medium·small.*→body.small(14→12) ·tiny.*→body.small. Underline/strike preserved via params; bold/italic distinctions dropped (legacy already rendered as a single Medium face).Tokens now apply real line-height, kerning and weights, so themed text shifts app-wide:
h136→32,small14→12, body weight → regular,small/tinyconverge at 12pt, bold emphasis dropped. Snapshot tests are disabled (pre-existing), so these have no automated visual coverage — value-equality unit tests + a manual DebugMenu Typography check only. Visual polish/baseline refresh is deliberately out of scope.Verification
./Alfie/scripts/verify.sh --skip-integration→ ✅ build + unit tests pass (integration skipped — no local BFF). Multi-lens code review (foundation + migration/adversarial): clean.Notes
GeneratedTokens/orproject.pbxproj.Docs/Plans/ALFMOB-266-integrate-typography-tokens/.🤖 Generated with Claude Code