All notable changes to Aurum-iOS. Follows Keep a Changelog;
versions follow semver (patch = token/bug fix, minor = new component/token,
major = breaking API).
[0.2.3] - 2026-07-30
Fixed
- **
AurumSectionHeaderAction.linknow renders neutral-subtle, matching its
Figma master (5442:462).** The link action was styled identically to the
text action — Title/XS-SemiBold in interactive.textPrimaryNormal
(brand purple) with a 20pt iconPrimaryNormal chevron — so "View All /
See More" links shouted as loudly as the section title and were
indistinguishable from a brand text-button. The sheet's action link
layer specifies Body/S-Medium in interactive.textNeutralSubtle with a
12pt interactive.iconNeutralSubtle chevron; the component now follows
it. text is unchanged and remains the brand-emphasis option.
Consumer impact: every existing link action becomes grey and one
step smaller — intended, but visible. Mirrors aurum-android 0.3.29.
- **
surface.textStaticBlackDisabled/surface.iconStaticBlackDisabled
were #121212; Figma and Android say #000000** (same 32% alpha). The
token-codegen carried a deliberate "normalize `_global-colors/neutral/
black/100 to palette black100` for Android parity" mapping whose premise
was false — verified against the live Figma file (alias chain walks to
#000000@0.32) and Android's manifest (ships #000000). The mapping also
silenced the codegen's own alias-integrity check. Removed: aliases into
collections outside the primitives export now inline Figma's resolved
value verbatim (and colors/* misses still hard-fail). Surfaced by
aurum-mcp's cross-platform token-parity check at merge time.
Changed
- Portal redesigned as a specimen book (
tooling/gallery/): the
presentation layer is now the locked Aurum-portal design system
(tooling/gallery/design.md, shared with aurum-android; platform lens
tokens are the only divergence). Newspaper masthead with the version as
the issue line, live type specimens rendered from real tokens on the
landing page, hairline plates instead of cards, tabular spec sheets on
component pages, typographic Do/Don't columns, a build-facts colophon
footer, full OKLCH tokenisation (tooling/gallery/tokens.css), in-place
copy feedback, and a platform-lens colour drawn from the system's own
palette (iOS = visual.blue.600). Verified at 320/375/768/1440 px with no
horizontal scroll; light + dark.
- Gallery rebuilt as the "Aurum for iOS" designer portal
(tooling/gallery/generate.py): the presentation layer is now a port of
aurum-android's portal — landing page with hero/stats/release card,
light/dark/auto theme, ⌘K live search on components and icons,
copy-to-clipboard token swatches and icon symbol paths, per-component
pages with intended-use/Do/Don't cards and pinned-simulator snapshot
tiles, SPM install section, and bidirectional cross-links with the
Android portal. Data layer, CLI (--validate / --emit-manifest /
--out), and manifest schema unchanged.
Added
AurumIcons.Navigation.caretBold{Up,Down,Left,Right}(+Filled).
Their masters have been sitting in the canonical icon sheet
(5130:35416) without code counterparts on either platform. Single-weight
in Figma, so both weights resolve to the same asset — the same convention
the existing caret family uses. Imported via make icons-import from
aurum-android's normalized Vector Drawables, bringing the iOS set back to
parity at 89 icons × 2 weights. The ICON_MANIFEST in
tooling/icon-import/import_icons.py gained the matching entries; it is a
verbatim port of Android's table, so an entry added on one platform must
land on the other in the same sitting.
- Catalog app (
catalog/AurumCatalog.xcodeproj, XcodeGen-generated
from project.yml — SPM can't declare app targets): an on-device
showcase with 11 family screens covering every component, including
live demos of the stateful surfaces the static gallery can't show —
the toast FIFO queue + timers, the persistent banner host, bottom
sheet presentations, and interactive tabs / nav bar / stepper /
selection controls. make catalog regenerates + builds.
- Gallery + MCP manifest tooling (
tooling/gallery/generate.py, the
iOS twin of aurum-android's generator): --validate enforces the
doc-tag + Figma-url contract in CI (make validate-docs, wired into
check.yml); --out renders the static HTML gallery (components with
doc tags + snapshot strips, tokens, icons, changelog); --emit-manifest
emits the aurum-mcp manifest (schemaVersion: 2,
platforms: ["ios"]), schema-validated against aurum-android's
contract. pages.yml deploys gallery + /data/manifest.json to GitHub
Pages after check passes on main.
[0.2.2] - 2026-07-21
Fixed
- Code Connect: the checkbox mappings used property names guessed from
the radio set; the Figma checkbox masters actually expose
shownSubtext / shownLabel / shownHelptext / validationState
(and "indeterminate", not "intermediate"). v0.2.1's tag publish
failed validation on these; this release republishes all 197 mappings.
AurumCheckbox's mapping also gained the types label-position axis
(parity with Android's).
[0.2.1] - 2026-07-21
Added
AurumNavBar: bottom navigation withstandard3/4/5and
centerQr5 layouts (item-count preconditions), line→filled icon swap,
the purple/500 → pink/50 @ 61% brand ramp on selected glyphs (sRGB
blend helper — Color.mix needs iOS 18), and the raised 56 pt Scan-QR
dome (elliptical radial wash, gradient ring, purple hard shadow, 33 pt
glyph box for Figma's 27 pt drawn size). Labels clip at the cell edge
(Figma's overflow-clip) instead of ellipsising. One Code Connect
mapping (197 total parse clean) + one snapshot tile. **This completes
the aurum-android component-catalogue port** — every Figma-backed
Android component now has a SwiftUI counterpart (AurumScreen /
AurumFragmentBridge are Android platform glue with no iOS
equivalent).
- Surface, stepper, transaction card:
AurumSurface(base container
primitive — token background + shape clip + optional border +
.aurumShadow elevation; codebase-only), AurumStepper (± quantity
control, neutral/brand, "Add" initial state at minValue, bound-aware
disabling), AurumTransactionListCard (status-tinted history row:
feedback.* outer wash, white inner card, status badge, tinted amount,
optional 40 pt leading slot + helper line). Two Code Connect mappings
(196 total parse clean) + three snapshot tiles.
- Selection family:
AurumRadioButton+AurumRadioGroup,
AurumCheckbox (tri-state with check/indeterminate glyph shapes) +
AurumCheckboxGroup, and AurumSwitch (custom-drawn to the Figma/M3
anatomy — 52×32 track, thumb grows 16→24 pt with a check glyph when on,
which the native Toggle can't render). Controls draw Figma's press
state-layer via a press-reporting button style; error tinting, disabled
fade, start/end label positions, 32 pt-indented subtext, and group
label/helper/error lines all mirror Android. Five Code Connect mappings
(194 total parse clean) + four snapshot tiles.
- Tabs:
AurumTab(selected/unselected cell, optional 24 pt leading
icon, Title/XS-Bold label) + AurumTabRow (data-driven items: array —
a documented deviation from Android's slot lambda; fit-or-scroll width
algorithm max(widestNatural, 100 pt) with flex-equal fit and
pinned-width scroll modes, animated 2 pt indicator, hairline divider).
Two Code Connect mappings (189 total parse clean) + one snapshot tile.
- Headers:
AurumGlobalHeader(profile pill with radial sheen +
support / rewards+notifications / live-price right-group variants,
onLight/onDark schemes with dark-glass gradient borders) and
AurumPageHeader (56 pt title-and-actions row covering the 10 Figma
trailing-action types via nilable button/icon/overflow slots, 32×40 pt
icon wrappers, onDark scheme). Both bleed containerColor under the
status bar at the top edge (Android's inset params with no API). Two
Code Connect mappings (187 total parse clean) + two snapshot tiles.
- Toast + Banner families:
AurumToast(6 tones × small/large, per-tone
status glyph, always-dismissible; Code Connect mapping — 185 total parse
clean) with AurumToastHost/AurumToastHostState (FIFO-serialised async
showToast, short/long/indefinite auto-dismiss, slide-up/fade);
AurumBanner (persistent full-bleed top band, same tonal language,
inline action + optional ✕; backgrounds bleed under the status bar at the
top edge — Android's windowInsets for free) with
AurumBannerHost/AurumBannerHostState (single persistent slot,
slide-from-top expand/collapse). Plus AurumIconButton (icon-only
button, 44 pt touch floor, pressed dim) — needed by both close
affordances. Hosts + banner + icon button are codebase-only (no Figma
nodes), mirroring Android. AurumElevationLevel gained a public init
(Android parity) for the toast's master-declared 0/1/1 shadow recipe.
Four snapshot tiles.
- Progress bars:
AurumProgressBar(determinate 8 pt track + primary
fill, optional label/percentage header) and AurumSegmentedProgressBar
(bars/bubbles × 6 intents, numbered checkpoints). Two Code Connect
mappings (184 total parse clean) + two snapshot tiles.
AurumBottomSheet(.aurumBottomSheetmodifier): native.sheet
presentation with a self-sizing .height detent, token corner radius +
card colour, strict (56 pt header + sticky button slot) and flexible
types. Platform deviations documented: system drag indicator inside the
card, system scrim.
AurumOtpInput: underline digit cells (4/6), invisible capture field
with oneTimeCode autofill, none/error/success/timer validation states,
completion-boundary onComplete. AurumTypeStyle gained a public init
(parity with Android's constructible TextStyle) for its Figma-specified
24/32 Bold digit style.
- Field family:
AurumTextField(static-label anatomy, validation-driven
borders and derived status affordances, counter, secure entry, multiline;
shape via a small enum — SwiftUI's InsettableShape can't be type-erased),
AurumSearchField (pill + magnifier + clear), AurumPhoneNumberInput
(country prefix + digits-only filter), AurumAmountInput (Num/XL hero
value + currency symbol + derived suffix). Three more Code Connect
mappings (180 total parse clean) and four snapshot tiles.
- Second component wave, API-parity ports of aurum-android prioritized
by jar consumer usage: AurumLabel (default/subtle/strong × uppercase),
AurumLinkButton (text-only brand action with pressed dim + slots),
AurumBadge (6 roles × 2 emphases × 2 sizes, cross-axis token pairing,
optional leading icon), AurumChip (action/other × neutral/brand/black/
selected × large/small with pressed states), AurumSectionHeader
(title/subtitle + link/text/icon actions). Each with doc tags, a Code
Connect mapping (177 total now published on release), and snapshot tiles.
Fixed
AurumChip's capsule border rasterizes its stroke (drawingGroup) to
side-step an iOS 26.5 shape-layer quirk that paints stray vertical
hairlines at a stroked capsule's horizontal extremes.
[0.2.0] - 2026-07-20
Removed
- **
AurumIcons.Navigation.caretCircleUp/Down/Left/Right(+Filled) —
removed to restore the 1:1 sheet↔catalog contract** (breaking). Their
Figma masters were deleted from the "Component Icons" sheet and current
product designs use chevron affordances exclusively; keeping ghost icons
breaks the premise that the catalog mirrors the sheet. Mirrors
aurum-android PR #57 (same removal); jar-android's only usage migrates to
a disc + chevronRight composition. 8 imagesets, 8 catalog entries gone
(170 remain); the FIGMA_DELETED workaround in the importer is gone with
them — a deleted Figma node now fails the import loudly, as the 1:1
contract demands.
[0.1.2] - 2026-07-20
Fixed
- Code Connect: skip the four
CaretCircle*icon mappings — their Figma
master components were deleted from the file (verified via the components
API; only the plain Caret set survives), and publish validation fails on
ghost nodes. The icon assets remain in the catalog. Android's
ICON_MANIFEST carries the same stale node ids and needs the same fix.
[0.1.1] - 2026-07-20
Added
- Figma Code Connect (research §11.4):
FigmaConnect/dev-only nested
SPM package with 180 .figma.swift mappings — AurumButton (variant ×
size × isFullWidth × label), AurumLoader, and one per icon×weight
emitted by the icon importer. All 180 validated with the Swift parser
(make figma-parse). figma-code-connect.yml parse-validates on PR and
publishes to Dev Mode only from v*.*.* tags (Android's release gate,
mirrored).
[0.1.0] - 2026-07-20
Added
- First components (research §11.3), API-parity ports of aurum-android:
AurumText— canonical text primitive overAurum.type.*roles with the
Android foreground-resolution order (explicit foreground: ShapeStyle →
color: → textDefaultNormal); AttributedString overload for
per-run styling.
AurumIcon+ generatedAurumIconscatalog (89 icons × line/filled) —
template-rendered asset-catalog SVGs with tint resolution explicit →
ambient \.aurumContentColor (the LocalContentColor port) →
iconDefaultNormal; gradient tint overload.
- Icon importer (
tooling/icon-import/import_icons.py): converts
aurum-android's committed, already-normalized Vector Drawables to
imagesets + the Swift catalog, so both platforms share one normalization
pipeline (make icons-import).
AurumButton— variants primary/secondary/tertiary × sizes 40/48/56 pt,
full-width, loading, auto-advance progress, leading/trailing slots;
radial primary fill, top-lit rim, and the dimensional purple/800
hard-shadow press (drop + 2 pt sink) via a private ButtonStyle.
AurumLoader— track + 90° arc spinner with optional right/bottom label.AurumDivider,AurumSkeleton(t=0-deterministic shimmer).- Tests: icon-catalog contract suite, button-defaults unit suite, and 13
component snapshot tiles mirroring the Android @AurumPreview groups.
- Foundations — the initial package skeleton per the architecture research
(docs/ios-design-system-research.md):
- Source SPM package with two products:
AurumTokens(extension-safe token
layer) and Aurum (components + paint toolkit, re-exports the tokens).
iOS 17 floor.
- Token codegen (
tooling/token-codegen/generate.py): committed Figma
W3C JSON exports → generated Swift token layer (Sources/AurumTokens/Token/),
with a --check determinism gate for CI. Name mapping is a faithful port
of the Token Sync plugin's mapping.ts. 156 palette primitives, 295
semantic + visual colors, 45 typography composites, 4 elevation recipes,
spacing/radius/borderWidth/iconSize scales.
- Theme layer: static
Aurum.*namespace (colors,type,space,
radius, borderWidth, shape, elevation, iconSize, motion,
opacity), theme-shaped structs, AurumRoot / .aurumTheme().
- Typography: bundled static Inter + Frank Ruhl Libre TTFs registered at
runtime (Aurum.registerFonts(), idempotent); every style carries a
Dynamic Type anchor (relativeTo); .aurumType(_:) reproduces Figma's
exact line height and scales it along the anchor curve.
- Paint toolkit:
AurumLinearGradient(CSS-angle, size-aware),
AurumRadialGradient (circular + rotated-elliptical via Core Graphics),
.aurumShadow() (offset/blur/spread/tint, Figma-blur÷2 conversion,
interior knockout, optional alpha mask), .aurumHardShadow(),
.aurumInnerShadow(), Aurum.shape.smooth() continuous corners.
- Tests: token integrity + paint math unit suites; snapshot harness on
swift-snapshot-testing with Git LFS baselines (pinned: iPhone 17 Pro,
iOS 26.5) covering gradients, shadows, squircle audit, and the full type
ramp.
- CI:
check.yml(codegen gate + build + test) andrecord.yml
(label-triggered baseline re-record).