NockerlCard is a pure surface. To make it tappable you compose Modifier.clickable { }
(with onClickLabel for the accessible name) onto the modifier, exactly as the
shipped tool / agent cards do. This keeps the surface and the interaction concerns
separate.
SwiftUI has no single Card view yet; the lifted-card treatment is composed from the
NockerlTheme tokens (fill + hairline + neutral shadow + top sheen) at the call site. The
parameters below are those tokens; a wrapper view is the planned reconciliation.
Style
Type
Default
Description
NockerlTheme.card1
Color
n/a
Base card fill (#2C313A dark / #FFFFFF light). card2 / card3 are the raised tiers.
NockerlTheme.cardRadius
CGFloat
14
Corner radius. 14pt today, but the token is 16 (see drift).
NockerlTheme.hairline
Color
n/a
Hairline border: white ~8% on dark, black ~7% on light.
.shadow(color: .black…)
modifier
n/a
The NEUTRAL drop shadow (black-tinted, never colored).
top LinearGradient
overlay
n/a
The ~1px top catch-light sheen (white → clear), the companion to the shadow.
Cross-platform drift (tracked for reconciliation)
The spec is approved; these are the real divergences between the shipped platforms,
tracked in the Review queue:
Card radius: the token radius.card is 16px (unified across platforms), but Compose
hardcodes NockerlCardRadius = 18dp and Swift NockerlTheme.cardRadius = 14pt.
Both should consume the token; web keeps its sharper container override.
Elevation ladder: Compose ships L1 to L3 presets (NockerlElevation, no Level4);
the L4 rung is the elevation.sheet token (14px) used by bottom sheets. Swift has no
preset ladder; shadows are per-call. Web exposes the full L1 to L4 scale.
Interactive API(resolved): a tappable card is one
declared interactive / onClick prop on the Card API on all three platforms (pressed =
elevation dip + focus ring). Web already exposes interactive; natives may implement via
clickable internally (Compose today) or a Button wrap (Swift), but the prop is the shared
contract.
Card component: Swift has no Card view yet (composed from tokens inline). A
wrapper to match Compose’s NockerlCard is the planned step.