getmil.com

Foundations

Design system

The single source of truth for visuals across GETMILK Office. Reuse these primitives instead of inventing new ones — every screen should feel like the same product.

Principles

Six rules that keep the system coherent.

  1. Tokens, not hex

    Always reach for `bg-brand-600`, `text-gray-700`, `shadow-sm`. Never hardcode hex.

  2. One primary per view

    Exactly one primary button per pane — usually the rightmost. Everything else is secondary-gray or tertiary.

  3. Quiet by default

    Most surfaces are white on gray-25. Color earns its place by signalling state.

  4. Consistent rhythm

    8-px base. Stick to gap-2/3/4/6, p-3/4/5/6. Don't invent gaps.

  5. Borders over shadows

    Inside the app, prefer `border-gray-200` + `shadow-xs`. Heavy shadows belong on overlays.

  6. Compose primitives

    If you reach for ad-hoc styles, extend a primitive instead. New patterns land here first.

Colors

Tokens are exposed as Tailwind utilities like `bg-brand-600`. Light surfaces (50/100) for tints; 600/700 for solid fills and text on light.

Gray — the workhorse. 95% of UI is gray.

gray-25
gray-50
gray-100
gray-200
gray-300
gray-400
gray-500
gray-600
gray-700
gray-800
gray-900
gray-950

Brand — Use sparingly. One filled brand element per view.

brand-50
brand-100
brand-200
brand-300
brand-400
brand-500
brand-600
brand-700
brand-800
brand-900

Error — Destructive actions, form errors, sanctions, blocked states.

error-50
error-100
error-200
error-300
error-400
error-500
error-600
error-700
error-800
error-900

Warning — At-risk, pending review, expiring soon.

warning-50
warning-100
warning-200
warning-300
warning-400
warning-500
warning-600
warning-700
warning-800
warning-900

Success — Active, verified, completed, on-track.

success-50
success-100
success-200
success-300
success-400
success-500
success-600
success-700
success-800
success-900

Blue — Informational. Links inside blocks of text.

blue-50
blue-100
blue-200
blue-300
blue-400
blue-500
blue-600
blue-700
blue-800
blue-900

Indigo — Secondary categorical accent — charts.

indigo-50
indigo-100
indigo-200
indigo-300
indigo-400
indigo-500
indigo-600
indigo-700
indigo-800
indigo-900

Typography

Inter, with cv02–cv11 stylistic sets enabled. Display sizes for headers; UI sizes for everything else.

Display 2xltext-display-2xl 72 / 80 — never in product UI
Display xltext-display-xl 60 / 72 — marketing only
Display lgtext-display-lg 48 / 60 — hero
Display mdtext-display-md 36 / 44 — section openers
Display smtext-display-sm 30 / 38 — modal titles
Display xstext-display-xs 24 / 32 — page H1 (PageHeader uses this)
Text xltext-ui-xl 20 / 30
Text lgtext-ui-lg 18 / 28
Text mdtext-ui-md 16 / 24 — body
Text smtext-ui-sm 14 / 20 — UI default
Text xstext-ui-xs 12 / 18 — captions, table cells

Eyebrow / overline

Use `.text-eyebrow` for section labels above titles.

Spacing & radii

8-px base. Use Tailwind's gap-/p-/m- utilities. Don't reach below `gap-1`.

Spacing scale (px next to Tailwind alias)

4px
gap-1
8px
gap-2
12px
gap-3
16px
gap-4
24px
gap-6
32px
gap-8
48px
gap-12
64px
gap-16

Radii

rounded-xs
rounded-sm
rounded-md
rounded-lg
rounded-xl
rounded-2xl
rounded-full

Shadows

`shadow-xs` is the default elevation for cards and buttons. Reserve `lg`+ for popovers/modals.

shadow-xs
shadow-sm
shadow-md
shadow-lg
shadow-xl
shadow-2xl

Buttons

Hierarchy first, size second. One primary per view.

Hierarchy

Destructive

Sizes

Icon-only

Badges

`pill-color` for status; `badge-modern` for metadata tags.

Pill-color (status)

gray brand success warning error blue indigo

Pill-outline

graybrandsuccesswarningerror

Badge-modern (metadata)

AerospaceCNCISO 9001ITAR

Sizes

smmdlg

Cards

White surface, gray-200 border, shadow-xs. Use for grouped content.

Default card
A simple card with header, body, and footer.

Body content sits here. Keep prose tight; for lists, drop the description and use a header + list.

Compact card (size=sm)
Tighter padding, used for feed items and list cards.

For dashboards with many cards in a grid.

KPI cards

One row of 3–4 above a dashboard. Don't stack rows of KPIs.

Manufacturers

1,082

+12%

vs last month

Open orders

48

+3

this week

Avg lead time

34d

-2d

lower is better

At-risk vendors

6

+2

needs review

Forms

Wrap every control in <Field>. Don't ship bare <input>s.

We'll never share it.

Must be at least 8 characters.

Empty states

Always provide an icon, a title, a sentence of context, and one CTA.

No manufacturers match your filters

Try removing a filter, widening your country list, or clearing your search.

Inbox zero

No new RFQs in the last 24 hours. We'll ping you when one arrives.

Page headers

One per route. Use SectionHeader for sub-sections inside long pages.

Operations

Manufacturers

Browse, filter, and onboard hardware vendors across the GETMILK Europe network.

Recent additions

Vendors created in the last 30 days.

…content for the section…

Maintained by the GETMILK platform team. To extend the system, add the primitive in src/components/ui/ and document it here. Then it's safe to use anywhere.