Component library

One component per need

Exactly what an app may use, one example each. A variant is a property on the component, never a new component. A new component or variant needs Daniel's yes.

Needs

Behov → komponent. Allt annat byggs inte ur designsystemet.

BehovKomponent
Sida och plattaPage + PageSection
Dashboard: grupp av små plattorDashboardGroup
Skal: menyShellMenu
Skal: konto och enhet (M2)ShellFooter
KnappButton
StatusBadge
FormulärfältLabel, Input, Textarea, Select, Checkbox
Meddelande på sidanAlert
Kvitto efter en handlingToaster (toast)
DialogDialog
SidopanelSheet
MenyDropdownMenu
Hjälptext vid hovringTooltip
Ruta som fälls ut vid klickPopover
FlikarTabs
Fäll ut och ihopCollapsible
LaddarSkeleton
TabellTable
SifferkortStat
Tomt lägeEmptyState
Datans ålderFreshness
Länk som förhämtarFwLink
DiagramChartStack
Minigraf i en radMiniSpark, MiniProgress
Appens ikonFaviconCube
 

Page + PageSection

Rubrik och verktygsrad på bakgrunden, allt annat i plattor. PageSection är plattan; PageFrame och SiteHeader är ramen runt.

Tokens: --background, --surface, --panel-border, --space-2

Invoices

Fakturor per unit, senaste 30 dagarna.

Summering

Öppna

12

Skickade

248

Försenade

3

Fakturor

4 units
RequestMerchantUnitAmount
REQ-2041Sam Sport ABSAM1 234,50
REQ-2042Hepp Design och Inredning Aktiebolag i GöteborgHEP89,00
REQ-2043Gesh Shoes ABGSH12 840,75
REQ-2044Sam Sport ABSAM−310,00
 

En vanlig section utan PageSection: layouten gör den till en platta.

RequestOwner
REQ-2041a.lind
REQ-2042j.holm
 

DashboardGroup

