bash-ui
ComponentsDesign systemsHow to use
Getting started
IntroductionHow to use
Design systemsSee all →
The MeridianFrontierUnderstatedCuratedStudioNeutralPlayground
ButtonsSee all →
Social link buttonsKey login buttonSend buttonArrow buttonVideo buttonApp store badgeTonal buttonLoading buttonCTA buttonInbox buttonDelete button
Top navbars & navigationSee all →
Radial navigationExpanding menuGooey tabsCount tabsApp sidebar
InputsSee all →
Sort-by headingDissolve inputSearchable selectCheckboxLock toggleNotification toggleGooey inputSearch barRange sliderDate range calendar
ChartsSee all →
GitHub activity chartRevenue bar chartDonut chartMoney flow chartIncome vs spending chartFunnel chartMetric cardPipeline chartBreakdown dialAI cost cardStick progress bar
Data displaySee all →
Tech stack logosWallet cardScore gauge
Images & mediaSee all →
Doodle portraitImage collageQR codeSaved board
Text & typeSee all →
Scramble text
ListsSee all →
Ranking tableTo-do listFAQ accordionSwipe cards
FeedbackSee all →
Feedback cardFeedback sheet
Menus & overlaysSee all →
Link previewInfo tooltipAccount menu

Understated

Used byPortfolio

Minimal by intention, expressive by nature. Considered typography, generous white space, and subtle artistic details create a distinctive visual identity that lets the work speak for itself.

Tidewater

Live

A booking app for coastal ferry crossings. I designed the flows and built the web client, from first sketch to launch in eight weeks.

Year
2025
Role
Design & build
Timeline
8 weeks

Next.js · TypeScript · Supabase

States

Shipped in March
Case study in draft
Beta sign-ups closed

System palette

Shape

Panel18px
Inset10px
Actionpill

Text types

Select a type to highlight it in the card above. Select again to clear.

Rules

  1. 01

    Expressive headings, rounded copy

    Use Viaoda Libre for the introductory statement and section headings, and Open Runde for paragraphs, metadata, project captions and controls. The original Viaoda font ships at 400; keep its distinctive silhouette rather than substituting a generic serif. Geist is the source's default UI fallback; monospace is a registry fallback for technical content.

  2. 02

    Let the work carry the colour

    Keep the page white, main copy black and supporting information zinc grey. Primary actions and navigation are monochrome. Project imagery, technology marks and the GitHub activity chart supply colour; do not invent a saturated structural accent.

  3. 03

    Space is the main separator

    Use broad gutters (8% on small screens, 18% on desktop), generous section gaps and alternating image-and-text rows. Centre the introduction on mobile and align it to the left on desktop. Most text sections sit directly on the page rather than inside cards.

  4. 04

    Rounded frames, circular actions

    The source's base radius is 10px. Project media uses rounded-2xl, which resolves to 18px through its radius scale; use rounded-panel for those frames and rounded-inset (10px) for controls. Navigation, collaboration buttons and arrow badges use fully rounded pills or circles.

  5. 05

    A warm wash is an occasional material

    Certification panels use a pale warm wash with irregular, layered watercolour edges. Use paper for this warmth and keep the main page neutral. Hand-drawn marks, small image rotations and tiny raised icon tiles are accents, not a treatment for every surface.

  6. 06

    Hierarchy comes from type and tone

    Keep headings in sentence case. Use black for names and emphasis, dim for supporting descriptions and faint for incidental furniture. Introductory text grows from roughly 14px to 20px; major headings reach roughly 48px. Use italics sparingly for roles and qualifications.

  7. 07

    Motion lives in the controls

    Calls to action slide their circular arrow across the pill over about 500ms. Navigation expands with damped springs; small tooltips fade around 200ms. When extracting components later, use motion/react and honour useReducedMotionConfig(); the source's motion does not consistently provide reduced-motion handling.

  8. 08

    Distinguish source tokens from extensions

    The source defines neutral light and dark UI tokens, but its portfolio sections keep fixed white backgrounds and black text. This entry applies those dark tokens consistently for the gallery and derives a dark warm inset. Positive, waiting, financial and frosted-menu slots extend the contract; they are not evidence of additional Portfolio components or an original financial palette.

Adapted from

Open Runde by Laurids Kern (based on Inter) · OFL-1.1 · shadcn/ui neutral token foundation · MIT

Accessibility

WCAG 2.2 colour contrast

Calculated from this system’s colours in both modes. These are contrast checks, not an overall accessibility score or certification.

Light · 10/13 pairs meet AA

Text pairs use the normal-size AA threshold; focus-ring pairs use the non-text threshold.

  • AaHeading on card21.00:1 · AAA
  • AaBody on card19.79:1 · AAA
  • AaSupporting text on card4.83:1 · AA
  • AaQuiet text on card2.56:1 · Below AA
  • AaBody on inset18.37:1 · AAA
  • AaLink on card17.92:1 · AAA
  • AaPrimary button label17.17:1 · AAA
  • AaInk button label21.00:1 · AAA
  • AaPositive state5.72:1 · AA
  • AaWaiting state4.86:1 · AA
  • AaNegative state5.29:1 · AA
  • AaFocus ring against card2.58:1 · Below AA
  • AaFocus ring against ground2.58:1 · Below AA
Dark · 12/13 pairs meet AA

Text pairs use the normal-size AA threshold; focus-ring pairs use the non-text threshold.

  • AaHeading on card17.17:1 · AAA
  • AaBody on card17.17:1 · AAA
  • AaSupporting text on card6.93:1 · AA
  • AaQuiet text on card3.70:1 · Large text only
  • AaBody on inset14.59:1 · AAA
  • AaLink on card14.23:1 · AAA
  • AaPrimary button label14.23:1 · AAA
  • AaInk button label17.17:1 · AAA
  • AaPositive state10.69:1 · AAA
  • AaWaiting state8.96:1 · AAA
  • AaNegative state5.56:1 · AA
  • AaFocus ring against card3.78:1 · AA non-text
  • AaFocus ring against ground4.17:1 · AA non-text

Normal text: AA ≥ 4.5:1, AAA ≥ 7:1. Large text: AA ≥ 3:1, AAA ≥ 4.5:1 (24px regular or approximately 18.67px bold). Non-text indicators: AA ≥ 3:1. Ratios are displayed rounded down; results use full precision.

AA text guidanceAAA text guidanceNon-text contrast guidance