Components
Core primitives — button, card, badge, status. Layout, form controls, overlays, data views, and full-screen examples live on their own pages.
More components
This page covers primitives only. Everything else has a canonical home.
Button
/components/button/Nine variants, three sizes with fixed height per size — text and icon-only buttons align in the same row. Primary and terminal support a pointer-following glow when you call initButtonGlow() once at the app root (see Foundations → Motion). Terminal carries the ❯ prefix for technical actions. Ghost semantic variants (ghost-destructive, ghost-success, ghost-warning, ghost-info) stay muted at rest and tint on hover — use in dense toolbars and ButtonGroups.
ButtonProps| Prop | Type |
|---|---|
asChild? | boolean |
loading? | boolean |
Button group
/components/button-group/Fused action buttons for independent clicks — not a toggle. Wrap text or icon-only Button children; the group shares borders and height. Use Segmented when one option should stay selected.
ButtonGroupProps| Prop | Type |
|---|---|
size? | ButtonGroupSize |
orientation? | ButtonGroupOrientation |
Segmented
/components/segmented/Single-select toggle for views, sort modes, or filters. Pass collapseMobile to show only the active option on narrow viewports — tap to open a dropdown overlay, select to collapse.
SegmentedProps| Prop | Type |
|---|---|
options | SegmentedOption[] |
value | string |
onChange | (value: string) => void |
size? | 'sm' | 'md' |
collapseMobile? | boolean |
Resize below 768px to see collapseMobile — selected option only; tap opens a dropdown.
The default surface. accent={true} adds a yellow border tint. accent='filled' adds a yellow border + subtle yellow fill. Optional CardHeader / CardContent / CardFooter compound parts. CardHeader accepts an actions slot — use CardChange for StatCard-style up/down deltas. Each of CardHeader/CardContent/CardFooter also takes its own accent to override the parent Card's accent for just that region.
CardProps| Prop | Type |
|---|---|
* `true` — yellow border tint (`border-tollerud-yellow/25`), no fill. | — |
* `"filled"` — yellow border + subtle yellow background fill (`bg-tollerud-yellow/5`). Use for callout boxes, cheapest-item highlights, and CTAs. | — |
* | — |
* Cascades to `CardHeader`/`CardContent`/`CardFooter` tinting. Any of those parts can | — |
* set their own `accent` prop to override the cascade for just that region. | — |
*/ | — |
accent? | boolean | 'filled' |
density? | 'comfortable' | 'compact' |
asChild? | boolean |
* Force structured layout (no shell padding, header/content/footer own their padding) on or off. | — |
* Omit to auto-detect from `CardHeader`/`CardContent`/`CardFooter` children — that detection reads | — |
* `child.type.displayName`, which can fail to survive a Next.js Server/Client Component boundary. | — |
* Set this explicitly when composing across that boundary instead of relying on auto-detection. | — |
*/ | — |
structured? | boolean |
Restart emma
Stops 4 running services. They can be restarted from the dashboard.
Review required
iris.tollerud.no
Brukt av budsjett
Active sessions
Last 24h
42
Error rate
Last 24h
0.4%
Uptime
Last 24h
99.9%
Deploy
Deploy
PriceDisplay
/components/price-display/Compact price display: a primary value with an optional secondary Badge below it. Use highlight='cheapest' for success coloring. size='sm' | 'md' | 'lg' scales the block for table cells or prominent rows. Defaults to right-aligned.
PriceDisplayProps| Prop | Type |
|---|---|
primary | string |
secondary? | string |
* `"cheapest"` switches the primary value to success color and the badge to `variant="success"`. | — |
* `false` (default) uses muted text for the primary and default badge styling. | — |
*/ | — |
highlight? | 'cheapest' | false |
align? | 'left' | 'right' |
size? | PriceDisplaySize |
ListCard
/components/list-card/Hover card shell for list and grid items. Pass href to render as a link. Use highlight='cheapest' for a yellow border tint on the best-value item. Children are fully consumer-controlled — compose with Cluster or Split for left/right layouts.
ListCardProps| Prop | Type |
|---|---|
href? | string |
* `"cheapest"` applies a yellow border tint to flag the best-value item. | — |
* `false` (default) uses the standard border. | — |
*/ | — |
highlight? | 'cheapest' | false |
external? | boolean |
PromoSection
/components/promo-section/Two-column marketing block with a text column and a consumer-controlled visual slot. Eyebrow matches PageHeader — mono uppercase yellow. Pass shimmer='word' to give one word in the title a shimmer accent. Collapses to single-column on mobile with text always first. background='raised' goes edge-to-edge with contentWidth capping the inner content.
PromoSectionProps| Prop | Type |
|---|---|
eyebrow? | ReactNode |
title | ReactNode |
* When `title` is a string, wraps the first matching substring(s) in `.tollerud-display-shimmer`. | — |
* Pass a string for a single accent or a string[] to shimmer multiple words/phrases. | — |
* e.g. shimmer="favorittøl" or shimmer={["favorittøl", "dine butikker"]} | — |
*/ | — |
shimmer? | string | string[] |
description? | ReactNode |
actions? | ReactNode |
visual? | ReactNode |
visualPlacement? | PromoSectionVisualPlacement |
background? | PromoSectionBackground |
textWidth? | PromoSectionTextWidth |
contentWidth? | PromoSectionContentWidth |
See what your favourite beers cost across every store
Create a free account and track prices on your go-to beers. Set up alerts when prices change.
Divider
/components/divider/A horizontal rule. Default uses the border token; accent variant draws a short yellow rule for section breaks.
Content above the divider
Content below the divider
Accent variant — short yellow rule
Badge & Pill
/components/badge-and-pill/Badges label status inline. Pills are tiny mono-flavored tags.
BadgeProps| Prop | Type |
|---|---|
variant? | keyof typeof badgeVariants |
Status & Kbd
/components/status-and-kbd/Status dots show liveness with a soft glow. Kbd renders shortcut chips.
Stat card
/components/stat-card/Compact metric tiles for dashboards, with optional trend. tone colors the value + border independently of accent — for a status-carrying figure.
StatCardProps| Prop | Type |
|---|---|
label | string |
value | ReactNode |
change? | { |
value? | string |
direction | CardChangeDirection |
tone? | 'success' | 'error' | 'warning' | 'info' | 'accent' |
} | — |
accent? | boolean |
tone? | StatCardTone |
icon? | ReactNode |
secondaryValue? | ReactNode |
secondaryTone? | 'default' | 'accent' | 'success' | 'error' | 'warning' | 'info' |
Active Sessions
42
CPU Load
63%
Storage
1.2 TB
Brukt av budsjett
12 930 kr / 2 700 kr
Price
23,90 kr
47,80 kr/lTicket price
Progress, Skeleton & Avatar
/components/progress-skeleton-and-avatar/Loading and identity primitives. Avatar and AvatarGroup stack naturally.
Tooltip
/components/tooltip/Appears on hover and focus. Supports top (default) and bottom placement.
Alert
/components/alert/Four semantic tones. Pass icon to override the default icon per tone. Alert has no built-in outer margin — stack with Stack or className in apps.
AlertProps| Prop | Type |
|---|---|
tone? | keyof typeof toneStyles |
title? | string |
icon? | React.ReactNode |
Heads up
Yellow signals an action worth noticing.
Scheduled
Maintenance window at 03:00 UTC. No action needed.
Deployed
emma — hermes v2.0 is live.
Connection failed
Could not resolve host — check DNS.
Storage full
Custom icon via the icon prop.
Spacing in apps
Wrap stacked alerts in <Stack gap="md"> or add className="mb-4". The demo above uses flex gap from the preview stage only.
Tabs & Accordion
/components/tabs-and-accordion/Organize content. Tabs ship pill and underline variants.
Timeline
/components/timeline/Vertical activity feed with status-colored dots and metadata. variant='flat' (v4.16.0) drops the connector line for a divided activity/audit-log list, and title accepts rich content.
Rolled out to emma
Config reloaded
emma refused connection
Table
/components/table/Plain static table primitives — no sorting, filtering, search, or pagination. Use DataTable for that; use Table for a fixed comparison table or small dataset.
TableRowProps| Prop | Type |
|---|---|
highlight? | boolean |
| Ingrediens | For 8 | For 14 |
|---|---|---|
| Laks, filet | 3,2 kg | 5,6 kg |
| Sitron | 4 stk | 7,0 stk |
Panel
/components/panel/A card with a header bar: title, optional description, and optional actions. Pass a fragment with multiple buttons to actions for a toolbar.
Compose stack
hermes
Meter
/components/meter/A labeled progress row that turns red past a hot threshold (default 85%). Used for CPU/memory/disk and plan-usage limits.
Stepper
/components/stepper/Horizontal step indicator for wizards and multi-stage flows. Pass an array of step labels and the current step index (0-based). Completed steps fill yellow; the active step carries a ring.
- 1Connect host
- 2Choose stacks
- 3Invite team
- 4Finish
- Connect host
- Choose stacks
- 3Invite team
- 4Finish
- Connect host
- Choose stacks
- Invite team
- 4Finish
Density
/components/density/Two ways to apply compact density: set density='compact' directly on a Card, or wrap a group with data-density='compact' to tighten everything inside.
Padding tightens in compact mode.
TOTP at sign-in.
Always compact via prop.
Comfortable by default.
Empty state
/components/empty-state/For surfaces with no data, no results, or an error. Icon, headline, calm explanation, one clear action. Use compact inside cards, tables, and panels.
EmptyStateProps| Prop | Type |
|---|---|
icon? | EmptyStateIconName | ReactNode |
title? | ReactNode |
description? | ReactNode |
action? | ReactNode |
secondaryAction? | ReactNode |
compact? | boolean |
accent? | boolean |
Connect your first machine and Tia will start watching it within seconds.
No open alerts across your fleet. The last incident was acknowledged 6 days ago.
Nothing matches “grafna”. Check the spelling or clear the filter to see everything.
emma.tollerud.no refused the connection. The agent may be offline or the port blocked.
Code block
/components/code-block/Terminal-style code display with an optional copy button. Use the code prop for a single string, or children for richer markup.
systemctl status tollerud-agentContainer
/components/container/Layout width constraint — 1100px max with 24px horizontal padding. Use as a page wrapper or section cap.
Action row
/components/action-row/A single command-list row — icon, label, description and shortcut. Used inside CommandMenu-style surfaces.
Glow card
/components/glow-card/Wraps any surface with a cursor-tracking yellow glow. Intensity and color are configurable.