Rubriken på rutnätet och bara små plattor, ingen stor platta runt gruppen (oaas-api#21832). columns är en egenskap.

Tokens: --surface, --panel-border

Dagens nyckeltal

Varianter i core

48 210

Öppna avvikelser

3

Typography

Tokens: --foreground, --muted-foreground, --leading-body, --h2-size

Label · 13 px, white, uppercase

Heading · 26 px

Section heading · 26 px

Subheading · 13 px, uppercase

Body text is 13 px on an 18 px line (--leading-body) and always muted. The bright text colour is reserved for headings, labels in focus, data and values. Numbers use Swedish formatting: 1 234,50 SEK and 12 408 rows. A link in running text is underlined.

ShellMenu

A group stays open until you close it: click its heading. Several can be open at once, and they stay open after a reload.

Tokens: --surface, --panel-border, --primary, --muted-foreground

Button

variant: primary, success, warning, destructive, ghost; disabled and aria-busy are states.

Tokens: --primary, --success, --warning, --destructive, --disabled, --btn-tint, --control-h

Badge

variant: success, warning, error, count; pulse blinks.

Tokens: --lamp-success, --lamp-warning, --lamp-danger

OK
Warning
Error
Active
3 of 14

Label, Input, Textarea, Select, Checkbox

Ett val av flera är Select, på/av är Checkbox.

Tokens: --border, --primary, --control-h, --muted-foreground-2

Visible to everyone who can see the pump.

Alert

variant: info, success, warning, destructive.

Tokens: --lamp-success, --lamp-warning, --lamp-danger, --muted-foreground

Warning
pump-no-02 is responding slowly, 3 of 10 calls took over 2 s.

Toaster

toast.success / toast.error ur sonner; Toaster står en gång i appens rot.

Pump saved

Dialog

Bekräfta en radering: samma Dialog med en destructive-knapp.

Sheet

Detaljer bredvid en lista; side är en egenskap (right som standard).

Tooltip

Run the pump now, outside the schedule

Popover

Tabs

14 runs today.

Collapsible

Skeleton

Table

Paging (paging), virtualisering över 200 rader och dragbara kolumner (resizableId) är egenskaper på Table.

Tokens: --foreground, --muted-foreground, --table-head-bg, --table-head-border, --divider

En rad per cell. Två värden = två kolumner.

För långt innehåll klipps med "…" och radbryts aldrig. Hela värdet syns i en tooltip (title) när man hovrar över cellen.

Data i celler är grå; bara rubrikraden är vit.

Breda tabeller scrollar i sidled; scrollbaren syns alltid i fönstret.

Kolumnerna dras bredare eller smalare i rubrikradens kant; dubbelklick återställer.

En tabell visar alltid hur många rader som finns och om fler finns.

UnitMerchant
HEPHepp Design och Inredning Aktiebolag i Göteborg, avdelning Returer och Reklamationer
 
RequestMerchantUnitStatusLatency (ms)Amount (SEK)Action
REQ-2041Sam Sport ABSAM
active
421 234,50
REQ-2042Hepp Design och Inredning Aktiebolag i GöteborgHEP
pending
—89,00
REQ-2043Gesh Shoes ABGSH
error
1 20412 840,75
REQ-2044Sam Sport ABSAM
success
88−310,00
 

Stat

delta ritar ▲/▼ %, data en sparkline; value={null} ritar – och emptyHint säger varför (oaas-api#21938).

Tokens: --surface, --panel-border, --lamp-success, --lamp-danger

Rows today

48 210
▲ 6,2 %

Visitors

–

No visitor data from your store yet

EmptyState

No runs yet

The pump has not run. Start it manually or wait for the next scheduled run.

Freshness

Shows only when the data is older than staleMs. A green pulsing lamp while it fetches.

Fresh · 10 s
Stale · 2 min
Fetching · 5 min

Freshness · src/lib/data

13 px, muted. Ticks every 30 s. The row is 32 px with and without text.

updatedAtnumber | null when the data was fetched (ms); null shows nothing
isFetchingboolean a green pulsing lamp before the text
staleMsnumber the text shows when the data is older than this
import { Freshness, useFwQuery } from "@/lib/data";

const q = useFwQuery({ key: ["stats"], fetcher: mockStats });
<Freshness updatedAt={q.updatedAt} isFetching={q.isFetching} staleMs={60_000} />

ChartStack

Det enda diagrammet. variant="stack" (standard, en serie = staplar) eller "line".

Tokens: --primary, --chart-cell, --lamp-success, --lamp-danger

Jobs per day
2080Oct 1Oct 4Oct 7Oct 10
█ ok █ failed

MiniSpark, MiniProgress

16 px höga, ryms i en 32 px tabellrad.

PumpRows, 7 daysSync
pump-se-0187 %
 

FaviconCube

Appens ikon i applistan och skalets rubrik.

Tokens

Värdet i mörkt och ljust läge, läst ur CSS:en. Skriv alltid tokennamnet, aldrig ett råvärde.

FärgerMörktLjustRoll
--foreground……rubriker, rubrikrad i tabeller, värden i fokus
--secondary-foreground……sekundär text
--muted-foreground……brödtext, data i tabellceller, etiketter
--muted-foreground-2……placeholder, hint
--primary……enda accenten: länkar, fokus, primärknapp
--primary-bright……lila text, knapptext
--primary-hover-fg……knapptext vid hover
--nav-underline……aktiv navigeringslänk
--success……grön knapp: kant och ton
--success-fg……grön knapptext
--warning……gul knapp: kant och ton
--warning-fg……gul knapptext
--destructive……röd knapp: kant och ton
--destructive-fg……röd knapptext
--disabled……avstängd: streckad kant
--disabled-foreground……avstängd: text
--border……kant på fält och knappar
--table-head-bg……tabellhuvudets band
--table-head-border……tabellhuvudets ram
 
LamporMörktLjustRoll
--lamp-success……grön lampa, --fw-lg: OK, live
--lamp-warning……gul lampa, --fw-ly: varning, stale
--lamp-danger……röd lampa, --fw-lr: fel, offline
--btn-tint……tonen i knappar och lampor (12 %)
 
TypskalaMörktLjustRoll
.text-sm13px13pxbrödtext, etiketter, data — systemets standard
--leading-body……radavstånd i brödtext (13 på 18)
.text-xl26px / 39px26px / 39pxsidrubrik
--h2-size……sektionsrubrik
.text-btn12px12pxknapptext, versaler
.label-mono13px13pxetikett, versaler
--font-sansJetBrains Mono 700JetBrains Mono 700enda typsnittet, en vikt
 
Avstånd och kontrollhöjdMörktLjustRoll
--space-1……8 px — rutnätets steg
--space-2……16 px — sidans padding, mellan paneler
--space-3……24 px — inne i paneler
--space-4……48 px
--space-5……64 px
--section-gap……före en sektionsrubrik
--control-h……knapp, fält, sök, select, datum; 44 px under 768 px
--radius……inga rundade hörn
 
Ytor och rutnätMörktLjustRoll
--background……sidan, under 8 px-rutnätet (alias --page)
--surface……paneler, card, popover, menyn
--btn-base……knappens grund under tonen
--panel-border……panelens kant, 1 px inset (.panel)
--divider……streckad radlinje i tabeller
--grid-line……linjerna i 8 px-rutnätet på body
--chart-cell……rutnätets cell i diagrammen
.surfaces-standard——klass: vanliga ytor i stället för inverterade