FluidIQ ops · 14 August 2026
The menu structure is shipped and frozen — Home, Work, Reports, Admin, exactly
as config/navigation.php defines it. Every page carries the same header markup,
class for class, from the real layout. The only thing that varies is look and feel,
which is the one decision waiting on you. They also all sit on one rebuilt type system, so the
jumpy, crooked letterforms are gone in every one.
What is on the Home screen is a separate question and is not being decided here. The dashboard content below is stand-in — real components, invented numbers — there to exercise the type, density and colour. Pinned reports and a customisable widget grid are wanted and are parked deliberately: they change the schema, not the stylesheet.
Each card is a live, scaled render of the actual page. Click to open it full size — then hover or tab into the header, because the menus really open, with no JavaScript in the file.
Kept for comparison. Each is roughly fifteen CSS variables over one shared stylesheet, one shared palette and one shared HTML file — which is why they look more alike than "three options" suggests.
tokens.css and nowhere else — those values already
passed contrast and colour-blindness validation, and no mockup here introduces a hex code.
Scroll to the bottom of any option. Five behaviours are reproduced live, because a still image can hide every one of them.
:hover opens them for a pointer, :focus-within
for the keyboard. Not a preference — dropdowns were rejected once on the belief they needed a
script, so a mockup with an onclick would be showing something we won't ship.
There is no script tag in any of these files.:hover on a touchscreen is whatever the browser decides a tap meant. Both states
are shown at a real 390px, and the page has zero horizontal overflow there./ops/runs, is-current sits on the Admin
button and on Runs. Without it the header goes blank on every page except Home.Left is the live app's type, reproduced from its own declarations. Right is what all three mockups use. This part lands whichever letter you pick.
Today — ops.css
Spend, month to date
412.68
Needs a person today
Merchant Center sweep · biweekly · 3 disapprovals outstanding
font-weight: 650 and 550 are not real weights in this stack, so the
browser fakes them by smearing every glyph sideways. 11.5px and
12.5px put letter edges on half-pixels. And ops.css sets its own
stack on body, overriding --font from tokens.css —
so half the app renders in a different face than the other half.
The mockups
Spend, month to date
412.68
Needs a person today
Merchant Center sweep · biweekly · 3 disapprovals outstanding
A real variable font (Inter, 100–900 continuous), so 450 and 550 are drawn rather than faked.
font-synthesis: none makes faking impossible going forward. Integer sizes on a
fixed scale. One stack, defined once. tabular-nums so digits line up column to
column. Letter-spacing is a function of size — tight on headings, open on small caps.
Independent of the look you choose.
grid-4 divides the width four ways no matter how narrow,
then collapses straight to one column at 900px. Replaced with
auto-fit, minmax(216px, 1fr) — cards reflow 4 → 3 → 2 → 1 and never go below a
readable width.rem and px padding against varying
font sizes, so no two rows shared a rhythm — and any cell that wrapped to two lines broke
every row around it. One row height, one baseline, nothing wraps.Open D, hit the toggle in the header a few times, and say yes or
name the one thing that is wrong. Individual values still move — rows tighter, radius softer,
the accent somewhere else — without disturbing anything around them, because each is a single
variable in assets/option-d.css.
D ports across as one step: the class names are already the shipped ones
(app-menu, app-menu-pop, app-menu-heading,
app-account, is-current), so nothing has to be re-typed.
Re-run python3 docs/_reference/mockups/build.py after any menu change and every
page follows config/navigation.php automatically.
One honest note on the script. A, B and C contain no JavaScript at all, and D's header, menus and phone drawer are still pure CSS — that is the property that proves the Blade layout works with script off. D adds about twenty inline lines, for the theme toggle and nothing else. It runs before the body so a stored choice paints with the first frame; a theme read after render flashes the wrong colours on every page load.