Design system reference
Seeghra
IBM Carbon v11, taken verbatim, set in Geist Sans and Geist Mono. Corners are square everywhere and everything aligns to the left edge.
Every colour, size and space on this page reads from tokens.css. Use the theme control at the top to check all four Carbon themes. Auto follows your system setting: White in light mode, g100 in dark mode.
Part 1
Foundations
Colour
270 theme tokens from @carbon/themes 11.83.0. Values below are read live from the active theme. Carbon's AI and chat tokens are left out of Seeghra.
Layering model
Contextual tokens such as --sg-layer, --sg-field and --sg-border-subtle resolve to the right step when a container sets data-sg-layer.
Palette
The Carbon colour palette from @carbon/colors 11.60.0. Theme tokens map onto these steps. Hover variants such as --sg-blue-60-hover are in tokens.css too.
Type
Carbon's type scale with Geist in place of IBM Plex. Sizes, weights, line heights and letter spacing are unchanged. Display and fluid styles scale between breakpoints using Carbon's own fluid formula.
Geist adjustments
Geist was measured against IBM Plex with fontTools and rendered in Chromium at every Carbon size. Its line box is the same height as Plex (1.300 em), so no line height moves. Mixed text runs about 2 percent wider, which does not change line counts in any fixed-height component. Only the items below change.
| Token | Carbon | Seeghra | Reason |
|---|---|---|---|
font-family-sans | IBM Plex Sans | Geist | The typeface swap. |
font-family-mono | IBM Plex Mono | Geist Mono | The typeface swap. |
font-family-serif, fluid-quotation-01, fluid-quotation-02 | IBM Plex Serif | Geist | Geist has no serif. Quotation styles keep their sizes and weights. |
font-family-sans-condensed, font-family-sans-hebrew | Plex Sans Condensed, Plex Sans Hebrew | Geist | Geist ships neither. |
font-variant-numeric-tabular (added) | Not needed | tabular-nums | Plex figures are tabular by default. Geist figures are proportional (the 1 is 384 units, the 0 is 663), so data tables, numbers and code switch on tabular figures to keep columns aligned. |
| All size, weight, line height and letter spacing tokens | Carbon values | Unchanged | Measured and kept. Details in the next table. |
| Metric (per em) | IBM Plex Sans | Geist | Effect |
|---|---|---|---|
| Ascender plus descender | 1.025 + 0.275 = 1.300 | 1.005 + 0.295 = 1.300 | Same line box, so Carbon line heights hold. |
| Cap height | 0.698 | 0.710 | Caps sit centred in Geist's line box, slightly better than Plex in buttons and tags. |
| x-height | 0.516 | 0.530 | Lowercase reads about 3 percent larger. Below the point where sizes need to drop. |
| Rendered width, mixed text | Baseline | +2.1 to +3.2 percent | Kept Carbon tracking. Removing it would make 12 px labels 3.5 percent narrower than Plex. |
| Figure width | 0.600, all equal | 0.384 to 0.663 | Handled by the tabular figures token. |
Type scale
Geist Pixel
A Seeghra addition. Five pixel variants from Vercel's Geist family, used only where a file asks for one. No Carbon type token changes, and every Carbon style above stays in Geist Sans. The faces are embedded in tokens.css.
| Rule | Why |
|---|---|
| Use for large numbers, banner headlines, covers and section openers | Pixel is a display face. It carries personality at size and costs legibility below it. |
| Set it at heading-04 (28 px) or larger | Below that the pixel grid starts to break up the letterforms. |
Weight 400 only, with font-synthesis: none | Pixel has one weight. The browser would fake bold or light from it. |
| Take size and line height from a Carbon type token | Pixel shares Geist's line box, so Carbon line heights fit it with no change. |
| Never for body text, labels, form fields or table cells | These must stay readable at 12 to 16 px. |
Spacing
Carbon's 13 step spacing scale, built on a 2 px mini unit and 8 px rhythm.
Layout sizes
Component heights. Buttons, inputs, dropdowns, toolbars and table rows all snap to these six sizes.
Grid
Carbon's 2x grid: 4 columns on small, 8 on medium, 16 from large up, with a 32 px gutter. Carbon centres the grid container at its maximum width; Seeghra pins it to the left edge.
| Breakpoint | Min width | Columns | Margin |
|---|
Motion
Six durations and two easing styles. Productive motion is for small, frequent UI changes; expressive motion is for larger moments such as opening a modal.
Iconography
Carbon icons from @carbon/icons 11.90.0, shown at 16, 20, 24 and 32. Icons inherit the text colour of their container.
Radius
Carbon v11 ships radius tokens and rounds a few components. Seeghra sets every radius to zero.
| Token or component | Carbon | Seeghra |
|---|---|---|
| Tag | Pill, 1rem | 0 |
| Tag close button | Circle | 0 |
| Checkbox | 2px | 0 |
| Toggle track and handle | Pill track, round handle | 0, square track and handle |
Part 2
Components
Button
Five kinds plus three danger kinds, five sizes. Labels sit at the start with the icon at the end, as in Carbon. Hover, active and focus are shown as fixed states below; the buttons are also live.
Text input
Label above, helper or validation text below. The field fills its container up to 20rem here.
Dropdown
Same field shell as the text input. The open menu sits on the layer above, with dividers between options and a check on the selected one.
Checkbox
A 16 px box with a square corner. The boxes below are live.
Toggle
Carbon's toggle with a square track and a square handle. Size, travel and colours follow Carbon exactly.
Tag
Square tags with the label at the start. Three sizes, eleven colours, plus filter, interactive and disabled states.
Notification
Inline, actionable and toast notifications in four kinds, each in high and low contrast. The close buttons are live.
Sync failed.
The directory server did not respond within 30 seconds.
Policy saved.
Changes apply at the next sign in.
Scheduled maintenance.
Reports pause on Sunday from 02:00 to 04:00 UTC.
Licence limit near.
46 of 50 seats are in use.
Sync failed.
The directory server did not respond within 30 seconds.
Policy saved.
Changes apply at the next sign in.
Scheduled maintenance.
Reports pause on Sunday from 02:00 to 04:00 UTC.
Licence limit near.
46 of 50 seats are in use.
Sync failed.
12 accounts were not updated.
Licence limit near.
46 of 50 seats are in use.
Export failed
The audit export stopped at 62 percent.
Today, 10:42
Export ready
Your audit export is ready to download.
Today, 10:42
Report scheduled
The access report runs every Monday at 08:00.
Today, 10:42
Approaching quota
Log storage is 91 percent full.
Today, 10:42
Tabs
Line tabs (40 px) and contained tabs (48 px). Selected tabs use the semibold compact heading style. Both sets are live; use the arrow keys to move between tabs.
Data table
Title, toolbar with search and actions, sortable headers, row selection with a batch action bar, and expandable rows. Select a row to see the batch bar. Numbers are left aligned and use tabular figures.
Component audit
Each Seeghra component checked against its Carbon v11 spec. Expand a row to see what changed.
| Expand | Status |
|---|
| Size | Height |
|---|---|
| Extra small | 24 |
| Extra small | 24 |
| Size | Height |
|---|---|
| Small | 32 |
| Small | 32 |
| Size | Height |
|---|---|
| Medium, zebra | 40 |
| Medium, zebra | 40 |
| Medium, zebra | 40 |
| Size | Height |
|---|---|
| Extra large | 64 |
| Extra large | 64 |
Modal
Passive, transactional and danger modals, shown in place on their overlay. Footer buttons split the width in half. Open the live version to check focus, Escape and the overlay click.
Account settings
Rename group
The new name appears in reports and approval emails straight away. Members keep their access.
Payroll admins
Delete this group?
14 members lose the access this group grants. You cannot undo this.
Export
Report sent
We emailed the report to 3 recipients.