ALFMOB-426: Reconcile iOS icon set with Figma (Tabler assets)#95
Open
khoinguyen-mindera wants to merge 14 commits into
Open
ALFMOB-426: Reconcile iOS icon set with Figma (Tabler assets)#95khoinguyen-mindera wants to merge 14 commits into
khoinguyen-mindera wants to merge 14 commits into
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR reconciles Alfie’s iOS iconography with the Figma Tabler-based icon set by introducing an asset-backed icon catalog and making Icon resolve to bundled vector assets for the in-scope categories, while retaining SF Symbols as design-approved fallbacks.
Changes:
- Added
Icons.xcassetsas a SharedUI SPM resource and updatedIconto render asset-backed icons (with a defined SF Symbol fallback set). - Introduced
ThemedIconto standardize token-driven icon sizing (16/24/32/40) and migrated several components/demo views off hardcoded icon sizing/tint chains. - Added unit tests and documentation to lock down icon resolution, fallback set integrity, alias behavior, and the Figma re-export runbook.
Reviewed changes
Copilot reviewed 71 out of 119 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| Alfie/AlfieKit/Package.swift | Registers the new Icons.xcassets resource bundle in SharedUI. |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Icons/Icon.swift | Converts Icon into a hybrid (asset-backed + SF fallback) renderer with alias mapping and fallback set. |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Icons/ThemedIcon.swift | Adds token-sized, template-tinted icon view for consistent call-site usage. |
| Alfie/AlfieKit/Tests/SharedUITests/IconTests.swift | Adds resolution/coverage guards for asset icons, SF fallbacks, aliases, and size-token mapping. |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Icons/Icons.xcassets/** | Adds the bundled SVG icon catalog (template rendering + preserve vector). |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/SizingBanner/ColorAndSizingSelectorHeaderView.swift | Migrates chevron rendering to ThemedIcon. |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Components/Selectors/PickerMenu.swift | Migrates chevron rendering to ThemedIcon. |
| Alfie/AlfieKit/Sources/SharedUI/Theme/Accordion/AccordionView.swift | Migrates chevron rendering to ThemedIcon (with rotation). |
| Alfie/AlfieKit/Sources/SharedUI/Components/Indicators/PaginatedControl.swift | Migrates chevron buttons to ThemedIcon. |
| Alfie/AlfieKit/Sources/SharedUI/Components/Carousel/ZoomableCarousel/ZoomableCarousel.swift | Migrates close button icon to ThemedIcon. |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Toolbar/ToolbarDemoView.swift | Updates demo icon reference to a remaining icon case. |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/SortBy/DemoSortByView.swift | Updates demo icon references away from deleted cases. |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Inputs/InputDemoView.swift | Updates demo default icon away from deleted cases. |
| Alfie/AlfieKit/Sources/DebugMenu/UI/Demo/Dividers/DividerDemoView.swift | Updates demo icon references away from deleted cases. |
| Docs/Iconography.md | Documents the Figma source, node map, re-export process, and fallback list. |
| Docs/Plans/ALFMOB-426-iconography-figma/_status.md | Adds the execution status record for the work. |
| Docs/Plans/ALFMOB-426-iconography-figma/plan.md | Adds the implementation plan/decisions and acceptance criteria mapping. |
| Docs/Plans/ALFMOB-426-iconography-figma/scope.md | Captures current-state audit and Figma inventory for the icon system. |
| Docs/Plans/ALFMOB-426-iconography-figma/grill.md | Records key decisions (mappings, deletions, fallbacks, coverage strategy). |
| Docs/Plans/ALFMOB-426-iconography-figma/phase-1-assets.md | Phase documentation for asset export + catalog creation. |
| Docs/Plans/ALFMOB-426-iconography-figma/phase-2-icon-enum.md | Phase documentation for hybrid enum + asset-aware rendering. |
| Docs/Plans/ALFMOB-426-iconography-figma/phase-3-themed-icon-view.md | Phase documentation for token-bound ThemedIcon adoption. |
| Docs/Plans/ALFMOB-426-iconography-figma/phase-4-docs-coverage.md | Phase documentation for docs + unit-test appearance coverage. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ALFMOB-426 — [iOS] Iconography: reconcile icon set with Figma
Replaces SF-Symbol rendering with the Figma Tabler-based icon set for the in-scope
Arrows & System (14) + E-commerce (34) categories.
Iconis now a hybrid enum: in-scopecases resolve to bundled vector assets; the rest stay SF-Symbol fallbacks (permitted by the AC).
Ticket: https://mindera.atlassian.net/browse/ALFMOB-426
What changed
Icons.xcassets(SharedUI) — 48 icons exported from Figma as SVG, template-rendering + preserve-vector; wired intoPackage.swift.Icon.swift— hybrid enum: 50 asset-backed cases + 10 SF-Symbol fallbacks; asset-awareimage/uiImage. Existing Swift case names kept stable (no call-site churn). Two aliases (info→help,reload→loading) share a glyph viaassetName.ThemedIcon— token-bound icon view (size fromSizing.iconsIcon{Small,Medium,Large,Xlarge}= 16/24/32/40, template tint). Migrated 5 in-scope components (Accordion, PickerMenu, SizingBanner header, PaginatedControl, ZoomableCarousel) off hardcoded points/colours.IconTests(resolution, fallback validity, alias mapping, size-token mapping) as the appearance-coverage substitute (repo snapshot suite is disabled).Docs/Iconography.md: Figma→repo re-export runbook + node-ID map.These 10 cases intentionally remain SF Symbols; they'd come from out-of-scope categories:
aCirclezCirclearrowLeftchartUpTrendchartDownTrendchat2locationlogInstorecloseCircleFillPost-review updates
Addressed PR review + Copilot feedback:
closeCircleFillto the SF circled-X badge (Figma "Clear" is a bare X — added as the separateclearcase) so the wishlist remove affordance is unchanged..accessibilityLabels (newL10n.Accessibility.*) across icon-only controls; bundled assets otherwise expose raw asset names to VoiceOver.ThemedIconis decorative-by-default with an opt-in label.Sizing.iconsIcon*tokens instead of hardcoded values.Icon.close.image(PLP refine sheet) to token-sizedThemedIcon.rewards(rosette) fallback + its deadrewardsItem()toolbar helper — it rendered nowhere in the live app. Live fallback set is now 10.🎨 Needs design sign-off
The SF→Tabler name mappings were flagged in the ticket as "resolve at refinement." They're
implemented per the agreed provisional mapping (notably:
heart→Wishlist,warning→Alert,filter→Refine,list→Menu Alt,logOut→Exit,grid→Grid 2,listplp→Grid 1). The architecturedecouples mapping from code — re-mapping any icon is re-exporting one SVG + editing one raw value.
Out of scope
Food & Nature / Care Guide / House & Furniture / Accommodations categories ·
ButtonIcon(checkbox/radio) · full call-site sweep (only in-scope components migrated) · Android/Flutter/Web
(sibling tickets) · automated export pipeline.
Verification
./Alfie/scripts/verify.sh --skip-integration→ ✅ build + unit tests pass (no BFF/networking surface).🤖 Generated with Claude Code