Orbex Sonar-DB Design system , home

Live

The default overview

Orders

Open total6,720 plt

May 2026

  • 1,420 pltshipped
  • 80 plton hold
  • 1,100 pltpending

June 2026

  • 1,500 pltshipped
  • 160 plton hold
  • 1,100 pltpending

New order

Create a new purchase order.

Daily shipments

Month to date4,485 plt

May 2026


Today
350 plt
Yesterday
370 plt
This month
4,485 plt
Returns
40 plt

Balance

Total balance3,900,000.00 USD

Overdue

2,230,800.00 USD

57.2%


Due today

46,800.00 USD1.2%

Deliveries

May 2026

Calendar view
May 12TuesdayTotal 415 plt
  • 04-118B2 items40 pltDelivered
  • 04-121A7 items150 pltDelayed
  • 04-127C1 item15 pltDelayed
  • 04-130A8 items210 pltDelivered

Recurring orders, quick action

Selected products1

  • Packaging CB-4030BoxStock: 380 plt
  • Take a look!new recycled-fiber boxes.

  • Packaging SF-2300RollStock: 560 plt
  • Try instead
    SF-2000410 plt

  • Packaging KP-1200RollStock: 210 plt
  • Packaging EP-5050UnitStock: 940 plt
  • Packaging CB-2010BoxStock: 640 plt
  • Packaging SF-1700RollStock: 320 plt
  • Take a look!thinner film, same hold.

  • Packaging TS-1210UnitStock: 150 plt
  • Packaging SB-1200RollStock: 480 plt

Inventory

Total2,800 plt

840 plt1,960 plt
On holdAvailable
Code: a self-contained version
tsx
/* The overview: cards on a grid of columns, each as tall as its size. The grid tokens follow the window */
import { Card, CardLink } from '@orbex/sonar-components/card'
import '@orbex/sonar-components/card.css'

const columns = [
  [
    { id: 'orders', title: 'Orders', size: 'm', figure: ['Open total', '3,940 plt'] },
    { id: 'inventory', title: 'Inventory', size: 's', figure: ['Total', '2,800 plt'] },
  ],
  [
    { id: 'deliveries', title: 'Deliveries', size: 'l', figure: null },
    { id: 'balance', title: 'Balance', size: 'm', figure: ['Balance', '3,900,000 USD'] },
  ],
  [
    { id: 'shipments', title: 'Daily shipments', size: 'xl', figure: ['Month to date', '4,485 plt'] },
    { id: 'recurring', title: 'Recurring orders', size: 'l', figure: null },
  ],
] as const

export function Overview() {
  return (
    <div
      style={{
        display: 'grid',
        gridTemplateColumns: 'repeat(var(--sonar-layout-columns), minmax(0, 1fr))',
        gap: 'var(--sonar-layout-gap)',
        alignItems: 'start',
      }}
    >
      {columns.map((cards, index) => (
        <div key={index} style={{ display: 'grid', gap: 'var(--sonar-layout-gap)' }}>
          {cards.map(({ id, title, size, figure }) => (
            <Card key={id} id={`card-${id}`} title={title} size={size} summary={figure ? { label: figure[0], value: figure[1] } : undefined} footer={<CardLink href={`/${id}`}>Go to {title}</CardLink>}>
              {/* The card’s content */}
            </Card>
          ))}
        </div>
      ))}
    </div>
  )
}

Rules

  • One overview, arranged once. People arrange it on a desktop; tablets and phones read that arrangement in order. See Breakpoints and grid.
  • Columns end level. Card heights are chosen so that M + L = S + XL, and the default overview keeps a straight bottom edge.
  • What matters most goes first. Orders and Daily shipments open the reading order because they are what people check every morning.
  • Every card leads somewhere. The overview never becomes the place where work is done; it says where to go.
  • Units are per card. Pallets, kilograms or items are chosen in each card, because each team counts differently.

Do and don’t

DoWhat people check first goes first: Orders and Daily shipments open the reading order.
Don’tColumns that end at different heights: the overview looks unfinished.
DoEach card answers one question and leads to the page where the work is done.
Don’tA card that tries to be the page: tables, filters and bulk actions.