Skip to main content
ENKO

Sizing

Sizing defines fixed dimensions, container widths, aspect ratios, and touch targets for Senco components.

Where spacing governs the gaps between things, sizing governs the things themselves. The two rules that matter most in this product are that a control must be hittable by a thumb on a moving bus, and that a fixed height must never be what clips a translated label.

Component dimensions

Fixed heights for core Senco components.

ComponentTokenHeightNotes
App bar--ds-size-appbar48pxFixed, contains brand + action icons
List item--ds-size-list-item60pxAvatar (36px) + 12px vertical padding
Bottom nav--ds-size-bottomnav52pxIcon (20px) + label + padding
Avatar--ds-size-avatar36pxRecipient initials, circular
Input--ds-input-height48pxDefault control height
Input (dense)--ds-input-height-sm36pxFilter bars, inline edit — never a primary field
Touch target--ds-size-touch48pxMinimum tappable area

Icon sizes

TokenSizePairs with
--ds-size-icon-sm16px--ds-text-sm and below — inline icons
--ds-size-icon20px--ds-text-base — navigation and action icons
--ds-size-icon-lg24pxStandalone icons, empty-state marks, app bar

Icon size pairs with text size, not with available space. A 24px icon next to 14px text reads as the icon shouting; a 16px icon next to 18px text disappears. When an icon stands alone, size it to its touch target instead — a 20px icon centered in a 48px hit area.

Icon set

Icons come from lucide-react (1.x). No other icon source is used; country flags are images, not icons.

RuleValue
Size--ds-size-icon-sm / --ds-size-icon / --ds-size-icon-lg, passed as size
StrokeLibrary default (2), never overridden per instance
ColourcurrentColor, unless a spec names an icon token
Beside a text labelaria-hidden="true"
StandaloneThe control carries the accessible name; the icon stays aria-hidden

Canonical mapping. A spec that names a meaning uses this icon, and a new meaning is added here before it is used anywhere.

Meaninglucide export
PendingClock
Processing, loading spinnerLoaderCircle
SentArrowUpRight
Completed, selected, successCheck
Failed, caution, crypto riskTriangleAlert
Error noteCircleX
Cancelled, close, removeX
InfoInfo
TipLightbulb
Regulatory disclosureShieldCheck
Biometric disclosureFingerprint
External linkExternalLink
Expand, dropdownChevronDown
Forward, drill inChevronRight
SearchSearch
AddPlus
RetryRotateCw
Show / hide passwordEye / EyeOff
UploadUpload
DownloadDownload
ShareShare
DateCalendar
Camera captureCamera
QR scanScanLine
Manual entryKeyboard

Check means both "completed" and "selected". In both cases it answers "is this done", and a second check shape would make users compare two near-identical glyphs.

Height is a minimum, not a fixed value

Every height in the table above is a min-height. Senco ships in multiple languages, and German or Tagalog labels routinely run 30–40% longer than English. A hard height on a button turns that into clipped text; a min-height turns it into a two-line button, which is ugly and legible instead of tidy and broken.

The only true fixed heights are the app bar and bottom nav, which are chrome and contain no wrapping content.

Why 60px list items

A transaction row carries a 36px avatar, two lines of text, and an amount. At 56px the two text lines touch the row edge; at 64px a mobile screen shows five transactions instead of six. 60px is 36 + 12 + 12 — the avatar plus space-3 above and below — so the number is derived from the scale rather than chosen.

Do / Don't
Do
Visa ****7788
Expires 11/27
RBC ****4400
Chequing
Pay $253.75

48px radio cards + 48px CTA. Every target is comfortable to tap.

Don't
Visa ****7788
RBC ****4400
Pay $253.75

Cramped 28px controls. Users struggle to select the right option or hit the button accurately.

Component dimensions
History
48px
JP
28px
Yuki Tanaka
Mar 27 · Sent
-$250.00
~52px
GB
James Wilson
Mar 27 · Sent
-$120.00
KR
Min-ji Kim
Mar 26 · Received
+$500.00
Home
Contacts
History
52px

Container sizing

Containers constrain content width.

TokenMax widthUsage
--ds-container-xs320pxMobile forms, modals
--ds-container-sm480pxNarrow content, transfer flow
--ds-container-md640pxDefault content width
--ds-container-lg960pxDashboard, wide layouts
--ds-container-xl1200pxFull-width desktop
--ds-container-max1400pxAbsolute page ceiling

Why the transfer flow is capped at 480px

The transfer flow is a single-column sequence of decisions. Widened to 640px it starts to look like a form that could be filled in any order, and users begin scanning rather than stepping. 480px is roughly one phone width — it keeps the desktop experience the same shape as the mobile one, which matters because most users do the same transfer on both.

Measure

Body copy targets 45–75 characters per line. At 16px in the system stack that lands between roughly 480px and 720px, which is why container-md (640px) is the default for content and container-lg is reserved for layouts that split into columns rather than run long text.

Container sizing
container-xs320px
Mobile forms, modals
container-sm480px
Narrow content, transfer flow
container-md640px
Default content width
container-lg960px
Dashboard, wide layouts
container-xl1200px
Full-width desktop

Aspect ratios

Consistent ratios for images, cards, and media containers.

RatioUsage
16:9Hero banners, promotional cards
3:2Transaction cards, detail images
4:3Thumbnails, compact media
1:1Avatars, profile images
3:4ID document uploads

3:4 exists for identity documents specifically. A passport page and a national ID card are both closer to portrait than to any of the landscape ratios, and a capture frame that does not match the document shape produces uploads that get rejected by verification.

Aspect ratios
16:9
Hero banners
3:2
Transaction cards
4:3
Thumbnails
1:1
Avatars
3:4
ID documents

Touch targets

  • Minimum size: 48 × 48px (--ds-size-touch)
  • Minimum gap between targets: 8px (space-2)
  • The visual element (icon, button) can be smaller than 48px — the tappable area must not be
  • Applies to all devices receiving touch input

Standards

CriterionRequirementSenco
WCAG 2.2 SC 2.5.8 Target Size (Minimum), AA24 × 24pxExceeded
WCAG 2.1 SC 2.5.5 Target Size, AAA44 × 44pxExceeded
Senco standard—48 × 48px

48px is above every requirement on purpose. The AA minimum of 24px is a floor for any interface; a transfer confirmation tapped with a thumb while walking is not the case that floor was written for. The cost of an accidental tap in this product is a misdirected payment.

Expanding a target without moving the visual

A 20px icon button keeps its 20px icon and gains its hit area through padding, not through a larger glyph:

visual   20px icon
padding  14px each side
target   48 × 48px

Where layout cannot afford the space — a dense table row action — the target is expanded with a pseudo-element overlay instead of by growing the box.

Do and don't

DoDon't
Give every icon button a 48px hit areaShip a 24px icon with a 24px target
Use min-height on controlsUse height and let a long label clip
Keep 8px between adjacent targetsButt two destructive actions against each other
Size icons to their textSize icons to fill the space available
Cap the transfer flow at 480pxLet the flow stretch to the viewport on desktop

Known gaps

ItemStatus
Dense control height (36px)Below the 48px touch standard — permitted only for pointer-primary surfaces, not documented per component
--ds-size-touch enforcementConvention; no lint rule or test verifies it
Aspect ratio tokensRatios are documented but not defined as --ds- variables
Touch targets
Wallet address
48px
8px
Minimum size: 48 × 48px
Minimum gap: 8px between targets
Crypto wallet buttons use icon-only 48px targets with 8px gap. Comfortable even on small screens.