frikwork

Typography & base elements

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
  1. First step
  2. Second step
  3. Third step
function greet(name) {
  return `Hello, ${name}`;  // preformatted block
}

Description list

frikwork
CCM's in-house, dependency-free CSS + JS UI framework.
CDN
Served from frikwork.com on Cloudflare Pages.

Figure

📊
Fig 1. A captioned figure.

Unclassed table (styled variant is .fw-table)

Table 1. Raw <table> with a caption.
ElementTag
Anchor<a>
Blockquote<blockquote>
Definition<dfn>

Native <details>, <progress>, <meter>

Unclassed disclosure

Native <details> without a class.

Buttons

App shell

.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://
Radio group
Toggles & checkboxes

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

Modal & toast

Confirm action
This is a frikwork modal. Press Escape, click the backdrop, or the × to close.

Badges & severity

Primary Online Warning Danger Critical High Medium Low

Alerts — static inline messaging (persistent, unlike toasts); dismissible

Skeleton loading

Avatars

AB TS FW JS KM ABC+5

Pagination

Breadcrumb

Steps

  1. Account
  2. Profile
  3. Billing
  4. Done

Timeline

Chips — removable; the × fires fw:chipremove

design frikwork in-progress urgent

Ring progress

35%
68%
82%
94%

Drawer, popover & command palette — focus-trapped overlays

Copy to clipboard bonus

Add data-fw-copy="text" to any element (or data-fw-copy="#selector" data-fw-copy-target to copy another element's text). Fires a toast + fw:copy.

<link rel="stylesheet" href="https://frikwork.com/v0/frikwork.css">
<script src="https://frikwork.com/v0/frikwork.js" defer></script>

Table

Wrap wide tables in .fw-table-wrap so they scroll horizontally on narrow screens instead of overflowing the page.

ServerStatusLoadRegionUptimeLast check
web-01Online0.42Sydney99.98%30s ago
db-01Warn1.87Sydney99.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-01Online0.42Sydney99.98%14 Jun 2026
web-02Online0.71Melbourne99.95%2 Jul 2026
db-01Warn1.87Sydney99.20%28 Mar 2026
cache-01Online0.09Brisbane100.00%19 Jul 2026
mail-01OfflinePerth97.64%5 Jan 2026
worker-01Online12.4Sydney99.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.

Brand green — plate 01 Teal — plate 02 Blue — plate 03 Amber — plate 04

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 inlast 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.