←MIT license

Design system · Open source

Flowbite, extracted and documented

At NRC Health, the design system is built on Flowbite. This page shows that open-source base on its own: every token copied from the source, every component with a live preview and a usage guide. Usage notes and guides are in English.

This is not NRC's design system. It is a public extraction of Flowbite, and it does not include the semantic layer built on top of it at NRC. Source: flowbite.com, MIT license

Color

Tailwind's default palette as Flowbite uses it. Each note says where a shade is used and the contrast computed against its usual background.

gray

gray-50oklch(98.5% 0.002 247.839)

Lightest neutral; subtle surfaces, table stripes, sidebar/nav hover background.

gray-100oklch(96.7% 0.003 264.542)

Secondary background; disabled input fill; Secondary-button background (13.35:1 with gray-800 text).

gray-200oklch(92.8% 0.006 264.531)

Default border, dividers, card border, navbar border; Secondary-button hover background. Decorative structure, not a state indicator.

gray-300oklch(87.2% 0.01 258.338)

Default input/select border. Note: at 1.47:1 against white this does not on its own meet the 3:1 non-text contrast guideline; the label and, on focus, the violet-500 ring (4.40:1) carry the boundary. Also Flowbite's dark-mode secondary text (dark:text-gray-300).

gray-400oklch(70.7% 0.022 261.325)

Placeholder text, disabled icons, chevrons. 2.60:1 on white, decorative/disabled only, never body text.

gray-500oklch(55.1% 0.027 264.364)

Secondary/muted text, helper text, meta-row labels and stat-tile captions on white (4.84:1).

gray-600oklch(44.6% 0.03 256.802)

Body text alternative, secondary links, sidebar inactive item text.

gray-700oklch(37.3% 0.034 259.733)

Strong secondary text, dark-mode borders, meta-row values, category-chip labels.

gray-800oklch(27.8% 0.033 256.848)

Secondary-button text, stat-tile value color; Flowbite's dark-mode surface (dark:bg-gray-800); Dark-button hover.

gray-900oklch(21% 0.034 264.665)

Dark-button background (17.75:1 with white text); Warning-button text on amber-500 (8.27:1).

violet

violet-50oklch(96.9% 0.016 293.756)

Brand tint; info alert/badge soft background; Outline-button hover fill; Sidebar active-item background.

violet-100oklch(94.3% 0.029 294.588)

Brand soft background for badges and alerts; focus-ring halo.

violet-300oklch(81.1% 0.111 293.571)

Brand border on light alert/badge backgrounds.

violet-500oklch(60.6% 0.25 292.717)

Focus ring / focus border (4.40:1 on white, meets the 3:1 UI-boundary guideline).

violet-600oklch(54.1% 0.281 293.009)

Primary brand color (violet); Primary-button background with white text (5.88:1); Link default; Sidebar active-item border/text; Outline-button border/text; checkbox/radio accent color.

violet-700oklch(49.1% 0.27 292.581)

Primary-button hover/active state (7.29:1 with white text); Link hover.

violet-900oklch(38% 0.189 293.745)

Brand text on light backgrounds; dark-mode brand accents.

blue

blue-600oklch(54.6% 0.245 262.881)

Category-chip dot for the blue hue only. Not a brand color in this system: the brand is violet.

green

green-100oklch(96.2% 0.044 156.743)

Success alert/badge/input soft background.

green-600oklch(62.7% 0.194 149.214)

Success border/icon/dot accent (3.22:1 on white, meets 3:1, do not pair with white text, that fails at 3.22:1).

green-700oklch(52.7% 0.154 150.069)

Success-button background with white text (4.94:1).

green-800oklch(44.8% 0.119 151.328)

Success text on green-100 soft background (6.45:1); Success-button hover.

red

red-100oklch(93.6% 0.032 17.717)

Danger alert/badge/input soft background.

red-600oklch(57.7% 0.245 27.325)

Danger primary; Danger-button/status-pill background with white text (4.76:1), form error border, category-chip dot.

red-800oklch(44.4% 0.177 26.899)

Danger text on red-100 soft background (6.86:1); Danger-button hover.

amber

amber-100oklch(96.2% 0.059 95.617)

Warning alert/badge/input soft background.

amber-500oklch(76.9% 0.188 70.08)

Warning-button/status-pill background, pair with gray-900 text (8.27:1), never white (only 2.15:1).

amber-600oklch(66.6% 0.179 58.318)

Warning border/icon/dot accent (3.19:1 on white, meets 3:1).

