Unclassed HTML looks like frikwork out of the box. Headings carry a proportional
vertical rhythm; block content flows with sensible spacing. Every rule here is zero-specificity
(:where()), so any .fw-* component or inline style overrides it freely.
Heading scale
h1 — Heading one
h2 — Heading two
h3 — Heading three
h4 — Heading four
h5 — Heading five
h6 — heading six
Prose — wrap long-form copy in .fw-prose for a readable measure + article rhythm
A lead paragraph sets the scene with slightly larger, relaxed type.
Body copy uses inline links, strong emphasis, italics,
highlighted text, CSS abbreviations,
inline code, Ctrl+K keys, H2O subscripts, x2
superscripts, struck inserted edits, and small print.
Design is not just what it looks like and feels like. Design is how it works.
Steve Jobs
Ordered & unordered lists
Unordered item one
Item two, with a nested list
Nested A
Nested B
Item three
First step
Second step
Third step
function greet(name) {
return `Hello, ${name}`; // preformatted block
}
.fw-shell is a full-height frame for sidebar apps: the page itself
never scrolls, the nav and the content scroll independently. Scroll inside each side below —
the long project list can't drag the content off the top. Normally it's 100dvh; here it's
capped to 300px so it fits on this page.
Header — stays put__head
This region scrolls on its own — __body.
The sidebar beside it is far longer, and it still can't push this column anywhere.
That's the whole point: with a plain min-height:100vh grid, the tallest child
wins and the document scrolls, leaving a dead gap next to the nav.
Keep scrolling…
…still here…
Bottom of the body scroller.
Cards
Cards are glass by default. Two variants: plain, and hover + status edge.
Add data-fw-motion="lively" to any ancestor and every card inside automatically
gains breathe + ring + drop — no extra classes.
Calm (default)
Glass card
Hover + status edge
Coloured hover highlight — hover each; the border + glow use the card's status colour
Brand (default)
Success
Warning
Danger
Lively data-fw-motion="lively"
Glass card — lively
Hover + status edge — lively
Stat cards
$0
Revenue
0
Uptime %
42
Servers
30s
Poll
Forms
Full control styling is opt-in via .fw-* classes; native controls keep the
brand accent-color. Every input type is covered below.
Enter a valid email
https://
Searchable select — data-fw-search enhances a native <select>; type to filter big lists (select2-style). AJAX-ready.
Simulates a server call over ~500 records — note the “Searching…” state.
Nav tabs
Overview pane
Activity pane
Settings pane
With icons — .fw-tab and .fw-navlink are inline-flex, so an inline <svg> sits beside the label. Give the SVG a width/height (the reset makes bare ones 300×150).
Segmented bar — .fw-tabs--segmented, optional .fw-tab__count; active glows when lively
Card-tabs — .fw-cardtabs / .fw-cardtab; a selector styled as cards, only the active one goes lively
89
Total
55
Online
0
Offline
0
Attention
Dropdown / settings panel
Widgets
Modal & toast
Confirm action
This is a frikwork modal. Press Escape, click the backdrop, or the × to close.
Wrap wide tables in .fw-table-wrap so they scroll
horizontally on narrow screens instead of overflowing the page.
Server
Status
Load
Region
Uptime
Last check
web-01
Online
0.42
Sydney
99.98%
30s ago
db-01
Warn
1.87
Sydney
99.20%
30s ago
Sortable columns — add data-fw-sort to the table, then click a header
Column type is auto-detected (numbers, $/%/thousands stripped)
or forced per column with data-fw-sort="num|date|text"; data-fw-sort="off" excludes a column,
data-fw-sort-init="asc|desc" sorts one on load, and a cell's data-fw-sort-value overrides its text
(used on the Deployed dates below). Blank cells always sink to the bottom. Each sort fires fw:sort.
Server
Status
Load
Region
Uptime
Deployed
Actions
web-01
Online
0.42
Sydney
99.98%
14 Jun 2026
web-02
Online
0.71
Melbourne
99.95%
2 Jul 2026
db-01
Warn
1.87
Sydney
99.20%
28 Mar 2026
cache-01
Online
0.09
Brisbane
100.00%
19 Jul 2026
mail-01
Offline
Perth
97.64%
5 Jan 2026
worker-01
Online
12.4
Sydney
99.87%
30 Apr 2026
In React, add data-fw-sort-controlled so rows aren't reordered — frikwork still cycles the headers
and sets aria-sort; listen for fw:sort and sort your own state:
<table class="fw-table" data-fw-sort data-fw-sort-controlled>
Drag to reorder sortable
Add data-fw-sortable to any container to make its direct children
reorderable — mouse and touch. A drop that changes the order fires a fw:reorder event.
Works on grids and lists.
Sortable cards — drag anywhere on a card
Revenue
Drag me
Uptime
Drag me
Servers
Drag me
Latency
Drag me
Sortable list with handles — grab the ⠿ handle; the rest of the row stays interactive
⠿Overview widget
⠿Activity feed
⠿Server table
⠿Alerts panel
Cross-container — give lists the same data-fw-sortable="board"; drag cards between them
To do
Draft release notes
Review PR #42
Update changelog
Done
Ship v0.0.11
Fires fw:reorder with fromContainer / toContainer.
In React, add data-fw-sortable-controlled so the DOM reverts on drop and you apply the move from the event in state.
Lightbox images
Add data-fw-lightbox to an image to open it full-screen on click. Give several
images the same value to form a gallery with prev/next arrows and ← → keys. Esc or a backdrop click closes it.
Mobile menu drill-down
A right-slide drawer with drill-down panels for multi-level navigation
(top → sub → sub-sub → sub-sub-sub). On phones it's the hamburger in the header; the button below opens
the same menu at any width so you can try it here. Tap Components → Cards → By region
to drill four levels deep, then use ‹ Back or Esc.
Accordion
▸ Section one
Native <details> accordion body.
▸ Section two
Second body.
Progress, spinner, tooltip
Hover me
Lively motion live sample
This grid is wrapped in data-fw-motion="lively", so its plain
.fw-cards automatically drop in — last card first, first card
last — then settle into a slow breathing glow with a conic border
ring travelling the edge. Hit replay to watch the staggered entrance again. Everything disables
under prefers-reduced-motion.
Card 1
Drops in last.
Card 2
Third to land.
Card 3
Second to land.
Card 4
Drops in first.
Extras (opt-in)
Load frikwork-extras.js and call frikwork.hero(cardEl, {report:'Up $505'}) for the takeover effect.
Settings
A generic focus-trapped off-canvas panel for arbitrary content.