Component Library · v1.0

Common UI components

The building blocks of the Kashew app, designed from the system tokens — greyscale surfaces, one gold accent used only where attention is earned, SF Pro for words, SF Mono for money. Toggle the theme to verify both modes.

01

Buttons & actions

HierarchyButtonStyle

Primary = gold fill + ink label. One primary per screen.

Icon & states.controlSize
Size scalemin-height · pt
XL · 56pt
Large · 50pt
Medium · 44pt
Small · 36pt
XS · 28pt

Primary actions live in the 50–56pt comfortable range. 44pt (Medium) is Apple's tappable floor.

Tap target vs. visual size≥ 44×44pt hit area

Dashed = invisible 44pt hit region around a smaller glyph.

Below 44pt, keep the visible button compact but pad the tappable area out to 44pt. Space adjacent small controls ≥ 8pt apart to avoid mis-taps.

02

Inputs & fields

Text fieldTextField
Validation & search.foregroundStyle
Invalid account number
Amount entry.amount font
50.00

Monetary input uses the SF Mono / tabular face.

03

Selection & toggles

SegmentedPicker .segmented
Notifications
Round-ups
ChoiceToggle / Picker
Instant transfer
Standard (1–2 days)
Save my details
StepperStepper
3

Split a bill between people.

04

Chips, tags & badges

Filter chipsselectable
AllFoodTransportBillsFun
Status tags & badgesLabel / overlay
+2.4%−12%PendingScheduled3
05

Cards & surfaces

Account cardelevation-2
Total balance
€ 4,820.17
•••• 4291
Stat cardsflat surface
Spent this month
€ 1,240
8% under budget
Info / calloutaccent bar

Round-ups are on

Spare change from each purchase goes to your Travel pot.

06

List rows

TransactionsList row
Whole Foods
Groceries · Today
42.18
Salary
Income · 28 May
2,400.00
Travel pot
Savings · 26 May
100.00
Settings & navigationNavigationLink
Account
Personal details
Security
Notifications
07

Sheets & dialogs

Sheet & dialog.sheet / .alert

Send €120.00

To Jordan Lee · arrives instantly

Delete this pot?

The €100 balance will return to your main account.
08

Feedback & status

Toasts & banners+ icon, never color alone
Transfer sent successfully
You're close to your monthly limit
Insufficient funds
Empty stateContentUnavailableView

No transactions yet

When you spend or get paid, it'll show up here.

Loading skeletons.redacted(reason:) · shimmer
Balance card
Transaction rows
Cards & text

Skeletons mirror the real layout so content swaps in without a jump. Match the final element's shape and size; shimmer pauses under Reduce Motion. In SwiftUI, .redacted(reason: .placeholder) on the real view is the native route.

09

Progress & data

Budget barProgressView
Groceries€ 320 / 400
Dining€ 210 / 180
Savings goalGauge
65%
€ 1,300 of 2,000
Spending breakdownsegmented
FoodTransportBillsOther
10

Avatars, categories & keypad

Avatarsinitials / image
AMJL
Category tokenstinted fill
Numeric keypadcustom input