amber-800oklch(47.3% 0.137 46.201)

Warning text on amber-100 soft background (6.41:1).

purple

purple-100oklch(94.6% 0.033 307.174)

Category-chip / badge soft background (purple).

purple-600oklch(55.8% 0.288 302.321)

Category-chip dot; solid fill with white text passes at 5.53:1.

purple-800oklch(43.8% 0.218 303.724)

Text on purple-100 soft background (7.51:1).

teal

teal-100oklch(95.3% 0.051 180.801)

Category-chip / badge soft background (teal).

teal-600oklch(60% 0.118 184.704)

Category-chip dot/border/icon (3.66:1 on white, meets 3:1, do not pair with white text at this shade).

teal-800oklch(43.7% 0.078 188.216)

Text on teal-100 soft background (6.69:1); solid fill with white text passes at 7.53:1.

Type

Heading and text sizes documented by Flowbite. The family is Inter, the specimens below use the system font.

Headings · Inter

Patient experience

h1 · 48px / 48px · 700

Patient experience

h2 · 36px / 40px · 700

Patient experience

h3 · 30px / 36px · 700

Patient experience

h4 · 24px / 32px · 700

Patient experience

h5 · 20px / 28px · 700

Patient experience

h6 · 18px / 28px · 700

Text · Inter

Patient experience

body-lg · 18px / 28px · 400

Patient experience

body · 16px / 24px · 400

Patient experience

body-sm · 14px / 20px · 400

Patient experience

caption · 12px / 16px · 400

Spacing

Steps that map to Flowbite's button paddings and layout gaps.

space-14px

Smallest gap; icon-to-text spacing, chip dot-to-label gap.

space-28px

Compact gaps; form field internal spacing, meta-row item gap.

space-312px

Flowbite xs/sm button horizontal padding (px-3).

space-416px

Base padding; Flowbite base-button horizontal padding (px-4).

space-520px

Flowbite large-button horizontal padding (px-5).

space-624px

Flowbite xl-button horizontal padding (px-6); default card padding (p-6).

space-832px

Section spacing, large gaps, stat-tile gap.

space-1248px

Layout spacing between major blocks.

space-1664px

Large vertical rhythm, section padding, navbar height.

Radius

Tailwind's default scale, from checkboxes to pills.

radius-xs

2px

Smallest radius; checkboxes, small tags.

radius-sm

4px

Inputs, selects, small controls.

radius-md

6px

Default component radius; buttons, badges, logo placeholder.

radius-lg

8px

Cards, alerts, dropdown/menu panels, accordion panels.

radius-xl

12px

Large cards, modals.

radius-2xl

16px

Prominent panels, large modals.

radius-3xl

24px

Hero and marketing surfaces.

radius-4xl

32px

Largest decorative radius.

radius-full

9999px

Pills; Flowbite's rounded-full pill buttons, badges and avatars.

Shadow

Three elevations, from cards to modals.

shadow-xs

Flowbite's default card shadow (shadow-xs).

shadow-sm

Slightly raised surface, dropdown, menu panel.

shadow-md

Modal, popover.

Icons

751 icons vendored from Flowbite's own icon set, MIT license, outline and solid. Search by name, click one to copy its SVG.

...

Components

Twenty-one components, all live. Hover, focus and click inside the previews.

Actions

Button

A clickable control that triggers an action; provide the label text and, optionally, an icon.

Use violet-600 (Primary) for the single main action in a view. Use the gray Secondary style for lower-emphasis actions beside it, never two Primary buttons in the same view. Reserve green-700 (Success), red-600 (Danger) and amber-500 (Warning) for actions that match that meaning, not for visual variety. Warning pairs with gray-900 text, not white, white fails contrast on amber-500 (2.15:1). Radius is radius-md; horizontal padding scales space-3 → space-6 across the five sizes (xs → xl), matching Flowbite's own button padding at each size.

Never rely on color alone to mark a destructive action, label it ("Delete", "Remove"), don't just make it red. Disabled buttons drop to 50% opacity and lose the pointer cursor; they still need a reason visible nearby (helper text, tooltip), not just the dimmed look.

Forms

Checkbox

A binary on/off control for one option in a list, or for a single agreement toggle; provide the label text.

Uses the browser's native checkbox with accent-color: violet-600 rather than a hand-drawn replica, real keyboard and screen-reader behavior for free, tinted to the brand. Label text is gray-700; disabled drops to gray-400 and removes the pointer cursor.

