Token-built abstract panels of each Conduction app. Used wherever a marketing surface needs to show an app without embedding a real screenshot. Reference for the level of abstraction: honeycomb.io/technologies/* — recognisable as the product, never literal.
Every AppMock variant is composed from the same atom toolkit. A topbar across the top is always there; below it the body is either an App (left nav + main work surface, optionally a right detail rail) or a Desk (no nav, the topbar's Nextcloud app shelf is the navigation). Both patterns share the same 16:10 frame, the same tokens, the same orange-accent budget.
Default for any Conduction app rendered inside Nextcloud's app surface. Carries its own per-app navigation in the left rail (with Settings + Feedback pinned bottom), a page header at the top of .col, and an optional sidebar on the right.
Used by: OpenRegister, OpenCatalogi, OpenConnector, ZaakAfhandelApp, Procest, DeciDesk, DocuDesk, OpenWoo, NLDesign, LarpingApp, PipelinQ, SoftwareCatalog.
Personal home / dashboard view. The Nextcloud topbar shelf is the only navigation; the body is one full-width canvas of widgets that fills the canvas top-to-bottom. Mix of action tiles, charts (bar / line / donut), calendar, video, and status lists. Used when the surface aggregates across the whole workspace instead of belonging to one app. No .nav, no .pageHeader, no .detail.
Used by: LaunchPad, LaunchPad · Tiles, LaunchPad · BI, LaunchPad · Widgets.
Most App-pattern screens are one of two templates: an Index (a list of records, filterable from the sidebar) or a Detail (one record open, with related sections and pinned metadata in the sidebar). Same chassis, same page header, same Settings/Feedback footer, same sidebar shape. Only the content of .col differs.
The list / overview view: every Index page in every Conduction app composes the same way. KPI strip on top to summarise what's in the list, then the list itself, with the sidebar open to filters and column controls.
Default sidebar tabs: Search + Columns. Used for: Requests, Clients, Leads, Tasks, Cases, Catalogues, Registers, Schemas.
The single-record view: one record's fields opened across stacked panels (Overview, Properties, Linked records, Activity). Sidebar pins related metadata, audit log, or quick edit fields. Same page header as Index; only the title and the actions change.
Default sidebar tabs: Overview + Activity. Used for: a single Request, a single Client, a single Schema, a single Catalogue entry.
Each card focuses on one zone of the chassis. The zone is at full opacity; the rest of the frame is dimmed so you see where the zone sits, not just what it is. The orange outline marks the focused region.
.topbar
The Nextcloud chrome row. Sits across every AppMock unconditionally because every Conduction app lives inside Nextcloud's workspace. The shelf icons are the cross-app navigation; per-app links never go here.
--c-blue-cobalt bg; whites at 0.4 / 0.7 / 1.0 alpha24px fixed; flex-shrink: 0.nav
The per-app sidebar. Carries this app's own primary navigation, plus a footer pinned to the bottom for global access (Settings, Feedback). The active item is the only place cobalt-100 backgrounds a row.
.active), and a .footer with Settings + Feedback pinned to the bottom22%, min 100px; flex-shrink: 0--c-cobalt-50 bg; --c-cobalt-100 right border + active bg + footer divider; --c-orange-knvb on the navHead hex.active item; never zero, never twomargin-top: auto.col
The work surface. In an App pattern, the column opens with a .pageHeader (title + actions), then KPI strip and panels. In a Desk pattern, .col nests inside .grid to become a full-bleed widget canvas with no page header.
.pageHeader + .kpiRow + .panelRows + tables. Desk pattern: .grid with .w widgets (no pageHeader)flex: 1; min-width: 0; overflow: hidden--c-cobalt-100 borders, --c-mint-500 / --c-orange-knvb KPI accents)min-width: 0 is load-bearing.pageHeader
The first row of .col on every Index and Detail template. Carries the page title (left) and exactly two action buttons (right): one ghost (border-only, secondary action) and one primary (filled cobalt). The header tracks .col's width: when the sidebar is open the header constrains; when the sidebar is closed it spans full-width across the body. Procest already does this correctly.
.btn.ghost (white with cobalt border, secondary action) on the left of the pair, then .btn (filled cobalt, primary action)14–16px band, sits flush with .col's top padding.col: full-spread when sidebar closed, constrained when sidebar open--c-blue-cobalt for the title-bar and primary button; --c-cobalt-200 border on ghost button; white bg on ghost.detail
The right-hand sidebar. Optional, dismissible, anchored to the active record or the active view. Carries an icon + title + description in a header, then a tabbed body (Search / Columns by default). Class stays .detail for code; we call it the Sidebar in copy.
.sb-head (icon + title + description + close), .sb-tabs (2–3 tabs, one .active), then a .sb-body of inputs / filters / pinned metadata26%, min 130px; flex-shrink: 0--c-cobalt-100 left border; --c-blue-cobalt active-tab underline; --c-cobalt-50 on the icon background.nav's job. The sidebar is scoped to the current view..col.Zones give a screen its skeleton; atoms fill it. Every Index and Detail composes from the same handful of building blocks. Learn these four and you can read any Conduction screen at a glance.
.kpiRow .kpi
.col
A horizontal row of three or four cards summarising the records below. Each card carries a hex glyph (the categorical accent), a big number, and a small label. Sets the user's mental model before they read the list.
.kpi cells; each cell is hex glyph (.ico) + meta column (.num + .label).kpi default (mint), .kpi.forest (data), .kpi.amber (KNVB orange, accent), .kpi.lavender (process)--c-cobalt-50 bg per cell; --c-mint-300 / --c-forest-300 / --c-orange-knvb / --c-lavender-300 for the hex glyph.amber per strip max — that's the orange-accent budget for .col.stack .item
.panel
The vertical row pattern that powers tables, queues, recent records, ranked lists, and related-record sections. One avatar (categorical colour), one or two text lines, an optional status pill on the right.
.item: .av avatar (left), .lines column with .l1 (primary, cobalt-700) + optional .l2 (metadata, cobalt-200), optional .statusPill on the right.av default mint, .av.b lavender, .av.c orange, .av.d forest, .av.e terracotta — categorical, not semantic--c-mint-300 / --c-lavender-300 / --c-orange-knvb / --c-forest-300 / --c-terracotta-300 avatars; --c-cobalt-50 row divider.lines; numbers belong in a separate column or a .statusPill.statusPill
.item · inside .panel .head
The right-side state indicator on a list row, or the inline status next to a section title. Two variants only: mint (stable / done / OK) and KNVB orange (beta / in-progress / accent). Hex glyph + short label, never just text.
.h hex glyph + .t text line; the hex carries the status colour, the pill bg is its tint.beta KNVB orange (in-progress), .neutral cobalt (informational)--c-mint-300 bg / --c-mint-500 hex / --c-mint-500 text. beta: terracotta-50 bg / --c-orange-knvb hex / terracotta-700 text.panel
.col
The white card with rounded corners that wraps every list, table, or record-section in .col. Has a head (small label) and a body (most often a .stack). Pair two side-by-side via .panelRow for two-column layouts.
.panelRow
.head (small cobalt-700 label, optional pill on the right) + body (almost always a .stack).panelRow; multiple .panelRows stack vertically inside .col--c-cobalt-100 1 px border; --c-cobalt-700 on the title line.panelRow; three or more wide goes outside .col's rhythm.head + .stack structure within the same panelEvery fill, stroke, and text colour is a CSS variable from tokens.css. No SVG icons, no PNGs, no real screenshots. Heights and widths render placeholder lines.
KNVB orange (--c-orange-knvb) is reserved for the single most-emphasised element in the mock: a primary action, a peak bar in a chart, the active hex in the nav header. Two oranges in one frame is a bug.
Mint (--c-mint-500) signals stable / done. KNVB orange signals beta / accent. Cobalt-blue is neutral. Avoid raw red except in genuine error states.
The outer .frame is always aspect-ratio: 16 / 10. Three width caps: sm 480 px, md 720 px (default), lg 960 px. Don't override the aspect ratio.
Lines, headings, labels, and stats are rendered as solid-colour rectangles. The viewer should recognise the shape of the screen, not read its content. Real text breaks the abstraction.
Each variant pictures the canonical view of one Conduction app: the screen a user would land on first. Take a real screenshot at localhost:8080, count the regions, then redraw with the atom toolkit.
LaunchPad carries four variants behind the tab strip on its card (default, tiles & grids, BI on registers, widget integration); the rest have one variant each. Every variant is its own JSX file under AppMock/variants/, registered by kebab-case slug in the VARIANTS map. Call from MDX as <AppMock app="launchpad-bi" />.
Personal home, full-bleed cobalt with a 4-column widget grid. Big primary tiles (Intranet, Calendar, Files) sit beside info widgets with avatar lists, empty states, and an upload drop-zone. Slug: launchpad.
Nextcloud-integration angle. Hex-icon launcher tiles deeplink into Nextcloud, external URLs, or sub-grids of further tiles. Mock pictures three launcher tiles, a 2×2 sub-grid, files list, calendar mini-grid, and a Decks board. Slug: launchpad-tiles.
BI-graph angle. Any chart, drawn directly on a register without ETL. Mock shows a 2×2 grid of graph cards (bar, line, donut, second bar), KPI tiles, plus a ranked-list table widget. Slug: launchpad-bi.
Cross-app widget angle. Any Conduction app that registers a Nextcloud dashboard widget shows up here: DocuDesk dropzone, Procest werkvoorraad, Mail, Calendar, Jira, RSS, video shortcut. Slug: launchpad-widgets.
Federated publication catalogue. Centre is a 3×2 grid of catalogue cards, each with a hex glyph in a different family colour to signal categorical mix. Slug: opencatalogi.
Integration plane. Centre stage is a single canonical pipeline (lavender source → cobalt connector → forest target) with a recent-runs status table below. Slug: openconnector.
Three-pane admin: nav left, dashboard centre, detail rail right. KPI strip on top, two-by-two analytical panels below. The right rail carries Filter Statistics, Totals, and Orphaned Items. Slug: openregister.
Case management for ZGW processes. Centre runs the stage timeline across the top (one done, one active in orange, three to-do) above a recent-cases table with status pills. Slug: procest.
Decision and minutes tooling for boards. Left nav, action row top right (New Decision / Action Item / Minutes), KPI cards, two side-by-side tables for notulen and besluiten. Slug: decidesk.
Document workshop. Template-driven generation, anonymisation, signing, archiving. Centre lists recent documents with status pips and an anonymise drop-zone widget below. Slug: docudesk.
LARP setting management: characters, scenes, NPCs, factions. Centre shows a 3×2 character card grid with hex avatars in family tones, plus a scene timeline strip on top. Slug: larpingapp.
NL Design System theme settings panel. Centre shows a colour-swatch row, type specimen, and component preview panels stacked vertically. Slug: nldesign.
Woo publication catalogue. Eleven Woo categories, citizen-search, audit log, federation to data.overheid.nl. Centre is a 3×2 grid of category cards in different family colours. Slug: openwoo.
CRM with kanban deal-flow. Five-column board (lead, qualified, proposal, won, lost) with KPI strip on top (pipeline value, win rate, deals this week). Slug: pipelinq.
IT-asset inventory. Tabular app list with stable / update-available / end-of-life status pips, plus a licence-renewal timeline bar chart on top. Slug: softwarecatalog.
Citizen plus case-worker portal. ZGW APIs, archive interfaces. Centre runs the active case-worker queue with stage pips on top of a citizen-side timeline of recent submissions. Slug: zaakafhandelapp.
Citizen-developer app builder. Three-pane builder: nav left, dashboard centre, manifest and schema editor rail right. A KPI strip (virtual apps, published, templates, versions) sits over a virtual-app list and the template catalogue. Slug: openbuild.
Status. Five variants are based on real screenshots taken at localhost:8080 (LaunchPad and its three sub-variants, OpenRegister, DeciDesk). The other eleven were drafted from each app's product description while their frontends were still rebuilding, and will get a refinement pass once the live UI is back.
The React component lives in docusaurus-preset/src/components/AppMock/. Each variant is a sibling JSX file under variants/, all sharing the same AppMock.module.css. The VARIANTS map in AppMock.jsx maps a kebab-case slug to a variant component, so multiple variants for the same app (like launchpad, launchpad-tiles, launchpad-bi, launchpad-widgets) are first-class entries; pick which one with <AppMock app="launchpad-tiles" />.