Skip to content
ongale / ui
COMPONENT LIBRARY
Foundations08Components19
  1. 01Color
  2. 02Typography
  3. 03Spacing
  4. 04Radius & elevation
  5. 05Focus
  6. 06Motion
  7. 07Layout primitives
  8. 08Icons

Small parts. One system.

Astro · Tailwind · Petite Vue

Ongale UI/Foundations
Usage notes
THE STARTING POINT Foundation baseline · 01

Foundations

A quiet, consistent base for the admin experience.
Shared values, thoughtful defaults, and room to build.

Neutral by defaultSatoshi typographyWCAG 2.2 AA target
01

Color

Purpose before decoration

The neutral palette

White workspaces, soft layers, and a near-black frame.

White

#ffffff

Neutral 50

#f7f7f8

Neutral 100

#f1f1f2

Neutral 200

#e5e5e7

Neutral 500

#707079

Neutral 800

#29292d

Neutral 950

#0b0b0d
Workspacesurface
Page backgroundcanvas
Primary textink
Navigationinverse

Success

Successful outcomes

Information

Helpful context

Warning

Needs attention

Danger

Errors & destructive actions

Use semantic roles in components. Pair status colors with a clear label or message.

02

Typography

Familiar. Readable. Native.

Satoshi

Locally served variable type, with a stable fallback.

Aa
text-2xlPage title · 32px

Clarity, at every scale.

text-xlSection title · 24px

Clarity, at every scale.

text-lgGroup title · 20px

Clarity, at every scale.

text-mdEmphasized body · 16px

Clarity, at every scale.

text-baseBody · 14px

Clarity, at every scale.

text-smSupporting text · 13px

Clarity, at every scale.

text-xsMetadata · 12px

Clarity, at every scale.

Monospace for values and identifiersdeployment_01 / 128 MB / 99.9%

Body: 14px / 1.5. Sizes use rem units and scale with browser text settings. No external font requests.

03

Spacing

A 4px rhythm

Space creates hierarchy

Small gaps connect. Larger gaps separate.

space-1
4px
space-2
8px
space-3
12px
space-4
16px
space-5
20px
space-6
24px
space-8
32px
space-10
40px
space-12
48px
space-16
64px
8–12px Within a control group16–24px Within a section32–48px Between sections
04

Radius & elevation

Soft edges. Clear layers.

Radius

Match the curve to the scale of the surface.

sm6px
control8px
panel12px
workspace24px
pillFull

Elevation

Borders define. Shadows lift.

subtle
raised
overlay

Subtle borders separate surfaces. Interactive boundaries use the stronger control token.

05

Focus

Always know where you are

Visible by default

A 2px outline with a 3px offset.
Blue on light surfaces. White on dark.

Use Tab to try the links.

Light surface
Dark surface

Focus rings are drawn here for illustration; keyboard focus follows the same tokens. Never rely on color alone.

06

Motion

Feedback, with restraint
Entrance250msEase out · exit 200ms
Dropdown200ms150–250ms · exit −20%
Move300msEase in-out · no bounce
Motion follows your device preference.Reduced motion → instant state changes

From the trigger

A short approach and scale 0.95 → 1, anchored to the trigger.

Project settings

Changes stay close to their source.

Preview an anchored surface.

Dropdown recipe · 200ms in / 160ms outtop right

Details follow

Rows arrive 30ms apart. Badges trail by 50ms.

  • 01API workspaceReady
  • 02Account settingsReady
  • 03DeploymentsReady
30ms + 50ms

A little feedback

The surface presses in. The label stays sharp.

Pointer and keyboard activation0.97 · 150ms

Save, then confirm

A steady loading ring. A brief confirmation.

Simulated save · no data is sent.
Custom spinner · simulated requestSave → Saving → Saved

Follow the hand

Direct tracking. 12% stretch. Softer resistance past the edge.

050100
No tween while held. No bounce on release.1.12 × 0.893

One object, two places

Stable identity. A 32px arc between destinations.

Object is in A.
Reuses the same DOM elementlayout-id

Reveal through a mask

Clip the incoming layer. Keep the base in place.

250ms · ease out

Change color in place

A circular mask carries the new color across.

old + new overlap

Finite, user-triggered motion. No springs or bounce. Motion recipes supply animation; production widgets still need their own complete interaction behavior.

07

Layout primitives

Compose, then reuse

Container + Stack

Constrain the width. Give content room.

Containersm · max 640px
Header
Content
Content
Footer
<Container size="sm" gutter={4}> <Stack gap={4}>…</Stack> </Container>
08

Icons

One source. One sprite.

Lucide, together

55 symbols in one local SVG sprite. Shared paths, consistent strokes.

  • archive
  • send
  • arrow-left
  • chevron-left
  • chevron-right
  • arrow-down-left
  • arrow-down
  • arrow-up
  • arrow-up-down
  • arrow-left-right
  • arrow-up-right
  • box
  • activity
  • bell
  • database
  • files
  • folder
  • gauge
  • globe
  • house
  • inbox
  • landmark
  • layers
  • menu
  • minus
  • panel-left
  • share-2
  • tag
  • user-round
  • check
  • clock-3
  • corner-down-left
  • chevron-down
  • circle
  • circle-alert
  • circle-check
  • circle-x
  • eye
  • eye-off
  • info
  • image
  • layout-grid
  • list
  • list-filter
  • loader-circle
  • mail
  • plus
  • pencil
  • rotate-cw
  • save
  • search
  • settings
  • trash-2
  • upload
  • x
12px
14px
16px
20px
24px
32px
A meaningful icon has a label.
<Icon name="save" size={16} /> <Icon name="circle-check" label="Completed" />

Lucide 1.70.0 · 24 × 24 viewBox · currentColor · 2px stroke by default. Browse Lucide

One source of truth.

Import the global styles once. Use semantic tokens and the layout primitives across components.

src/styles/tokens.csssrc/components/foundations/

This gallery covers the foundation batch. Controls, loading states, and larger compositions follow in later batches.

Ongale UIConsistent by construction.