Always pair the box with a clickable label (<label> wrapping both, or for/id), never a checkbox with no associated text.

DateRangePicker

The trigger control for choosing a date range; provide the currently selected start and end dates.

Scope note: this is the closed-state trigger only, styled like an Outline button showing the formatted range and a calendar glyph (drawn in CSS, no icon asset available to copy), not the open calendar grid itself. The grid is a materially different, more complex component (month navigation, day selection, range highlighting) and hasn't been built yet; treat it as a separate future component rather than assuming this covers it.

Border gray-300, radius radius-sm, focus ring violet-500, same as Select.

Input

A single-line text field with a label and helper text; provide the label, placeholder, and, for the error/success states, a message explaining why.

Default border is gray-300, radius radius-sm. That border alone is a light 1.47:1 against a white page and doesn't meet the 3:1 non-text contrast guideline on its own; the label above the field and, on focus, the violet-500 ring (4.40:1) are what actually mark the boundary, this is flagged rather than silently fixed, since it's this system's own choice, not a copied brand value.

Error state tints the whole field red-100 background / red-600 border / red-800 text; success tints green-100 / green-600 / green-800. Never show the error tint without an explanatory message next to it, the color change alone doesn't say what's wrong. Disabled fields use gray-100 background and gray-400 text and drop the pointer cursor.

Radio

A single choice among mutually exclusive options; provide the option group name and the list of labels.

Same approach as Checkbox: native <input type="radio"> with accent-color: violet-600, real interaction included. Group options under one name attribute so only one can be selected.

Never use Radio for a single yes/no toggle, that's Checkbox's job.

SearchInput

A text input scoped to filtering a list of results as you type; provide a placeholder describing what's being searched.

Built on Input's tokens (gray-300 border, radius-sm, violet-500 focus ring) with a trailing icon button in radius-sm on its right edge, background violet-600 / icon white. The icon is drawn in CSS (no icon font or image asset available to copy from a real source, so nothing was approximated as a logo or brand mark, just a generic magnifier shape).

Use this only where results filter live or on submit; if there's no list to search, it's a plain Input.

Select

A single-choice dropdown for filtering or picking a value from a fixed list; provide the option list and the current value.

Shares Input's border and radius (gray-300, radius-sm) and the same contrast caveat: that border alone doesn't meet 3:1 against white, the label and focus ring (violet-500) carry the boundary. Trailing chevron in gray-400. Disabled uses gray-100 background and gray-400 text.

Prefer Radio over Select when there are 4 or fewer options, letting people compare choices without opening a menu is usually better than hiding them.

Navigation

Accordion

A collapsible section for hiding secondary content (typically filter groups) behind a heading; provide the heading text and the content it hides, and optionally a trailing action like "Reset".

Built on native <details>/<summary>, expand/collapse and keyboard support come from the browser, no JavaScript. The chevron rotates 180° on open using a details[open] CSS selector, not a script. Header text is body-sm font-medium in gray-700; the panel has no border or background of its own, it just indents.

Don't nest an Accordion inside another Accordion, flatten the groups instead, or it becomes hard to scan.

AppLevelFilter

The top utility bar for filters that apply across the whole app (region, health system, facility type), plus the current user's menu; provide the filter labels and values, and the user's name.

Background is transparent, meant to sit directly on the app shell's violet-50 background, not on white, that's what separates it visually from the page-level Header sitting below it. Each filter is a label/value pair, caption label in gray-500, value in gray-900, gray-400 chevron. The user menu reuses an avatar circle in violet-100/violet-700.

Distinct from FilterTrigger: FilterTrigger is the single pill control, this is the app-wide bar that groups several of them with the account menu.

Header

The page-level header: breadcrumb, title, primary actions and a row of page filters; provide the breadcrumb trail, the title, the action labels and the filter labels.

