Skip to content
SAMRISKDesign System v0.1

Building risk, managed.

The single reference for SAMRISK's visual language — brand, color, typography, components, and patterns used across the platform.

12

Reference sections

40+

Design tokens

20

UI components in use

Color palette

SAMRISK uses a single primary blue paired with a slate neutral. Click any swatch to copy the hex.

Primary — Blue

Used for primary actions, links, focus rings, and brand accents.

Neutral — Slate

Surfaces, text, borders, dividers. The foundation of every screen.

Semantic colors

Reserved meanings — don't use these for decorative purposes.

Confirmations, completed states, positive trends

Caution states, upcoming deadlines, pending review

Destructive actions, validation errors, overdue items

Neutral system messages, tooltips, help text

Theme color

Used in PWA manifest, mobile address bar, and Open Graph cards.

A slightly more saturated blue than primary-500 — chosen for higher visibility in OS chrome and on dark social-card backgrounds.

Typography

Inter for everything. JetBrains Mono for code, hex tokens, and labels. Title case — never uppercase headings.

Display.type-display36–56px / 700 / -0.025em

Building risk, managed.

H1.type-h128–40px / 700 / -0.02em

Page heading

H2.type-h222–30px / 700 / -0.015em

Section heading

H3.type-h322px / 600 / -0.01em

Subsection heading

H4.type-h418px / 600

Card title

Subhead.type-subhead18px / 500

Introductory text or lead paragraph

Body L.type-body-lg17px / 400

Larger body copy for marketing or hero descriptions.

Body.type-body15px / 400

Default body text used throughout the product UI.

Label.type-label13px / 600 / 0.04em / uppercase

Field label

Caption.type-caption13px / 400 / muted

Helper or secondary copy below a field

Mono.type-mono12px / 500 / JetBrains

Token, hex, or code snippet

Micro.type-micro11px / 500 / 0.08em

Eyebrow label

Spacing scale

Every margin, padding, and gap is a multiple of 4px. Tailwind tokens map 1:1 — p-4 = 16px.

TokenPixelsVisualCommon use
0.52pxHairline gap inside dense form rows
14pxBase grid unit
28pxIcon-to-label spacing, tight stack
312pxCompact card padding, button gap
416pxDefault card padding, vertical rhythm
624pxSection gap, modal padding
832pxPage block separation
1248pxMajor page section padding
1664pxHero vertical padding
2496pxMarketing-page hero, between-sections

Responsive breakpoints

Mobile-first. Use Tailwind's sm:, md:, lg:, xl: prefixes to scale up.

Mobile

< 640px

Single column. Sidebars hide. Touch-first.

sm

sm

≥ 640px

Two-column forms, dense tables.

md

md

≥ 768px

Tablet layouts, sidebar reveal.

lg

lg

≥ 1024px

Desktop layout with permanent sidebar.

xl

xl

≥ 1280px

Wide layouts, multi-column dashboards.

2xl

2xl

≥ 1536px

Edge case — large-monitor density.

Components in use

A sampler of the most-used Nuxt UI primitives in SAMRISK. Switch to the Components view for the full reference.

Buttons

Badges

ActiveApprovedPendingOverdueDraft

Alerts

Info
Six audits are due this week.
Action required
Three buildings have incomplete risk assessments.

Cards

Property: Riverside Tower

15 floors · 42 risk items tracked · last audit 2 weeks ago

Forms & inputs

Every field uses UFormField for the label, help text, and error slot. Labels are sentence case.

We'll use this for notifications.
Optional — max 200 characters.
Please enter a valid email.

Data display

Tables, status badges, progress, and skeleton loaders — the workhorses of the SAMRISK product UI.

Status badges

CompletedRisk assessment signed off
In reviewWaiting for manager approval
OverduePast scheduled audit date

Progress

Risk assessment completion

68% complete

Skeleton

Use while data is loading — match the dimensions of the real content.

Empty state

No audits yet

Schedule your first periodic audit to get started.

Dark mode

Every surface gets both themes. Use dark: variants and the useColorMode composable. Toggle dark mode using the button in the top right.

Riverside Tower

15 floors · 42 risk items

Riverside Tower

15 floors · 42 risk items

Motion

Subtle and fast. 200ms color transitions globally; modal/menu animations come from Nuxt UI defaults. Respect prefers-reduced-motion.

Color transitions

200ms ease — applied globally to buttons, links, inputs.

transition: all 200ms ease

Focus ring

2px primary-500 outline, 2px offset. Always visible on keyboard focus.

Reduced motion

All animations collapse to 0.01ms when the user has reduced-motion enabled in OS settings.

Do's & Don'ts

The shortest list of rules that will keep SAMRISK looking like SAMRISK.

Do

  • Use SAMRISK blue for primary actions

    Save, submit, and confirm buttons use primary-500. One primary call-to-action per view.

  • Pair slate text on white surfaces

    Body text is slate-700 on white in light mode, slate-100 on slate-900 in dark.

  • Default to Inter at 15px body

    Match the SAMRISK app exactly. Larger sizes are reserved for marketing or empty-state hero copy.

  • Use UFormField for every input

    It gives consistent label, help text, and error styling across the product.

  • Respect the 4px spacing grid

    Every margin, padding, and gap is a multiple of 4px. Use Tailwind tokens (1, 2, 4, 8…).

  • Provide a focus-visible ring

    Every interactive element shows a 2px primary outline on keyboard focus. Don't override this for visual taste.

Don't

  • Don't introduce new accent colors

    Stick to blue + slate + the four semantic colors. New hues need design review.

  • Don't use pure black (#000) or pure white in dark mode

    Use slate-900 surface on slate-950 canvas. Pure black is too harsh against any colored content.

  • Don't use uppercase headings

    SAMRISK is a professional B2B tool, not a brutalist brand. Use sentence case.

  • Don't mix component libraries

    Use Nuxt UI components only. No custom buttons or inputs unless wrapping Nuxt UI primitives.

  • Don't hide error messages

    Validation errors always render below the field via UFormField's `error` slot.

  • Don't skip dark mode

    Every new surface gets both light and dark styling. `dark:` variant is mandatory, not optional.