--bgPage backgroundFOIALAB LIVING STYLE GUIDE
One visual language.
Every page.
This is the toolbox for building FOIALab consistently. Every example below uses the same production classes, theme variables, and reusable controls loaded by the live site.
01 / FOUNDATIONS
Color and system tokens
Use variables instead of hard-coded accent colors. The selected color theme updates every accent token automatically.
--bg-softSecondary background--panelTranslucent surface--panel-solidSolid surface--textPrimary text--mutedSecondary text--lineBorders and rules--accentSelected accent--accent-brightBright accent--accent-deepDeep accent--glowAccent glow--scrollbar-size17px scrollbarAvailable accent presets
#a431ff#7c3aed#db2777#dc2626#ea580c#d97706#16a34a#0d9488#0891b2#1b9dff#4f46e5#71717a:root {
color: var(--text);
background: var(--bg);
}
.feature-highlight {
border-color: var(--accent);
color: var(--accent-bright);
box-shadow: 0 0 24px var(--glow);
}02 / BRAND & THEME
Theme-aware branding
The logo mark, favicon, browser theme color, picker, and interface accents all use the same selected color.
Choose any of the 12 presets to test this page live.
<AccentPicker />import AccentPicker from "@/app/accent-picker";
import { FoiaLabMark, FoiaLabWordmark } from "@/app/foialab-brand";
<FoiaLabMark title="FOIALab" />
<FoiaLabWordmark />
<AccentPicker />03 / TYPOGRAPHY
Montserrat type system
Montserrat is loaded once in the root layout. Keep headings tight and confident; keep body copy readable and restrained.
Truth through records.
38px / 650 / −0.04emResearch Paths
24px / 650 / −0.04emSOURCE-GROUNDED RESEARCH
.ui-eyebrowUse plain, direct language with comfortable line spacing for long research workflows and evidence review.
.ui-copy04 / BUTTONS
Action hierarchy
Use one primary action per region. Ghost and secondary actions support it; danger is reserved for destructive or irreversible work.
<button className="button button-primary">Save changes</button>
<button className="button button-secondary">Preview</button>
<button className="button button-ghost">Cancel</button>
<button className="button button-danger">Delete</button>
<button className="button button-ghost workspace-toolbar-button">
Public site
</button>05 / FORM CONTROLS
Every input, one control system
Dashboard forms inherit consistent labels, focus rings, validation, disabled states, fully custom dropdown menus, and a themed date-time picker.
import {
SelectControl,
DateTimeControl,
CheckboxDropdown,
} from "@/app/dashboard/form-controls";
<label className="field">
<span className="field-label">Source type</span>
<SelectControl value={source} onChange={handleSource}>
<option value="foia">FOIA response</option>
<option value="contract">Contract</option>
</SelectControl>
<span className="field-help">Helpful context goes here.</span>
</label>
<label className="field">
<span className="field-label">Review date and time</span>
<DateTimeControl value={reviewAt} onChange={handleReviewAt} />
</label>06 / SCROLLBARS
Theme-owned scrolling
Page scrollbars and nested scrolling regions use the selected accent automatically. The shared width is 17 pixels across current major browsers.
/* The page scrollbar is automatic. For nested regions: */
<div className="scrollbar-themed">
...
</div>
/* Alias retained for existing components: */
<pre className="custom-scrollbar">...</pre>
/* Shared tokens */
--scrollbar-size: 17px;
--scrollbar-track: ...;
--scrollbar-thumb: ...;07 / BOXES & PANELS
Surface hierarchy
Use raised panels for high-priority work, standard panels for grouped content, and inset panels for secondary detail.
Primary workspace panel
Use for the most important action or review area.
.ui-panel-raisedGrouped content
Use for lists, forms, summaries, and supporting tools.
.ui-panelSecondary detail
Use inside another panel for metadata and context.
.ui-panel-inset.ui-stat08 / STATUS & FEEDBACK
Badges and notices
Never rely on color alone. Every status pairs color with readable text and a stable semantic class.
<span className="ui-badge ui-badge-success">Complete</span>
<div className="ui-notice ui-notice-warning">
A human review is required.
</div>10 / IMPLEMENTATION
How new pages use the system
The global styles are already linked once at the application root. New pages inherit them automatically—do not create another theme, button, form, or shell stylesheet.
Load once
app/layout.tsx imports app/globals.css. Do not add another stylesheet link to individual pages.
Use production classes
Combine base and variant classes, such as button button-primary or ui-panel-raised.
Use shared React controls
Import custom dropdowns, date/time controls, the theme picker, branding, sidebar, and page header from their shared components.
Keep page CSS structural
Page modules may define grids, maps, viewers, and specialized data layouts. They must not redefine shared color, type, buttons, controls, navigation, or branding.
// app/layout.tsx — already configured once for every route
import "./globals.css";
// Any page or component
<section className="ui-panel-raised">
<p className="ui-eyebrow">NEW WORKFLOW</p>
<h2 className="ui-title">Consistent by default</h2>
<p className="ui-copy">Page-specific CSS handles layout only.</p>
<button className="button button-primary">Continue</button>
</section>