White background (#fff), distinct from the app shell's general violet-50 background so it reads as a raised block. Border-bottom gray-200; breadcrumb links gray-500, current page gray-700; title in h1, gray-900. Primary action pairs with the Secondary style beside it, same rule as the Button component: one Primary per view. Filter pills reuse the same visual language as FilterTrigger but sit inline, for page-scoped filters rather than app-scoped ones (see AppLevelFilter for the latter).

LeftSideNavbar

The left column: logo, app switcher, two top-level links, then the main navigation with one active item and one expandable item for sub-pages; provide the app name, the nav labels, and which item is active.

White background, border-right gray-200, unaffected by the app shell's violet-50 background. Active item gets a violet-600 left border, violet-50 background and violet-600 text; inactive items are gray-600. Combines Sidebar's navigation pattern with MenuButton's icon-trigger variant for the app switcher, assembled as one organism rather than composed by hand each time.

Same active/inactive rule as Sidebar: this is a functional current-page indicator, not decoration.

MenuButton

A button that opens a small list of actions or options; provide the trigger label and the list of menu items.

Built on the native <details>/<summary> disclosure element, not custom JavaScript, real click-to-toggle and keyboard support come from the browser for free. The trigger is styled as a Secondary button with a trailing chevron; the panel is shadow-sm, radius-lg, gray-200 border, offset space-2 below the trigger.

Never put more than roughly seven items in one menu without grouping them, past that, it's a page, not a menu.

Navbar

The top-level app bar; provide the app name (and a logo image, if one exists) plus the primary nav links and the current user's name.

Built with this system's neutral tokens only, white background, gray-200 bottom border, gray-800 text, not any specific product's brand color. No real logo was supplied to this system, so the logo slot is a plain gray-200 placeholder square with radius-md, not a reconstructed mark; swap it for the real asset when one is provided, per this system's rule against approximating logos. The user menu on the right reuses MenuButton.

Height is space-16 (64px); horizontal padding space-6.

Sidebar

A vertical list of destinations (reports, pages, sections); provide the list of labels and which one is active.

The active item gets a violet-600 left border, violet-50 background and violet-700 text; inactive items are gray-600 text with a gray-50 hover background. This is a functional current-page indicator, not decoration, don't add the same left-border treatment to something that isn't indicating "you are here."

This is the generic Flowbite-token version of the container; it does not carry any specific product's brand color (see Navbar).

Surfaces

Card

A contained surface for grouping related content; provide a heading, body text, and optional actions or a list of rows.

Border gray-200, radius radius-lg, shadow shadow-xs, padding space-6, matching Flowbite's default card (p-6). The border is decorative structure, not a state indicator, so it isn't held to the stricter 3:1 UI-boundary guideline the way a form input's border is.

Keep shadow-xs as the only elevation cue; don't stack a heavier shadow and a darker border on the same card. A card with a list divides rows with gray-200, not a border around each row.

Feedback

Badge

A small label attached to a piece of content; provide the text (and, for the category variant, which of the seven hues it belongs to).

Three variants, one component: - Outline, transparent fill, <color>-600 border, <color>-800 text. For a score or sentiment value that needs to stand out without shouting. - Solid, <color>-600 (or amber-500, red-600) background. Danger and Success solid badges use white text (they pass 4.5:1); Warning solid uses gray-900 text (white fails on amber-500). For a status that needs weight, like an alert state. - Category chip, a small colored dot plus gray-700 label text, no border or fill. Cycle the seven hues (gray, blue, green, red, amber, purple, teal) across categories in a stable, documented order, never assign colors ad hoc per instance, or the same category will drift to different colors elsewhere.

Never use color alone on the Solid variant without the text also saying what the status is, "RE-OPENED", not just a red pill.

Link

Inline text that navigates or triggers an action from within a sentence or a list; provide the label text.

violet-600 default (5.88:1 on white), violet-700 on hover with an underline added on hover only, the underline appearing is itself a hover signal, so it doesn't need to be there by default when the color already marks it as a link within a body-text paragraph. A standalone link used as a control (not inside a sentence) still needs that color to meet 4.5:1, which violet-600 does.

Never use Link styling on something that isn't navigable, that's what Button (ghost/text style) is for.

MetaRow

An inline strip of "LABEL: value" pairs describing a record (a person, a submission, an entry); provide the ordered list of label/value pairs.

Labels are caption (12px, uppercase, gray-500); values are body-sm (14px, gray-700). Pairs wrap onto new lines as a group, never mid-pair, separated by space-4 gaps.

Keep it to short scalar facts (dates, IDs, single words); anything longer belongs in the body content below it, not squeezed into a meta row.

StatTile

A single number with a label, for a dashboard summary; provide the number and the caption describing it, and optionally a link to the detail view.

Value uses the h2 type style (36px/700) in gray-900; caption is caption (12px) in gray-500, uppercase, above the number. An optional link below uses Link's violet-600.

Never show a number here without a caption, an unlabeled number is meaningless out of context. Keep to one number per tile; a tile with a trend arrow or delta is a variant to design deliberately, not to bolt on.

Not built yet: Alert, Table, Tabs, Modal, Avatar.