Component library
On this page
The library is WebAwesome (wa-*) restyled by the FDT theme, plus the FDT extensions (fdt-symbol, the program card, the tactical callout).
Every card below is ready to copy: load /colors_and_type.css and /components/bundle.css, then paste the markup from the card’s guideline. All classes are prefixed fdt-.
<link rel="stylesheet" href="/colors_and_type.css">
<link rel="stylesheet" href="/components/bundle.css">
Each card lives at static/components/<Name>/: preview.html is the live frame rendered below, README.md is the guideline under it.
The first line of every preview is the card marker (<!-- @dsCard group="…" height=… -->), which decides the group and the frame height on this page.
Icons and APP-6D frames in the previews are geometric stand-ins; production uses Font Awesome Sharp Regular and <fdt-symbol>. The two kits load Font Awesome Sharp Regular from the FDT Pro kit.
Brand
ProductFamily every product wordmark, one system
Open preview · Guideline source
Every FDT product shares one system: the name is the identity, set as an UPPERCASE wordmark with no product color of its own.
Consumer provides: the product name, its capability as an eyebrow, one descriptor sentence and its platform.
<article class="fdt-card"><div class="fdt-card-body">
<div class="fdt-kicker">Counter-UAS</div>
<h3 class="fdt-card-title">GHOST GRID</h3>
<p class="fdt-card-text">Counter-unmanned aircraft systems.</p>
</div><footer class="fdt-card-foot">Desktop</footer></article>
- Names: one real word or a two-word compound, all caps, no mythology. QRF is grandfathered.
- No second brand color per product. Products differ by name, never by hue.
- READBOARD and Defense Fit are FDT apps built on this system.
Typography
Eyebrow house move · eyebrow over display
Open preview · Guideline source
The eyebrow is the micro uppercase line, in electric-400, that sits above every Display or section heading.
Consumer provides: A short category or context phrase (2–5 words). Write it in sentence form; the class sets the capitals and 0.18em tracking.
<div class="fdt-kicker">Defining the future battlespace</div>
<h1 class="display-l">Decision Superiority at the Speed of Relevance</h1>
- Use the
eyebrowtype style (11px Inter 500, 0.18em, UPPERCASE) via.fdt-kicker; 6–10px above the heading. - One eyebrow per heading; never stack two.
- Color is
electric-400(5.8:1 onnavy-900). - Use
·to join two facts:PROGRAM · LIVE.
Actions
Button wa-button · every variant and size
Open preview · Guideline source
The command control: every button is a verb, set UPPERCASE in Barlow Condensed 700.
Consumer provides: A label that is an imperative verb (Acquire, Create mission, never Submit or “please”), a variant class and optionally a size class.
<button class="fdt-btn fdt-btn--brand">Acquire</button>
<button class="fdt-btn fdt-btn--neutral">Cancel</button>
<button class="fdt-btn fdt-btn--danger">Disengage</button>
- Variants:
--brand(one primary per view,fdt-glow-md),--neutral,--outlined,--plain,--danger,--danger-plain,--success,--warning. - Locked labels:
whiteonelectric-500/hostile;navy-900onneutral/caution(white fails there). - Sizes:
--sm32px, default 36px,--lg44px for mobile primaries.--iconfor square icon buttons; give it anaria-label. - Focus is the two-layer ring (2px
electric-500+fdt-glow-sm). No gradients, no shrink on press. - Neutral border is
steel-400so the control edge reads at 3:1.
Forms
Checkbox wa-checkbox · checked, unchecked, indeterminate, disabled
Open preview · Guideline source
An on/off choice that is submitted with a form.
Consumer provides: A label for each box; related boxes go in a fieldset with a legend.
<label class="fdt-check"><input type="checkbox"><span></span>Confirm before engage</label>
- 18px box,
steel-400border at rest,electric-500fill with white check when on. - For instant settings use Switch instead.
FileInput wa-file-input · rest and drag
Open preview · Guideline source
A drop zone for uploading files.
Consumer provides: Accepted types and size limit in the help line.
<div class="fdt-drop">Drop OPORD here or <strong>browse</strong></div>
- Dashed
steel-400at rest;electric-500withfdt-glow-smwhile dragging.
FormField wa-input · rest, focus, invalid, disabled
Open preview · Guideline source
A top-aligned label, an input, and help or error text below.
Consumer provides: A <label for>, the input, and help text; on failure an error that states what is wrong, then how to fix it.
<div class="fdt-field">
<label class="fdt-label" for="cs">Callsign<span class="req">*</span></label>
<input id="cs" class="fdt-input" aria-required="true">
<span class="fdt-help">3 to 12 uppercase characters</span>
</div>
- Label Inter 500 13px
fog-100; required asterisksteel-300(not red). Help 12pxsteel-300. - Input
navy-700with asteel-400border (3:1),electric-500+fdt-glow-xson focus. - Invalid: 2px
hostileborder, message inhostile-300with a warning glyph; setaria-invalidandaria-describedby. - Validate on blur. Width matches the data; single column, 40ch cap. Never “please.”
FormLayout wizard steps · section · actions
Open preview · Guideline source
How fields assemble into a form: step indicator, section headings and the action row.
Consumer provides: Sections of related fields; for 5+ sections, a step list.
<ol class="fdt-steps"><li class="done"><b>01</b>Mission</li><li class="current"><b>02</b>Assets</li>…</ol>
<div class="fdt-form-section">Assets</div>
<div class="fdt-actions"><button class="fdt-btn fdt-btn--plain">Back</button><button class="fdt-btn fdt-btn--brand">Next</button></div>
- Field gap
space-4(compactspace-2); section gapspace-6above. - Primary right; Cancel left of it; destructive far left.
- Never auto-advance; never full-width submit outside mobile.
NumberInput wa-number-input · mono value with stepper
Open preview · Guideline source
Numeric entry with a stepper; the value is data, so it sets in mono, right-aligned.
Consumer provides: Min, max, step and a unit in the label.
<div class="fdt-number"><input class="fdt-input" value="1500"><div class="fdt-number-step"><button aria-label="Increase">▲</button><button aria-label="Decrease">▼</button></div></div>
- Size to the data: about 6–12 characters wide.
- Range errors:
Value exceeds maximum of 5,000.
Radio wa-radio-group
Open preview · Guideline source
One choice from a short visible set.
Consumer provides: A fieldset + legend and two to six options.
<label class="fdt-check"><input type="radio" name="mode"><span></span>Passive</label>
- More than six options: use Select.
Rating wa-rating · debriefs
Open preview · Guideline source
A 1–N score for retrospectives and debriefs.
Consumer provides: The value and maximum, plus a text equivalent.
<div class="fdt-rating" aria-label="3 of 5">…</div>
- Filled
electric-500, emptynavy-700with asteel-400outline.
SegmentedControl wa-radio-group appearance=button
Open preview · Guideline source
A radio group drawn as buttons, for switching a view mode in place (QRF VISUAL / THERMAL / SIGNALS).
Consumer provides: Two to four short UPPERCASE options.
<div class="fdt-segmented" role="radiogroup"><label><input type="radio" name="f" checked><span>VISUAL</span></label>…</div>
- It is a radio group, not tabs: it changes a mode, not a page.
- Selected:
electric-500fill, white label.
Select wa-select
Open preview · Guideline source
Single choice from a list; the open list uses the Dropdown surface.
Consumer provides: A label and options; a placeholder option only when no default makes sense.
<select class="fdt-select"><option>Fortress</option></select>
- Multi-select shows chosen values as Tags.
- Options hover to
electric-500at 15%.
Slider wa-slider
Open preview · Guideline source
A value chosen along a range, with its value shown in mono.
Consumer provides: Min, max, step and a live readout.
<input type="range" class="fdt-slider" style="--fill:64%">
- Always show the number; the track alone is not precise.
- Set
--fillto the value as a percentage.
Switch wa-switch
Open preview · Guideline source
An instant on/off setting that applies without a submit.
Consumer provides: A label stating the setting, not the action.
<label class="fdt-switch"><input type="checkbox" role="switch"><span></span>Auto-engage</label>
- Off:
navy-700,steel-400border. On:electric-500withfdt-glow-xs.
Textarea wa-textarea
Open preview · Guideline source
Multi-line free text, styled like the input and set in body type.
Consumer provides: Label, textarea and optional help; same validation states as FormField.
<textarea class="fdt-textarea"></textarea>
- Resizes vertically only; minimum 88px.
- Full column width for comments and descriptions.
Status
Badge wa-badge · count, capsule, anchored
Open preview · Guideline source
A count or short capsule anchored to an icon, avatar or menu label.
Consumer provides: The count or label and an aria-label that names what is counted.
<span class="fdt-anchor"><svg class="fdt-icon">…</svg><span class="fdt-badge b-hostile" aria-label="7 unread notifications">7</span></span>
whiteonelectric-500/hostile;navy-900onneutral/caution.- Anchored badges carry a 2px
navy-900ring.
Callout wa-callout · info, success, warning, danger, training
Open preview · Guideline source
An inline contextual panel that stays in the page flow.
Consumer provides: A bold lead sentence and one line of detail; the variant.
<div class="fdt-callout fdt-callout--warning"><span class="mk"></span><div><b>Link degraded.</b> Telemetry at 0.5 Hz.</div></div>
- Use
--dangeras the form error summary when 3+ fields fail. - The training disclaimer is required on any surface with synthetic scenarios.
ClassificationStrip structural banner atop a surface
Open preview · Guideline source
A full-width banner stating the security or program context of a surface; always visible.
Consumer provides: The marking text; segments joined by // or —.
<div class="fdt-strip fdt-strip--sensitive">CUI // Program sensitive</div>
- Fills:
hostileandfdt-classification-controlledwithwhite;fdt-classification-sensitiveandneutralwithnavy-900. - Never dismiss, animate or glow it.
Popover wa-popover
Open preview · Guideline source
A non-modal panel with richer content anchored to a trigger.
Consumer provides: A title, a few readouts and at most one action.
<div class="fdt-popover"><h4>UNK-003</h4>…</div>
ProgressBar wa-progress-bar
Open preview · Guideline source
Determinate progress for mission timers and loads.
Consumer provides: The value (--v) and a mono readout beside it.
<div class="fdt-progress" role="progressbar" aria-valuenow="65" style="--v:65%"><i></i></div>
- Track
steel-500, fillelectric-500withfdt-glow-xs; semantic variants for resources.
ProgressRing wa-progress-ring
Open preview · Guideline source
Circular progress for compact readouts.
Consumer provides: The value; stroke-dasharray = value × 150.8.
<svg class="fdt-ring" viewBox="0 0 56 56"><circle class="t" cx="28" cy="28" r="24"/><circle class="v" cx="28" cy="28" r="24" stroke-dasharray="108.6 150.8"/></svg>
Skeleton wa-skeleton
Open preview · Guideline source
Content-shaped placeholders while data loads.
Consumer provides: Blocks sized like the content they replace.
<div class="fdt-skel" style="height:12px"></div>
- Slow
steel-500shimmer onnavy-700; static under reduced motion.
Spinner wa-spinner · linear rotation
Open preview · Guideline source
An indeterminate loading indicator.
Consumer provides: An accessible label naming what is loading.
<span class="fdt-spinner" role="status" aria-label="Loading tracks"></span>
- Linear rotation, never spring. Stops under reduced motion.
StatusIndicator tag · pill · locked vocabularies
Open preview · Guideline source
Persistent state of one entity: tags for plural metadata, pills for one declarative status.
Consumer provides: A label from a locked vocabulary and its variant class: is-neutral, is-electric, is-caution, is-hostile, is-steel.
<span class="fdt-pill is-neutral">FIELDED</span>
<span class="fdt-tag is-caution">Program sensitive</span>
- Vocabularies: program lifecycle, release tier (
ALPHABETARCGALEGACYEOL), availability (ONLINEDEGRADEDOFFLINEMAINTENANCEUNKNOWN), account state, tactical state. - Text on tints:
neutral,caution,electric-400,hostile-300,steel-300; all 4.4:1 or better onnavy-800/900. Keep tinted pills offnavy-700. - Max 4 tags per entity, then
+N. Never animate, glow, or make a status clickable (filter-chip dismiss is the one exception).
Toast wa-toast · transient notifications
Open preview · Guideline source
A transient notification, top-right on desktop and full-width top on mobile.
Consumer provides: A system-narrated title, one detail line, and the variant.
<div class="fdt-toast fdt-toast--success" role="status"><div><b>Sync complete</b>All assets reporting.</div><button class="x" aria-label="Dismiss">×</button></div>
- 4px left rule in the semantic color, as the spec defines;
navy-700surface. - Auto-dismiss after 6s; errors stay until dismissed and use
role="alert".
Tooltip wa-tooltip
Open preview · Guideline source
A terse label on hover or focus.
Consumer provides: One short phrase; never essential information.
<span class="fdt-tooltip" role="tooltip">Bearing to target · 045°</span>
- 500ms show delay, 100ms hide.
fog-100onnavy-700.
Containers
Card wa-card · program card, live and static
Open preview · Guideline source
The base panel; the Program Card composes it.
Consumer provides: Optional strip, classification tag, wordmark title, descriptor, body and a mono footer; one lifecycle pill.
<article class="fdt-card is-live">
<div class="fdt-card-body">
<div class="fdt-card-head"><span class="fdt-tag is-electric">FDT controlled</span><span class="fdt-pill is-neutral">FIELDED</span></div>
<h3 class="fdt-card-title">GRIDWATCH</h3>
<p class="fdt-card-text">…</p>
</div>
<footer class="fdt-card-foot">SECTOR 04 · 18:47Z</footer>
</article>
navy-800, 1pxnavy-600,radius-md, no shadow.is-liveearnsfdt-glow-sm; hover shifts the border toelectric-500.- Wrap interactive cards in
<a>for keyboard use. No colored left border, nothing above 8px.
DecisionPrompt QRF signature interaction
Open preview · Guideline source
The QRF decision card: situation, context, question and a 50/50 choice.
Consumer provides: Eyebrow, H2 problem, context, the question and two UPPERCASE actions.
<div class="fdt-decision"><div class="fdt-kicker">Situation</div><h2>…</h2><p>…</p><p class="q">…</p><div class="fdt-actions">…</div></div>
- Protect this shape. Full-width and bottom-anchored on mobile.
Details wa-details · disclosure
Open preview · Guideline source
A collapsible section for secondary detail.
Consumer provides: A summary line and the hidden content.
<details class="fdt-details"><summary>Rules of engagement</summary><div>…</div></details>
- Chevron rotates 90° over 200ms.
Dialog wa-dialog · modal
Open preview · Guideline source
A modal that blocks the surface until answered.
Consumer provides: A question title, one sentence of context and two actions.
<div class="fdt-dialog" role="dialog" aria-modal="true" aria-labelledby="t">…</div>
- Scrim
navy-900at 70% with 8px blur; panelnavy-700,radius-md, no shadow. - Escape dismisses; focus returns to the trigger.
Divider wa-divider
Open preview · Guideline source
A 1px navy-600 horizontal rule.
Consumer provides: Nothing; place between sections.
<hr class="fdt-divider">
- Never double, never decorative.
Drawer wa-drawer · side panel
Open preview · Guideline source
A side panel over the surface, opaque navy-800.
Consumer provides: A title, close control and content.
<aside class="fdt-drawer"><header>Track detail<button class="fdt-close">×</button></header><div class="body">…</div></aside>
- On mobile the map HUD collapses into a bottom drawer.
EventBanner pinned above the top nav
Open preview · Guideline source
A dismissible announcement pinned above the top nav.
Consumer provides: An event tag, one line with the event name highlighted, and a dismiss control.
<div class="fdt-banner"><span class="fdt-tag is-caution">Event</span><span>… <span class="hl">AUSA 2026</span></span><button class="fdt-close">×</button></div>
- Truncates the title below 640px.
FeatureTile marketing feature grid tile
Open preview · Guideline source
A feature cell for corporate pages: icon, H3 and one short paragraph.
Consumer provides: An icon, a title-case heading and up to two sentences.
<div class="fdt-card fdt-card--tile"><div class="fdt-card-body">…</div></div>
- Card at 50% surface opacity; icon stroke in the accent.
- Three or four per row; no filler stats.
MapHUD translucent overlay panels · static and live
Open preview · Guideline source
Corner-anchored readout panels floating over the map.
Consumer provides: A wordmark title and label/value readouts.
<div class="fdt-hud is-live"><div class="fdt-hud-title">SECTOR 04</div><dl class="fdt-readout"><dt>Center</dt><dd>33TWN 24680 67890</dd></dl></div>
navy-800at 85% with 12px blur; live panels earnfdt-glow-sm.- Readout labels
steel-300, valuesfog-100mono.
SectorCard QRF sector / AO card
Open preview · Guideline source
A territory card: sector name, tactical-state pill, terrain and sub-unit tags.
Consumer provides: Sector name, one tactical state, terrain descriptor and unit tags.
<article class="fdt-card"><div class="fdt-card-body">…<span class="fdt-pill is-hostile">CONTESTED</span>…</div></article>
- Tactical states:
SECUREDneutral,CONTESTEDhostile,DENIEDcaution,UNKNOWNsteel. - Terrain line uses
steel-300.
StatsRow marketing stats callout
Open preview · Guideline source
A row of large numerals with micro labels.
Consumer provides: Real, sourced numbers only, with a label each.
<div class="fdt-stats"><div class="fdt-stat"><b>12</b><span>Programs fielded</span></div>…</div>
- Numerals in
display-l; labels inmicrosteel-300. - 2×2 under 640px.
Navigation
BottomTabBar QRF / mobile primary nav
Open preview · Guideline source
Primary navigation on mobile, in the thumb zone.
Consumer provides: 3–5 destinations with icon and label.
<nav class="fdt-tabbar"><a aria-current="page"><svg class="fdt-icon">…</svg>Map</a>…</nav>
- Active in
electric-300. - Pair with a persistent back button; no sidebars on mobile.
Breadcrumb wa-breadcrumb
Open preview · Guideline source
Hierarchical position, directly above the page title.
Consumer provides: Up to 5 levels below root; the last is the current page.
<nav class="fdt-crumbs" aria-label="Breadcrumb"><ol><li><a href="#">Missions</a></li><li aria-current="page">Timeline</li></ol></nav>
- Links
steel-300, currentfog-200. Separator/insteel-400. - Never crumb the root.
Dropdown wa-dropdown · menu
Open preview · Guideline source
A menu opened from a button.
Consumer provides: Items as verbs, optional shortcuts; destructive last.
<ul class="fdt-menu" role="menu"><li role="menuitem">Brief mission</li>…</ul>
navy-700,radius-md, 1pxnavy-600. Hoverelectric-500at 15%.- Destructive items in
hostile-300.
Pagination list pagination
Open preview · Guideline source
Paging for long operator lists, with a position count.
Consumer provides: Total, current range and pages.
<nav class="fdt-pages"><button class="fdt-page" aria-current="page">2</button>…</nav>
- Current page
electric-500withwhite. - Prefer pagination to infinite scroll.
Sidebar product sidebar · active, nested
Open preview · Guideline source
The primary nav inside dense products: 240px, collapsing to 48px icons.
Consumer provides: Section headers, items with icon + label, at most two levels.
<nav class="fdt-sidebar" aria-label="Primary"><div class="fdt-side-head">Operations</div><a class="fdt-side-item" aria-current="page"><svg class="fdt-icon">…</svg>Tracks</a></nav>
- Active:
navy-700, 2pxelectric-500left rule with glow,fog-100. - Nested items indent with a
navy-600guide line.
Tabs wa-tab-group
Open preview · Guideline source
Switch between 2–5 views at the same level.
Consumer provides: Short labels; the panel content.
<div role="tablist" class="fdt-tabs"><button class="fdt-tab" role="tab" aria-selected="true">Tracks</button>…</div>
- Inter 500 13px UPPERCASE. Active
fog-100with 2pxelectric-500and glow. - Never more than 5, never two rows, never for forms.
Tree wa-tree · unit hierarchy
Open preview · Guideline source
A hierarchical tree: unit org charts, file browsers.
Consumer provides: Nodes with labels and optional mono identifiers.
<ul class="fdt-tree" role="tree"><li><span>1st Brigade</span><ul>…</ul></li></ul>
- 20px indent per level.
Data
Avatar wa-avatar · square
Open preview · Guideline source
A user or unit marker: square, 2px radius, initials.
Consumer provides: Initials or a unit code; optional account-state dot.
<span class="fdt-avatar">FD</span>
- Square, never round.
BarChart wa-bar-chart
Open preview · Guideline source
Categorical comparison on the semantic palette.
Consumer provides: Data series; axis labels in micro mono.
<svg class="fdt-chart">…</svg>
- Axes
steel-500, labelssteel-300, primary serieselectric-500, comparisonsteel-300. - Reveal animations instant under reduced motion.
DataTable operator table with status column
Open preview · Guideline source
Rows of records with micro headers, mono data and a status pill column.
Consumer provides: Column headers, rows, and which columns are numeric.
<table class="fdt-table"><thead><tr><th>Program</th>…</tr></thead><tbody><tr><td>GRIDWATCH</td><td class="num">1,204</td></tr></tbody></table>
- Numbers right-aligned in tabular mono. Rules
navy-600, no zebra. - Selected row
navy-700with a 2px accent edge. - Paginate long lists (see Pagination). Intentional addition: the spec references table rows but defines no table.
LineChart wa-line-chart · primary vs comparison
Open preview · Guideline source
A time series with an optional dashed comparison series.
Consumer provides: Series, time axis in Zulu, direct labels instead of a legend.
<svg class="fdt-chart">…</svg>
- Distinguish series by dash and lightness, not hue alone.
ResourceMeter QRF resource row
Open preview · Guideline source
Four resource cells: colored micro label, large value and a thin fill bar.
Consumer provides: Label, value and fill per resource; color states its health.
<div class="fdt-meter"><div style="color:var(--neutral)"><span>Ammo</span><b>88%</b><i style="--v:88%"></i></div>…</div>
- Set the cell
color; the label and bar inherit it.
Sparkline wa-sparkline
Open preview · Guideline source
An inline trend line beside a value.
Consumer provides: A short series and the current value.
<svg width="100" height="28"><polyline points="…" stroke="var(--electric-400)" fill="none"/></svg>
Tactical
Symbol fdt-symbol · APP-6D affiliation frames
Open preview · Guideline source
APP-6D / MIL-STD-2525D affiliation frames with mono track IDs.
Consumer provides: A 10-character SIDC in production; here an affiliation class and track ID.
<span class="fdt-track"><svg class="fdt-symbol fdt-symbol--hostile">…</svg>HST-014</span>
- Friendly rounded rectangle, hostile diamond, neutral square, unknown quatrefoil (dashed when pending).
- Strokes lightened (
electric-400,hostile-300) for 3:1 on dark grounds. Preview frames are geometric stand-ins; production renders through<fdt-symbol>. - Never fuse a UI icon with a frame.
TacticalCallout leader-line annotation with acquire bracket
Open preview · Guideline source
A leader-line annotation that marks and labels a point on the map.
Consumer provides: The target point, a label line and acquire state.
<polyline class="fdt-callout-line" …/><path class="fdt-bracket" …/>
- 1px
electric-500leader;[ ]bracket terminal glows on acquire.
Kits
CorporateSite corporate marketing site · reference layout
Open preview · Guideline source
A full reference layout for frontierdefensetech.com: hero with eyebrow and display heading, programs grid, capability statement, footer.
Consumer provides: real program names, capability copy and stats; keep the hero’s house move (eyebrow, display-l, body, one primary button).
- Corporate register: generous whitespace, grid overlay as the only texture, restrained glow.
- Loads
colors_and_type.css; icons are Font Awesome Sharp Regular from the FDT Pro kit.
Simulator GRIDWATCH simulator · reference layout
Open preview · Guideline source
A full reference layout for the GRIDWATCH simulator: classification strip, top bar, icon sidebar, map canvas with HUD panels, and a track roster.
Consumer provides: live tracks, sector data and the operator’s callsign; keep the classification strip at the top of every view.
- Product register: information-dense, grid overlay and ghost markers, glow on live elements only.
- Loads
colors_and_type.css; icons are Font Awesome Sharp Regular from the FDT Pro kit.