A relationship-manager view where client context, model proposal, signature, and follow-up care orbit around the same human account.
Institutional Finance Design System
251 catalogued categories across nine domains — trading, compliance, AML, AI, enterprise SaaS, data — each carrying its own decision logic, regulatory anchor, and accessibility contract. One file. Versioned, hand-coded, maintained.
The production system that shipped at the ASIC-regulated broker is 150 components — 8 regulatory rewrites, 0 rebuilds. This page is the 251-category catalogue around that system. Recruiter path: hire.html.
The Domain Map
Nine domains, from raw tokens to sanctions screening. Pick one — it filters the whole catalogue, sidebar included.
What an entry actually carries
240 registers · 173 cite a regulation · 34 issuing bodies · 2 themes · AA baseline
Not a screenshot — a component you can operate, plus the reasoning that produced it.
Rendered from the same tokens as production, in both themes. Not a picture of the component — the component.
The situation it was built for, stated plainly enough that a PM can check it against a ticket.
What it should refuse, and what to reach for instead. A system that can’t say no isn’t a system.
Keyboard path, focus order, contrast ratio, reduced-motion — written as a contract, not an aspiration.
The rule it answers to — ASIC RG 268, MiFID II Art 24–27, FINRA 2111, SEC 17a-4, SR 11-7, GDPR, WCAG 2.1 AA. A citation, not a vibe.
Honest scope: 122 of the 251 entries carry the register; the rest carry none.
A register is four cells or it is not a register, so foundations, token pages and labs have no partial
version — a colour ramp has no when not to. The count is measured, not asserted:
node eds/verify.mjs fails if this number and the panel above it ever disagree again.
Live Implementations
Run the system. Don’t read about it.
- A versioned component contract for trading platforms, KYC flows, advisor dashboards, and compliance surfaces
- Tokens exposed as CSS custom properties, JSON, and Tailwind config — see Code Export
- WCAG 2.1 AA baseline + Finance-Specific Accessibility extensions (deuteranopia-safe semantic palette)
- Production-tested across 40+ jurisdictions including ASIC RG 268, MiFID II Art 24-27, FINRA 2111, SEC 17a-4
- AI Skill Set: added the runs-anywhere tool strip (12 third-party AI tools, honest no-affiliation caption) — the 40 Markdown skills are vendor-neutral by construction.
- Not an incumbent terminal clone — opinionated decisions, not parity
- Not a marketing site framework — every component carries an institutional use case
- Not a generic "design system in a box" — built around regulated-finance constraints
- Not auto-generated from Figma — every component is hand-coded, audited, and versioned
Design Principles
AI Skill Set
Forty repeatable, AI-assisted working methods for absorbing unfamiliar, C-level, cross-functional work quickly — while keeping the qualified professional in the loop. Each is downloadable as a Markdown skill file, grouped into eight domains and searchable below. Every one is a working method, not professional advice.
The value isn't the list — it's the routing. Each brief loads only the skills it needs into a live pipeline, so I start on the deadline, not after a ramp.
Cognitive-Behavioral Toolkit
Stay clear and steady under high-pressure, high-ambiguity C-level load — as workplace self-management.
- Thought recording & cognitive reframing
- Behavioral experiment design
- Emotion-regulation techniques
Career Development Strategist
Turn a vague career question into a sequenced plan, a negotiation script, and a defensible decision.
- Career-path planning
- Salary-negotiation scripts
- Career-change decision analysis
Financial-Grade Accessibility Audit
A first-pass WCAG audit a fintech team can act on — findings, fixes, and how the standards are moving.
- WCAG item-by-item audit (2.1 / 2.2 AA)
- Remediation code suggestions
- Standards-evolution tracking
Academic Paper Writing
Structure a defensible manuscript fast — from literature map to argument spine to submission-ready format.
- Literature review synthesis
- Argument-structure suggestions
- Journal formatting & submission
Product & Market Analysis
A directional read on demand, pricing, and opportunity before capital or inventory is committed.
- Demand & trend analysis
- Competitor pricing comparison
- Product-selection opportunity scoring
GDPR Data-Privacy Operations
Map the data flows, redline the processor terms, and plan a lawful cross-border transfer — for the DPO to sign off.
- Data-flow inventory (Art. 30 ROPA)
- DPA clause review (Art. 28)
- Cross-border transfer mechanisms
US Tax Law Navigator
Issue-spot and organise the records so a CPA or tax attorney starts from a clear, well-cited map — not a blank page.
- Federal / state comparison
- Deduction & credit strategy (illustrative)
- Cross-border tax risk assessment
SEO Strategy
Find the ranking opportunities, fix the technical debt, and plan the content that earns them.
- Keyword opportunity analysis
- Technical SEO audit
- Content blueprint planning
Smart-Contract Audit
A first-pass vulnerability scan, gas review, and a report a professional auditor can verify and sign.
- Reentrancy / overflow scanning
- Gas optimization suggestions
- Audit report draft
Patent Search & Prior-Art
Map the prior art and the field so a patent attorney starts from evidence, not a blank page.
- Prior-art search strategy
- Patent-landscape analysis
- Patentability preliminary (issue map)
Web3 & Tokenomics
Design the token flows, phase the roadmap, and structure DAO governance — for counsel to review.
- Token-economic model design
- Product roadmap planning
- DAO governance mechanisms
Awwwards-Grade Web Design
Award-grade art direction, scroll storytelling, and interaction polish — accessible and fast by contract.
- Visual direction & typography
- Motion & scroll storytelling
- Interaction detail polish
AI Production Engineering
Ship models to production, cut inference cost, keep data pipelines stable, and backstop reliability and safety.
- Model deployment & serving
- Inference-cost & pipeline stability
- AI reliability & safety backstops
Intellectual Property
Patent strategy, trademark clearance, and copyright licensing — organised so an IP attorney starts from evidence.
- Patent application strategy
- Trademark infringement risk scan
- Copyright licensing clause review
COPPA Children's-Privacy Compliance
Review consent flows, map what's collected from under-13s, and track FTC enforcement — for privacy counsel.
- Consent-mechanism clause review
- Data-collection process comparison
- Enforcement-case update tracking
Workplace Psychology & Resilience
Manage stress and burnout, navigate conflict, and set boundaries — as workplace self-management.
- Stress & burnout management
- Conflict-communication strategy
- Boundary-setting
TypeScript Architecture
Model illegal states away, refactor large codebases safely, and set the frontend architecture.
- Type-system design review
- Large-project refactoring
- Frontend architecture best practices
Growth Marketing
Diagnose the funnel, design honest A/B tests, and read acquisition ROI without fooling yourself.
- Funnel diagnosis (AARRR)
- A/B test design
- Acquisition-channel ROI analysis
Brand Copywriting
Define the voice, write the product page, and land the tagline — with a claims flag for the reviewers.
- Brand-voice definition
- Product-page copy
- Campaign tagline ideation
US Securities Regulation (SEC)
Map registration vs exemption, disclosure obligations, and Reg BI / adviser conduct rules — as an issue map for counsel.
- Registration vs exemption mapping
- Disclosure & periodic-reporting
- Broker-dealer / adviser conduct rules
ISDA Derivatives Documentation
Map what the Schedule and CSA change from the defaults, and check confirmations against the Definitions — negotiation prep for counsel.
- Master & Schedule election mapping
- Credit Support Annex mechanics
- Confirmation & Definitions check
Output-Token Efficiency
Cut the token cost of an AI workflow at equal quality — audit the budget, restructure the output, gate the regression.
- Token-budget audit
- Prompt & output restructuring
- Cost governance & verification
Objectivity & Logical Rigor
Check a claim before it ships — separate claim from evidence, name the fallacies, steelman the other side, calibrate the confidence.
- Claim–evidence separation
- Fallacy & assumption audit
- Steelman & confidence calibration
Multi-Jurisdiction KYC/AML
Map AML duties across jurisdictions, gap-report against the program, and structure findings to feed the compliance stack.
- Multi-jurisdiction requirement mapping
- Automated gap & comparison reporting
- Integration with existing systems
Broker / Exchange Listing Readiness
Generate the admission checklist from the rulebook, track gaps to closure with reminders, and cross-reference prior cases.
- Automated review-checklist generation
- Gap tracking with reminders
- Historical-case cross-referencing
Socratic Facilitator
Draw out a person’s own best thinking — sharp questions, deliberate perspective-shifts, and a concrete action to close on.
- Socratic questioning
- Perspective shifting
- Action triggering
Fintech HR
Scorecards and interviews for compliance-sensitive roles, plus the fit-and-proper & accountability map a regulated hire carries.
- Regulated-role scorecards
- Regulatory-judgment interviews
- Fit-and-proper & accountability mapping
Corporate Management
Turn strategy into measurable objectives, design the operating cadence, and structure the decisions that matter.
- Strategy-to-objectives translation
- Operating cadence & reviews
- Decision structuring
EBITDA & Financial Analysis
Build defensible adjusted EBITDA with labelled add-backs, bridge the drivers, and frame valuation multiples — every number sourced.
- EBITDA build & normalisation
- Margin & variance decomposition
- Valuation-multiple framing
IPO & SPAC Readiness
Jurisdiction-configured listing prep — close and estimate the financials, match every required material and data point, sequence the path.
- Jurisdiction & path configuration
- Financial close & estimation
- Materials matching & data-room assembly
Persona Development
Turn real research into decision-useful personas — behaviour-clustered, evidence-anchored, activated into journeys and JTBD.
- Evidence intake & segmentation
- Persona synthesis
- Activation — journeys, JTBD, scenarios
n8n Automation
Turn a manual multi-tool process into a dependable n8n workflow — node mapping, debugging, then reliability, secrets, and cost.
- Workflow design & node mapping
- Building & debugging
- Reliability, security & cost
Video Director Prompt
Director-grade prompts scaled to length — a 10-second beat, a 1-minute sequence, or a 30-minute program decomposed into shots with continuity.
- 10-second shot — single beat
- 1-minute sequence — multi-shot continuity
- 30-minute program — structured decomposition
Reading & Learning Coaching
Learn faster and remember longer with evidence-based methods — retrieval practice, spaced repetition, interleaving, Feynman, active reading.
- Diagnose & goal-set
- Evidence-based study system
- Reading comprehension & retention
CFA Level III Analysis
Portfolio management and private-wealth planning at Level III depth — capital-market expectations across equity, fixed income, alternatives and currency; IPS for private-wealth and institutional clients; risk, behavioral finance and performance.
- Capital-market expectations & allocation
- Portfolio construction & IPS
- Risk, behavioral finance & performance
CPA Accounting
Financial accounting and reporting the way a CPA works — journal entries, statement prep and close, GAAP/IFRS treatment and disclosure.
- Transaction analysis & journal entries
- Statement preparation & the close
- Standards, disclosure & controls
Mathematical Model Analysis
Build and stress a quantitative model honestly — formulate and state assumptions, solve and calibrate, then validate with sensitivity and uncertainty.
- Formulation & assumptions
- Solve & calibrate
- Validate, sensitivity & uncertainty
Logic Structuring
Untangle a messy problem or argument into a clear structure — MECE decomposition, dependency and assumption mapping, top-down synthesis.
- Decompose — MECE issue tree
- Map dependencies & assumptions
- Structure the synthesis
JavaScript Development
Modern vanilla-JS engineering done right — language and runtime fundamentals, DOM and browser APIs, then testing, performance and security.
- Language & runtime fundamentals
- Browser & DOM engineering
- Testing, performance & security
Canvas Web Animation
Performant web animation on the Canvas 2D API — motion design, the rAF render loop and particle systems, with a mandatory reduced-motion contract.
- Motion design — easing, spring, choreography
- Canvas engineering — rAF, particles, layering
- Performance & accessibility
Claude
ChatGPT
Codex
Gemini
Antigravity
Cursor
Grok
DeepSeek
Qwen
Figma MCP
Hermes Agent
OpenClaw
NVIDIA
Hugging Face
Ollama
n8n
Dify
ComfyUI
Cline
OpenCode
Monica
Z.ai
Each skill is a plain Markdown file — paste it into any assistant, load it as a Claude skill or agent brief, or serve it to a local open-weight model; nothing here is locked to one vendor. Logos identify third-party tools for context; no affiliation or endorsement is implied.
Where this lives
The ACY production system is 150 components. It absorbed 8 regulatory rewrites with 0 rebuilds. This catalogue is 251 categories — larger than any one shipped surface. Four platforms below are shipped. Studies after that are labelled production-grounded or true concept.
Both systems used together on one product: Northwind People — a B2B HR system with a Design Mode that traces every surface back to the contract entry it came from.
ACY Securities
Production design on an ASIC-regulated broker. 150-component system. 8 regulatory rewrites, 0 rebuilds.
Finlogix
Shipped market-data platform. Time-to-insight 4.2s → 2.5s is a paired within-subjects study (n=15, d=2.47) on that product — not a catalogue-wide claim.
LogixTrader
Shipped multi-audience trading platform — retail, introducing broker, hedge fund, institutional integrators.
TradingCup
Shipped copy-trading platform. Outcome numbers live on the case study, each with its own source.
Xanthos — Private Bank
B2B2C private banking platform for UHNW clients ($28M+ net worth) and their relationship managers. 5 flows × 11 screens — portfolio dashboard, RM briefing, proposal acceptance, life event planning, 5-step onboarding. The RM is the primary tool user; the client experiences the bank through them.
TradeX — Institutional Hedge Fund Dashboard
Institutional risk dashboard built from primary research with PMs ($100M–$50B AUM). Causal intelligence overlays, liquidity stress visualisation, real-time alpha attribution, GenAI scenario stress testing. The dashboard an incumbent terminal structurally cannot build.
Argos — Cross-Asset Financial Crimes Platform
Cross-asset AML/CFT compliance platform — alert triage, investigator workspace, SAR filing, real-estate compliance, securities surveillance. 40+ screens, 4 user roles (L1/L2 Analyst, Investigator, Compliance Officer), AI co-pilot with explainable confidence scoring.
Aureus — B2C AI Wealth Hub
Translates UHNW private-banking fiduciary logic into a retail mobile experience. Four AI modules — Velocity Dashboard, Alternative Finder, Event Radar, Fiduciary Decision Room. 31 screens, working React prototype, 3 interactive demos, full 90-day persona journey.
ConnectX — Private Banking CRM
Relationship-manager CRM with four-tier AI autonomy governance — Read-Only, Suggest, Draft, Execute. Each tier carries explicit consent surfaces and audit hooks. The CRM the RM uses to talk to the AI without losing fiduciary sign-off.
Double-Blind — Fiduciary Protocol
Protocol design for AI-augmented fiduciary decisions. SHA-256-sealed commit captures the analyst's hypothesis before the AI's recommendation is shown. Aligns with SR 11-7 model risk management and SEC Rule 17a-4 record retention.
Praxis Prime — F2B Prime Brokerage
Front-to-Back prime brokerage platform tracking a 2M-share institutional block trade across execution, risk, and T+1 settlement — bound by a single OrderID. 8 modules, 5,288 LOC React / TypeScript, FIX/SWIFT Diff Viewer signature feature.
Nova — Designing AI Trust in High-Stakes Finance
Design language for AI co-pilots in high-stakes financial decisions — explainability surfaces, confidence intervals, dissent capture, and the override boundary between human and machine. When the AI is wrong, the human's audit trail must show why they overrode it.
Also shipped: ACY Connect (FIX 4.4 institutional API, 12+ prime-broker clients).
Beyond the enterprise — open-source engines
This catalog is built for regulated finance. But the discipline behind it —
tokens-first, accessible by contract, machine-readable — is how I build everywhere. Three open-source tools,
all MIT, all usable by a human and by an AI agent (MCP server + llms.txt): a
design-system API, a creative animation engine, and a React component registry. The point is range:
I don't only design rigid institutional surfaces — I think, design, and ship across the whole
spectrum, in the open.
eds-mcp
This very catalog, made machine-readable. A pure core engine drives an MCP server and a zero-dependency HTTP REST API (OpenAPI) that serve tokens, component contracts and regulatory anchors — so an AI agent reads them and generates compliant UI, audits accessibility, and scaffolds a conformance test. 29 tools over 65 institutional contracts in 14 domains — and, since v1.17.0, 142 consumer contracts in 12 more. The contract behind this showcase, exposed.
GalaxyJS
60 hand-tuned cosmic canvas animations + a UI kit, ~20 kB gzipped,
framework-free — drops into any page with one <script> tag. One shared rAF loop,
HiDPI, offscreen auto-pause, reduced-motion by contract. Proof I design for delight and performance,
not only for compliance density.
ReactΩ
31 copy-paste motion, interaction & physics React components you own outright —
installable by humans and AI agents via a CLI, shadcn, or an MCP server. A deterministic
registry + an llms.txt keep human docs and machine contracts from ever drifting. The same
discipline as this catalog, a different stack.
Ed Agent
The operating model behind this system, made runnable. One plain-English requirement runs nine human-gated lifecycle stages with two deliberation checkpoints — was the intent captured, and should you trust this? A squad swaps across five missions, drives eds-mcp to build compliant UI, and runs a red team, claim grounding and a self-correcting inner loop. Design judgment and the sign-off gates stay human.
// All four are git clone-able and npx-runnable today — and every
one
ships an MCP server, so an AI agent can use it without reading a line of docs. Human-editable, machine-operable.
The same hand that builds a regulated trading surface built these.
About this system
An editorial stance — why this catalog exists, who it's for, and what it isn't.
Why this exists
Most fintech design systems read like an extended Figma library — neat tiles of buttons, cards, and modals. That's a deliverable, not a system. Real design systems are contracts: between designers and engineers, between product and compliance, between the team that ships v1 and the team that maintains it three years later.
This catalog is my own independent, MIT-licensed system, built to the same discipline as the work behind
every
case study on the portfolio — it is not any employer's codebase and contains none of it. ACY's
150-component absorption of 8 regulatory rewrites without a rebuild cycle was governed by that discipline, and
remains ACY's. Christie's 260-year editorial restraint translated into a private-banking onboarding flow is
the same reasoning applied here. The institutional terminal at
/demo-trading-terminal.html compiles down to tokens defined here.
How to read this catalog
The sidebar groups 251 categories into 9 domains. Three approaches:
- Designer scan — open Color, Typography, Spacing, then jump to a domain you care about (AML, Trading, Compliance).
- Engineer scan — open Tokens · Code Export first to grab CSS / JSON / Tailwind config, then copy any component snippet directly.
- HR / hiring manager scan — read this section, the Changelog, and pick three components from different domains. The breadth of regulatory citations across components is the signal you're looking for.
Engineering Extension: Live Storybook
This showcase is accompanied by a full Storybook component library. It acts as an engineering extension and verification layer where engineers, design system consumers, and frontend/tech leads can interact with live component variants, prop controls, states, and interactions. It demonstrates that every design decision considers strict implementation feasibility and is fundamentally R&D-ready.
What you won't find here
No external animation library, no marketing-page pattern dependency, no chart engine wrapper. This catalog
handles the regulated finance core — disclosures, surveillance, order entry, KYC, risk, audit, and a
small motion taxonomy for production UI states. Charts live in Lightweight Charts v4.2;
animations live in component-level CSS keyframes; marketing pages live in main.css outside this
surface.
Maintenance contract
Versions are SemVer. Breaking changes go in the changelog with migration guidance. New components arrive in batches with a regulatory anchor (you don't add a new disclosure pattern without naming the rule it serves). Tokens are immutable within a major version.
AI-Native Development
One machine-readable contract. A designer, a front-end engineer and an AI agent all read it — and none of them can invent a hex code or drop a disclosure.
A gallery is a deliverable. This is a contract — tokens as CSS / JSON / Tailwind, every component carrying its usage rules, props, a11y notes and the regulation it serves, served live over MCP. The speed comes from the agent. The correctness comes from the system, not from hoping the model gets it right.
The whole section in one picture. Nobody re-types anything, so nothing drifts — six consumers, one source of bytes. Everything below is just the detail of how each arrow works.
The decisive gap
- A Figma library a human re-types into code — design and code drift apart
- The AI guesses hex codes, spacing, and which component to use
- Compliance (risk warnings, disclosures, KYC gates) is bolted on afterward
- Demos wire mock data; real loading / empty / error / stale states get skipped
- Every regulated surface is rebuilt by hand — weeks per change
- One token contract (CSS / JSON / Tailwind) — the agent reads the exact values
- Every component ships when-to-use / when-not, props, a11y, regulatory anchor — the agent picks correctly
- Compliance lives in primitives the agent can't restyle away
- Components declare a data contract with all four states — the agent wires real streams
- A change propagates through tokens — minutes, zero rebuild
One token, every layer
Change a token once and it threads through every layer the agent
touches — the same value, no drift. Here is --accent expressed simultaneously across the stack:
Re-theme, or absorb a regulatory restyle, by editing layer 01. Layers 02–06 inherit it — the agent never edits a value it shouldn't.
One contract, three consumers
A designer, a front-end engineer and an agent are not three workflows. They are three doors onto the same bytes.
The design system is the MCP server
Not documentation an agent reads. Tools an agent calls — and that can answer no. Click a tool.
eds-mcp calls (v1.17.1 · 29
tools · 65 component contracts / 14 domains · zero-dependency, also served as an OpenAPI 3.1
REST
API). Payload shapes are simplified for reading; the tool names, the contracts and the refusal behaviour are
the real ones. Source
→The machine layer — fetchable, not described
This page spends a lot of words claiming an agent can read the system. So here is the system, as two files an agent can actually GET.
The contract, served as JSON
251 categories · 9 domains · 240 registers · 173 cite a regulation · 34 issuing bodies · 77 tokens × 2 themes
Every design token, both themes, exactly as the page resolves them. Not a copy that will drift — it is parsed out of the stylesheet this page renders with.
Every category, its domain, and — where it has one — the four cells: when to use, when not to, the a11y contract, and the regulatory anchor. Counts are read off the live page, never typed in.
The proof, not the promise. node eds/verify.mjs — or
node eds/verify.mjs https://edwson.com against the deployed site — re-derives all of
the above from the page and asserts it. 4,820 assertions, zero dependencies. Its first run failed:
this page had been printing 122 registers in one paragraph and 115 in the next, and
tokens.json had the dark palette filed under “light”. Generated by
node eds/generate.mjs, which refuses to write on a duplicate id or a nav link that reaches
nothing.
And it is executed, not only read. Every other check here reads this page as text.
node eds/smoke.mjs runs it: the document is parsed into
a 419-line hand-written DOM, all
48 inline scripts are evaluated, all 259 sidebar entries are activated, and every one of
the 891 interactive controls is clicked — twice, because a state machine that
only works once is the failure a single click never finds. Then keyboard parity: every widget role
sitting on a div is given Enter and Space first, and only if nothing moves is it clicked,
so anything that answers a mouse and not a keyboard is named. Last run: 0 runtime errors, 0
keyboard-parity failures across 891 controls and 266 widgets. No browser, no network, no
dependencies.
Logos identify third-party tools; no affiliation or endorsement is implied. The point is not the list — it is that plain JSON over HTTP needs no integration at all. Anything that can fetch a URL is already a client.
No server, no SDK, no install. Two GETs and the agent has the whole contract.
The static files are the contract. The server is the contract plus the verbs — it can scaffold, lint, and refuse.
compliance_check can come back
BLOCK. A contract an agent can read is useful; a contract an agent can be refused by is
governance. eds-mcp on
GitHub →
The 2026 build loop
The loop, at a glance. Two human gates — state the intent, sign the diff. Everything between them runs unattended, four of the stages at the same time, and the compliance gate can refuse the build and send it back rather than filing a warning nobody reads.
-
Agent ingests the contractHumanPoints the agent at the token export + Storybook + MCP server.AILoads tokens, component metadata, and the 4-state data contracts.System guaranteesOne source of truth — no scraping screenshots, no guessing.
-
Human states intentHumanPlain language: “order ticket, ASIC risk warning, live price.”AIMaps intent to the right components by their usage metadata.System guarantees“When-not-to-use” rules stop the wrong component.
-
AI assembles from tokensHumanReviews the assembly, not the hex codes.AIComposes components referencing tokens — never raw values.System guaranteesToken-only: a theme or rule change still propagates later.
-
Compliance is enforcedHumanDoesn't have to remember the rule — it's structural.AICan't ship the surface without its required disclosure primitive.System guaranteesRisk warnings & KYC gates can't be styled away.
-
Live data bindsHumanSupplies the stream endpoint; the contract does the rest.AIWires the documented schema with loading / empty / error / stale states.System guaranteesReal data streaming, not happy-path mocks.
-
Human signs off at the diffHumanApproves a small, readable diff and owns the outcome.AISurfaces exactly what changed and why.System guaranteesSR 11-7 / SEC 17a-4 effective-challenge discipline on every commit.
How the whole build pipeline changes with AI
The component contract is one half. The other half is what AI does to the whole product pipeline. The classic flow is linear and finds problems late; with AI in the loop, every stage gains a draft-ahead and a predict-ahead layer, the stages overlap instead of queuing, and problems shift left — caught at design time, not discovered at QA/UAT where a fix costs the most.
Landing on a system you didn’t build
Most of the job is not designing the next screen. It is working out why the last one looks like that — fast, and without breaking anything.
The first thing I open is not a ticket — it is a request to DevOps and InfoSec: may I point AI at this history, what may leave the network, what is retained, for how long. If the answer is no, the answer is no; if it is “not to a vendor cloud,” the same stack runs on-prem. I want that decision in writing, from the people who own it. An AI workflow that starts by quietly exfiltrating your backlog is not a workflow, it is an incident.
Epics, stories and tickets from the last ~12 months, clustered into themes rather than read end-to-end: what shipped, what got reverted, and what keeps coming back. A bug that recurs three times is not a bug. It is a missing rule.
The Figma history against what is actually live. Where the two diverged is the interesting part — it is almost never laziness. It is a constraint nobody wrote down: a deadline, a vendor limit, a regulator’s comment.
If it is an app: Flutter or native? Does it consume a token layer, or a third-party
kit with its own opinions? Are colours #hex in the widgets? That one answer decides everything
downstream — whether a future change can propagate, or has to be rebuilt.
Now the unwritten constraints have names. You cannot redesign a system whose constraints you cannot state — and every constraint you cannot name is one you are about to break in the next sprint.
Straight into Confluence, where the team already looks: a decision register and a per-surface checklist, in the same four cells this catalogue uses — when to use, when not to, behaviour and a11y contract, regulatory anchor. Designers and engineers now cite the same page.
The register is already structured, so it also ships as a contract a machine can read. Same rules, two audiences — the page a human cites in a stand-up, and the tool an agent calls before it writes a line. The project stops being something you have to remember.
The sprint, with the contract in the middle
| Ceremony | What the PM brings | What I put in | What the contract enforces |
|---|---|---|---|
| Epic | The outcome and the deadline — in the PM’s language, not mine. | The surfaces it touches, and which of them are regulated. | Acceptance criteria drafted against real components, so “done” is checkable instead of arguable. |
| Refinement | Priority, scope, what is being cut. | Component IDs and the regulatory anchor, attached to the story. | The ticket now names the rule — nobody has to remember it at 5pm on a Friday. |
| Sprint | Nothing. This is the part that should be quiet. | Intent, then review of the diff — not the hex codes. | Dev scaffolds from the same contract: no raw hex, no missing disclosure, four data states. |
| QA | The acceptance criteria, unchanged since the epic. | The edge cases the register already lists under when not to. | Tests generated from the contract, not from a screenshot — and a11y is a gate, not a nice-to-have. |
| Retro | What hurt, and what we are changing. | Any new decision, written into the register the same day. | The rule set learns. Confluence and the MCP update together, so the page and the agent never disagree. |
Why the speed doesn't cost quality
--accent, --space-4,
--radius — never a literal. One edit re-themes everything, and the next regulatory restyle is a
token change, not a rebuild.
when-to-use, when-not, props, a11y notes, and
a regulatory anchor. The agent picks the right one for the right reason — the metadata is the guardrail.
loading,
empty, error, and stale — so AI-wired live streams (price ticks, FIX
OrdStatus, KYC progress) behave under real conditions, not just the happy path.
Prompt → component
For the enterprise: lower AI cost, total consistency
The same contract that makes an agent accurate makes it cheap. Serving targeted, reference-based slices over MCP — instead of pasting CSS and screenshots into the agent every turn — cuts both input and output tokens, and the correctness of the contract collapses the correction loops that quietly burn most of the budget. A measured example: a single targeted token slice is 78% smaller than shipping the whole token file.
60K input + 4K output
tokens (multi-turn agent re-reading CSS/screenshots, ~2.3 correction loops); MCP ≈ 6K input
+ 700 output (targeted retrieval, prompt-cache-friendly, ~1.1 loops). Token-per-request
assumptions are the conservative part; the loop reduction is where the real money is.The second lever: model-tier routing & output discipline
The calculator above is the retrieval-side saving — hand the agent a targeted slice instead of pasting whole files. The generation side is a second, independent lever that compounds with it:
- Model-tier routing — a small orchestrator (my own “hermes” router) sends each task to the cheapest model that can do it; the top model is reserved for genuinely hard reasoning, so most agent calls never touch it.
- Output discipline — agents are stopped from “thinking out loud” and forced into terse, structured output (output tokens are the expensive ones). Suppressed where safe, kept where correctness depends on it — regulated logic is never run terse.
- Context as keywords — compressed, keyword-shaped context with a persistent
DB_Structure.mdsource-of-truth the agents read and write back to, so compression doesn’t drift and errors are caught against one coherent spec.
- This is DesignOps cost governance, not ML infra — part of owning the company’s design-tooling and AI-API admin and budget (Figma, Adobe, OpenAI / Codex).
- Stacked with the MCP retrieval saving, the two levers cut spend an estimated ~60–80% versus naively routing everything to the top model — measured on my own workloads, not a universal guarantee.
- The actual figures live in a private usage dashboard, kept off the public site — available to walk through in an interview.
Auto-update & deploy
Change a token once; it reaches every consumer with no rebuild — because apps, docs, and agents all read the same contract and pull only the delta.
diff_since returns the delta.Consistency, guaranteed
manifest.json with per-file checksums is the
source of truth. Every team resolves to the same bytes — no “which version are you on?”Data residency — run the whole stack on-prem
When data can't leave the building — regulated finance, privacy-bound enterprises — the same MCP + agent stack runs entirely on your own hardware, not a vendor cloud.
gpt-oss-120b (Apache 2.0), Qwen3.5 122B-A10B (Apache 2.0), and
gemma4:31b-it-bf16. Served, not pre-trained — the honest scope.
tokens.json · components.json ·
server.js · build-manifest.js · manifest.json.
npm install && npm start and point your agent at it.
How to drive it
Domain-Expert Orchestration Studio
Pick a client brief. Watch the right domain experts — and only the right ones — engage, call eds-mcp, and return a precise, quantified build plan. The point a recruiter should take away: I read a need from several angles and route it through a multi-agent team that pulls exactly the components, tokens and regulatory anchors the brief requires. Not a token dump. Not a generic answer.
The expert team
Faithful to the real eds-mcp engine: every tool, component id and regulatory anchor above is
one the system actually exposes (v1.17.1 · 29 tools · 65 contracts · 14 domains). The
agents that sit out are the point as much as the ones that engage — the brief never pulls a
primitive, a token, or an expert it doesn’t need. Run it yourself: the open-source
eds-mcp repo ships a one-command lifecycle example (npm run example) that takes a one-line
requirement intake → planning → PRD → R&D → QA → launch and writes the real
artifacts — the regulation map, the spec, the compliant code, the QA reports and the conformance tests
— in about 70 ms. And the real, runnable version of this studio — the nine-agent,
human-gated orchestrator itself — is open-source: Ed Agent runs this exact lifecycle on your
machine and drops into any bot via MCP or an AGENTS.md brief. github.com/Edwson/Ed-Agent →
Why it’s fast — the queue, not the typing
I am not typing faster. The dependency graph is shorter, and I am only in it at the gates.
npm run example). The human side is the
gates — and those are the part I refuse to compress.Changelog & Version
SemVer · breaking changes called out · regulatory anchors per release.
- Flagship Conversion Hub Integrated. Added the
.ds-flagship-hubdirectly into the Overview section, connecting institutional visitors with live interactive proof surfaces: the Live FIX 4.4 Financial Terminal drill (sub-16ms latency testing, extreme volatility stress simulation) and 1-Page Executive ADRs. - Sensorial Balance & Cognitive Ergonomics. Reinforced extreme volatility ergonomics across order execution, panic de-escalation, pre-attentive contrast calibration, and strict regulatory compliance anchoring (ASIC RG 268, MiFID II, SEC Rule 17a-4).
- 4,818 assertions and not one of them pressed a button. Every check in this
repository reads the page as text. A handler bound to a selector nothing matches, a demo that reads a
property off
null, a toggle that works once and breaks on the second press — none of those are visible to a parser, and all of them are visible to a visitor in about four seconds.eds/smoke.mjscloses that gap: 48 inline scripts evaluated, 259 sidebar entries activated, 891 controls clicked twice each, against a hand-written DOM because the machine that runs this has no browser and no network. - Three unguarded state lookups were hardened.
REASONS[retryReason]in the payment-retry panel,JUR_DATA[jur]in the jurisdiction simulator andROSTERS[current]in the agent roster all dereferenced a map with a key that came from a control’s value, with no fallback. A stale saved state or an out-of-range value is enough to throw. Each now falls back rather than crashing — and this is a catalogue people copy from, so the pattern in the sample matters as much as the behaviour on the page. - Keyboard parity is asserted behaviourally. This catalogue cites WCAG 2.1.1 in
dozens of entries. The test for it is not “is there a keydown listener” — it is
whether what a mouse can do, a keyboard can also do. Every widget role on a
divis given Enter and Space first; only if nothing observable moves is it then clicked. The obvious order — click, undo, press Enter — assumes the control toggles, and a stepper does not: that assumption produced four false failures against a section whose keydown handling is correct. - Result: 0 runtime errors, 0 keyboard-parity failures across 891 controls and 266 non-native widgets. Both guards were negative-tested by breaking them: a keydown handler deleted from the ticket stepper was caught and named to the element; a selector typo was caught and named to the inline script.
- 112 entries gained the full four cells. All ten AML components, seven compliance entries, all nineteen B2B and B2B-SaaS entries, all twenty financial components, fifty-two general components including the ten social patterns, and six of the cross-cutting patterns. Before this release 123 of 251 entries carried no register; after it, none carries an unexplained one.
- The remaining eleven are waived on the record, not left blank. The seven
foundations (
color,typography,spacing,elevation,iconography,tokens-code,figma), the reference map, and the three animation study galleries each now carry a stated reason there is no use-or-not decision to record — a token set is what components decide with, not a component anyone chooses. This is the substantive change: an empty register and a deliberate absence used to look identical, and 123 entries were sitting in that ambiguity. - The generator now refuses to emit an ungoverned entry.
eds/generate.mjsfails the build if a catalogue section has neither a four-cell register nor a stated waiver, if it carries both, or if the waiver is too short to be a reason.eds/verify.mjsasserts the waiver in both directions and compares the reason in the contract against the reason on the page character for character, so the JSON cannot carry a justification the reader never sees. All four guards were negative-tested by breaking them. - The “when not to” cell is where the content actually lives. A sanctions hit may not auto-block without a review path, because transliteration collisions turn silent rejection into a de-banking mechanism. A PEP flag may not be binary, because FATF's three tiers carry different obligations. A jurisdiction switch may not be user-facing, because jurisdiction is derived from client classification rather than chosen by the client. The seat manager may not be the deprovisioning path, because access removal is a security control. A split button's two halves may not share one focus target, which in order entry is the difference between Buy and Buy Stop. Every drag operation needs a keyboard equivalent, which is WCAG 2.2's newest criterion and the one existing implementations fail most often.
- Five anchors were relabelled and five issuing bodies added — by the generator, not by
hand.
aml-typologyandaml-regchangeclaimed a domain anchor over named instruments.b2bs-usage-pricing,b2bs-partnerandsoc-trendingclaimed a regulatory anchor the generator did not recognise — which turned out to be a gap in the generator: its issuing-body table had no entry for FASB, ESMA, the EU DSA, the anti-bribery statutes or the UK AML statutes, so ASC 606, the Bribery Act 2010 and the DSA were being read as domain conventions. Five bodies were added, which is why the issuing-body count moved by more than the new citations alone would explain. - Counts, all measured by the generator: decision registers 128 → 240, registers naming an instrument 91 → 173, issuing bodies 26 → 34, assertions 3,790 → 4,818. Entries with no register and no stated reason: 123 → 0.
- The gap was found by using the system, not by auditing it. Building the
Northwind People demo out of these contracts put six entries on screen
that carry no four-cell decision register —
kanban,timeline,keyvalue,pagination,filterbarandb2b-approval. Design Mode reported each as an explicit gap, which is the right behaviour, but six of the forty surfaces on a demo arguing that the register is binding had nothing binding to show. - All six now carry the full four cells. Two of them state a rule the system had not written down before: a Kanban card renders time in stage because a review pipeline is judged on ageing rather than position, and a Timeline event names the system it came from because a merged chronology with invisible provenance cannot be reconciled against the source of record. The pagination entry now says the total count is never optional — a pager that hides it converts a review into a sample.
b2b-approvalgained a regulatory anchor, not a domain one. Segregation of duties is the reason the pattern exists: the person who raises an action may not approve it, and both SOX §404 internal-control assertions and the four-eyes principle fail on a single-approver path dressed up as two. That is the first SOX citation in this catalogue, which is why the issuing-body count moved.- Counts, all measured by the generator: decision registers 122 → 128, entries citing a named instrument 90 → 91, issuing bodies 25 → 26, assertions 3,776 → 3,790. The catalogue is unchanged at 251 entries across 9 domains — nothing was added, six things were finished.
- The decision register existed on the page and nowhere a machine could reach it.
eds/components.jsoncarried id, name, domain, summary, URL and the regulatory anchor — but not the three cells that decide whether a component may be used at all. An agent reading only the JSON could see which rule a component serves and could not see the case where using it is wrong. The generator already parsed all four cells to find the anchor; it now keepswhenToUse,whenNotanda11ytoo, matched by their own label rather than by position so reordering the grid cannot mislabel them. 122 entries carry a register. - The other 129 carry
register: null, not a missing key. This page has always disclosed that 122 of 251 entries carry the four-cell register and the rest carry none. Omitting the key would have let a reader assume the guidance lives somewhere else, or that the export was truncated. An explicit null says the thing itself: this entry has no register, the summary and the anchor are the whole of the guidance.eds/verify.mjsasserts that every entry carries a register or an explicit null, and that the count of registers matches the number this page prints. - An offline tier, because the fuller contract is a heavier contract. With the
registers in it the index is 192 KB — roughly 48K tokens, which is most of the window on a
model someone runs on their own hardware. The same generated array is therefore also written as
eds/index.slim.json(84 KB, carrying ahasRegisterflag so you can tell before you fetch) and nine domain shards at 3.0–47.5 KB, the largest of which is 12.2K tokens. One generator run writes all of them, which is the only reason they can be trusted to agree. Nothing here is an API: fetch once, commit the files beside your code, and the contract — includingnode eds/verify.mjs— keeps working with the network off. - The shards have to explain their own emptiness. Each shard ships a
honestScopeline stating whatregister: nullmeans, and the verifier requires that line to be present. Without it a sliced file makes “this entry has no guidance” look identical to “this file is incomplete”, which is the failure mode that makes an agent invent the missing half. - Nine new assertions, three negative tests, and one that was in the wrong place. The
shards must hold 251 entries between them; the slim index must list the same ids in the same order and
agree entry-by-entry about
hasRegister. The first version of this block sat after the self-referential assertion-count check, so its own nine assertions were not counted and the number printed above could never be made correct — a check that counts the run has to be the last thing in the run. Assertions 3,767 → 3,776.
- The export panes were publishing a palette this page does not use. The Tokens Code
Export is the one artefact here meant to leave the page — “copy design tokens
directly into your build pipeline” — and 21 of its 23 shared values were from an abandoned
dark draft:
--bg: #0a0a12under a:rootselector on a page whose light background is#f5f6f4, and a--text3that fails AA. An engineer who did exactly what the page said got the wrong theme under the wrong selector and none of the semantic tokens the components use. All five CSS panes are now written fromeds/tokens.json, which is itself parsed out of this page’s stylesheet; the colour pane carries both themes under their real selectors, because one flat:rootis what caused the confusion.eds/verify.mjsasserts every pane value against the live token, skipping theprefers-reduced-motionblock the way the cascade does. - The export also promised 32 token names
:rootnever declared — the spacing scale, type scale, weights, leading, durations, easings,--radius-pilland--shadow-xl. Kept the promise rather than deleting it: the scale is now declared, so the export describes something real.--radius-xs: 4pxwas added because 4px is the most-used radius in this page’s own markup (137 occurrences) — a scale that does not name its most-used step is not describing the system — and--text-2xs: 0.625rembecause that is the dense step the trading and compliance surfaces were all reaching for by hand. - Two dead palettes, removed. The file opened with a complete
:rootand a complete[data-theme="dark"]whose 31 declarations were every one redefined further down — two palettes shipped to every visitor and used by nothing. Also removed: a second--radiusat:root(10px, losing to 8px). Proved rather than assumed — the extracted token set and all 77 resolved values are byte-identical without them, checked against the browser’s own computed values. - The fourth register cell had three names and none of them tracked the content.
“Regulatory anchor” (74), “Domain anchor” (31) and “WCAG / regulatory
anchor” (17) — and 13 entries labelled Domain cited NACHA, Reg E, ISO 20022, SEC
17a-4 and GDPR, while 14 labelled Regulatory cited nothing you could look up. A label that
sometimes promises a citation and sometimes does not is worse than no label. The kind is now
derived from the cell’s own text and published as
anchorKind: names an issuing body or numbered instrument → Regulatory anchor (90); names an engineering standard or the supervisory consequence instead → Domain anchor (32). 44 labels were rewritten and both directions are asserted, so the register can no longer over-promise or under-claim. - One status chip, two sizes. Measured across the 16 families that render a small status label: 20 distinct font-sizes (8.96px to 16px), 4 weights, 5 tracking values, three shapes (pill, 8px rect, 4px rect) and heights from 17px to 31px — for one role. Put two of those components side by side and you are looking at two systems. Normalised to two density steps — dense for blotter and audit rows, regular for cards and rails — with tracking only where the label is all-caps, because adding it elsewhere just looks like a logo. The families keep their own names and colours: their semantics differ, their geometry should not. Left alone on purpose: a Font Awesome icon class, two buttons, an icon badge, a topology-diagram label and two JS-filled text spans that only look like chips in a class-name grep.
- One glyph for one meaning. ▲▼ means a value moved (25 occurrences); two places were using ↑↓ for the same fact, so a delta rendered two ways in two components. ↑↓ is left where it means something else — arrow-key hints, a scroll cue, an axis direction, and cash in/out in the transaction history.
- New:
eds/generate.mjsandeds/verify.mjs. The consumer sibling has shipped a runnable self-test since its v1.32.0; the institutional system — the larger of the two, and the one this page cites as evidence of discipline — had none, and had drifted accordingly.node eds/verify.mjsnow runs 3,218 assertions with zero dependencies, locally or against the deployed site, andnode eds/generate.mjsrebuilds both contracts from the page, refusing to write on a duplicate id or a sidebar link that reaches nothing. - What the first run found, in order of severity.
eds/tokens.jsonwas publishing the dark palette under“light”—--bg: #0a0a12on a page whose light background is#f5f6f4— and shipping--duration-*: 0ms, a value that exists only inside@media (prefers-reduced-motion). Both are the signature of a scrape that reads a:rootprinted inside a code sample and reads an at-rule as if it were a default. The generator now skips comments and quoted strings while counting braces, becausecontent: '}'desynchronises the walk and the later:rootblocks — the ones carrying the current palette — are then silently never found. The file had been wrong for seventeen days and nothing on the page could have told you. - The anatomy panel disagreed with itself. One paragraph said 122 registers; the paragraph directly beneath it said 115 entries carry the full four-cell register. Measured: 122, and a register is four cells or it is not a register — there are no partial ones, so the honest-scope sentence was describing a state that does not exist. Also corrected: 91 → 90 entries citing a named instrument, 20 → 25 issuing bodies (the framework table had not been recounted since Corporate Actions added SEC 10b-17, 15c6-1, IRS 1099-DIV, IRC §3406, Nasdaq 5550(a)(2) and NYSE 802.01C), 64 → 43 tokens per theme, and one code sample still quoting 23 eds-mcp tools where the rest of the page says 29. The folding rule — SEC Rule 17a-4, Reg BI and Reg SCI are three instruments and one issuer — is published in the contract so the arithmetic can be checked rather than trusted.
- Accessibility: 3,047 axe violations → 0. Both themes, every one of the 259
sections revealed at once, best-practice rules included. The bulk was contrast: eleven light tokens sat
between 2.0:1 and 4.4:1 on the surfaces they are actually painted on, which the old nine-pair
table never measured — it only tested
--bgand--surface. The matrix is now 62 pairs per theme, every text token against every surface, and the tokens moved rather than the claim. Also fixed: a live regression where--price-upresolved tovar(--price-up)and 433 elements rendered with no colour at all; 71 controls with no accessible name;opacityused to de-emphasise readable text, which makes a measured token unmeasured; Copy buttons sitting insiderole="tablist"; seven scrollable regions unreachable by keyboard; and an exit animation whose end state wasopacity: 0.34— permanently half-dismissed at 2.04:1 rather than dismissed. - The luminance-tapering specimen was advocating a violation. Its five tiers ran 0.95 / 0.70 / 0.45 / 0.25 / 0.12 alpha, which measures 17.7 / 9.7 / 4.5 / 2.15 / 1.34:1 — so a timestamp sat at 2.15:1 and an account number at 1.34:1, both labelled “non-essential”. WCAG 1.4.3 exempts decorative and incidental text; it does not exempt data you have decided matters less. Re-solved to 18.5 / 12.0 / 8.5 / 6.0 / 4.6:1 — enough separation to rank a blotter, with every value still readable. On a page that audits everything else against a named clause, this was the one specimen that could not be defended.
- What was measured and then left alone. The styled checkbox was given a 24 px
minimum target before checking whether it needed one. It did not: at 18 px it already satisfies
WCAG 2.2 §2.5.8 through the spacing exception, and the change had grown seven controls for nothing.
Reverted. The six real failures were a six-item ruleset filter at
gap: 4px— 16 + 4 leaves the 24 px circles overlapping — fixed by spacing, which 2.5.8 accepts and which leaves a compact filter rail looking like itself.
- 508 hardcoded hex values, replaced with three new tokens. The live preview markup
(trading-terminal-style demos: order books, tickers, sparklines, persona avatars) carried
#66bb6a/#ef5350/#ffa726as literal hex on roughly 600 individual elements — SVG strokes, span colours, gradient stops — the single largest source of non-token colour on this page, and a direct contradiction of the token-only principle this page argues for. Centralised into--price-up,--price-down, and--price-pending, declared once in both themes at the exact values the markup already used, so nothing visibly changed and nothing can drift going forward. - What was left alone, and why. ~90 occurrences inside inline
onclickhandlers and<script>blocks were not touched — a JS string literal doesn’t resolve a CSS custom property the same way a style attribute does, and rewriting that safely is a JS refactor, not a find-and-replace. A further ~40 one-off hex values (persona/category colours distinguishing different demo entities, decorative gradients, brand cross-references) were also left alone: they are not duplicates of a shared meaning, and forcing them onto shared tokens would collapse colours that are deliberately different, not fix a bug.
- Seven corporate-action components, one new sidebar group. Stock Split, Reverse Split, Dividend Declaration, Dividend Payout, Ex-Dividend Timeline, Rights Issue, and Corporate Action Election — the events that adjust a position without a trade. Each carries the four-cell decision register and a jurisdiction-correct anchor: SEC Rule 10b-17 and FINRA UPC 11140 for record/ex-date notice, Nasdaq 5550(a)(2) / NYSE §802.01C for a reverse-split listing cure, IRC §1(h)(11) for qualified-dividend character, IRS 1099-DIV and IRC §3406 backup withholding for payouts, Securities Act §5 for a rights offering, and DTC voluntary-election deadlines with SEC Rule 17a-4(f) instruction retention.
- Honest by construction. A split shows position value unchanged, not a price crash; a
reverse split names the cash-in-lieu of fractional shares; a rights issue states that unexercised rights
lapse and non-participation dilutes; an election shows the no-instruction default as prominently as the
choices. Categories 244 → 251, decision registers 115 → 122;
the machine contract (
eds/components.json) regenerated to match.
- This page argued for 55 KB that an agent can read the system — and then gave it
nothing to read. The consumer sibling shipped
cds/*.json; the institutional system shipped a screenshot of an argument. Now it shipseds/tokens.jsonandeds/components.json— both generated from this page, never hand-written, so they cannot drift from what you are looking at. Discoverable from the<head>viarel="alternate"and a schema.org Dataset with twoDataDownloadentries, so a crawler finds the contract without parsing 2 MB of HTML. - Generating the contract immediately caught the page lying to itself. The header claimed 245 categories while the Domain Map — whose counts are read off the live DOM — summed to 244. The truth is 244 (252 sections minus the 8 overview/meta ones). Likewise the register count was stale at 113 (it is 115 since two registers were repaired), and “17 frameworks” was a hand-kept number: extracting the citations from the anchor cells and folding each to its issuing body gives 20. Every live surface now matches the contract file; the changelog history was left alone, because history is not edited.
- Two ways in, and the difference between them is the word no. Plain JSON over
HTTP needs no integration — anything that can fetch a URL is already a client, which is why the logo strip
is a fact and not a partnership claim. But JSON can only be read. The MCP server can be
asked, and
compliance_checkcan come back BLOCK. A contract an agent can read is useful; a contract an agent can be refused by is governance.
- The ARR waterfall was broken in three ways at once, and the worst one was not visual.
Its axis said
y=80is $24M, but the $18.4M bar was drawn toy=70— a bar labelled 18.4 that measured 25.7. Two value labels sat aty="-2", outside the viewBox, so +$0.4M and $24.1M simply never rendered. And the KPI cards underneath contradicted the chart above them: the bridge's own numbers give NRR 100% and GRR 86%, while the cards claimed 108% and 92%. Rebuilt from one scale, with connector lines, token colours, and figures chosen so that every card is derivable from the bars — the arithmetic is now printed under each one. A revenue bridge whose KPI cards don't reconcile with its own bars is worse than no chart: it is a chart that will be believed. - Two decision registers were rendering as plain body text.
#sec-ag-teamand#sec-ag-sopused.ds-logic-label/.ds-logic-text— class names that do not exist anywhere in the stylesheet. Same content, wrong contract. All 460 register cells now carry a real.ds-logic-klabel. .ds-changelog__tag--patchwas used but never defined, so two release tags rendered unstyled next to styled ones. (This entry uses it.)- The consumer CTAs were painted with the wrong token. Profile Follow,
notification Follow back, the DM send button and the story-ring + all used
--gold— which is this system's emphasis colour (the human gate, the ◆), not its action colour, and which resolves to a muted brown in the light theme. Muddy fill, near-black label. Worse, the DM unread badge was white on gold: 3.1:1, an outright AA failure on a page that audits everyone else for contrast. Added a real--cta/--cta-fgpair (5.6:1 light, ~6.5:1 dark) and pointed all five at it. An action deserves its own token, not a borrowed one. Swept the whole page rather than waiting to find them one at a time: the ISDA Clause Negotiator’s Resolve Clause was the last one (gold fill, and a hardcodedcolor:blacklabel). Every interactive element backed by--goldis now on--cta; the 16 that remain gold are decorative — avatars, sparkline fills, timeline dots — where an accent is exactly right. - Clean on the structural sweep: 0 duplicate element ids, 0 dead nav links, 0 unreachable sections, 0 inline handlers calling an undefined function, and — after this pass — 0 SVGs drawing outside their own viewBox. Known debt, quantified: 610 hardcoded hex values remain in live preview markup, against a page whose first principle is token-only. That is a separate, larger job.
- The section had grown dense enough to need a map. Two short inline SVG diagrams, both themed from tokens (no images, no library): a hub at the top — the contract in the centre, six consumers around it (designer, PM, front-end, AI agent, QA, production) — so the reader sees the whole argument before reading any of it; and a build-loop flowchart under the loop heading: intent → compose_flow → four parallel reads → scaffold → compliance gate → audit → sign the diff.
- Fixed on first look: the hub’s third line was wider than the hub (text overflowing its own box), “Sign the diff” ran past the right edge of the viewBox, the BLOCK arrowhead floated below the node it points at, and the SVG stretched to the full container width — inflating 12px labels to ~20px. Capped at 880px, gate labels centred, arrow lands on the box.
- The flowchart draws the thing the prose kept having to explain: a red dashed arrow looping from the compliance gate back to the scaffold. The gate refuses the build — it does not warn about it. Human gates keep the ◆-and-outline treatment used everywhere else on the page, so “a machine did this” and “a person did this” stay visually distinct.
- New: “Landing on a system you didn’t build.” Seven steps, and step 00 is asking permission — the first thing I open on a new project is not a ticket, it’s a request to DevOps and InfoSec: may I point AI at this history, what may leave the network, what is retained. If the answer is “not to a vendor cloud,” the same stack runs on-prem. An AI workflow that starts by quietly exfiltrating your backlog is not a workflow, it is an incident. Then: read the year of tickets (a bug that recurs three times is a missing rule), diff the Figma history against production (divergence is a constraint nobody wrote down), read the stack (Flutter? a token layer, or hardcoded hex in the widgets? — that one answer decides whether a change can propagate or must be rebuilt), name the constraints, write the rules back to Confluence, and give the project its own MCP.
- New: the sprint, with the contract in the middle. Epic → refinement → sprint → QA → retro, mapped across three columns: what the PM brings, what I put in, and what the contract enforces. Acceptance criteria drafted against real components (so “done” is checkable, not arguable); the ticket names the rule; tests generated from the contract, not from a screenshot; and every new decision written back the same day, so the Confluence page and the agent never disagree. Tool-agnostic by design — Jira + Confluence is what I use; Linear + Notion, Azure DevOps or Slack + Zoho map one-to-one. The tools change; the artefacts don’t.
- Why it matters: a system only three people understand is not a system — it is a hostage situation. Written rules are how you take a codebase back from whoever has been there longest, and they are the only version of institutional knowledge that survives someone resigning.
- New: the critical path, plotted. The studio showed which experts engage but never when — so the one thing a hiring manager actually wants to know (why this ships in days) was missing. Three views of the same nine stages: serial hand-off (8 queues, >50% of elapsed time is waiting, QA arrives last when a finding costs the most), orchestrated (regulation, risk, data and performance are independent reads — they run at once; the critical path is 5 stages, not 9, and compliance runs before the build), and three briefs at once.
- What “multi-line” actually means. Not doing three things at once with my hands — being the serial resource in three graphs that are otherwise parallel. The agents have no calendar; I do, so the design spends it only where judgment is required: stating the intent, and signing the diff. When brief B is BLOCKED on a missing SCA gate, briefs A and C don’t stop — the block is a machine verdict on one lane, not a meeting.
- Honest by construction: the chart is labelled a dependency model, not a stopwatch — it shows sequence and concurrency, not measured wall-clock. The one measured figure is machine-side (the eds-mcp lifecycle example writes the full artefact set in ~70 ms). The trace column header, which claimed calls ran “in sequence,” now says dependency order — because that was the whole point.
- New: “One contract, three consumers.” A designer, a front-end engineer and
an AI agent are not three workflows — they are three doors onto the same bytes. Switch between them
and see what each one actually opens: the palette plus the four-cell register;
npm iplus the four-state data contract; an MCP call plusremovable: false. Edit layer 01 and all three resolve to the new value on the next pull — nobody re-types anything, so nothing drifts. - New: the MCP console. The design system is not documentation an agent reads — it
is tools an agent calls, and that can answer no. Six real
eds-mcptools, each showing the request the agent sends and the payload the server returns: a 312-byte token slice instead of a 14 KB file; a contract carryingwhenNotToandremovable: false;lint_usagefailing a raw hex on WCAG 1.4.1;compliance_checkreturning a ship-blocking BLOCK;diff_sincereturning a 2.1 KB delta instead of a rebuild. - New: four agents, one contract. The relay view — design-agent composes the flow, build-agent scaffolds it token-only, compliance-agent refuses the build (missing ASIC RG 227 suitability gate), build-agent re-scaffolds, a11y-agent audits contrast and focus order, and the human signs the diff. The agents don’t coordinate by chatting; they coordinate by enforcing the same machine-readable rules. That is why one can overrule another: it isn’t being opinionated, it is quoting the contract. Speed comes from the agents. Safety comes from the system.
- Section subtitle and lede cut back; the
aidev-ledeinline margins and the token swatch converted to classes.
- New: The Domain Map. Nine domains — foundations, components, financial, compliance, AML, AI & ML, B2B & SaaS, patterns, data engineering — each card renders its category count from the live sidebar at runtime (never hand-written, so it cannot drift) and drives the existing domain filter. Breadth is now visible on the first screen instead of buried in the nav.
- New: “What an entry actually carries.” The depth counterpart — 113 four-cell decision registers (when to use / when not to / behaviour & a11y contract / anchor), 91 of which cite a named regulation across 20 frameworks. Honest scope stated inline: foundations and token pages carry only the cells that apply to them.
- Entry anatomy is a spec table, not a card of pills. The first cut dressed data (113 / 84 / 17) in the same pill language as the CTAs above it — wrong affordance — and split five prose cells into ragged columns. Rebuilt as one hairline-ruled row per cell, with the counts as a quiet mono data line.
- System Card rhythm pass. The content was right; it read as five equal-weight bands stacked into a wall. The stats now carry the weight (mono, tabular, larger), the receipts are demoted, the shouty uppercase body copy is sentence case, and the disc bullets are em-dash markers.
- Cut the waffle. Section subtitle, executive lede and the six design principles rewritten shorter and sharper; all remaining static inline styles in Getting Started converted to classes.
- The first screen is now the masthead and four ways in. The hero card is gone — Inter-black headline, eyebrow, pill buttons, floating white panel: a second, generic design language sitting directly under a Cormorant masthead. Also gone: the restated headline and the lede. The title and subtitle already say what this is; everything else was a second voice repeating them. What remains is four quiet mono links — where this ships, inspect tokens, live data, regulatory map — and then the Domain Map, which is the first thing on the page that is actually evidence.
- Removed the fake terminal mockup. A page that links to a real live trading terminal has no business opening with a screenshot of a pretend one — it was the weakest artefact on the page and it undercut the density it claimed. The hero is now a single editorial column; the Domain Map and the live implementations carry the weight.
- Expanded the AI Skill Set from 34 to 40 downloadable skills. Added CFA Level III Analysis (portfolio management & IPS), CPA Accounting (GAAP/IFRS treatment, close, disclosure), Mathematical Model Analysis (formulation, calibration, sensitivity/uncertainty), Logic Structuring (MECE decomposition, dependency mapping, top-down synthesis), JavaScript Development, and Canvas Web Animation — each honestly scoped (CFA is analysis, not investment advice; CPA is unaudited, not attest or tax; a model is a simplification, not a forecast).
- Made the set findable. The forty skills are now grouped into eight domains (finance & business, regulation & compliance, law & IP, engineering, design & web craft, analysis & reasoning, growth & writing, people & coaching) with a live search box and per-domain filter chips (counts included), event-delegated over static cards so download links and SEO stay intact.
- Meta section — the 245 component-category count is unchanged. Scoped
sk-styles, dual-theme via tokens.
- Expanded the AI Skill Set from 30 to 34 downloadable skills. Added Persona Development (behaviour-clustered, evidence-anchored personas activated into journeys and JTBD), n8n Automation (workflow design, debugging, and reliability/secrets/cost), Video Director Prompt (director-grade prompts scaled across 10-second, 1-minute, and 30-minute tiers), and Reading & Learning Coaching (retrieval practice, spaced repetition, interleaving, Feynman, active reading).
- Same honesty frame. Persona Development stays grounded in real research and refuses demographic stereotypes; n8n Automation gates every irreversible action behind a human and keeps secrets in the vault; Video Director Prompt is direction not guaranteed output, with no real-person likeness or protected IP; Reading & Learning Coaching is a study method, not a clinical assessment for dyslexia or ADHD — those route to a specialist.
- Added an “In practice” operating loop above the grid — a four-step routing model (exec brief → load Ed Agent + only the skills the brief needs → run in parallel → ship to fit) showing the set is loaded on demand into a live delivery pipeline, not admired as a list.
- Expanded the AI Skill Set from 27 to 30 downloadable skills. Added Corporate Management (strategy-to-objectives, operating cadence, decision structuring), EBITDA & Financial Analysis (EBITDA build & normalisation, margin/variance decomposition, valuation-multiple framing), and IPO & SPAC Readiness — a jurisdiction-configured listing-prep method (regime/path configuration, financial close & estimation, materials matching & data-room assembly) drawn from close C-level IPO/SPAC support.
- Same honesty frame, sharpened. IPO/SPAC Readiness is jurisdiction-first and evidence-backed but explicitly prepares, never attests: no audit, no eligibility, no valuation, no adequacy — every determination routes to securities counsel, PCAOB auditors, the underwriter/sponsor, and the CFO, with real anchors (Securities Act, Forms S-1/F-1/S-4, Reg S-K/S-X, SOX, ASX/UK/HK/SGX regimes, de-SPAC projection-liability caution). EBITDA carries the non-GAAP / Reg G reconciliation discipline and flags aggressive add-backs; Corporate Management structures the call and leaves it to the accountable executives.
- Meta section — the 245 component-category count is unchanged. Scoped
sk-styles, dual-theme via tokens, event-delegated download links.
- Expanded the AI Skill Set from 23 to 27 downloadable skills. Added Multi-Jurisdiction KYC/AML (per-jurisdiction requirement mapping, automated gap/comparison reporting, integration with existing compliance systems), Broker / Exchange Listing Readiness (rulebook checklist generation, gap tracking with reminders, historical-case cross-referencing), Socratic Facilitator (Socratic questioning, perspective shifting, action triggering), and Fintech HR (regulated-role scorecards, regulatory-judgment interviews, fit-and-proper & accountability mapping).
- Same honesty frame. The two regulated skills carry strong disclaimers with real anchors (FATF, FinCEN CDD 31 CFR 1010.230, EU AMLD, UK MLR 2017, AUSTRAC AML/CTF Act 2006; NYSE / Nasdaq 5000 / ASX Listing Rules) and route every determination to the MLRO, counsel, sponsor, and exchange; the facilitation skill routes distress and expert questions out rather than coaching around them; Fintech HR flags fairness and privacy for HR/legal and makes no hiring or fit-and-proper determination.
- Meta section — the 245 component-category count is unchanged. Scoped
sk-styles, dual-theme via tokens, event-delegated download links.
- Expanded the AI Skill Set from 19 to 23 downloadable skills. Added US Securities Regulation (SEC) (registration vs exemption, disclosure/reporting, Reg BI & adviser conduct), ISDA Derivatives Documentation (Master & Schedule elections, Credit Support Annex mechanics, Confirmation/Definitions checks), Output-Token Efficiency (token-budget audit, prompt/output restructuring, quality-gated cost governance), and Objectivity & Logical Rigor (claim–evidence separation, fallacy/assumption audit, steelman & confidence calibration).
- Same honesty frame. The two legal-sensitive skills (SEC, ISDA) carry strong “not legal advice” disclaimers with real citations (Securities Act §77a / Exchange Act §78 / Reg BI; 2002 ISDA Master §5–6, CSA, 2021 IRD Definitions) and escalate every conclusion to counsel; the two craft skills report measured results and calibrated confidence, never a portable percentage or a truth claim.
- Meta section — the 245 component-category count is unchanged. Scoped
sk-styles, dual-theme via tokens, event-delegated download links.
- Added an AI Skill Set overview section — 19 downloadable skills. Nineteen
repeatable, AI-assisted working methods for absorbing unfamiliar, C-level, cross-functional work quickly:
cognitive-behavioral, career development, financial-grade accessibility audit, academic writing,
product-market analysis, GDPR, US tax, SEO, smart-contract audit, patent search, Web3 & tokenomics,
Awwwards-grade web design, AI production engineering, intellectual property, COPPA children’s
privacy, TypeScript architecture, growth marketing, brand copywriting, and workplace psychology. Each
downloads as a Markdown skill file (
/skills/*.md) with frontmatter, a three-capability workflow, a worked example, and guardrails. - Honest by construction. Every skill carries a “What this is NOT” register — a working method, not professional advice. Legal, tax, medical, and security domains require qualified professional review, and the mental-health skills route crises to professionals and exclude any harmful technique. This is the same “AI produces, human judgment governs” discipline behind Ed Agent and eds-mcp.
- Meta section (like Overview) — the 245 component-category count is unchanged.
Scoped
sk-styles, dual-theme via tokens, reduced-motion safe, event-delegated download links.
- Added a Customer Support component group. Live Support Chat (deflection chips +
aria-livetranscript), Support Ticket & SLA tracker (colour-shifting deadline bar + status stepper), Help Center Search (combobox deflection with graceful escalation), and CSAT & Feedback capture (progressive-disclosure rating). Each carries the four-cell decision register with a real regulatory anchor (SEC 17a-4 records; FCA DISP / ASIC RG 271 complaint timeframes). - Added universal UI primitives. Scrollbar Variants (thin · minimal · fade · snap · progress — all token-driven and keyboard-scrollable) and a complete Call-to-Action vocabulary (primary → destructive, plus pill, block, icon-only, split, async-loading, and FAB) anchored to WCAG 2.1 target-size, focus, and name-role-value.
- Category count 239 → 245; synced across meta, JSON-LD, quickjump, command status, and the System Card. All new components are token dual-theme, reduced-motion-safe, and use event-delegated JS.
- Added Ed Agent to the open-source engines. A fourth card in “Beyond the
enterprise” — the nine-agent operating model behind this system, made runnable: one requirement
→ nine human-gated lifecycle stages, a squad that swaps by domain (code · marketing · contract ·
regulated-finance), a learning memory, and an MCP server /
AGENTS.mdbrief to drop into any bot. It drives eds-mcp for the regulated-finance build; design judgment and the sign-off gates stay human. - The Orchestration Studio now links to its real, runnable counterpart
(
github.com/Edwson/Ed-Agent). Machine layer synced — CreativeWorkmentions, the FAQ,ai-profile.jsonandllms.txtall reflect four open-source tools. Narrative addition — the 245 component-category count is unchanged.
- New interactive section — “Domain-Expert Orchestration Studio.” Pick a
client brief (AU KYC · EU payments · US advisory · UK lending · global AML · EU auth) and watch a
nine-strong multi-agent team engage selectively — each expert firing the specific eds-mcp tools
the brief needs (
compliance_check→find_by_regulation→compose_flow→audit_accessibility→scaffold_test) and returning a precise, quantified plan: the exact components, the regulatory anchors honoured, and only the tokens those components use, with a naive-vs-orchestrated contrast. - Faithful to the real engine. Every tool, component id and anchor mirrors eds-mcp v1.17.1 (29 tools · 65 contracts · 14 domains). The experts that sit out are the point: the brief never pulls a primitive, token, or expert it doesn’t need.
- Scoped
orc-styles, dual-theme via tokens, vanilla delegated JS, reduced-motion safe. Narrative/demo section — the 245 component-category count is unchanged.
- New section — “Beyond the enterprise — open-source engines.” Surfaces three open-source, MIT, AI-native tools alongside the financial catalog: eds-mcp (this design system as an MCP server + a zero-dependency HTTP REST API), GalaxyJS (60 cosmic canvas animations, ~20 kB, MCP + llms.txt), and ReactOmega (51-component AI-native React registry · CLI + shadcn + MCP). Each links to GitHub, a live playground, and a case study — evidence of range beyond regulated finance, all usable by humans and AI agents.
- AI-discovery weighting. Added a range FAQ (institutional-finance-and-beyond) plus
mentionsof the three repositories to the page JSON-LD; syncedai-profile.jsonandllms.txt. - Narrative section only — the 245 component-category count is unchanged.
- Transactions & Ledger — five new live components (Financial domain, no new filter pill): Deposit / Fund Account (method-aware fee + ETA + resulting balance), Withdrawal / Cash Out (available-balance and daily-limit guardrails with a text BLOCKED state), Transaction Detail (full single-record view with status in words), Transaction History (filter-by-type + search ledger), and an append-only Activity & Audit Log (sequence, severity, integrity hash). Anchored in NACHA / ISO 20022 / Reg E / SEC 17a-4(f) / SOC 2.
- Five new text-reveal animation studies alongside Stagger Text Reveal: Typewriter, Decode / Scramble, Word Fade-Up (blur), Mask Wipe (clip-path, text stays selectable), and 3D Char Flip — each screen-reader-safe (real sentence kept programmatic) and reduced-motion safe.
- Iconography +30 icons (49 → 79), payments/transaction-weighted, all inline SVG, still 5 semantic categories.
- Category count 229 → 239; synced across meta, JSON-LD, quickjump, and System Card.
Scoped
mtx-/txn-styles, dual-theme via tokens, vanilla delegated JS.
- Seven new live components — an end-to-end money-movement layer (folded into the
Financial domain, no new filter pill): a Payment Rail Selector (ACH / Same-Day ACH / Wire / RTP /
FedNow / SEPA / SWIFT with live speed, cost, cut-off, finality, limit), a Money Movement Tracker
(initiated → risk hold → clearing → settled, or a return with a real NACHA code), an FX
Quote Ticket (you-send / they-receive with mid-market markup shown in the open + re-pricing timer),
a Reconciliation Match (statement ↔ ledger, matched / unmatched / exception, manual-match
with audit note), a Payment Retry & Dunning ladder (reason-code-driven retry vs.
require-update), a Debit Mandate & Consent capture (live NACHA / SEPA mandate text, grant /
revoke), and a Payout Schedule (available / in-transit / reserve / next payout). Each carries its
NACHA / ISO 20022 / Reg E / SEPA / PSD2 / SOC 1 anchor in its decision logic; mirrors the
new
paymentsdomain in the eds-mcp server. - Category count 222 → 229; synced across meta, JSON-LD, quickjump, and System Card.
Scoped
pay-styles, dual-theme via tokens, vanilla delegated JS, reduced-motion safe.
- Three new live components — build an on-prem AI cluster (folded into AI & ML,
no new filter pill), modelled on EXO (
exo-explore/exo): a Cluster Topology & Memory Pool (add/remove Mac Studio nodes, pooled unified-memory readout, human visual + live machine-readable YAML manifest), a Model Fit & Topology-Aware Partitioning calculator (model + quant + context → est. memory, fits verdict, memory-weighted per-node shard split, Pipeline vs Tensor parallel), and a Distributed Inference & API Surface (streamed completion across the ring, tokens/sec, OpenAI/Claude/Ollama-compatible endpoint). Default = 2× M3 Ultra 128GB + 1× M3 Ultra 512GB = 768GB pooled. Grounded in EXO (RDMA over Thunderbolt 5, tensor parallel 1.8×/3.2×); memory figures labelled estimates. - Category count 219 → 222; synced across meta, JSON-LD, quickjump, and System Card.
Scoped
clx-styles, dual-theme via tokens, vanilla delegated JS, reduced-motion safe.
- Five new live components — build your own AI agent / skill cluster (folded into
the AI & ML domain, no new filter pill): an Agent Definition Builder (template-seeded,
NotebookLM-style editor that renders a live
agent.mdfrom name / role / model / system prompt / source URLs), a Skill Card Editor (liveSKILL.mdwith trigger keywords + resources, where the description is the routing signal), an Agent / Skill Cluster Manager (roster with keyword search, enable/draft toggles), an Expert Team Composer (Design / Code / Marketing / Contract presets that swap the agent roster — Executor / Reviewer / Copywriter / Data-Logic / SEO), and an Adversarial Workflow (SOP) (Diagnostic → Debate → Humanize → Final, with the de-AI constraints and output format). - Category count 214 → 219; synced across meta, JSON-LD, quickjump, and System Card.
Scoped
agm-/agw-styles, dual-theme via tokens, vanilla delegated JS, reduced-motion safe.
- Cross-Platform Rendering extended to cross-browser — a live browser & engine
switcher (Chrome, Edge, Opera, Arc, Brave, DuckDuckGo, Firefox, Tor) mapping eight browsers to three
engines (Blink / Gecko / WebKit), a feature-support matrix (
color-mix(),:has(), custom scrollbars,backdrop-filter, logical properties) with the@supportsfallback per feature, and the defensive contract (feature detection not UA sniffing, system fonts, fluidclamp()layout) that keeps layout pixel-stable on every browser. No new category — count stays 214.
- Eleven new live components across three domains — Tokens & AI Cost (Token Cost Calculator, Tokenizer Estimator, Context-Window Budget, Prompt-Cache Savings, Token Stream Meter), Data Engineering (Schema / Data-Contract Editor with live CREATE TABLE DDL, Data-Quality Profiler, Lineage DAG with upstream/downstream impact tracing, Typed Query Result Grid with type-aware sort, Delta / Version Diff), and a Cross-Platform Rendering section that re-renders one component with native macOS / Windows / Linux (GNOME) / Ubuntu window chrome, font stacks, scrollbars, and ⌘/Ctrl shortcut grammar.
- Category count 203 → 214; synced across meta, JSON-LD, quickjump, and System Card.
Scoped
tk-/dx-/osx-styles, dual-theme via tokens, vanilla delegated JS, reduced-motion safe.
- Data-residency block added to AI-Native Development — running the MCP + agent stack on-prem on enterprise hardware (verified: two NVIDIA DGX Spark / ConnectX, EXO-clustered Mac Studios; gpt-oss-120b, Qwen3.5 122B-A10B, gemma4:31b-it-bf16 served + LoRA-fine-tuned locally). Honest scope: served, not pre-trained.
- Visual cleanup — removed the coloured 3px left-rail accents from the lifecycle/proof/runs cards for a cleaner, less templated look.
- New “AI-Native Development” section — reframes the catalog as a machine-readable contract an AI agent consumes directly: the decisive gap vs an ordinary Figma library, a one-token-every-layer cascade (CSS → JSON → Tailwind → component → AI context → pixel), the 2026 build loop (human / AI / system-guarantee per step), four quality + data-streaming guarantees, an interactive prompt → component demo (order ticket / KYC EDD / AI sign-off), and how to drive it via the token export, Storybook, and the eds-mcp-server.
- Narrative section, no new component categories — count stays 203; tokens,
components, and exports unchanged. Scoped
aidev-styles, dual-theme, vanilla delegated JS.
- Micro-interactions (JS) — six pure-JS components: Count-Up Numbers (rAF ease-out,
tabular numerals), Easing Playground (real spring and bounce physics, not keyframe fakes), Toast Queue
(live manager: max-3 stack, eviction, pause-on-hover, aria-live split), Pointer Tilt Card (damped 3D +
glare, hover-device gated), Magnetic Button + Ripple (6px cap, keyboard ripple from center), and Stagger
Text Reveal (screen-reader-safe character split). Every demo no-ops to its final state under
prefers-reduced-motion. - Accessibility Lab · WCAG 2.1 AA — six live pattern demos: spec-accurate Contrast Checker (relative-luminance formula, AA/AAA grading), Focus Trap with escape + focus restore, Live Region Announcer (polite vs assertive with a visible log), Form Error Summary (GOV.UK-validated pattern with aria-describedby wiring), Skip Link (reveal-on-focus), and Touch Target Size (hit-area overlay, 24px failure vs padded fix). Each cites its success criteria by number.
- Heading semantics repaired sitewide — 63 sections that used
<div>titles converted to real<h2>(and subtitles to<p>): screen-reader users can now navigate all 203 categories by heading. - Category count 191 → 203; counts synced across meta, JSON-LD, quickjump, System Card, command status, and About.
- Two new animation domains, ten new interactive studies — Animation (SaaS): Command Palette Choreography, Plan Upgrade Morph (price odometer + feature cascade), Notification Sweep (sequential read-wave to inbox zero), Integration Handshake (packet flow, gold seal, honest fail/retry state), Workspace Provisioning (spinner-to-check sequence). Animation (Media): Player Morph (mini → theater spring), Chapter Scrub Ripple (eased seek + preview crossfade), Karaoke Caption Reveal (word-level gradient sweep), Story Ring Carousel (SVG countdown ring + layered parallax), Waveform Mood States (idle breathes / playing dances / buffering shimmers).
- Same contract as v1.5.3 — pure CSS + vanilla JS,
data-statedriven with the shareddata-ast-actionhandler, dual-theme tokens only, replay-safe, andprefers-reduced-motionfallbacks that keep the final state readable. Kept deliberately outside Animation Types per the taxonomy rule: types teach the vocabulary, these sections ship complete product moments. - Category count 189 → 191; counts synced across meta, JSON-LD, quickjump, System Card, command status, and About.
- Five complete animation studies added — Private Banking RM Journey Orbit, SaaS Deployment Rail, Consent Signature Ceremony, Permission Constellation, and Executive Insight Storyboard.
- Pure CSS + vanilla JS — no animation library added; interaction state is driven
by scoped
data-stateattributes, CSS transitions/keyframes, and small local event handlers. - Category count remains 189 — this release deepens the existing Animation Types section rather than adding separate catalog categories.
- Animation Types section added — entrance, exit, feedback, loading, data-change, and spatial-transition demos now live beside the existing motion-token reference.
- Production motion contract documented — each animation pattern names duration, easing, use case, risk boundary, and reduced-motion fallback.
- Total category count 188 → 189 — nav, quick filter count, System Card, SEO meta, SoftwareApplication JSON-LD, FAQ JSON-LD, and Getting Started copy aligned.
- Mobile shell hardened — header actions now collapse into a two-column control grid, search takes a full-width row, and the sidebar becomes a sticky horizontal navigation rail with domain filters preserved.
- Page-level overflow eliminated — 390px mobile emulation verifies
scrollWidth = clientWidthfor the overview, dark theme, and AI-filtered states. Hero copy, command-center preview, dense preview bodies, and wide tables now contain their own overflow instead of pushing the viewport. - Dark mobile contrast fixed — body-scoped theme tokens now respect
data-theme="dark", preventing the dark H1 from rendering over a light mobile background. - Getting Started refreshed — System Card bumped to v1.5.1, category count aligned to 188, domain count aligned to 18, and a responsive-readiness signal added to the first-screen evidence layer.
- SEC & ISDA Compliance — 10 new components: SEC Rule 10b5-1 Insider Trading Plan, SEC Form 4 Insider Transaction Ledger, SEC Rule 15c3-3 Customer Protection Reserve Calculator, SEC Reg BI Disclosure Gate, SEC Rule 17a-4 Storage Seal (WORM), ISDA CSA Margin Call Calculator, ISDA Master Agreement Clause Negotiator, ISDA Taxonomy UPI Resolver, ISDA SIMM Risk Exposure Matrix, and ISDA Resolution Stay Protocol Status.
- Total category count 177 → 188
- Artificial Intelligence — 10 new components: Safety Guardrails (LlamaGuard/EU AI Act), RAG Citation Map (SEC/Prospectus chunk mapping), Cost & Token Budget (slider tracker), Agent Loop Execution (DAG flow), Uncertainty Heatmap (token entropy suggestions), Adversarial Prompt Tester (jailbreak matrix), RLHF Pairwise Arena (human preference feedback), Audit Trail Registry (cryptographically sealed blocks), Schema Validator (JSON validation & coercions), and Local Feature Attribution (Integrated Gradients / feature importance).
- Total category count 167 → 177
- Artificial Intelligence — 12 new components: Calibrated Confidence Badge (with a designed abstain state), Reasoning Chain, Autonomy Tier Selector (Ambient → Autonomous), Human Sign-off Gate (typed, hash-sealed), AI Suggestion Card (reject-with-reason as a first-class state), Streaming Response, Prompt Composer (context chips + injection-safe paste), AI Disclosure Label (EU AI Act Art. 50), Model Fallback Chain, Agent Tool-Call Trace, Grounding Indicator (claim-level), and Effective Challenge (SR 11-7 taxonomy + routing).
- Machine Learning — 6 new components: Model Card (with a do-not-use panel), Confusion Matrix (business-cost framing), Feature Importance (anti-causal caveat built in), Drift Monitor (PSI bands + label-delay honesty), Experiment Tracker (reproducibility as admission rule), and Champion–Challenger Gate (promotion blocked by a fairness regression — the blocked state is the point).
- Every new component ships with a ds-logic block (when to use / when not / behaviour
& a11y contract / regulatory anchor) and a new
AI & MLdomain filter. Grounded in shipped patterns: ConnectX autonomy tiers, Aureus Decision Room, Double-Blind sealed commits, Duo-Shou calibrated valuation, Ed's Agent fallback chain.
- ds-logic blocks — a four-cell decision-logic register (When to use / When not to & what instead / Behaviour & accessibility contract / Regulatory anchor) added to the 20 highest-stakes components: the full trading set (Order Entry, Trade Ticket, Order Status, SL/TP, Leverage Selector, Margin Panel, Risk Matrix, Order Book, Price Display) and the compliance set (KYC, Disclosure, Consent, Suitability, Audit Trail), plus the core primitives they compose from (Button, Input, Toggle, Modal, Alert, Data Table).
- Why — a component library shows what; a design system has to defend when and why not. Each anchor cites the governing pattern from production: FIX 35=8 state machine driving order UI, RG 268 modal-decay evidence, FinCEN CDD citation-beside-the-field, SEC 17a-4(f) append-only trail, FINRA 2111 gating.
- No component markup changed — documentation-only release; previews, tokens, and exports untouched.
- Visual polish layer — institutional finance treatment applied across all 149 component
previews in one cascade pass: Cormorant Garamond display + Inter UI body + JetBrains Mono numerals;
gold-accented section underlines and preview-header eyebrows; refined preview-card chrome (subtle
gold-tinted gradient surface + warm shadow + soft gold hover state); unified focus state
(
border-color: var(--gold)+ 3px gold halo) on every native input / select / textarea; Tabler-style chevron SVG replacing default native select arrows. - Component logic — sole-indicator discipline — fixed stacked-indicator bugs where active
states rendered two visual treatments simultaneously: tabs (Single Select / Combobox / Multi-Select)
suppressed the original inline
border-bottom: 2px solid var(--accent2)blue line so the new gold::afterunderline is the sole indicator; sidebar nav active state suppressed the inset blue ring + blue-tint background so the gold left-border + gold gradient is the sole highlight. - Layout-engine fix · full-bleed previews — the default
.ds-preview-body { display: flex; flex-wrap: wrap; }was forcing 60+ full-application components (KYC Stepper, Audit Trail, RBAC Permission Matrix, Multi-Approver Workflow, API Keys & Webhook Manager, etc.) to render as side-by-side flex items with the smaller toolbar/legend collapsing to the left half and the bigger panel squeezed to the right. Two scoped catch-all rules now detect the "I want my own layout" signal (inlinepadding:0orpadding:NNpxwithoutgap:ordisplay:set) and switch those previews todisplay: blockfull-width stacks. 18 padding-zero previews + 43 padding-NNpx previews protected — no further per-component edits required. - Custom control geometry preserved — toggle pills (
.c-toggle: 40×22), custom checkboxes (.c-checkbox: 18×18), and custom radios (.c-radio: 18×18) are now excluded from the universal native-control sizing rule via:not(.c-toggle):not(.c-checkbox):not(.c-radio), fixing the "label clipped to 'rk Mode' / 'yo-Factor Auth'" bug where pseudo-elements were overflowing collapsed boxes. Custom controls retint to gold via colour-only overrides — geometry untouched. - Filter pill polish — the left-sidebar domain filter (All / Foundations / Components / Financial / Compliance / AML / B2B & SaaS / Patterns) reskinned: outlined chips with gold hover border + active state inverts to dark-fill on bone-white text.
- Storybook v1.0 GA — the working component library at edwson.github.io/Ed_Storybook is now feature-complete for v1.0: 9 vanilla-HTML reference components (Button, Input, Select, Chip, Breadcrumb, Toast, Sparkline, Badge, Card) shipped with full Args/Controls panels, light + dark theme toggle, accessibility addon report (WCAG 2.1 AA verified), and copy-paste-ready HTML + CSS for every variant. This is the working dev library that complements the marketing showcase you are reading now.
- Git — clean commit boundary at this release; tag
v1.1.0applied. - No breaking changes from v1.0.x — all token names, component class names, and BEM contracts preserved. Body class hierarchy unchanged. Safe to upgrade in place.
- System Card pinned at top — version, scope, audience, maintainer signature
- New Tokens · Code Export module exposing color / typography / spacing / motion / elevation tokens as CSS, JSON, and Tailwind config (multi-format copy)
- Editorial stance section formalises why the system exists and how to read the catalog
- Promoted from 0.9.x. No breaking changes from 0.9.x — all token names preserved
- 10 AML Compliance components (Sanctions Screening, PEP Monitor, SAR Filing, UBO Graph, Ongoing Monitoring, Jurisdiction Heatmap, CDD Refresh, Typology Library, Regulatory Change Feed, Transaction Risk Scoring) — all anchored to FATF / FinCEN / EU AMLD6 / MAS / OFAC
- 10 B2B SaaS Platform components (Contract Lifecycle, Usage Pricing, Customer Health, Provisioning, Quota Dashboard, Incident Command, Audit Evidence, Partner Deal Reg, ARR Waterfall, SSO/SCIM Console)
- Total category count 126 → 146
- WCAG 2.1 AA contrast verified across all fg/bg pairs in core + semantic palettes
- Deuteranopia-safe semantic colors for trader-facing components (replaces standard red/green with blue/orange where context permits)
- Keyboard navigation documented for all interactive components
- Three density modes (HD / MD / LD) added across data table, order entry, and risk components
- HD targets institutional terminals (≤ 28px row height)
- LD targets retail / advisor portals (≥ 44px row height meeting Fitts'-law thresholds)
- Initial public catalog with 94 categories — UI primitives, financial domain, compliance, data display, social platform
- Light/dark theme via CSS custom properties
- Used as the artifact behind ACY Securities, ACY Connect, Finlogix, and Christie's case studies
Tokens · Code Export
Every foundation token in three formats — CSS custom properties, JSON, and Tailwind config. Copy whatever your stack needs.
No decision register — by designThis is an export format for the tokens above. It has no interface behaviour to govern.
Live Density Switcher
HD compresses trading rows, MD fits analyst dashboards, and LD gives client-facing flows more touch area.
Color tokens · with WCAG contrast
Every text token measured against its own theme background — light on
#f5f6f4, dark on #070b0f. AA = ≥4.5 for normal text · AAA = ≥7.0. Every
hex here is
parsed out of this page’s stylesheet by eds/generate.mjs and every ratio is recomputed from
it
by eds/verify.mjs, so a row cannot claim a level it does not hold.
Light theme · on #f5f6f4
--text1#11171c16.7 : 1AAA--text2#5260636.0 : 1AA--text3#525a5c6.5 : 1AA--accent#18233014.7 : 1AAA--accent2#2c67626.0 : 1AA--green#2069566.0 : 1AA--red#a13e4a5.9 : 1AA--gold#7264485.3 : 1AA--purple#5f69785.1 : 1AA--info-text#0a58f65.2 : 1AA--violet-text#882cfa5.1 : 1AA--mifid-text#2d63cd5.1 : 1AA--price-up-text#3271355.5 : 1AA--price-down-text#bf15115.8 : 1AA--price-pending-text#9659005.2 : 1AADark theme · on #070b0f
--text1#eef2f117.5 : 1AAA--text2#a5b0b08.9 : 1AAA--text3#8a97996.5 : 1AA--accent#e7ece916.5 : 1AAA--accent2#87aaa57.8 : 1AAA--green#82b5a58.6 : 1AAA--red#d276826.3 : 1AA--gold#a89b7f7.2 : 1AAA--purple#8b98a56.7 : 1AA--info-text#5b8ff96.3 : 1AA--violet-text#bb86fc7.5 : 1AAA--mifid-text#5a86db5.5 : 1AA--price-up-text#66bb6a8.3 : 1AAA--price-down-text#f26f6c6.8 : 1AA--price-pending-text#ffa72610.2 : 1AAA:root {
/* Core surfaces */
--bg: #f5f6f4;
--surface: #ffffff;
--surface2: #eef1ef;
--surface3: #e4e9e6;
--border: #d7dedb;
--border2: #b7c2be;
/* Text — every pair below 4.5:1 is a build failure, not a preference */
--text1: #11171c;
--text2: #526063;
--text3: #525a5c;
/* Brand + interactive */
--accent: #182330;
--accent2: #2c6762;
--accent-fg: #ffffff;
--cta: #0a66c2;
--cta-fg: #ffffff;
--cta-hover: #08549f;
/* Semantic */
--green: #206956;
--red: #a13e4a;
--gold: #726448;
--purple: #5f6978;
/* Signal — the -text variant is the readable one; the plain token is a fill */
--info: #5b8ff9;
--info-text: #0a58f6;
--violet: #bb86fc;
--violet-text: #882cfa;
--mifid: #3b6fd4;
--mifid-text: #2d63cd;
/* Price direction — shape carries it too, never colour alone */
--price-up: #66bb6a;
--price-up-text: #327135;
--price-down: #ef5350;
--price-down-text: #bf1511;
--price-pending: #ffa726;
--price-pending-text: #965900;
}
[data-theme="dark"] {
--bg: #070b0f;
--surface: #0d1216;
--surface2: #13191e;
--surface3: #1a2228;
--border: #232d34;
--border2: #33414a;
--text1: #eef2f1;
--text2: #a5b0b0;
--text3: #8a9799;
--accent: #e7ece9;
--accent2: #87aaa5;
--green: #82b5a5;
--red: #d27682;
--gold: #a89b7f;
--purple: #8b98a5;
--accent-fg: #07100f;
--glow: 0 0 0 1px rgba(255, 255, 255, 0.05), 0 22px 60px rgba(0, 0, 0, 0.34);
--info-text: #5b8ff9;
--violet-text: #bb86fc;
--mifid-text: #5a86db;
--cta: #2f86e0;
--cta-fg: #0a0f18;
--cta-hover: #4a97e8;
--price-up-text: #66bb6a;
--price-down-text: #f26f6c;
--price-pending-text: #ffa726;
}
{
"color": {
"bg": "#0a0a12",
"surface": "#12121e",
"surface2": "#1a1c2e",
"border": "#1e2030",
"border2": "#2a2d42",
"text": {
"1": "#e8eaf0",
"2": "#8c95a6",
"3": "#5a6678"
},
"accent": "#6495ed",
"accent2": "#7aabff",
"accentFg": "#0a0a12",
"green": "#16825d",
"red": "#c5303f",
"gold": "#C9A959",
"purple": "#7b1fa2"
}
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
bg: '#0a0a12',
surface: '#12121e',
surface2: '#1a1c2e',
border: '#1e2030',
border2: '#2a2d42',
text: {
1: '#e8eaf0',
2: '#8c95a6',
3: '#5a6678',
},
accent: '#6495ed',
accent2: '#7aabff',
accentFg: '#0a0a12',
green: '#16825d',
red: '#c5303f',
gold: '#C9A959',
purple: '#7b1fa2',
}
}
}
}
Typography tokens
7-step modular scale (1.25× ratio). System fonts for body, monospace for market data and code.
:root {
--font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
--mono: 'SF Mono', 'Fira Code', 'Roboto Mono', 'Courier New', monospace;
--text-2xs: 0.625rem;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.5rem;
--text-2xl: 2rem;
--text-display: 3rem;
--weight-light: 300;
--weight-regular: 400;
--weight-semibold: 600;
--weight-bold: 700;
--leading-tight: 1.2;
--leading-snug: 1.45;
--leading-relaxed: 1.7;
}
{
"font": {
"family": {
"sans": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
"mono": "'SF Mono', 'Fira Code', 'Courier New', monospace"
},
"size": {
"xs": "12px",
"sm": "14px",
"base": "16px",
"lg": "18px",
"xl": "24px",
"2xl": "32px",
"display": "48px"
},
"weight": {
"light": 300,
"regular": 400,
"semibold": 600,
"bold": 700
},
"leading": {
"tight": 1.2,
"snug": 1.45,
"relaxed": 1.7
}
}
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
fontFamily: {
sans: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'],
mono: ['SF Mono', 'Fira Code', 'Courier New', 'monospace'],
},
fontSize: {
xs: ['0.75rem', { lineHeight: '1.45' }],
sm: ['0.875rem', { lineHeight: '1.45' }],
base: ['1rem', { lineHeight: '1.7' }],
lg: ['1.125rem', { lineHeight: '1.45' }],
xl: ['1.5rem', { lineHeight: '1.2' }],
'2xl': ['2rem', { lineHeight: '1.2' }],
display: ['3rem', { lineHeight: '1.2' }],
}
}
}
}
Spacing tokens · 4px base grid
Every gap, padding, and margin maps to this scale. Multiplier of 4 means 1px shifts compound predictably.
:root {
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 24px;
--space-6: 32px;
--space-7: 48px;
--space-8: 64px;
--space-9: 96px;
}
{
"space": {
"1": "4px",
"2": "8px",
"3": "12px",
"4": "16px",
"5": "24px",
"6": "32px",
"7": "48px",
"8": "64px",
"9": "96px"
}
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
spacing: {
1: '4px',
2: '8px',
3: '12px',
4: '16px',
5: '24px',
6: '32px',
7: '48px',
8: '64px',
9: '96px',
}
}
}
}
Motion tokens · duration + easing
Four durations, three easings. Respect prefers-reduced-motion via the
--motion-allow guard.
:root {
--duration-fast: 120ms;
--duration-base: 200ms;
--duration-slow: 320ms;
--duration-slower: 500ms;
--ease: cubic-bezier(0.2, 0.8, 0.2, 1);
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
}
/* The reduced-motion contract is part of the token layer, not an afterthought */
@media (prefers-reduced-motion: reduce) {
:root {
--duration-fast: 0ms;
--duration-base: 0ms;
--duration-slow: 0ms;
--duration-slower: 0ms;
}
}
{
"motion": {
"duration": {
"fast": "120ms",
"base": "200ms",
"slow": "320ms",
"slower": "500ms"
},
"easing": {
"default": "cubic-bezier(0.2, 0.8, 0.2, 1)",
"out": "cubic-bezier(0, 0, 0.2, 1)",
"in": "cubic-bezier(0.4, 0, 1, 1)"
}
}
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
transitionDuration: {
fast: '120ms',
base: '200ms',
slow: '320ms',
slower: '500ms',
},
transitionTimingFunction: {
DEFAULT: 'cubic-bezier(0.2, 0.8, 0.2, 1)',
out: 'cubic-bezier(0, 0, 0.2, 1)',
in: 'cubic-bezier(0.4, 0, 1, 1)',
}
}
}
}
Elevation tokens · 4-step shadow ladder
Subtle gold-tinted shadows on dark surfaces for institutional warmth without losing data legibility.
:root {
--shadow-sm: 0 1px 2px rgba(20, 26, 31, 0.06), 0 0 0 1px rgba(20, 26, 31, 0.02);
--shadow-md: 0 10px 28px rgba(20, 26, 31, 0.08), 0 1px 2px rgba(20, 26, 31, 0.04);
--shadow-lg: 0 24px 70px rgba(20, 26, 31, 0.14), 0 4px 16px rgba(20, 26, 31, 0.06);
--shadow-xl: 0 24px 64px rgba(20, 26, 31, 0.18), 0 8px 24px rgba(20, 26, 31, 0.08);
--radius-xs: 4px;
--radius-sm: 6px;
--radius: 8px;
--radius-lg: 12px;
--radius-pill: 9999px;
}
{
"shadow": {
"sm": "0 1px 2px rgba(0,0,0,0.45)",
"md": "0 4px 12px rgba(0,0,0,0.40), 0 0 0 1px rgba(201,169,89,0.04)",
"lg": "0 12px 32px rgba(0,0,0,0.55), 0 0 16px rgba(201,169,89,0.08)",
"xl": "0 24px 64px rgba(0,0,0,0.65), 0 0 24px rgba(201,169,89,0.12)"
},
"radius": {
"sm": "4px",
"DEFAULT": "8px",
"lg": "12px",
"pill": "9999px"
}
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
boxShadow: {
sm: '0 1px 2px rgba(0,0,0,0.45)',
md: '0 4px 12px rgba(0,0,0,0.40), 0 0 0 1px rgba(201,169,89,0.04)',
lg: '0 12px 32px rgba(0,0,0,0.55), 0 0 16px rgba(201,169,89,0.08)',
xl: '0 24px 64px rgba(0,0,0,0.65), 0 0 24px rgba(201,169,89,0.12)',
},
borderRadius: {
sm: '4px',
DEFAULT: '8px',
lg: '12px',
pill: '9999px',
}
}
}
}
Color
The color system supports visual hierarchy, accessibility, and product differentiation. All tokens respond to light/dark theme toggle.
No decision register — by designA token set is not a usage decision. There is no “when not to use colour”; the decisions live in the components that consume these tokens, and every one of them states its contrast obligation in its own register. Recording a register here would be padding the count.
Core Palette
Live Theme Switcher
Preview how core components react to token changes without leaving the color foundation.
Semantic Colors
Accessibility: Color-Blind Safe
Typography
A clear type hierarchy optimized for financial data density. System fonts for performance; monospace for market data.
No decision register — by designSame reason as the colour tokens: a type scale is a foundation the components decide with, not a component with a use-or-not choice. The binding rules — minimum sizes, text-spacing tolerance, monospace for tabular figures — appear in the registers of the components that apply them.
Display / 48px / Weight 300
H1 / 32px / Weight 400
H2 / 24px / Weight 600
H3 / 18px / Weight 600
Body / 16px / Weight 400 / Line-height 1.7
Caption / 12px / Weight 600 / Uppercase
Monospace / Data / 14px
Spacing
A 4px base grid ensures consistent rhythm across all components. Spacing tokens scale from 4px to 96px.
No decision register — by designA 4px scale has no misuse case that can be stated as “use something else instead”. Where spacing carries an obligation it is a target-size one, and that is recorded in the density register where it actually binds.
| Token | Value | Usage |
|---|---|---|
--space-1 |
4px | Inline icon gaps, minimal padding |
--space-2 |
8px | Compact padding, tag gaps |
--space-3 |
12px | Input padding, button gaps |
--space-4 |
16px | Card padding, section gaps |
--space-6 |
24px | Content padding, grid gaps |
--space-8 |
32px | Section separation |
--space-12 |
48px | Major section margins |
--space-16 |
64px | Page-level spacing |
Elevation
Elevation communicates hierarchy and interactivity. Shadows scale from subtle borders to prominent overlays.
No decision register — by designShadow tokens are a visual layer over decisions made elsewhere. The real rule — that elevation must never be the only signal of interactivity or of state — is stated in the card, drawer and modal registers, which are the places it can be violated.
Iconography
Tabler-based SVG icon system — 5 semantic categories, 3 density sizes, consistent 2px stroke weight. Every icon is inline SVG for full colour control and zero network requests. Click any icon to copy its SVG.
No decision register — by designAn icon set is an asset, not a pattern. The decision that matters — that an icon is never the sole carrier of meaning — belongs to each component that places one, and is recorded there.
| Token | HD (dense) | MD (default) | LD (comfortable) | Stroke | Usage |
|---|---|---|---|---|---|
--icon-xs |
12px | 14px | 16px | 1.5px | Inline text, badges, table cells |
--icon-sm |
14px | 16px | 18px | 2px | Buttons, input adornments |
--icon-md |
18px | 20px | 24px | 2px | Navigation, cards, tabs |
--icon-lg |
24px | 28px | 32px | 1.5px | Feature icons, empty states |
--icon-xl |
32px | 40px | 48px | 1.5px | Hero, onboarding illustrations |
Button
Buttons trigger actions. Variants communicate importance hierarchy from primary CTA to ghost actions.
Use for actions — submit, confirm, execute — never for navigation (that is a link). One primary button per view region; the hierarchy is the decision, not the decoration.
Do not use danger styling for emphasis — it is reserved for destructive or capital-committing actions, and those always pair with a confirm step. Avoid icon-only buttons for irreversible actions.
Loading state disables the control and sets aria-busy to prevent double-submit — in an order path, a double-click is a duplicate order. Focus ring is never removed, only restyled.
Destructive financial actions (close position, cancel all) require a typed or two-step confirm so the action leaves an auditable intent trail (SEC 17a-4 discipline).
Variants
Sizes
States
With Icons
Input
Form inputs for financial data entry. States communicate validation status for compliance workflows.
Use for free-form single-line entry. Labels are always visible — placeholder-as-label fails the moment a user starts typing, and screen readers lose context.
Do not validate on submit only. Financial forms validate pre-flight, field by field, because a round-trip costs latency the user can feel (the FIX order-entry budget is 8–12ms).
Errors bind via aria-describedby and never rely on colour alone. Numeric fields use inputmode + tabular-nums so digits align in review.
Fields collecting personal data show why beside the field — in-context citation reduced KYC support tickets and lifted completion in the EDD studies.
Toggle & Checkbox
Selection controls for settings and multi-choice forms.
Toggle is for instant-effect settings only — the state change IS the action. Checkbox is for declarations collected now, applied on submit.
Never use a toggle where a submit follows — the user cannot tell whether the change took effect. Never pre-tick consent checkboxes.
Both controls keep a 44px touch target regardless of visual size; state is announced via aria-checked, not colour.
Consent to data processing or marketing must be an explicit affirmative act — unticked by default, granular per purpose, with withdrawal on the same surface (GDPR / MiFID client-communication rules).
Badge & Tag
Status indicators and categorical labels for financial workflows.
Labelling a state or a category that the reader needs to see without reading the row — order status, account tier, risk band.
Never as the only carrier of a state that changes what the reader may do: a badge is a summary, and a summary is not a permission. Never use one for a count that keeps moving, and never stack more than two on a row — past two, nothing is emphasised.
The badge text is the state, so it is announced without needing its colour; the colour is redundant. Where it labels a control, it is inside that control's accessible name rather than adjacent to it, because adjacency is a visual relationship only.
WCAG 2.2 SC 1.4.1 Use of Colour and SC 1.4.3 Contrast (Minimum). Badges fail contrast more often than any other component in this catalogue, because tinted backgrounds get chosen for the tint rather than for the ratio.
Card
Cards group related content and data. Hover states signal interactivity.
Grouping content that is read and acted on as one unit, where the grouping is meaningful rather than decorative.
Never as a container for a single sentence — a card around one line of text adds a boundary and no grouping. Never make the whole card clickable while also placing links inside it: the nested target is unreachable by keyboard and ambiguous by mouse.
Where the card is a link, the accessible name is the heading, not the whole content; where it holds several actions, it is a region with a heading and the actions are separately labelled. Hover elevation is never the only affordance — focus must be visible too.
The single-target rule is the register entry: one card, one primary destination. Everything that goes wrong with cards downstream is a violation of it.
Alert & Toast
Feedback patterns for system messages, confirmations, and compliance notifications.
Severity maps to consequence, not excitement: info (no action), warning (action may be needed), critical (action required now). The ladder is fixed system-wide so colour carries meaning.
Toasts auto-dismiss, so they never carry compliance-relevant or loss-relevant information — anything a user might need to prove they saw must persist until acknowledged.
Alerts announce via aria-live (polite for info, assertive for critical). Icons + colour dual-encode severity for colour-blind users.
Margin calls and trade rejections render as persistent banners with timestamps, never toasts — if it can end up in a dispute, it stays on screen and in the log.
Inline Alerts
Toast Notifications
Data Table
Sortable data tables for portfolio holdings, transaction history, and compliance logs.
The default register for financial data. Numbers right-align in tabular-nums; text left-aligns; headers are real th elements with scope.
Do not centre numeric columns or truncate identifiers (order IDs, ISINs) — truncation is how a wrong-instrument error survives review.
Sticky headers above 20 rows; sort state is visible and announced; density is a user setting, not a designer preference.
Columns that feed compliance review (timestamps, venue, status) are never hideable — configurability stops where the audit requirement starts.
| Asset Class | Allocation | Value | YTD Return |
|---|---|---|---|
| Equities | 42% | $10,291,008 | +12.4% |
| Fixed Income | 28% | $6,860,672 | +4.1% |
| Alternatives | 18% | $4,410,432 | +9.8% |
| Real Estate | 8% | $1,960,192 | +3.2% |
| Cash | 4% | $980,096 | +0.2% |
Progress
Progress indicators for onboarding flows, file uploads, and multi-step compliance processes.
Reporting the state of an operation the user is waiting on, where the total is known and the wait is long enough to need reassurance.
Never where the duration is unknown — that is a spinner or a status message, and a bar that fills to 90% and stops is worse than no bar. Never as a step tracker for a form; that is the step indicator, and conflating them hides which steps are complete.
The value, maximum and current unit are all programmatically exposed; the percentage is also stated in text. Updates are announced at meaningful thresholds, not on every increment.
WCAG 2.2 SC 4.1.2 Name, Role, Value for the progressbar role, and SC 2.2.1 where a determinate operation has a timeout attached to it.
Modal & Dialog
Modals for confirmations, signatures, and compliance acknowledgments. Focus-trapped with keyboard navigation (WCAG 2.1 AA).
Interrupt only when the user must decide before anything else can happen: irreversible actions, capital commitment, regulatory acknowledgement.
Do not use modals for repeat disclosures — the 18-month RG 268 study showed dismissal time decays from 18s to 0.6s as muscle memory forms. Repeat-exposure content belongs inline at the decision point.
Focus is trapped, Escape closes (unless legally gated), focus returns to the trigger on close. Exactly one primary action; the safe option is never visually dominant by accident.
When a modal carries a regulatory acknowledgement, the render event and dismissal are logged with timestamps — the audit trail is the deliverable, not the pixels.
Tooltip
Contextual hints for data points, regulatory terms, and abbreviations. Accessible via keyboard focus.
A short clarification of something already visible — an abbreviation, a regulatory term, a column header that had to be shortened.
Never for content the reader needs in order to act: a tooltip is unreachable on touch, invisible in print, and gone the moment the pointer moves. Never put an interactive element inside one.
Reachable on keyboard focus as well as hover, dismissible with Escape without moving focus, and persistent
enough to move the pointer into it — the three conditions of WCAG 1.4.13. The trigger keeps its own
accessible name; the tooltip supplements it via aria-describedby.
WCAG 2.2 SC 1.4.13 Content on Hover or Focus: dismissable, hoverable, persistent. Most tooltip implementations fail all three, which is why the register entry is the criterion rather than a style note.
Avatar
User identity indicators for RM profiles, client accounts, and team displays.
Identifying a person or an account where the face or initial is a recognition aid alongside the name.
Never as the only identifier — an avatar without a name is unreadable to a screen reader and ambiguous to everyone else. Never generate initials from a name without handling single-word and non-Latin names, which is where the pattern silently breaks.
Decorative when the name is adjacent (alt=""), named when it stands alone. Presence and status
indicators are stated in words in the accessible name, not implied by a coloured dot on the corner.
The rule is that the avatar is redundant by design: it accelerates recognition for sighted readers and carries no information that is not also in text.
Skeleton
Loading placeholders that maintain layout structure while data fetches. Reduces perceived latency.
Loading states where the layout is known in advance and the wait is long enough for a blank area to read as an error.
Never for waits under about 300ms — the flash is more disruptive than the wait. Never where the eventual layout is unknown, because a skeleton that does not match what arrives causes a second, worse reflow. Never as a permanent state when the fetch fails; a skeleton that never resolves is a page that lies.
The region is marked busy so assistive technology does not read placeholder structure as content, and the
loaded state is announced once. The shimmer respects prefers-reduced-motion and falls back to a
static tint.
WCAG 2.2 SC 2.3.3 Animation from Interactions is the reduced-motion obligation; SC 4.1.3 Status Messages covers announcing completion without moving focus.
Disclosure
Regulatory disclosure patterns for SEC, FINRA, and ASIC requirements. Expandable by default to meet visibility mandates while preserving UI cleanliness.
Disclosure is a render event, not a paragraph: jurisdiction-routed copy computed from client × product × licence, logged with a timestamp when it enters the viewport.
Never reuse one global disclosure string — the RG 268 engagement standard is jurisdiction-specific, and generic text fails it even when displayed correctly.
Contextual inline at the decision point beat modal and header-strip patterns across 18 months: 1.6s sustained read, 0.4% abandonment, and it survived two regulation revisions without redesign.
The backend event log is the deliverable — when the regulator asks 'was it shown, when, in what form', Legal answers from the log, not from a screenshot.
Risk Disclosure (ASIC)
Consent Flow
Stepped consent patterns for GDPR, COPPA, and financial services agreements. Consent is recorded with timestamp for audit trail compliance.
Granular, per-purpose consent collected at the moment the purpose becomes real — not a wall of checkboxes at signup for things that may never happen.
Pre-ticked boxes and bundled consent are design debt that becomes a finding. Decline is always as reachable as accept.
The consent record stores what was shown (copy version), when, and the affirmative act — versioned copy because the text at the time of consent is what was consented to.
Withdrawal lives on the same surface as the grant (GDPR Art. 7(3) symmetry) — burying revocation in support email is the anti-pattern this component exists to prevent.
KYC Stepper
Multi-step Know Your Customer onboarding. Progressive disclosure collects all AML/FINRA-required information across 5 validated steps — Identity, Source of Wealth, Entity Structure, Investment Policy, and Compliance Review.
Progressive disclosure, one question per screen — the 'dentist model': never show the whole instrument tray at once. Completion doubled (27% → 55%, GA4) when the wall became a corridor.
Do not front-load document upload — sequence identity → residency → income → source of funds so each ask is anchored by the trust built before it.
Save-and-resume via 30-day magic link, because UHNW clients need days to locate source-of-wealth documents. Abandonment is mostly a pause, not a refusal — unless you make resuming impossible.
Every intrusive question cites its regulation beside the field (FinCEN CDD 31 CFR § 1010.230, FATF Rec 10) — sophisticated clients respond to legal framing, not friendly copy.
Risk Warning
Contextual risk indicators for leveraged products, margin calls, and position sizing. ASIC and ESMA mandated visibility at point of action.
Alongside the control that creates the exposure — the leverage selector, the size field, the confirm button — so the warning is read in the same glance as the decision.
Never as a page-level banner or a footer block: a warning that is not adjacent to the action is a warning the user has already scrolled past. Never as an interstitial the user dismisses once per session; the obligation attaches to the action, not to the session.
The warning is text in the flow, not a tooltip and not title=; it is inside the labelled group
of the control it qualifies, so a screen reader reaches it before the input rather than after. It never
animates in, and it is never the only thing distinguishing two states.
ESMA and ASIC both require the loss-percentage disclosure to be prominent and adjacent to the point of action for retail CFD clients — ESMA's 2018 product-intervention measures, carried into national regimes, and ASIC RG 227. “Prominent” is a layout requirement, which is why it is a component decision and not a copy decision.
Suitability
FINRA Rule 2111 suitability assessment components. Captures risk tolerance, investment horizon, and financial situation for compliance-grade audit trails.
The FINRA 2111 / Reg BI gate rendered as product UI: the questionnaire scores into a profile, and the profile gates product access — visibly, with reasons.
Suitability is not advisory copy beside a buy button. If the gate can be scrolled past, it is not a gate — it is decoration that a plaintiff's lawyer will screenshot.
A failed gate routes to education and a cooling-off path, never to a retry-until-pass loop — retake limits are part of the control.
Answers, score, and gate outcome are stored against the copy version shown — the suitability decision must be reconstructable years later.
Session Timeout
Session management for authenticated financial portals. Preserves in-progress state and provides graceful re-authentication (WCAG 2.2.1 Timing Adjustable).
Any authenticated surface where an idle session must end, and where the user may have unsaved work in progress — an order ticket, a partially completed onboarding form, an unfiled report.
Never as a hard logout with no warning and no state preservation. Never with a timeout the user cannot extend, and never on a read-only surface where the only thing at risk is the reading position.
WCAG 2.2.1 Timing Adjustable is the contract: warn the user before the limit expires and give them at least 20 seconds to extend it with a simple action, and preserve in-progress state across re-authentication. The countdown is announced politely rather than assertively, so it does not interrupt typing; the extend control is reachable by keyboard without leaving the field the user was in.
WCAG 2.2 SC 2.2.1 (Timing Adjustable, Level A). The exemption for “real-time exception” and for security-essential limits is narrow: it permits the timeout, not the loss of the user's work.
Session Expiring Soon
Your session will expire in 4:59. Any unsaved progress will be preserved. Click below to continue working.
Accordion
Expandable content panels for FAQ, regulatory disclosures, and progressive information architecture.
Long reference content where the reader wants one section at a time — disclosures, FAQs, layered policy text.
Never to hide something the reader is required to have been shown: collapsing a mandated disclosure behind a control is a design decision about whether it was disclosed. Never for content under about three lines, where the toggle costs more than the space it saves.
Headers are real buttons inside heading elements, with aria-expanded reflecting state; the
panel is associated with its trigger. Collapsed content is genuinely removed from the accessibility tree
rather than visually hidden while still being read.
Where the panel holds a regulatory disclosure, prominence requirements apply — ESMA and FCA both treat placement as part of whether a warning was given. That is why “never collapse a mandated warning” is in the register rather than in a style guide.
Tabs
Content segmentation for multi-view interfaces. Active tab maintains keyboard focus for WCAG compliance.
Parallel views of the same subject where only one is relevant at a time and the reader switches between them freely.
Never for sequential steps — that is a wizard, and tabs invite skipping. Never where the reader needs to compare two panels; that is a split view. Never hide a required form field in an inactive tab, which produces a validation error pointing at something invisible.
Roving tabindex with arrow-key navigation, aria-selected on the active tab, and the panel
labelled by its tab. Activating a tab does not move focus into the panel unless the panel is the next
logical stop.
WCAG 2.2 SC 2.4.3 Focus Order and SC 4.1.2. The ARIA Authoring Practices tab pattern is followed exactly, because a partially-implemented tablist is less usable than plain links.
Breadcrumb
Navigation trail for deep hierarchies. Provides context within multi-level information architecture.
Deep hierarchies where the reader arrived directly and needs to know where they are before they can decide where to go.
Never as a substitute for primary navigation, and never as a history trail — a breadcrumb describes structure, not the path the reader took. Never truncate the current page's ancestor to an ellipsis without making it reachable.
A navigation landmark with an accessible name, an ordered list inside, and the current page marked
aria-current="page" rather than merely unlinked. Separators are decorative and hidden from
assistive technology.
The distinction between structure and history is the register entry: a trail that reflects where the reader came from is a different component with different guarantees, and conflating them makes both unreliable.
Pagination
Page navigation for transaction logs, audit trails, and large data sets.
Large record sets an operator works through and returns to, where the position has to be stable across a reload and shareable with a colleague.
Not for a feed someone scans continuously — that is infinite scroll. And never where the user must be able to say they saw everything: for completeness, give them a filtered, counted view rather than pages they can lose their place in.
A landmark with an accessible name; the current page carries aria-current="page"; the visible range is stated in words (“41–60 of 1,284”) and re-announced when it changes, because a page control that only redraws is silent to half its users.
The total is always shown. “How many are there” is the first question in any review, and a pager that hides the count quietly converts a review into a sample.
Divider
Visual separators for content sections. Horizontal and labeled variants.
Separating groups within a surface where whitespace alone has not made the grouping read, or where a labelled divider names the group that follows.
Never between every item in a list — a rule between each row makes the list heavier and the grouping less visible. Never to substitute for a heading: if the section deserves a boundary, it usually deserves a name.
Decorative by default and hidden from assistive technology; a labelled divider is a heading and marked as one, not a rule with text sitting on it. Contrast is checked as a non-text element rather than left at whatever the border token happens to be.
WCAG 2.2 SC 1.4.11 Non-text Contrast where the divider carries meaning. A divider that fails it is invisible to some readers, which turns a deliberate grouping into an accidental one.
Or continue with
Regulatory Disclosure
Dropdown
Action menus and selection lists with keyboard navigation support.
An action menu or a short selection list where the options are commands rather than form values.
Never for a form field with a fixed set of values — that is a select, and menus do not submit. Never with more than about ten items and no grouping, and never as the only path to a destructive action.
Menu semantics with arrow-key navigation, Escape to close returning focus to the trigger, and typeahead on first letter. The trigger states its expanded state; the menu is not reachable in the tab order while closed.
WCAG 2.2 SC 2.1.2 No Keyboard Trap and SC 2.4.3 Focus Order. The focus-return-on-close rule is the one most often skipped, and skipping it strands keyboard users at the top of the document.
Spinner
Loading indicators for asynchronous operations. Sizes scale with density mode.
Indeterminate waits where the duration cannot be known and the region affected is small.
Never for a wait longer than about ten seconds without a message explaining what is happening — an unexplained spinner past that point reads as a hang. Never as a page-level loader where a skeleton would preserve layout, and never more than one per region.
The spinner carries a status role with a text label such as “Loading positions”, announced once rather than
continuously. It respects prefers-reduced-motion by slowing rather than stopping, since
stopping removes the only signal.
WCAG 2.2 SC 4.1.3 Status Messages: the fact that something is loading has to reach assistive technology without stealing focus.
Banner
Page-level announcements for system maintenance, regulatory updates, and critical alerts.
Page-level information that applies to everything below it — planned maintenance, a regulatory notice, a degraded service.
Never for feedback about an action the reader just took; that belongs next to the action. Never stack banners — the second one guarantees the first is not read. Never make a critical banner dismissible without a way back to it.
Severity is a word in the text, not only an icon and a tint. Critical banners use an alert role and are announced; informational ones do not interrupt. The dismiss control states what is being dismissed.
WCAG 2.2 SC 1.4.1 and SC 4.1.3. Where the banner carries a mandated notice, dismissibility becomes a compliance question rather than a UX one — which is why the register says so.
Empty State
Placeholder content when data is unavailable. Provides context and actionable next steps.
A surface with nothing in it yet, where the reader needs to know whether that is normal, an error, or something they can fix.
Never as a bare “no data” — that leaves the reader unable to distinguish an empty result from a broken query. Never show the same empty state for a first-run, a filtered-to-nothing and a failed fetch; they need three different next actions.
The state is announced when it replaces content, and the primary action is a real control rather than an illustration with a caption. The illustration is decorative.
The register entry is the three-way distinction: first-run, filtered-empty and error are different states, and a single empty component that cannot tell them apart is a defect rather than a simplification.
No Transactions Yet
Once your investment proposal is approved, transactions will appear here with full audit trail.
Drawer
Slide-out panels for detail views, filters, and secondary content without leaving context.
Detail or filter content that the reader needs alongside their current context, without losing their place in the underlying view.
Never for a decision that must be made before continuing — that is a modal, and a dismissible drawer makes a required choice optional. Never nest drawers; the second one has no coherent dismissal behaviour.
Focus moves into the drawer on open and returns to the trigger on close; Escape closes. When modal, the background is inert and the drawer is a dialog; when non-modal, the background stays operable and the drawer is a complementary region — the two are not interchangeable.
WCAG 2.2 SC 2.1.2, SC 2.4.3, and SC 2.4.11 Focus Not Obscured — the last one being the criterion a drawer overlapping a focused field in the page behind it fails.
Client Details
File Upload
Document upload for KYC verification, tax forms, and compliance documentation.
Document collection where the file is evidence — identity documents, tax forms, compliance attachments — and rejection has to be explainable.
Never drag-and-drop only: it is unusable by keyboard and unreliable on touch, so the file input is the primary path and the drop zone is the enhancement. Never reject silently for size or type; state the limit and the accepted formats before the attempt, not after.
The drop zone is a labelled input; upload progress and completion are announced; each accepted file is listed with a remove control that names the file. Errors name the file and the reason.
Where documents are collected for identity verification, GDPR Art 5(1)(c) data minimisation applies: the interface should ask for the document the risk tier requires rather than a standard set, and the register records that as a design constraint.
Textarea
Multi-line text input for notes, descriptions, and compliance remarks.
Free text of more than one line — case notes, compliance remarks, narrative fields that will later be read by someone else.
Never with a character limit that is not stated before the reader starts typing. Never rely on placeholder text as the label, and never auto-grow without a maximum, which turns a long note into a page the reader cannot navigate out of.
A visible persistent label, the limit and remaining count exposed as a status rather than announced per keystroke, and validation on blur rather than on input. Resize is not disabled.
WCAG 2.2 SC 3.3.2 Labels or Instructions and SC 1.3.1. The placeholder-as-label failure is the most common one in this component and it fails both.
Chip Select
Multi-select chips for filtering, tagging, and categorical selection.
Multi-select where the active choices need to stay visible while the reader keeps working — filters, tags, categories.
Never for a single exclusive choice; that is a radio group. Never where the option list is long enough to wrap past two rows — at that point a combobox with tags carries the same meaning in less space.
Each chip is a button or a checkbox with its selected state programmatically exposed; removal is a distinct control with its own accessible name (“remove EUR filter”), never a bare ×. The selected count is announced on change.
The reason to choose chips over a dropdown is that every active criterion stays visible; any variant that collapses them into a count has given up the property the pattern was chosen for.
Timeline
Chronological event display for audit trails, trade history, and compliance logs.
Chronology reconstructed across systems — applied, screened, approved, settled — on one axis, read to answer what happened, in what order.
Not a substitute for the Audit Trail where the record is evidence. A timeline renders history; it does not seal it. If the question is “can this be altered without anyone noticing”, the answer has to be the WORM-backed trail, not this.
Marked up as an ordered list so the sequence survives without the visual axis. Every event is a sentence with an absolute timestamp; relative phrasing (“2 days ago”) always carries the absolute value beside it, because relative time is unreadable in an exported record.
Each event names the system it came from. A merged chronology whose provenance is invisible cannot be reconciled against the source of record, which is the only reason anyone opens it.
Stat / Metric
Key performance indicators and summary metrics for dashboards and reports.
A headline figure on a dashboard, read at a glance, usually with a comparison to a prior period.
Never without the period the figure covers and the basis of the comparison — “+12%” with no window is not a fact. Never colour the delta without also signing it, and never round to a precision the underlying data does not support.
The label, value, unit and comparison are one accessible name so the figure is read as a sentence rather than as four fragments. Trend arrows are decorative alongside the signed number.
The register entry is that a stat is a claim: the period, the basis and the precision are part of the component, not caption text that can be dropped when space is tight.
Key-Value
Structured data display for account details, transaction records, and compliance metadata.
A fixed set of read-only attributes about one entity, scanned rather than compared — an account, a candidate, a transaction.
Not for comparing entities: two of these side by side is a table wearing the wrong clothes. Not for editable fields either, which need real labels, validation and an error path.
A real definition list, so a screen reader pairs each term with its value rather than reading two unrelated columns. Identifiers stay selectable and never truncate — a half-copied reference is worse than no reference.
Fields that feed the decision sit above the fold and the rest collapse. Recall order is a design decision here, not the order the API happened to return.
Link
Navigational links with accessible focus indicators. External links include visual indicator per WCAG.
Navigation to another location — within the page, within the product, or out to a third party.
Never for an action that changes state; that is a button, and the distinction is what tells a keyboard user whether Enter or Space applies. Never use “click here” or a bare URL as the link text, and never open a new tab without saying so.
The accessible name describes the destination out of context, because screen reader users navigate by link list. External links carry a text or a labelled-icon indicator, and target changes are announced in the name rather than only by an icon.
WCAG 2.2 SC 2.4.4 Link Purpose (In Context), SC 3.2.5 Change on Request for the new-tab behaviour, and SC 1.4.1 where the link is distinguished from body text by colour alone — which fails unless the contrast between link and text is at least 3:1 or another visual cue is present.
Step Indicator
Compact horizontal step tracker for multi-step flows.
A multi-step flow where the reader benefits from knowing how many steps remain and which are complete.
Never where steps can be completed out of order and the indicator implies they cannot, and never where the number of steps is not known in advance. Never use it as navigation unless the completed steps are genuinely revisitable.
Current step is stated as “step 3 of 6” in text as well as visually; completed, current and upcoming states are words in the accessible name rather than colour and fill. Where steps are links, the disabled future ones are not focusable.
WCAG 2.2 SC 1.3.1 Info and Relationships and SC 1.4.1. The failure this prevents is a flow whose progress is legible only as a row of filled circles.
Price Display
Real-time price rendering with directional indicators, color coding, and flash-on-change animation.
The atomic unit of every trading surface. Tabular numerals, fixed decimal precision per instrument convention, tick direction encoded by colour AND glyph.
Never animate price changes with movement — a blinking or sliding price draws attention disproportionate to its information. Flash the background, not the position.
Colour-only tick direction fails colour-blind users on the highest-stakes signal on screen — the arrow glyph is non-negotiable.
A stale quote is a risk event: past the staleness threshold the price greys out and timestamps itself rather than silently showing the last print.
Order Entry
Trade execution form with buy/sell toggle, order type selection, and pre-trade risk check.
The highest-stakes form in the system. Validation is pre-flight and continuous — by the time SEND activates, rejection should be near-impossible.
No confirm modal on the hot path — it adds 300–500ms of human dismissal and trains click-through. Use reversible execution instead: one-click send, a visible 3-second cancel window on the blotter.
Keyboard-first: every field reachable without a mouse, shortcuts for size presets, Enter is never bound to SEND without explicit arming.
UI state is driven by the FIX ExecutionReport (35=8) state machine — what the venue says happened, not what the click intended. That distinction is the audit trail.
Position Card
Active position display with real-time P&L, entry price, and allocation weight.
A held position where entry, current value, unrealised P&L and portfolio weight are read together — typically the blotter row a trader scans before deciding to add or close.
Never as the confirmation surface for an action: a card that both reports a position and closes it invites a click on stale data. Never show unrealised P&L without the price it was struck from and the time it was struck at.
Every figure carries its currency and its sign in text; the timestamp of the quote is present, because a P&L without a time is a claim about now that may be about ten minutes ago. Live updates are announced politely and throttled, never per tick.
The constraint is staleness, not layout: a position card is a snapshot of a moving number, so the design decision that matters is publishing the moment it was true rather than implying it is continuous.
Trade Ticket
Confirmation receipt for executed trades with compliance-grade audit metadata.
The decision surface: instrument, size, direction, and consequence in one frame. Margin impact and worst-case loss render before submit, not after.
Do not collapse the ticket into a one-tap buy button for leveraged products — friction at the point of leverage is a regulatory feature, not a UX failure.
Size steppers respect lot conventions; switching direction re-runs validation; everything visible at 360px width because the mobile ticket is the real ticket.
Suitability gating (FINRA 2111 / ASIC RG 227): if the client profile fails the product gate, the ticket routes to education — it never just hides the button.
P&L Display
Profit and loss rendering with directional formatting, color coding, and arrow indicators.
Any rendering of a gain or loss where the reader needs direction and magnitude at a glance.
Never with colour as the only carrier of direction — red/green is the single most common accessibility failure in trading interfaces, and it fails for roughly one in twelve men. Never with a locale-ambiguous number: 1,234.56 and 1.234,56 are different figures and the reader cannot tell which convention is in force from the digits alone.
Direction is a sign or a word in the text, with colour and the arrow as redundant encodings on top. Currency and, where relevant, the base of the percentage are stated. Values are announced on change only when the change is user-initiated; a tape that announces every tick is unusable with a screen reader.
WCAG 2.2 SC 1.4.1 Use of Colour: colour must not be the only visual means of conveying information. In a P&L this is not a styling preference — the sign is the content.
Watchlist Row
Compact instrument display for watchlists with sparkline area, last price, and change.
A dense list where the reader is scanning many instruments for movement, and each row must fit the same vertical rhythm.
Never as the surface a trade is placed from: a compact row cannot carry enough context to size an order, and putting the action there produces mistakes at exactly the moment the reader is scanning fastest. Never let the sparkline be the only indication of direction.
Each row is a link or a button with a single accessible name that includes the symbol and the change, so a screen reader user is not forced through four cells to identify a row. The sparkline is decorative and marked as such, with the change stated numerically alongside.
Row density is the design constraint that generates everything else here: at this height there is no room for a second line, so anything that cannot be said in the accessible name is not part of this component.
Sparkline
Inline mini-charts for trend visualization within table rows, cards, and compact displays.
Inline trend indication inside a table row or a card, where the shape is a hint and a full chart would not fit.
Never where the exact value matters — a sparkline has no axis and no scale, so reading a level off it is guesswork. Never as the only representation of a series a decision depends on; pair it with the number or link to the real chart.
The sparkline is aria-hidden with the trend stated in adjacent text, because an unlabelled
path element announces as nothing. Where it is interactive, it stops being decorative and needs a full
accessible description.
The honest limit of the pattern is that it is unquantified by construction. Treating it as a chart is the misuse; treating it as a hint next to a number is the correct one.
Depth Indicator
Order book depth visualization showing bid/ask volume at each price level.
Showing resting bid and ask volume by price level, where the reader is judging whether size can be worked without moving the market.
Never as a liquidity guarantee: displayed depth is not committed depth, and rendering it as a solid block implies a fill that may not exist. Never aggregate levels without saying so — a chart bucketed to the nearest tick and one showing raw levels tell different stories.
Levels are reachable as a table of price and size, not only as a rendered shape; the aggregation interval is stated. Bid and ask sides are labelled in words, not distinguished by colour alone.
The design constraint is the gap between displayed and executable liquidity. The component's job is to keep that gap visible rather than to make the book look deeper than it is.
Heatmap Cell
Color-intensity cells for market sector performance, correlation matrices, and risk grids.
Comparing one measure across many cells — sectors, correlations, country exposures — where the pattern matters more than any single value.
Never without the value available per cell: a heatmap is a summary, and a reader who needs the number and cannot get it will estimate it from the colour, badly. Never with a rainbow scale, which has no perceptual order and invents boundaries that are not in the data.
Each cell's accessible name carries its label and its value; the scale is stated with endpoints and with what the midpoint means. A sequential or diverging ramp is used according to whether the data has a meaningful zero, and the ramp is checked against the two most common forms of colour vision deficiency.
WCAG 2.2 SC 1.4.1 again, and SC 1.4.11 Non-text Contrast for the cell boundaries. A heatmap that fails these is not a chart with an accessibility issue — it is a chart that a substantial minority of readers reads a different pattern from.
Order Book
Full bid/ask price ladder with quantity, cumulative depth bars, and spread highlight. Designed for HD-density trading terminals.
Level-2 depth where bar length encodes size and colour intensity encodes proximity to touch — the book's shape is readable before any number is.
Do not smooth or animate book updates for elegance — a book that moves prettily misrepresents microstructure. Updates snap; only the aggression highlight pulses.
Aggressor prints flash on the tape side, not the resting side — direction of initiative is the signal traders actually read.
Time priority is honest to the feed's granularity: if the feed is conflated, the UI says so rather than implying microsecond precision it does not have.
Instrument Header
Full instrument identity strip — symbol, name, exchange, asset class, currency, and live session status. Used at the top of charts and order panels.
The identity strip above a chart or an order panel, where the reader must be certain which instrument they are about to act on.
Never abbreviate to the ticker alone across asset classes — the same symbol resolves to different instruments on different venues, and the venue is the disambiguator. Never omit the currency; a price without its currency is not a price.
Symbol, venue, asset class and currency are all in the header's accessible name so a screen reader user is oriented in one read. Session status is a word, not a dot, and it states the venue's local time.
The requirement is unambiguous instrument identity — symbol plus venue plus currency — because everything below this strip is meaningless if the reader has the wrong instrument in mind.
Leverage Selector
Interactive leverage input with risk-level color gradient and maximum allowed indicator. Risk disclosure updates dynamically per ASIC/ESMA regulatory constraints.
Leverage selection renders the jurisdiction cap as a hard boundary — the selector physically cannot exceed the client's regulatory maximum.
Do not present leverage as a neutral slider to the max — the warning band begins at the threshold where margin-call probability inflects, not at the legal cap.
Each step shows the margin requirement consequence live; the control is a disclosure surface, not just an input.
Caps are config from the jurisdiction matrix (ASIC RG 227, ESMA intervention measures) — when a regulator moves the cap, the token updates, no rebuild.
Margin Panel
Account margin overview with used/available balance, margin level percentage, and warning thresholds. Color shifts to amber at 150% margin level and red at 110% (margin call zone).
Margin utilisation with three fixed thresholds (70 / 85 / 95%) that colour the entire panel context, plus projected utilisation on order hover — consequence before commitment.
Never hide the liquidation price behind a tap or tooltip — it is the single number a leveraged client must always see.
The panel is the same component on desktop dock and mobile sheet; thresholds and copy come from tokens, not per-platform forks.
Margin-call states persist with timestamps and are never auto-dismissed (dispute evidence). The 95% state pre-arms the deposit flow.
Order Status
State badges and inline status rows for the full order lifecycle. Each state maps to a deterministic UI color and icon to support rapid scanning in high-volume queues.
Maps FIX Tag 39 OrdStatus to user language: New, Partially Filled, Filled, Cancelled, Rejected — each with a distinct visual register.
Never collapse partial fills into a binary done/not-done — a PM managing a working order needs filled quantity, remaining, and average price at a glance.
Status transitions announce via aria-live; a rejection always carries the venue reason code translated into action language.
The status chip is the same component on the blotter, the ticket, and the position view — one source of truth for the same Tag 39 value everywhere.
SL / TP Config
Stop Loss and Take Profit configuration with pip distance, price equivalence, and estimated P&L impact. The dual-input layout reduces cognitive load by showing both absolute price and distance simultaneously.
Stop-loss / take-profit entry shows both the absolute price and the distance (% and currency) — traders think in both, and mismatch errors are expensive.
Never frame the stop as a percentage alone — loss is felt in currency. The projected loss at stop renders in account currency beside the field.
Values validate against tick size and minimum stop distance per instrument; invalid entries explain the constraint, not just reject.
Default SL/TP from the last trade was the single biggest abandonment fix in the order-flow study — defaults are a design decision with measurable money attached.
Volume Bar
Volume histogram showing today's trading activity relative to the 20-day average. Above-average bars are highlighted in accent color to signal unusual activity.
Showing today's volume against a stated historical baseline, so unusual activity is visible as unusual rather than merely large.
Never without naming the baseline: “above average” with no window is an assertion, not a measurement. Never highlight an outlier without letting the reader see the comparison figure.
The baseline window and the current figure are both in text; the highlight is redundant to a stated multiple rather than the only signal. Bars carry their date in the accessible name.
The whole informational content is the ratio to a baseline, so the baseline is part of the component rather than a footnote under the chart.
Time & Sales
Live execution tape showing individual trades with timestamp, aggressor side, price, and size. Color coding distinguishes buyer-initiated (green) from seller-initiated (red) trades.
The execution tape, where the reader is watching aggressor side and size to judge order flow in real time.
Never with buyer- and seller-initiated distinguished by colour alone. Never auto-scroll without a pause control, and never announce each print to assistive technology — a live region on a tape makes the page unusable.
Aggressor side is a word or a symbol in the row text. The tape is a log region with announcements off by default and an explicit control to summarise instead; pausing is available by keyboard and the paused state is announced.
WCAG 2.2 SC 2.2.2 Pause, Stop, Hide governs auto-updating content: the reader must be able to pause it. On a tape this is not a courtesy — an unpausable feed cannot be read by anyone who reads slowly.
Economic Calendar
Event row with impact tier indicator, consensus vs. previous values, and countdown. High-impact events trigger pre-event risk warnings in connected order entry components.
Scheduled economic events where the impact tier and the consensus-versus-previous comparison drive a pre-event risk decision.
Never present consensus as a forecast the venue endorses; it is a survey median and its dispersion matters. Never fire a connected risk warning without saying which event triggered it — an unattributed warning gets dismissed.
Impact tier is a word before it is a colour; times are stated in both the venue's timezone and the reader's, because an event calendar in one timezone is a source of expensive mistakes. The countdown is not the only rendering of the time.
The component's constraint is timezone correctness. Everything else here is presentation; a right number at the wrong hour is simply wrong.
Session Clock
Multi-timezone market session display showing open/closed status for major exchanges. Critical for institutional traders managing positions across jurisdictions.
Multi-venue session status for a reader holding positions across jurisdictions, where “is this market open” has a different answer per venue and per day.
Never derive status from a fixed schedule alone: half-days, holidays and daylight-saving transitions are where this component is actually tested. Never show only the reader's local time, and never show only the venue's.
Status is a word with the next transition stated as an absolute time; both timezones are labelled with their abbreviation and their offset. The clock does not announce on every tick.
The failure mode being designed against is a holiday calendar that was not loaded — so the component states the schedule source and the date it is valid for, rather than implying the status is derived live.
Allocation
Visual portfolio allocation breakdown across asset classes. The bar-based approach is preferred over pie charts in high-density trading UIs for accurate proportional comparison at small sizes.
Portfolio composition across asset classes at small sizes, where the reader is comparing proportions rather than reading exact values.
Never as a pie chart at this density — angle is the hardest visual encoding to compare accurately, and it fails first at small sizes. Never omit the residual: a breakdown that does not sum to the whole hides the part nobody wanted to explain.
The breakdown has a table equivalent with the percentages and the base value; segments carry their label and share in the accessible name. The total is stated so the reader can see it reconciles.
The choice of bars over pies is the register entry: position along a common scale is the most accurately judged visual encoding, and at trading-UI density that difference is the difference between reading it and estimating it.
Spread Display
Bid/ask spread visualization with pip value and cost-per-lot calculation. Tight spreads are shown in green; widening spreads during low liquidity shift to amber with a visual indicator.
Showing the bid-ask spread with its cost expressed in the unit the reader trades in — pips, ticks, or cost per lot.
Never show the spread without its cost translation; a number of pips means nothing to the client's P&L until it is money. Never present a tight spread as an available price without the size it is good for.
The state (tight, widening) is a word alongside the figure, not a colour shift alone. The quote time is present, because a spread from a stale quote is the most misleading number on the screen.
FCA COBS 4.2.1R — communications to clients must be fair, clear and not misleading: a cost presented in a unit the client cannot convert is a disclosure that does not disclose.
Risk Matrix
Two-dimensional risk grid mapping position size against market volatility. Each cell's background intensity communicates aggregate risk level at a glance — designed to surface tail-risk concentrations without requiring mental arithmetic.
Concentration and exposure as a matrix where colour intensity AND a glyph encode severity — dual encoding because risk review includes colour-blind reviewers.
A heat cell is never a dead end: every cell drills to the evidence behind it (positions, metrics, conditions). A naked number a reviewer cannot interrogate is a compliance liability.
Keyboard navigation walks cells in reading order with the cell's full context announced — the matrix is a table semantically, a heatmap visually.
Built for the SR 11-7 effective-challenge standard: the surface exists so a human can challenge the model's aggregation, not just admire it.
Volatility ↓
<$50K
$50–200K
$200–1M
>$1M
Alert Config
Price alert configuration with condition logic, notification channel selection, and expiry. Supports absolute price, percentage move, and crossover triggers for professional traders managing multiple instruments.
Configuring a price alert with an explicit condition, a delivery channel and an expiry, for someone managing many instruments at once.
Never create an alert with no expiry by default — an unbounded alert set becomes noise and then gets muted wholesale. Never let the notification channel be the only unstated part: an alert the reader thinks is going to their phone and is not is worse than no alert.
The condition is restated in plain language before saving (“notify when EURUSD trades above 1.0850, once, expiring 30 September”), because a form of dropdowns does not read back as a sentence. Channel and expiry are required fields, not optional ones.
The register entry is the readback: the component's job is to make the configured rule legible as a sentence, since that is the only form in which a person can check it is what they meant.
Trade History
Closed position history row with entry/exit prices, duration, and realized P&L. Color-coded P&L with directional indicators enables rapid performance scanning across hundreds of historical trades.
Reviewing closed positions at scale, where the reader is scanning for pattern across hundreds of rows rather than examining one.
Never present realised P&L without the costs that were netted into it; a gross figure next to a net figure with no labels is the most common misreading in a trade blotter. Never sort by P&L as the default — it hides the sequence, which is where the pattern is.
P&L direction is signed text with colour redundant; duration is an explicit interval rather than two timestamps the reader must subtract. The table has real headers, because this is read column-wise as often as row-wise.
The design constraint is that this is a scanning surface: anything requiring arithmetic by the reader breaks the scan, which is why duration and net are computed here rather than left implicit.
Candlestick
OHLC candle display with body, wicks, and data annotation. The side panel shows Open / High / Low / Close values with directional color. Used in chart tooltips, trade review panels, and daily summary cards.
OHLC review where the reader needs the four values, not just the shape — tooltips, trade review panels, daily summary cards.
Never as the only rendering of the values: a candle body encodes open and close by position and direction, which is unreadable without sight and imprecise with it. Never colour by direction alone.
The four values are text in the side panel with their labels; the candle itself is decorative and marked as such. Direction is stated in words as well as by fill.
The register entry is that the candle is an index into the numbers rather than a substitute for them — which is why this component ships with the OHLC panel attached instead of as a standalone glyph.
Screener
Instrument scanner with filter chips and ranked results. The chip-based filter pattern reduces the form footprint compared to dropdowns while keeping all active criteria visible — critical for traders who run multiple simultaneous scans.
Running several simultaneous scans where the reader needs every active criterion visible at once without a form dominating the viewport.
Never hide active filters behind a “filters (3)” summary: an invisible criterion produces a result set the reader misreads as the whole universe. Never apply a filter silently — the result count changing is the feedback.
Each chip is a button whose accessible name includes the criterion and the fact that activating it removes the filter; the result count is announced on change. Clearing all filters is distinct from clearing one, in both wording and placement.
The pattern exists to keep the active criteria visible, so any variant that collapses them defeats the reason it was chosen over dropdowns.
| Symbol | Name | Price | Change | Volume | Rel. Vol |
|---|---|---|---|---|---|
| NVDA | NVIDIA Corp | 891.43 | +4.2% | 68.4M | 2.4× |
| META | Meta Platforms | 510.22 | +3.1% | 42.1M | 1.8× |
| AMD | Advanced Micro Devices | 188.74 | +2.8% | 38.7M | 1.4× |
Funding Rate
Perpetual swap funding rate display with next payment countdown, annualized rate, and long/short cost indication. Positive rates mean longs pay shorts; negative rates reverse the flow.
Perpetual swap funding where the reader needs to know the direction of payment, the size of it, and when the next one lands.
Never show the rate without stating who pays whom — the sign convention is not universal and readers arrive from venues with the opposite one. Never annualise without labelling it as annualised; the period rate and the annualised rate differ by orders of magnitude.
Direction of payment is a sentence (“longs pay shorts”), not a sign the reader must decode. The countdown is accompanied by an absolute time, and both the period and annualised figures are labelled.
The register entry is the sign convention: it is the one thing about this component that is genuinely ambiguous across venues, so it is stated in words rather than encoded.
API Credential
API key management card with reveal/conceal toggle, one-click copy, environment badge, and expiry indicator. Designed for the ACY Connect institutional B2B onboarding flow — credential issuance is the final step before a counterparty can connect their trading system.
Issuing a credential at the end of a counterparty onboarding, where the key is shown once and the environment must be unmistakable.
Never let a production credential look like a sandbox one — the environment badge is the safety feature, not decoration. Never re-display a secret after issuance, and never imply it can be recovered rather than rotated.
The environment is in the accessible name of the card, not only in a badge; reveal and copy both confirm in text, because a silent clipboard write is indistinguishable from failure. The expiry is an absolute date with the rotation path stated next to it.
SOC 2 CC6.1 logical access and NIST SP 800-63B on secret handling: the one-time reveal is the control, and an interface that softens it to a convenience removes it.
Quote Comparison
Multi-broker quote comparison for best execution analysis. Highlights the tightest spread and lowest slippage per column. Used in institutional prime brokerage dashboards to satisfy best execution obligations under MiFID II.
Comparing quotes across brokers or venues to evidence execution quality, where the comparison is the artefact somebody may have to defend.
Never present the tightest spread as the best execution outcome on its own — price is one factor among several, and a single-factor claim is precisely what the obligation is designed to prevent. Never compare quotes captured at different times without showing the timestamps.
The winning column is named in text, not indicated by highlight alone; each quote carries its capture time and its size. The comparison is a real table so it survives being exported into a review pack.
MiFID II Art 27 and RTS 27/28 best execution: the firm must take all sufficient steps to obtain the best possible result taking price, costs, speed, likelihood of execution and settlement, size and nature into account, and must be able to demonstrate it.
Stock Split
Forward-split notice: the ratio, the record and payable dates, and the before/after that proves position value is unchanged.
A corporate-action notice for a forward split (e.g. 4-for-1). Show share count up, price down, and total position value held constant — the split changes the denomination, not the wealth.
Do not render a split as a price crash on the chart. A split-adjusted history is required; an unadjusted line that shows −75% overnight is a data defect, not a price move. Use the Reverse Split component for consolidations.
Ratio, dates, and the value-unchanged fact are text, never colour alone; the before/after table reads as paired rows to a screen reader. Cost-basis-per-share adjustment is stated in words.
SEC Rule 10b-17 & FINRA UPC 11140 — timely issuer notice of the record date and ex-date; due-bill handling for trades between record and payable. Basis reallocated per IRS Pub 550 (a split is not a taxable event).
Reverse Split
Consolidation notice with the fractional-share cash-in-lieu term and the listing-compliance reason stated, not implied.
A reverse split (e.g. 1-for-10): shares down, price up, value held. Surface the reason honestly — often a minimum-bid-price cure — and disclose how fractional shares are handled.
Never present a reverse split as a 10× gain. The per-share price rises mechanically; wealth is unchanged. Do not hide the cash-in-lieu of fractional shares — it is a realised, taxable event for the holder.
The compliance reason and the fractional-share treatment are full sentences; the ratio badge is not the only signal. Cash-in-lieu amount is shown with its calculation basis.
SEC Rule 10b-17 record-date notice; listing cure under Nasdaq Rule 5550(a)(2) or NYSE §802.01C ($1 minimum bid). Fractional shares paid as cash-in-lieu; cost basis reallocated (IRS Pub 550).
Dividend Declaration
The four dates that govern a dividend — declaration, ex, record, payable — with per-share amount, yield, and tax character.
An income event notice. The four dates are the whole product: who owns before the ex-date gets paid. Show DPS, annualised yield, and whether the dividend is qualified.
Do not conflate declaration with payment — a declared dividend is not cash in the account. Use the Dividend Payout component for the settled credit and withholding.
Each date carries an explicit label; the ex-date (the ownership cutoff) is emphasised in words, not colour alone. Qualified-vs-ordinary status is stated because it changes the holder's tax.
FINRA UPC 11140 / SEC Rule 10b-17 set and notice the ex-date and record date; under T+1 (effective May 2024) the ex-date aligns to the record date. Qualified-dividend character per IRC §1(h)(11).
Dividend Payout
The settled credit: gross, withholding, and net stated in words — plus the reinvestment (DRIP) alternative and its price.
The payment confirmation on payable date: shares held × DPS = gross, less any withholding = net credited. If reinvested, show the DRIP purchase price and resulting fractional shares.
Do not show gross as the amount received when withholding applies — the net is what settles. Use the Dividend Declaration component for the forward-looking event, not the payment.
Gross, withholding, and net are separate labelled rows; the net is the emphasised figure. Withholding rate and basis are stated so the deduction is never a silent surprise.
Reported on IRS Form 1099-DIV; backup withholding at 24% under IRC §3406 where a valid TIN is absent. Non-resident withholding per the applicable tax treaty. DRIP reinvestment price disclosed.
Ex-Dividend Timeline
The corporate-action lifecycle as an ordered, labelled sequence — declaration to payable — with the current stage marked in text.
When the sequence and the current position in it matter more than any single date: to answer "have we passed the ex-date, and when does cash arrive." Each node is a real, named milestone.
Do not use a decorative progress bar with no dates — a timeline that can't say which day the ownership cutoff falls on is theatre. For a single event, use the Dividend Declaration card.
Rendered as an ordered list to assistive tech; the current stage is announced in words (aria-current), not by colour alone; each node carries its date. Reduced-motion shows the final state instantly.
FINRA UPC 11140 ex-dividend procedures; under T+1 settlement (SEC Rule 15c6-1, effective May 2024) the ex-date aligns with the record date, collapsing the legacy T+2 one-day gap.
-
DeclaredApr 08
-
Ex-Date · nowMay 09
-
RecordMay 09
-
PayableMay 16
Under T+1 the ex-date and record date fall on the same day. To receive this dividend, the position must be held before the May 09 ex-date.
Rights Issue
A rights offering: entitlement ratio, subscription price, the deadline, and what lapses if the holder does nothing.
When existing holders are offered new shares at a discount in proportion to their holding. Show the ratio, subscription price, the theoretical value of a right, and the hard deadline — rights expire.
Never present a rights issue as free upside. Unexercised rights lapse worthless (or are sold if transferable) and non-participation dilutes the holder. State both outcomes. For a mandatory event, use a different notice.
The deadline is a countable, labelled date with time zone; the lapse consequence is a full sentence. Oversubscription privilege and transferability are stated, not implied by an icon.
Registration and prospectus delivery under Securities Act §5 (or an available exemption) for the rights and underlying shares; subscription, oversubscription, and lapse terms disclosed. A voluntary election with a firm cut-off.
Corporate Action Election
A voluntary election between options — cash or stock — with the deadline, the default if the holder is silent, and the irrevocability stated.
When a holder must choose between outcomes (optional stock dividend, merger consideration, tender). The default — what happens on no instruction — is shown as prominently as the choices, because silence has a consequence.
Do not pre-select the option that benefits the broker, and never hide the default. For a mandatory action with no choice, use a notice, not an election — offering a choice that doesn't exist is misleading.
Radio options are keyboard-navigable with visible focus; the selected state is text + control, not colour alone; the deadline and default are read in words. Election is confirmed and its irreversibility disclosed before submit.
DTC voluntary-offer election deadlines govern the cut-off; instructions and their timestamps retained per SEC Rule 17a-4(f). The no-election default outcome is disclosed, and the election is irrevocable after the deadline.
Motion
Animation timing functions for transitions, micro-interactions, and loading states. Click each card to preview.
Choosing a duration and easing for a transition, from a named set rather than per instance.
Never animate a state change the reader is waiting on — motion added to a slow operation makes it slower. Never exceed about 300ms for a feedback transition, and never animate large areas of the viewport.
Every timing token has a reduced-motion fallback that is a state change rather than a shortened animation; nothing conveys information by motion alone; no animation flashes more than three times per second.
WCAG 2.2 SC 2.3.1 Three Flashes or Below Threshold and SC 2.3.3 Animation from Interactions. The reduced-motion fallback is a token-level obligation here, which is why it lives in the foundation rather than in each component.
Animation Types
A motion taxonomy for production UI: entrance, exit, feedback, loading, data-change, and spatial transitions. Each pattern names its duration, easing, risk, and reduced-motion fallback.
No decision register — by designA taxonomy, not a component. Each entry in it already names its own duration, easing, risk and reduced-motion fallback — the binding rules for motion as a whole are recorded once, in the motion register.
Interactive Animation Studies
Five complete interaction studies for product contexts beyond trading: relationship management, SaaS deployment, consent ceremony, permission topology, and executive storytelling.
A release-command animation for build, test, canary, and production promotion without leaving the operator's mental model.
A high-trust signature moment where the animation confirms authorship, intent, and record capture.
A topology animation for enterprise SaaS admin consoles: roles light up as permission scope changes.
A boardroom-ready transformation between narrative and decision view, useful for SaaS executive dashboards and client advisory reviews.
Animation (SaaS)
Five complete interaction studies for SaaS product moments — command
execution, plan upgrade, inbox triage, integration handshake, and workspace provisioning. Pure CSS + vanilla
JS, state-driven (data-state), token-themed for both themes, with
prefers-reduced-motion fallbacks. Motion here is product feedback, not decoration: every study
animates a moment where the user needs confirmation that the system heard them.
No decision register — by designInteraction studies, published to show the contract being met rather than to be reused as a component. The governing rules are in the motion register.
Open, search, execute: the palette springs in over a defocused app, results stagger up, and the chosen action collapses the list into a single confirmation toast.
Starter becomes Pro without a page reload: the price odometer rolls, locked features unlock in sequence, and the card itself earns its highlight.
Mark-all-read as a single readable gesture: a wave moves down the list, unread dots collapse, the counter rolls to zero, and inbox-zero breathes.
Connecting two systems is a trust moment: packets travel, both nodes pulse, and success seals the line gold — while failure bounces the packet back with an honest retry countdown.
Four infrastructure steps light up in sequence — spinner to check, top to bottom — so a 30-second backend process reads as visible, ordered progress instead of a dead spinner.
Animation (Media)
Five interaction studies for media products — player morph, chapter
scrubbing, karaoke captions, story rings, and waveform mood states. Same contract as every animation in this
system: pure CSS + vanilla JS, data-state driven, dual-theme tokens, reduced-motion safe. Media
motion has one extra duty: it carries the content's emotion without upstaging it.
No decision register — by designInteraction studies, as above. The one additional duty media motion carries — that it must never compete with the content it frames — is a consequence of the same reduced-motion contract recorded in the motion register.
The mini-player grows into theater mode with one spring: artwork scales, the title breathes up a size, transport controls drop in, and the equalizer starts dancing.
Jumping chapters is a glide, not a teleport: the playhead eases across, the chapter marker ripples on arrival, and the preview card crossfades to the new scene.
Words light up in time: a gradient sweep crosses each word with a small lift, while the progress bar keeps the line honest about where the audio actually is.
The active story takes the center: its countdown ring draws, the background parallaxes a beat slower than the caption chip, and neighbors recede without disappearing.
One waveform, three honest moods: idle breathes, playing dances, buffering shimmers — so audio state is readable from across the room without a single label.
Count-Up Numbers
Animated number reveal for stats and KPIs — requestAnimationFrame with an ease-out
curve and tabular numerals so the layout never jitters. Under prefers-reduced-motion the final
value renders instantly.
Dashboard stats, impact numbers, fundraising totals — moments where the arrival of a number is part of the story.
Never on live trading or financial-decision data: an animating price is a misrepresentation of the feed. Numbers a user acts on render instantly, always.
Runs once on demand, uses font-variant-numeric: tabular-nums to prevent reflow, and stays out of the screen reader's way — AT gets the final value, not 60 intermediate ones.
WCAG 2.2.2 (short, user-initiated, replayable run); reduced-motion honoured by skipping straight to the final value.
Easing Playground
The same 320px journey under five easing functions — linear, ease-out, ease-in-out, spring, and bounce — implemented in pure JS (rAF) so spring physics aren't faked with keyframes. Watching the difference is the fastest way to teach motion taste.
Design-system education and motion-spec reviews: when an engineer asks 'which easing', point at the difference instead of describing it.
Don't ship bounce or heavy spring on serious product surfaces — overshoot reads as playful; institutional contexts use the ease-out family almost exclusively.
Buttons are real buttons; the stage is aria-hidden with the active easing named in visible text; reduced-motion jumps the ball to the end state.
WCAG 2.3.3 Animation from Interactions — motion is user-initiated, brief, and disabled by the OS preference.
Toast Queue (Live)
A working toast manager, not a static mock: spawn, stack (max 3, oldest evicted), auto-dismiss with a visible progress bar, pause-on-hover, manual close — and a split aria-live strategy (polite for info/success, assertive for critical).
Transient confirmations of completed actions: saved, sent, copied. The queue cap and eviction policy are the design decisions most toast libraries skip.
Never for compliance-relevant or loss-relevant content — auto-dismissing evidence is the anti-pattern; that register belongs to persistent banners (see Alert & Toast).
Hover pauses the timer; close buttons are focusable; critical toasts use aria-live=assertive, the rest polite so screen readers aren't interrupted by good news.
WCAG 4.1.3 Status Messages — announced without focus theft; 2.2.1 Timing Adjustable via pause-on-hover + manual dismiss.
Pointer Tilt Card
A 3D tilt that tracks the pointer with damped rotation and a radial glare that follows the cursor — pure JS transforms, springs back on leave, and switches itself off for touch devices and reduced-motion users.
Hero cards, feature highlights, award-page registers — one or two per view as a focal accent.
Not for dense grids or anything containing text the user must read while interacting — motion under the reading surface costs comprehension. Never on form containers.
Activates only on (hover:hover) and (pointer:fine); rotation capped at 7°; springs back to rest on leave; purely decorative and invisible to assistive tech.
WCAG 2.3.3 — interaction-triggered motion fully disabled under reduced-motion; no information is conveyed by the motion itself.
HOVER / MOVE POINTER
Magnetic Button + Ripple
Two press-feedback classics done with restraint: a magnetic pull capped at 6px that eases the button toward the cursor, and a ripple from the press point. Both are decoration on top of a fully functional, keyboard-perfect button.
Primary CTAs on marketing and portfolio surfaces where a moment of delight is on-register.
Skip both in dense product UI — magnetism on a 24px-tall table action is noise. The ripple must never be the only press feedback (focus + active states stay).
Works identically by keyboard (ripple fires from center on Enter/Space); magnet caps at 6px so the hit target never escapes the pointer; reduced-motion disables both.
WCAG 2.5.2 Pointer Cancellation — action binds to the click, ripple on down is feedback only; 2.4.7 focus visible at all times.
Stagger Text Reveal
Character-level entrance for display headlines: JS splits the line into spans, each rises and settles with a 28ms cascade. The original string stays in the DOM for assistive tech; the animated copy is decorative.
Hero headlines and section moments on editorial/marketing surfaces — the typographic equivalent of a curtain rise.
Never on body copy, navigation, or anything read mid-task; once per page load is the ceiling — repeated stagger becomes a tic.
Split spans are aria-hidden with the full sentence kept in a visually-hidden element; replay is user-initiated; reduced-motion renders the line instantly.
WCAG 1.3.1 — the programmatic text is the real sentence, not 34 orphan characters; reduced-motion honoured.
Typewriter Reveal
Types a headline out character by character behind a blinking caret — JS appends one glyph at a time while the full sentence stays in the DOM for assistive tech. The animated copy is decorative.
Terminal, code, or editorial moments where the “being written now” feeling earns attention — once per view.
Never on navigation, body copy, or anything read mid-task; a slow type-out in front of content the user wants now reads as a delay, not delight.
The real sentence sits in a visually-hidden span; the typed copy is aria-hidden; replay is user-initiated and reduced-motion prints the line instantly.
WCAG 1.3.1 + 2.3.3 — programmatic text is the full string, not a stream of orphan characters; motion fully removed under reduced-motion.
Decode / Scramble
A cipher that resolves left-to-right: each position cycles random glyphs, then locks to its real character — the “decrypting” register, done with restraint.
Security, data, or AI surfaces where a “resolving” metaphor fits the content — a loading-to-truth moment.
Not for long strings or anything time-critical; the scramble adds perceived latency. Never on numbers a user must trust mid-update.
Full text kept in a visually-hidden span; cycling glyphs are aria-hidden; reduced-motion skips straight to the resolved string.
WCAG 2.2.2 — no essential meaning is conveyed only by the transient glyphs; the settled text is the source of truth.
Word Fade-Up (blur)
Reveals a line word by word, each rising out of a soft blur into focus — a calmer, more legible cascade than per-character motion for longer headlines.
Longer display headlines and section intros where character-level motion would feel busy — the editorial default.
Not for single words (use a simpler fade) or dense paragraphs; blur-in on body copy hurts reading speed.
Words are aria-hidden spans with the full sentence in a visually-hidden element; one play per load; reduced-motion renders sharp instantly.
WCAG 1.3.1 + 2.3.3 — the readable sentence is programmatic, not reconstructed from fragments; blur/motion removed under reduced-motion.
Mask Wipe
The whole line is revealed by a hard-edged wipe sweeping left to right via animated clip-path — no character splitting, so the text stays selectable and natively readable.
Logotype lockups and single-line statements where you want one clean gesture rather than a cascade.
Not for multi-line blocks (the wipe reads as a glitch across wraps); not where the text must appear immediately.
No DOM splitting — the element holds the real text, fully selectable and read normally; reduced-motion shows it un-clipped at once.
WCAG 1.3.1 — text is never fragmented; the wipe is purely presentational and disabled under reduced-motion.
3D Char Flip
Each character flips up on its X-axis from flat to upright with a staggered cascade — a dimensional cousin of the stagger reveal for high-impact hero moments.
Hero headlines on award or launch surfaces where a single, deliberate flourish sets the tone.
Never on body copy or repeated elements; 3D rotation per character is the most attention-expensive of the set — use sparingly.
Split spans are aria-hidden with the sentence in a visually-hidden element; replay is user-initiated; reduced-motion renders flat and upright instantly.
WCAG 1.3.1 + 2.3.3 — the real sentence is programmatic; rotation removed entirely under reduced-motion.
Contrast Checker (Interactive)
Pick any foreground and background: the checker computes the WCAG relative-luminance ratio live and grades it against AA and AAA for normal and large text, plus the 3:1 non-text minimum. The math is the spec formula, not an approximation.
Token decisions, theme reviews, and the recurring 'is this gold readable on white' argument — settle it with the formula in front of both people.
A passing ratio doesn't end the audit: 1.4.1 colour-only signalling and state contrast still need review. The checker is one control, not the conformance story.
Inputs are native colour pickers with visible labels; results render as text chips (never colour alone); the live ratio is announced via a polite region on change.
WCAG 1.4.3 Contrast (Minimum, AA 4.5:1 / 3:1 large), 1.4.6 (AAA), 1.4.11 Non-text Contrast — computed per the WCAG 2.x relative-luminance definition.
Focus Trap (Dialog Pattern)
A live dialog focus trap done right: Tab and Shift+Tab cycle inside, Escape closes, and focus returns to the trigger that opened it. The trap is the easy half — the restore is the half everyone forgets.
Modals, drawers, command palettes — any layer that takes over the page must own focus for exactly as long as it exists.
Don't trap focus in non-modal UI (popovers should dismiss on tab-out), and never trap without a keyboard exit — that's the violation this pattern exists to prevent.
Open moves focus to the first control; Tab wraps both directions; Escape closes; focus restores to the trigger; the dialog carries role=dialog and aria-modal with a labelled heading.
WCAG 2.1.2 No Keyboard Trap, 2.4.3 Focus Order — the ARIA APG dialog pattern.
Confirm export
Tab cycles inside this dialog. Esc closes and returns focus to the trigger.
Live Region Announcer
Status messages that screen readers actually hear: a polite region for ambient updates and an assertive region for must-know-now — with a visible log so sighted reviewers can verify what was announced and when.
Async results: save confirmations, background sync, validation outcomes — anything that changes without a focus move.
Don't announce continuous noise (every keystroke, every price tick) and never use assertive for good news — interruption is a cost you spend on emergencies.
Regions exist in the DOM from load (late-inserted live regions are unreliable); messages are swapped, not appended forever; the visible log mirrors exactly what AT received.
WCAG 4.1.3 Status Messages — programmatically determinable without receiving focus; polite vs assertive chosen by consequence.
Form Error Summary
On failed submit: focus moves to a summary box that names every error as a link; each link jumps to its field; each field carries aria-invalid and an aria-describedby message. The pattern that turns 'something is wrong' into a fixable list.
Any form longer than two fields — and mandatory on regulated flows (KYC, payments) where an abandoned form has a measurable cost.
Don't rely on inline messages alone for long forms (screen-reader users get no overview), and never use colour as the only error signal.
Summary receives focus on submit (tabindex=-1); links move focus to the field; messages bind via aria-describedby; errors announce once, not per keystroke.
WCAG 3.3.1 Error Identification, 3.3.2 Labels, 3.3.3 Error Suggestion, 2.4.3 Focus Order — the GOV.UK-validated error-summary pattern.
Problems to fix
Skip Link
The first Tab press on a page should offer a way past the navigation. Visually hidden until focused, then unmissable — try it: click into the demo and press Tab.
Every page with repeated navigation before the main content — which is every page. The cheapest AA fix on the entire checklist.
Don't hide it with display:none (unfocusable) or leave it permanently visible (clutter); reveal-on-focus is the contract.
First focusable element in the demo DOM; on activation moves focus to the main region (tabindex=-1); visible focus style when revealed.
WCAG 2.4.1 Bypass Blocks — the canonical technique.
Touch Target Size
24px icons feel fine with a mouse and fail with a thumb. Toggle the overlay to see each control's true hit area against the 44×44 reference — and how padding grows the target without growing the icon.
Mobile-reachable UI review: table row actions, chip closers, player controls — anywhere small glyphs accumulate.
Don't inflate the visible control to fix the metric — grow the hit area (padding / pseudo-element) and keep the visual weight. Density and reachability are not enemies.
The overlay shows real interactive bounds; the small target demonstrates the failure, the padded target shows the fix at identical visual size; all controls stay keyboard-operable.
WCAG 2.5.8 Target Size Minimum (24px, AA in WCAG 2.2) and 2.5.5 (44px, AAA) — labelled honestly: this system targets 44px on primary touch surfaces.
Accessibility
WCAG 2.1 AA baseline with Finance-Specific Accessibility (FSA) protocols for institutional environments.
Setting the baseline every component in this system is measured against, and the finance-specific additions on top of it.
Never treat the baseline as an audit performed at the end: the criteria in this system are contract terms per component, which is why they appear in each register's third cell rather than in a single conformance page. Never claim a conformance level the system does not test for.
WCAG 2.2 Level AA is the floor: contrast measured rather than assumed, keyboard operability for every function, focus visible and unobscured, no information by colour alone, and status messages that reach assistive technology without stealing focus.
WCAG 2.2 Level AA as the baseline, with the EU Accessibility Act (Directive (EU) 2019/882) as the reason the level is a floor rather than a target for financial services in the EU from June 2025, and Section 508 / EN 301 549 as the procurement equivalents.
Luminance Tapering
The taper directs the eye; it does not licence sub-AA text. An earlier version of this specimen bottomed out at 1.34:1 for the account number and called that tier “non-essential” — but WCAG 1.4.3 exempts decorative and incidental text, not data you have decided matters less. Five tiers now span 18.5:1 down to 4.6:1, which is enough separation to rank a blotter and still leaves every value readable.
Color-Blind Safe Mode
▼ -$18,220
▼ -$18,220
Density
Components adapt across three density modes. HD for trading terminals, MD for dashboards, LD for client portals.
Products that must serve a trading terminal and a client portal from the same component set, where the difference is spacing rather than structure.
Never let a density mode change what is on screen — density that hides information is a different design, not a setting. Never take the compact mode below the minimum target size, which is where the constraint actually binds.
Every mode meets the target-size floor and the text-spacing criterion independently; density is a token-level scale rather than per-component overrides; the current mode is a stated setting, not inferred from viewport.
WCAG 2.2 SC 2.5.8 Target Size (Minimum) at 24×24 CSS pixels and SC 1.4.12 Text Spacing. High density is where both are lost, so the register records them as the boundary the compact mode may not cross.
| Token | HD (Trading) | MD (Dashboard) | LD (Portal) |
|---|---|---|---|
btn-height |
28px | 36px | 44px |
input-height |
28px | 36px | 44px |
row-height |
28px | 40px | 52px |
cell-padding |
4px 8px | 8px 16px | 12px 20px |
font-body |
12px | 14px | 16px |
icon-size |
14px | 18px | 24px |
Infrastructure & State
API-driven UI architecture for high-concurrency financial environments. We design the data lifecycle, not just the visual layer.
Designing the data lifecycle — loading, empty, partial, stale, error, recovered — as first-class states rather than as exceptions to a success case.
Never design only the populated state; every surface in this system is required to specify what it does with no data, slow data, stale data and failed data. Never collapse empty and error into one rendering.
Each state has an announced transition, a text explanation, and where recovery is possible, a control that performs it. Nothing depends on the reader inferring a state from an absence.
The register entry is the enumeration itself: six states, specified per surface. Most production defects in data-driven finance UI are an unspecified member of that list rather than a bug in the populated view.
Real-time State Orchestration
In institutional platforms like TradeX, the UI must handle 10,000+ data updates per second across 8-monitor setups. Our design system extends into the state machine layer to ensure consistency and performance.
Components are architected as finite state machines. Whether it's a "Partial Fill" on a trade ticket or a "Stale Data" warning on an Order Book, every visual state is a predictable outcome of the API payload.
We use a pub/sub architecture at the component level. A price update in the Order Book automatically propagates to the Risk Matrix and P&L attribution widgets, ensuring a unified "Truth State" across all open monitors.
Error & Liability Management
We categorize system failures into high-fidelity error states mapped to SEC/FINRA auditing requirements.
Figma Libraries
Source Figma files for the complete Zerologix component library and brand system.
No decision register — by designA link to the source library files. Nothing here renders in a product.
Component Library
Brand System
Date Picker
Date and date-range selection for transaction filtering, reporting periods, and regulatory filing deadlines. Essential for compliance date queries and historical data analysis.
Date and range selection where the value has a regulatory or reporting meaning — a filing deadline, a reporting period, a transaction window.
Never as the only way to enter a date: typing is faster for anyone who knows the date, and a calendar-only field is a barrier for keyboard and screen-reader users. Never leave the date format ambiguous — 03/08/2026 is two different days depending on the reader's locale.
A text input with an explicit format hint plus an optional calendar; the grid is a real grid with arrow-key navigation, the selected and today cells distinguished by more than colour, and the month change announced. Range selection states both endpoints in text.
WCAG 2.2 SC 3.3.2 Labels or Instructions for the format hint, and SC 1.3.5 Identify Input Purpose. The locale ambiguity is not a WCAG issue but a correctness one: a reporting period off by a month is a misstated return.
Select / Combobox
Three variants: a native styled Select for simple lists, a fully keyboard-navigable Combobox with type-ahead for instrument search, and a Multi-Select Tag input. All support grouped options and ARIA roles. Keyboard: ↑↓ navigate, Enter select, Esc dismiss.
Selection from a list long enough that scanning it is slower than typing — instrument search, counterparty lookup, country selection.
Never for fewer than about seven options, where a native select or a radio group is faster and more robust. Never make the typed value free-text unless free text is genuinely valid; an autocomplete that silently accepts an unmatched string produces data nobody can reconcile.
Full ARIA combobox semantics: the input owns the listbox, active option is tracked with
aria-activedescendant, the result count is announced on filter, and Escape returns the field to
its last committed value. Grouped options use real group labels.
WCAG 2.2 SC 4.1.2 and the ARIA Authoring Practices combobox pattern. This is the component where partial implementation does the most damage, because it looks operable and is not.
Radio Group
Exclusive choice selection for order type, account tier, and risk classification. Supports both horizontal and vertical layouts with descriptive labels for compliance contexts.
Exclusive choice from a small, visible set where the options must be compared before choosing — order type, account tier, risk classification.
Never with more than about seven options, and never where no selection is a valid state unless one option says so explicitly. Never pre-select a default in a risk or consent context: a pre-ticked answer is not an answer.
A fieldset with a legend, arrow-key navigation within the group, and each option's description associated with its input rather than sitting next to it. The group is one tab stop.
GDPR Art 4(11) and Art 7 require consent to be a freely given, specific, informed and unambiguous indication by a clear affirmative action — which is why pre-selection is prohibited here rather than discouraged. EU DSA Art 25 covers the same ground for interface design that impairs free choice.
Range Slider
Dual-handle range input for price filters, allocation percentages, and risk tolerance bands. Visual range display with real-time value updates for portfolio rebalancing.
Bounded numeric ranges where approximate selection is acceptable and immediate visual feedback helps — price bands, allocation percentages, tolerance ranges.
Never where an exact value matters: a slider cannot be operated precisely by pointer or by touch, so it is paired with number inputs rather than replacing them. Never for an unbounded range, and never with a step so fine that keyboard operation takes hundreds of presses.
Both handles are separately focusable with their own accessible names (“minimum”, “maximum”), report value, min and max, and support Home/End and PageUp/PageDown. The current values are text next to the track, not only inside the handles.
WCAG 2.2 SC 4.1.2 for the slider role's value properties, and SC 2.5.8 Target Size (Minimum) for the handles, which are routinely built below the 24×24 CSS-pixel floor.
OTP Input
One-time password entry field for two-factor authentication, wire transfer confirmation, and sensitive admin actions. Secure digit-by-digit input with auto-focus between fields.
One-time code entry for step-up authentication — second factor, wire confirmation, sensitive administrative actions.
Never as separate inputs without paste handling: readers copy the whole code from a message, and a field set that accepts it one character at a time is the most complained-about pattern in authentication. Never auto-submit on the last digit without a visible confirm, which makes a typo unrecoverable.
Presented as a single labelled input semantically, with the boxes as presentation; paste fills all fields;
backspace moves back; the code's expiry is stated and announced when it lapses.
autocomplete="one-time-code" is set.
WCAG 2.2 SC 3.3.8 Accessible Authentication (Minimum) — a cognitive function test is not permitted unless an alternative exists, and NIST SP 800-63B sets the parallel expectation that the authenticator not impose unnecessary usability burden.
Command Palette
Keyboard-driven command interface (Cmd+K) for power users navigating instruments, executing trades, and accessing settings. Type-ahead command search with grouped action categories.
A keyboard-first accelerator over functionality that is already reachable another way, for readers who use the product all day.
Never as the only path to a command — a palette is an accelerator, and anything reachable only through it is unreachable for most users. Never let it execute a destructive or irreversible action directly from a fuzzy match.
A modal dialog with a combobox inside: focus is trapped, Escape closes and restores focus, results are
announced by count, and the active result is tracked with aria-activedescendant rather than by
moving focus. The shortcut is discoverable from the interface, not only from documentation.
WCAG 2.2 SC 2.1.1 Keyboard and SC 2.4.11 Focus Not Obscured. SC 2.1.4 Character Key Shortcuts also applies where a single-key trigger is used: it must be remappable or active only on focus, or it will fire while a speech-input user is dictating.
Bottom Sheet
Mobile-first panel for order confirmation, filter selection, and quick actions. Dismissible sheet with drag handle and smooth scroll behavior for touch devices.
Touch-first confirmation or selection where the reader's thumb is at the bottom of the screen and a centred dialog would be awkward to reach.
Never on desktop, where it is a modal in an unusual position with no benefit. Never for content taller than about two-thirds of the viewport — past that it is a page. Never make drag the only dismissal.
Dialog semantics with focus trapping and Escape; the drag handle has an accessible button equivalent.
Snap-point animation respects prefers-reduced-motion, and the sheet does not obscure the
focused element behind it.
WCAG 2.2 SC 2.5.7 Dragging Movements — any drag operation needs a single-pointer alternative, which is exactly what a drag-to-dismiss sheet omits by default.
Order Confirmation
Resizable Panel
Drag the divider handle to resize panel areas. Used in trading workspaces for chart/order-book splits and multi-panel layouts. Supports both horizontal and vertical orientations with min/max constraints.
Workspace layouts where the reader's own split is meaningful and persistent — chart against order book, list against detail.
Never where the layout has one correct proportion; an adjustable divider on a fixed design is an invitation to break it. Never allow a panel to be resized to zero without an explicit collapse state and a way back.
The divider is a focusable separator with arrow-key resizing, reporting its value and bounds. The resulting size is announced on commit rather than continuously, and the layout persists per reader.
WCAG 2.2 SC 2.5.7 Dragging Movements again — a divider that only responds to a drag has no keyboard path, and SC 1.4.10 Reflow, since a manually narrowed panel must still reflow rather than requiring two-dimensional scrolling.
Sticky Header
Persistent context bar for instrument identity, account status, and active session info. Remains visible during scroll for quick reference to critical data.
Persistent context — which instrument, which account, which session — that stays true and stays needed while the reader scrolls.
Never for navigation the reader uses once per visit, and never taller than about 15% of the viewport on small screens, where it consumes the content it is meant to contextualise. Never let it cover the element that just received focus.
Anchor-link targets are offset so a jumped-to heading is not hidden beneath the bar; the bar is a banner or region landmark with a name; it does not trap focus and it collapses rather than growing when content is long.
WCAG 2.2 SC 2.4.11 Focus Not Obscured (Minimum) is the criterion this component most often fails: a sticky bar covering a focused input is invisible to the person operating it.
The bar keeps instrument, session and account state in view while the page below it scrolls. Anchor targets are offset by its height so a jumped-to heading is not hidden underneath it.
Data Grid
Sortable, filterable, and paginated data grid for holdings, transaction history, and compliance logs. Column-based layout with sort indicators and selection checkboxes for bulk actions.
Tabular data the reader sorts, filters, pages through and selects from — holdings, transactions, compliance logs.
Never for layout, and never as a virtualised grid without keeping the full row count visible: a reader who cannot see the total treats what they can scroll as everything. Never allow a bulk action on a filtered selection without restating the count and the filter in the confirmation.
A real table with header cells and scope, sort state exposed via aria-sort and announced on
change, selection state per row in the row's accessible name, and keyboard navigation that does not require
passing through every cell to leave the grid.
WCAG 2.2 SC 1.3.1 Info and Relationships for the table semantics, SC 4.1.2 for sort state. The bulk-action rule is an operational-risk one: a mis-scoped bulk action on financial records is the failure this register cell exists to prevent.
| Symbol | Quantity | Price | P&L | Action | |
|---|---|---|---|---|---|
| TYPESCRIPT | 250 | 3,421.50 | +2,850.75 | ||
| AMZN | 150 | 2,890.25 | -1,250.30 | ||
| UST 10Y | 500k | 104.25 | +12,450.00 |
Tree View
Hierarchical account and portfolio structure with interactive expand/collapse, keyboard navigation, and optional checkbox selection. Used for fund-of-funds, sub-account hierarchies, and permission scopes.
Genuine hierarchies where depth carries meaning — fund-of-funds structures, sub-account trees, permission scopes.
Never for a flat list with categories; that is a grouped list and it is easier to operate. Never let checkbox selection be ambiguous about descendants — partial selection must be a stated third state, not a visually different tick.
Tree semantics with expanded state, level and position exposed, arrow keys to move and expand, and
typeahead. Partial selection uses aria-checked="mixed" and says so in words, because a dash in
a box is not self-explanatory.
WCAG 2.2 SC 4.1.2 and SC 1.3.1: depth and position must be programmatically available, since indentation is a visual encoding only and disappears entirely in a screen reader's linear reading.
Kanban Board
Workflow visualization for compliance task tracking, trade lifecycle states, and review pipelines. Drag-and-drop card management with status column organization.
Stage-based work where the shared view is the point — a team looking at the same board agrees on where things are without asking. Columns are states, not owners.
Not for a queue with a clock on it. A board shows position and hides age, so anything with an SLA belongs in the ticket tracker instead. Above roughly seven columns the board stops being scannable and becomes a spreadsheet with rounded corners.
Drag is an enhancement and never the only path: every card carries a keyboard-reachable Move to… control, and a completed move is announced with the card and its new column named. Column counts are text, not just height.
Time-in-stage renders on every card, because a review pipeline is judged on ageing rather than on position — a card that has not moved in eleven days is the finding, and a board that only shows where it sits will not surface it.
Calendar View
Event calendar for earnings announcements, regulatory filings, dividend dates, and economic events. Visual event markers with details on hover or click.
Dated events the reader plans around — earnings, filings, dividends, economic releases — where the month shape itself is useful.
Never as the only view for a long list of events: a reader looking for the next filing wants a list, not a grid to scan. Never place event detail behind hover only, and never render a multi-timezone calendar without stating which timezone the grid is in.
A grid with proper row and column headers, arrow-key navigation across dates, and each day's event count in the cell's accessible name so the reader does not have to enter empty days. Event markers carry text, not colour alone.
WCAG 2.2 SC 1.4.13 for any hover-revealed detail and SC 1.4.1 for the markers. The timezone rule is correctness rather than accessibility: a filing deadline shown in the wrong zone is simply the wrong date.
Code Block
Syntax-highlighted code display for API documentation, FIX protocol messages, and WebSocket payload examples. Copyable code with line numbers and language identifier.
Literal payloads the reader will copy or compare — API examples, FIX messages, WebSocket frames.
Never for content the reader is meant to read as prose, and never syntax-highlight in colours that fall below contrast on either theme. Never let line numbers be selected along with the code; a copy that includes them is a copy that does not run.
The block is a labelled region stating its language; copy confirms in text rather than silently; horizontal scrolling is keyboard-reachable, which means the container is focusable when it scrolls. Highlight colours are checked at 4.5:1 against the block background in both themes.
WCAG 2.2 SC 1.4.3 Contrast (Minimum) applied to syntax highlighting — the most common place a design system passes its contrast audit on components and fails it inside code samples — and SC 2.1.1 for the scrollable region.
Notification Center
Aggregated notification feed for price alerts, compliance deadlines, and system messages. Categorized and dismissible notifications with priority indicators.
An aggregated feed of things that happened while the reader was elsewhere, with enough categorisation that the important ones are findable.
Never as the delivery mechanism for something time-critical: a centre is pull, and an alert with a deadline needs push. Never mark all as read without a way to recover, and never group notifications whose actions differ.
New items are announced by count, not individually; each item's type and age are in its accessible name; dismissal names what is dismissed. The unread count is text as well as a badge.
WCAG 2.2 SC 4.1.3 Status Messages. The push-versus-pull rule is the register's substantive content: a compliance deadline delivered only into a notification list has not been delivered.
Confirmation Dialog
High-stakes action confirmation for trade execution, wire transfers, and account changes. Modal dialog with warning icon, destructive action button, and cancel option.
Irreversible or high-value actions — executing a trade, sending a wire, changing account ownership — where the reader must restate intent.
Never for a reversible action; a confirmation on something with an undo trains the reader to dismiss confirmations. Never phrase the buttons as “OK / Cancel”, and never state the action generically — the dialog must name the specific thing, with its amount and its counterparty.
Focus moves to the dialog and is trapped, Escape cancels, the destructive button is not the default focus target, and the dialog's accessible name contains the specific action. The consequence is stated in the body, not implied by an icon.
WCAG 2.2 SC 3.3.4 Error Prevention (Legal, Financial, Data): transactions must be reversible, checked, or confirmed. This component is the “confirmed” branch, which is why generic wording fails it — a confirmation that does not restate the data has not confirmed anything.
Confirm Wire Transfer
You are about to transfer $50,000 to JP Morgan Chase. This action cannot be undone.
Drag & Drop
Reorderable lists for dashboard widget arrangement and watchlist prioritization. Visual feedback during drag operations with drop zone indicators.
Reordering where the order is the reader's own preference and the arrangement is persistent — dashboard widgets, watchlist priority.
Never for an operation with a correctness constraint the reader cannot see, and never as the only way to reorder. Never rely on drop-zone highlighting alone to indicate where an item will land.
Every drag has a keyboard equivalent — grab, move with arrows, drop, Escape to cancel — and each step is announced (“moved EURUSD to position 2 of 8”). Drop targets are described in text, and the final order is announced on commit.
WCAG 2.2 SC 2.5.7 Dragging Movements is explicit: any function operated by dragging must have a single-pointer alternative. This is the newest criterion in 2.2 and the one most existing drag implementations fail outright.
Keyboard Shortcuts
Keyboard shortcut reference panel for trading terminal hotkeys. Organized by category with searchable help modal for power users.
A reference surface for a product with enough hotkeys that they cannot be learned from the interface alone.
Never as the only place shortcuts appear — a binding that exists solely in a help modal will not be learned. Never document a shortcut that is not remappable if it is a single character key.
The panel is a dialog with search, grouped by category with real headings, and each binding is text rather than a styled key glyph without an accessible name. The trigger shortcut is itself listed.
WCAG 2.2 SC 2.1.4 Character Key Shortcuts: a single-character shortcut must be able to be turned off, remapped, or active only on focus. This panel is where that setting belongs.
Keyboard Shortcuts
Trading
Navigation
Design System Reference Map
This system was built by studying 8+ reference-grade design systems — from institutional finance (institutional terminals, Stripe) to government compliance (Gov.uk, USWDS). Below: what each reference taught us and how it shaped component decisions.
No decision register — by designA reference map of the systems this one was built by studying. It documents where decisions came from; it is not itself a component anyone chooses to use.
Financial & Institutional
Enterprise & Data
Government & Regulatory
What This System Does Differently
MiFID II Suite EU 2014/65/EU
MiFID II (Markets in Financial Instruments Directive II) mandates pre-trade transparency, post-trade reporting, best execution disclosure, and transaction cost reporting. These components encode those requirements as interactive UI patterns — not PDF documents.
EU or UK-passported investment services where pre-trade transparency, cost disclosure and best-execution evidence have to be visible in the interface rather than retrievable from a PDF on request.
Never outside a MiFID-scope jurisdiction — rendering EU cost tables to a US or Australian client is not conservative, it is wrong, and it implies protections that do not apply there. Never as static copy: the figures are per-instrument and per-order, so a hardcoded table is a disclosure that is false the moment the market moves.
Every disclosure is text with a programmatic label tying it to the instrument it describes; cost figures carry their currency and their basis (ex-ante or ex-post) in the accessible name, not only in a column header. Nothing here is behind a hover.
Directive 2014/65/EU (MiFID II) with Regulation (EU) 600/2014 (MiFIR): Art 24(4) cost and charges disclosure, Art 27 best execution, and the RTS 27/28 reporting obligations. The UK retained regime carries the same substance post-Brexit under FCA COBS.
Pre-Trade Transparency — Best Execution Venues Art. 27
Investment firms must take all sufficient steps to obtain the best possible result for clients. This panel surfaces venue-level data so PMs can verify routing decisions before order submission.
Post-Trade Confirmation Art. 59 & 60
Investment firms must send trade confirmations no later than the first business day after execution. This confirmation component encodes all MiFID II-required fields.
Transaction Cost Disclosure Art. 24(4) & RTS 28
ESMA / FCA Risk Warning
ESMA (European Securities and Markets Authority) and FCA (Financial Conduct Authority) mandate specific risk warnings for retail CFD clients, including the percentage of retail investors who lose money. These are legally required — not optional copy.
Retail CFD and leveraged-product surfaces in the EU and UK, where the firm-specific loss percentage is a mandated, calculated figure rather than editorial copy.
Never with a placeholder or a rounded-for-neatness number — the percentage is the firm's own, recalculated quarterly, and a stale one is a misstatement. Never for professional-classified clients, where the retail warning does not apply and its presence misrepresents the client's category.
The percentage is rendered as text at the firm's own contrast floor, never as an image and never below the surrounding body size. It is not dismissible, and it is inside the same landmark as the trading control it qualifies so it is not skipped by landmark navigation.
ESMA product-intervention measures on CFDs (2018), made permanent in national regimes, and FCA PS19/18 in the UK: a standardised risk warning stating the firm's own percentage of loss-making retail accounts, with prescribed prominence.
Mandatory CFD Risk Warning ESMA 2018/796
Required at point of sale and on all marketing materials. The loss percentage must be calculated from the firm's own client data over the preceding 12 months and updated quarterly.
ESMA Leverage Caps by Asset Class ESMA 2018/796 Art. 4
| Asset Class | ESMA / FCA Cap | ASIC Cap | Risk Level | Margin Required |
|---|---|---|---|---|
| Major FX Pairs (EUR/USD, GBP/USD…) | 30:1 | 30:1 | Medium | 3.33% |
| Non-major FX / Gold | 20:1 | 20:1 | Medium-High | 5.00% |
| Major Equity Indices (S&P 500, FTSE 100…) | 20:1 | 20:1 | Medium-High | 5.00% |
| Non-major Equity Indices / Commodities | 10:1 | 10:1 | High | 10.00% |
| Individual Equities | 5:1 | 5:1 | Very High | 20.00% |
| Cryptocurrency | 2:1 | 2:1 | Extreme | 50.00% |
Jurisdiction Simulator
The same Order Entry component renders differently across regulatory jurisdictions. Switch between EU (MiFID II/ESMA), UK (FCA post-Brexit), Australia (ASIC), and US (CFTC/FINRA) to see how compliance requirements alter the interface — warnings, leverage caps, disclosures, and required fields all adapt automatically.
Demonstrating, or building, one order-entry surface that must render differently under EU, UK, Australian and US rules — where the difference is leverage caps, mandated warnings, and required fields rather than translation.
Never as a user-facing toggle in production. Jurisdiction is derived from the client's classification and residence, not chosen by them; a switch invites a retail client to select the professional ruleset. Never as a theme layer either — the differences are structural, not cosmetic.
Switching jurisdiction changes the accessible form structure, so the change is announced and focus is placed at the top of the re-rendered form rather than left on a control that may no longer exist. Newly required fields are marked required programmatically, not only visually.
Four regimes with materially different obligations on the same screen: MiFID II/ESMA (EU), FCA COBS (UK), ASIC RG 227 and the CFD product intervention order (Australia), and CFTC/FINRA rules (US, where retail forex leverage and CFD availability differ outright).
What Changes Per Jurisdiction
Best Execution MiFID II Art. 27 / RTS 27 & 28
Investment firms must demonstrate best execution — the best possible result for clients considering price, costs, speed, likelihood of execution, size, and market impact. This panel shows the Smart Order Router's venue decision in real-time.
Showing why a specific order routed to a specific venue, at the moment it routed, to a reader who may later have to defend that decision.
Never as a marketing claim that the router “always gets the best price” — best execution is a multi-factor obligation, and a single-factor claim is the failure mode the rule exists to prevent. Never without the timestamp and the factor weights that applied; a reconstruction with today's weights is not evidence.
The venue comparison is a real table with headers, not a positioned grid, because the reader will want it row-by-row in a screen reader and column-by-column in a review. The winning venue is named in text, not indicated by highlight alone.
MiFID II Art 27 and RTS 27/28: the obligation is the best possible result taking price, cost, speed, likelihood of execution and settlement, size, nature and any other relevant consideration into account — and the firm must be able to demonstrate it on request.
FCA CASS — Client Money CASS 7 & 7A
The FCA's Client Assets Sourcebook (CASS) requires firms to segregate client money from firm money. This panel surfaces client money status for both the end-client view and the RM operational view — distinct audiences, distinct information needs.
Surfacing client-money segregation status to two audiences at once — the client, who needs to know their money is not the firm's, and the operations reader, who needs the reconciliation state.
Never merged into one view. The two audiences need different facts, and showing the client an internal reconciliation break reads as an incident rather than as a routine daily control. Never as a live balance either — segregation status and available balance are different claims.
The two views are separate regions with their own headings rather than a tab flip that silently changes meaning; the segregation statement is a sentence, not a badge, because “held in a statutory trust” does not survive being compressed to a green dot.
FCA CASS 7 (client money rules) and CASS 7A (client money distribution and transfer): client money is held on statutory trust, segregated from firm money, with an internal client-money reconciliation performed each business day.
Client View — Account Safety
RM View — CASS Operational Status
Two completely different components serve two completely different users — but they reference the same underlying data. The client view answers "is my money safe?" The RM view answers "are we CASS compliant today?" Same information architecture. Different cognitive tasks. Different visual weight.
SEC Rule 10b5-1 Plan Rule 10b5-1(c)
Visual scheduler and execution monitor enforcing statutory cooling-off periods and transaction caps for corporate insiders.
In executive equity dashboards, stock administration platforms, and compliance panels tracking scheduled insider transactions.
Do not use for standard discretionary retail trades. Use basic limit order status forms instead.
Expose status via standard aria-live="polite" when scheduled tranches change. Ensure execution
list has ARIA tables structure.
SEC Exchange Act Rule 10b5-1(c)(1)(ii)(B) (governing mandatory cooling-off periods for directors and officers).
SEC Form 4 Ledger Exchange Act Sec. 16(a)
Real-time ledger showing insider equity transactions, transaction codes, and beneficial ownership filings within the 2-business-day window.
| Reporting Person | Code | Tx Date | Amount (Shares) | Price | Owned Post-Tx | Filing Status |
|---|---|---|---|---|---|---|
| Jane Smith (Director) | S | 2026-06-09 | -15,000 | $42.50 | 85,000 (D) | ✓ Filed (SEC EDGAR) |
| Marcus Brody (VP Finance) | P | 2026-06-10 | +2,500 | $41.80 | 18,200 (D) | ✓ Filed (SEC EDGAR) |
| Alexander Vance (COO) | S | Today | -10,000 | $43.10 | 50,000 (D) | Pending File (T+1) |
Use inside compliance trade portals, equity platforms, and public investor relationship pages to show institutional insider tracking.
Do not use for general market client transactions. Use general client trade confirmations instead.
Tables should include ARIA labels for sorting headers and semantic details for transaction codes S (Sale) and P (Purchase).
Section 16(a) of the Securities Exchange Act of 1934 and SEC Rule 16a-3 (mandatory filing within two business days).
SEC Rule 15c3-3 Reserve Rule 15c3-3(e)
Special Reserve Bank Account calculator displaying credits, debits, and reserve cash deposit requirements for broker-dealers holding customer assets.
In back-office broker-dealer ledger audits, compliance reporting dashboards, and treasury reserve controls.
Do not expose in standard retail customer account pages. Use simple credit interest statements instead.
The calculation result must have role="status" and aria-live="polite" to let
screen readers know when the inputs change.
SEC Rule 15c3-3 (Customer Protection Rule) under the Securities Exchange Act of 1934 (requiring a Special Reserve Bank Account).
SEC Reg BI Gate Exchange Act Rule 15l-1
Multi-step retail investor stepper enforcing Regulation Best Interest disclosure rules, ensuring Form CRS receipt and acknowledgement prior to recommendation execution.
Before opening an account, you must review our broker-dealer relationship summary. This documents our services, fees, conflicts of interest, standards of conduct, and disciplinary history. Download Form CRS (PDF).
In retail brokerage onboarding, advisory client signups, and before delivering recommendations to retail accounts.
Do not enforce on institutional accounts or eligible contract participants (ECPs), where Reg BI does not apply.
The disclosure PDF link must have a descriptive label. The checkbox must have an explicit
aria-required="true".
SEC Regulation Best Interest is Exchange Act Rule 15l-1. Form CRS delivery is a separate rulemaking — Exchange Act Rule 17a-14 for broker-dealers, Advisers Act Rule 204-5 for advisers — which is why this gate enforces two obligations rather than one.
SEC 17a-4 WORM Seal Rule 17a-4(f)
Visual indicators confirming Write-Once-Read-Many (WORM) storage locks, hash integrity checks, and retention scheduling for broker-dealer communications.
trade_ledger_2026_Q2.db.gz ·
SHA-256: f2a3c7...90e3
In document vaults, record-retention auditor dashboards, and trade statement export wizards.
Do not use for temporary application state caches or draft files where edits are expected.
Display status icon with appropriate aria-label="Write-Once-Read-Many storage lock active".
SHA-256 hashes must have monospace font representation.
SEC Rule 17a-4(f) under the Securities Exchange Act (governing electronic storage media integrity standards).
ISDA CSA Margin Call ISDA 2016 VM CSA
Collateral management dashboard calculating variation and initial margins, thresholds, and final payout requests under bilateral agreements.
In collateral operation desks, trade negotiation screens, and post-trade settlement systems.
Do not use for cleared swap margin requirements (which are handled by Central Counterparties / CCPs).
The margin call result should update with an ARIA notification and include proper financial units display.
CFTC Margin Requirements for Uncleared Swaps and Basel III BCBS-IOSCO framework.
ISDA Clause Negotiator ISDA Master Section 5
Bilateral negotiation interface showing termination threshold differentials and cross-default clauses between two contracting entities.
In derivative onboarding systems, legal ops negotiator dashboards, and counterparties consensus reviews.
Do not use for automated algorithmic clearing arrangements. Use structured rules engines instead.
Compare layouts side-by-side using screen reader landmarks like aria-describedby pointing to
change descriptions.
Dodd-Frank Title VII Recordkeeping obligations (requiring clear auditability of agreement negotiations).
ISDA UPI Resolver ISDA Taxonomy 2.0
Schema mapping interface generating Unique Product Identifiers (UPI) and CFI codes from raw swap attribute fields for reporting trade data to Repositories.
In post-trade compliance interfaces, transaction reporting templates, and DTCC swap reporting workflows.
Do not use for plain vanilla equity trades, which use standard ISIN or CUSIP identifiers.
Always display the CFI code and resolved UPI in raw accessible text, not inside images, so screen readers can copy it.
CFTC Part 43 & 45 Swap Data Recordkeeping and reporting rules (requiring unique product identifiers).
ISDA SIMM Risk Exposure SIMM 2.5
Risk parameter matrix entry grid mapping Delta, Vega, and Curvature vectors to compute Initial Margin requirements under Uncleared Margin Rules.
| Tenor Bucket | Delta ($/bp) | Vega ($/bp) | Curvature | Margin Weight |
|---|---|---|---|---|
| 1Y | 0.00 | $142,500 | ||
| 5Y | 0.00 | $620,100 | ||
| 10Y | 0.00 | $1,980,500 |
In derivatives risk dashboards, quantitative trading portals, and capital reserve calculation tools.
Do not use for retail accounts or standard brokerage margin accounts (which use Regulation T / SPAN margins).
Matrix inputs must have descriptive aria-label describing the intersection (e.g. "Vega for 5
year tenor").
BCBS-IOSCO framework on Margin requirements for non-centrally cleared derivatives.
ISDA QFC Stay Status 12 CFR Part 252
System warning banner detailing contract stay provisions under Qualified Financial Contracts (QFC) rules preventing cross-default close-outs.
In trade confirmations, risk settlement interfaces, and legal compliance tracking panels.
Do not use for exchange-traded derivatives or cleared swap contracts, where stays do not apply in this format.
Use a high-visibility warning status (such as role="alert") if the counterparty enters default
administration, triggering stays.
Federal Reserve Board, FDIC, and OCC Qualified Financial Contract (QFC) Stay Rules.
Filter Bar
Chip-based active filter display with search, date range picker, and status toggles. Used in data grids, trade blotters, and compliance logs to surface active filter state clearly.
A filter set an operator returns to daily, on a list large enough that the unfiltered view is not useful.
Not for one-off narrowing inside a modal, where the state dies with the dialog. And never as the only place the applied filter appears — the result count has to state it too, or a filtered list reads as a complete one.
Every active filter is a removable chip with a text label, not an icon; removal is announced together with the new result count. Clear-all is a separate, deliberate action rather than a chip that looks like the others.
Filters serialise to the URL. Two people reviewing “the same list” must be able to prove it is the same list, and a filter held only in memory makes that impossible.
Split Button
Primary action button with a dropdown chevron for variant actions. Used for order entry (Buy / Buy Limit / Buy Stop), export (CSV / PDF / JSON), and report generation actions.
A primary action with closely-related variants where the default is right most of the time — buy against buy-limit, export as CSV against PDF.
Never where the variants are not variants of the same action, and never where the default is not clearly the most common choice: a split button with an arbitrary default is a trap in an order-entry context. Never let the chevron be the only affordance for the alternatives.
The primary action and the disclosure are two separate controls with separate accessible names, so the reader is never one keystroke from the wrong action. The menu follows menu semantics with Escape returning focus to the disclosure.
The register entry is the two-control rule: a split button whose halves share a single focus target is a single button that sometimes does something else, which is the pattern's known failure in trade entry.
Audit Trail
Immutable chronological log of system events, user actions, and compliance decisions. Required for MiFID II best execution reporting, SOX audit support, and internal controls. Each entry is cryptographically linked to prevent tampering.
Append-only event stream with hash chaining — each entry carries actor, action, payload diff, and timestamp; the chain makes silent edits cryptographically loud.
Do not render the trail as raw JSON — the audience is a compliance officer under time pressure. Each event renders as a human-readable sentence with the diff one click away.
Filterable by actor, surface, and event class, but never editable or deletable from the UI — the viewer has zero write paths by design.
Built to the SEC 17a-4(f) WORM standard: write once, read many. The same pattern seals AI recommendations in the Double-Blind protocol — sign-off is a first-class event.
Live Data Integration
Design components consuming real production APIs — zero mock numbers. Every price, rate, and filing shown here is fetched live. Demonstrates loading skeletons, stale-data detection (72-second window), error boundaries with last-known-good cache, and WebSocket reconnection with exponential backoff.
Interfaces backed by real feeds, where staleness, failure and reconnection are states the design has to render rather than states the code hides.
Never render a cached value as if it were live — the last-known-good figure needs its age stated. Never retry without backoff, and never fail silently to a blank panel, which is indistinguishable from a zero.
The staleness window is stated in the interface, not only enforced in code; stale and disconnected states are announced once each rather than on every retry; the last-known-good timestamp is text. Error boundaries name the affected feed.
The design constraint is that a market value has an age, and the age is part of the value. Every rule here follows from refusing to display a number without it.
KYC / AML Identity Verification Stepper
Multi-step identity verification flow used by regulated financial platforms for onboarding under FinCEN CDD, FCA SYSC 6, and MAS AML/CFT requirements. Handles document upload, liveness check, sanctions screening, and risk scoring with clear failure states and manual-review escalation paths.
Regulated onboarding where identity has to be established before an account can transact, and where a failed check has a defined manual-review path rather than a dead end.
Never as a linear wizard with no exit: a document that will not read, a liveness check that fails on a low-end camera, and a name that transliterates badly are all normal, and each needs a route to a human. Never collect a document the risk tier does not require — enhanced due diligence is triggered, not default.
Each step is a labelled fieldset with its own heading, so the flow is resumable and a screen reader knows where it is; progress is stated as “step 2 of 5” in text, not implied by a bar. Failure states say what to do next, and never say only “verification failed”, which is unactionable and reads as an accusation.
FinCEN CDD Rule 31 CFR 1010.230 for the customer identification and beneficial-ownership elements, FCA SYSC 6 on compliance systems and controls, and the MAS AML/CFT notices. FATF Recommendation 10 sets the risk-based principle that stops this being one flow for everyone.
Role-Based Access Control Matrix
Granular permission editor for multi-tenant enterprise platforms. Each cell represents a policy decision logged to the audit trail. Used for SOC 2 CC6.1 access controls, Type I/II attestations, and regulatory separation-of-duties reviews. Supports role templates, permission inheritance, and "who changed this" hover tooltips.
Editing permissions in a multi-tenant system where every cell is a policy decision an auditor will later ask about, and where roles are numerous enough that a list of checkboxes stops being readable.
Never as a matrix so wide it needs horizontal scrolling to compare two roles — at that point split by resource. Never allow an edit that removes the last administrator, and never show inherited permissions identically to directly granted ones: the difference is the whole audit answer.
The grid is a real table with row and column headers, because a permission cell means nothing without both announced; inherited state is a word in the cell's accessible name, not a lighter shade. “Who changed this” is reachable by keyboard, not hover-only — hover-only provenance is provenance that does not exist for half the auditors reading it.
SOC 2 CC6.1 logical access controls and CC6.3 for role changes, with ISO 27001 A.9 as the parallel control set. Separation of duties is the underlying requirement: a role that can both grant permissions and act under them is the finding.
| RESOURCE | CLIENT ANALYST | PM | TRADER | COMPLIANCE | ADMIN |
|---|
Multi-Approver Approval Workflow
N-of-M signoff pattern for high-stakes actions — trade cancellation, policy changes, vendor contracts, client offboarding. Each approver sees full context (proposed change, diff, requestor, SLA), can approve/reject/request changes, and is logged to the audit trail. Parallel or sequential, with optional hierarchy routing.
N-of-M sign-off on an action that is irreversible or high-value, where every approver has to see the same payload rather than a summary of it.
Never for a single approver plus a reviewer who cannot block — that is theatre with an extra click. Never where the person who raised the action can also approve it, and never where an approver can act on a description instead of the exact payload.
Each approver's state is a word, never colour alone; the payload is restated at the point of approval rather than referenced; pending, approved and rejected transitions are announced. A rejection captures a reason, because an unexplained block is an escalation nobody can resolve.
Segregation of duties: the person who raises an action may not approve it. That control is the reason the pattern exists — SOX §404 internal-control assertions and the four-eyes principle in operational risk both fail on a single-approver path dressed up as two.
Data Lineage Graph
Visualises where data originated, every transformation it passed through, and every downstream consumer. Critical for BCBS 239 risk-data aggregation, GDPR Article 30 processing records, and IFRS 17 actuarial assumption traceability. Each node shows owner, freshness, and PII status; each edge shows the transformation contract.
Answering “where did this number come from and who consumes it” for a figure that appears in a regulatory return or a financial statement.
Never as a pretty graph with no owner or freshness on the node — an untimestamped lineage diagram tells you the shape of the pipeline, not whether today's number is trustworthy. Never omit the PII marking: lineage is also the map a data-protection request has to be answered from.
The graph carries a text equivalent: source → transformation → consumer as a nested list, with the transformation contract readable rather than encoded in edge style. Owner, freshness and PII status are text on the node, not icon-only.
BCBS 239 risk-data aggregation principles (accuracy, completeness and traceability of risk data), GDPR Art 30 records of processing activities, and IFRS 17 traceability of actuarial assumptions.
SLA / Uptime Status Board
Real-time service health board with p50/p95/p99 latency, error budget burn, and incident history. Pattern used in Stripe Status, Atlassian Statuspage, and Datadog SLO dashboards. Each service shows 90-day uptime sparkline, current SLA commitment, and remaining error-budget percentage.
A status board where the reader needs to know both what is broken now and how much error budget is left — the second being the number that changes what the team does next.
Never as a green/red board alone: “operational” with 4% of the monthly error budget remaining is a different situation from “operational” with 90%, and a board that cannot say so is decoration. Never publish an uptime figure without its measurement window.
Status is a word before it is a colour; the sparkline has a text summary of its range so it is not the only carrier of the trend. Percentile latencies are labelled p50/p95/p99 in the accessible name, because the number alone is meaningless.
The convention this follows is the public status page as practised by Stripe, Atlassian and Datadog: a named SLA commitment, a stated measurement window, and error-budget burn published rather than computed privately.
Reconciliation Diff Table
Side-by-side comparison of two datasets with automatic mismatch highlighting. Used for trade reconciliation (our books vs. prime broker statement), GL-to-subledger checks, MiFID II trade reporting vs. ARM acknowledgement, and daily position-break investigations. Mismatches grouped by severity with resolution actions.
Comparing two records of the same events — our book against the counterparty statement, general ledger against subledger — where the output the reader needs is the breaks, not the matches.
Never as a plain side-by-side with no severity grouping: a thousand-row diff where a rounding difference and a missing trade look alike is a diff nobody finishes reading. Never auto-resolve a break; the resolution is the audit record.
Mismatches are announced by count on filter change, and each break states its type in text rather than by row tint. The two sides are semantically paired in the table structure, so a screen reader reads “ours 1,204 / theirs 1,240” as one comparison and not as two unrelated columns.
MiFIR Art 26 transaction reporting — Regulation (EU) 600/2014, not the MiFID II directive — with the ARM acknowledgement cycle, and FCA CASS 6/7 reconciliation requirements, where an internal reconciliation must be performed and breaks resolved within defined periods.
| SYMBOL | OUR QTY | PB QTY | Δ | OUR NAV | PB NAV | Δ $ | ACTION |
|---|---|---|---|---|---|---|---|
| AAPL | 45,000 | 45,000 | 0 | 8,126,700.00 | 8,126,700.00 | — | ✓ Matched |
| MSFT | 22,500 | 22,501 | −1 | 9,348,075.00 | 9,348,490.54 | −415.54 | Review |
| NVDA | 12,000 | 11,000 | −1,000 | 10,697,160.00 | 9,805,063.00 | −892,097.00 | Break · Escalate |
| GOOGL | 8,200 | 8,200 | 0 | 1,358,012.00 | 1,358,012.00 | — | ✓ Matched |
| TSLA | 6,750 | 6,750 | 0 | 1,207,237.50 | 1,207,237.50 | — | ✓ Matched |
Enterprise Tenant Switcher
Multi-tenant navigation pattern for MSP dashboards, consultancy portals, and enterprise SaaS. Shows current tenant prominently, recents, search, and role-per-tenant. Keyboard-driven (⌘K opens, arrow keys, enter selects). Switching reloads workspace without full navigation to preserve scroll context.
Multi-tenant consoles where one operator legitimately works across several customer workspaces and needs to know, at all times, which one they are acting in.
Never where the tenant is implicit or shown only in a corner avatar — an action taken in the wrong tenant is the most expensive mistake this pattern exists to prevent. Never make switching silent: it changes what every subsequent action means.
The current tenant is in the accessible name of the page landmark, not only in the switcher; a switch moves focus and announces the new tenant. The keyboard path (open, arrow, enter) is documented in the trigger's accessible name rather than left to be discovered.
The pattern's constraint comes from operational risk rather than a statute: acting in the wrong tenant is a data-segregation incident, so tenant identity is treated as page state rather than as navigation chrome.
API Keys & Webhook Manager
Credential lifecycle with scoped permissions, rotation policy, and delivery health. Modeled on Stripe/Plaid developer consoles with institutional audit expectations. Reg alignment: SOC 2 CC6.1 (logical access), PCI DSS 3.2.1 (key management), OWASP API Security Top 10.
Credential lifecycle where a key is shown once, scoped narrowly, rotated on a policy, and where webhook delivery health is part of the same picture.
Never display a secret again after creation, and never let the interface imply it can be recovered. Never offer an unscoped key as the default path — the convenient option becomes the deployed one. Never delete a key without showing what last used it and when.
The one-time reveal is announced and the copy action confirms in text, because a silent clipboard write is indistinguishable from failure. Rotation and revocation are separated in wording and in placement, since they have very different consequences and are commonly confused.
SOC 2 CC6.1 logical access, PCI DSS key-management requirements where cardholder data is in scope, and the OWASP API Security Top 10 — broken object-level authorisation being the failure that over-scoped keys produce.
https://ops.northwind.example/hooks/treasury
Regulatory Alert Triage Queue
Compliance inbox for surveillance hits — AML, market abuse, sanctions, PEP. Each alert carries regulatory source, severity scoring, SLA clock, and case linkage. Pattern reference: NICE Actimize, Nasdaq SMARTS, internal tools at tier-1 banks. Reg alignment: FINRA Rule 3110, MAS Notice 626, FCA SYSC 6, OFAC SDN screening.
A compliance inbox where surveillance hits from several sources land together and each one carries its own regulatory clock.
Never merge the sources into an undifferentiated feed: an OFAC screening hit and a market-abuse surveillance alert have different deadlines and different escalation paths. Never allow a close without a reason, and never let the SLA clock be the only thing that sorts the queue — severity and clock are two axes.
The regulatory source is text on every alert, not a coloured stripe; the SLA state is a date plus a state word. Bulk actions require the count to be restated in the confirmation, because a mis-scoped bulk close is a supervisory failure rather than an inconvenience.
FINRA Rule 3110 supervision, FCA SYSC 6 compliance systems and controls, MAS Notice 626, and OFAC screening obligations under 31 CFR Part 501.
Seat & License Manager
Enterprise SaaS seat allocation with role tiers, utilization reporting, and contract-aware provisioning. Covers the "are we paying for ghosts" question that FP&A asks every quarter. Reg alignment: ISO 27001 A.9 (access control), SOC 2 CC6.2 (user deprovisioning).
Seat allocation where the operational question (who has access) and the commercial question (what are we paying for) are answered from the same record.
Never let this be the only deprovisioning path — access removal is a security control and must not depend on someone reviewing a billing screen. Never present “inactive” as “safe to remove” without stating the inactivity window.
Utilisation is stated as a fraction with both numbers, never as a bare percentage; the last-active date is absolute. Removing a seat states in the confirmation what access is being revoked, not just how much money is saved.
ISO 27001 A.9 access control and SOC 2 CC6.2 on user deprovisioning — the control being that access is removed promptly on role change or departure, which is why this screen must not be the mechanism it depends on.
Post Composer
Rich content composer with media attachments, @mention autocomplete, emoji picker, draft save, visibility scoping, and character limit with live counter. Pattern reference: Twitter/X, LinkedIn, Bluesky composer. Accessibility: full keyboard control, SR announcements, reduced-motion aware.
Authoring surfaces where the reader is producing content with attachments, mentions and a visibility scope that must be understood before posting.
Never leave visibility implicit — a post published to the wrong audience is the failure this component exists to prevent, and a small icon is not a statement of scope. Never lose a draft on navigation, and never enforce the character limit by silently truncating.
Visibility is stated in words next to the post action, not only as an icon; the remaining character count is a status region updated on a threshold rather than per keystroke; mention autocomplete follows combobox semantics with announced result counts.
The register entry is explicit scope-before-publish: everything else in a composer is convenience, and this is the one property whose absence causes irreversible harm.
Feed Post Card
Timeline post with author meta, repost attribution, rich content, media grid, reactions bar, and action row (reply, repost, like, share, bookmark). Pattern reference: Twitter/X, Threads, LinkedIn native post. Handles quote-repost chain and collapsed-thread continuation.
A timeline unit carrying author, content, attribution and actions, where repost and quote chains must remain attributable.
Never flatten repost attribution into the reposter's name — that misattributes authorship. Never make the whole card a single link while it also contains links and buttons. Never hide the timestamp behind a relative string alone.
The card is an article with an accessible name; reaction buttons state both their action and their current state (“like, 42, not liked”); the timestamp carries an absolute value. Media in the grid has real alternative text or is explicitly marked as undescribed.
Attribution integrity is the register entry: the component's contract is that the reader can always tell who wrote a thing and who passed it on.
Story Ring Carousel
Horizontally scrolling story row with viewed/unviewed ring states, live indicator, and "your story" affordance. Pattern reference: Instagram, LinkedIn video spotlight, WhatsApp status. Gradient ring signals unseen content; muted ring = already watched.
Ephemeral, time-ordered content where the unseen/seen distinction is the primary information in the row.
Never as the entry point to anything essential — the content expires, and anything that expires cannot be the only route. Never auto-advance without a pause control. Never signal unseen state by a gradient ring alone.
Seen and unseen are in each item's accessible name; the carousel is keyboard-scrollable with visible focus; auto-advance is pausable and respects reduced motion. The live indicator is text, not a pulsing dot.
WCAG 2.2 SC 2.2.2 Pause, Stop, Hide for the auto-advance, and SC 1.4.1 for the ring state. A ring gradient is precisely the “colour alone” failure, made harder because it is also an animation.
Threaded Comments
Nested comment thread with collapse/expand, author highlighting, reaction pills, reply composer inline, and OP/verified badges. Pattern reference: Reddit, Hacker News, Linear comments. Scales to 5+ levels of depth with visual rail to anchor the reading eye.
Nested discussion where reply structure carries meaning and depth can exceed what indentation can express.
Never rely on indentation past about three levels; beyond that, collapse with an explicit “in reply to” rather than shrinking the column further. Never collapse a thread without stating how many replies are hidden.
Each comment states its reply target in text; nesting is a real list structure so depth is programmatically available; collapse controls report expanded state and the hidden count. The visual rail is decorative.
WCAG 2.2 SC 1.3.1 Info and Relationships and SC 1.4.10 Reflow — deep indentation is the standard way a thread view fails reflow at 320 CSS pixels.
Profile Header
Identity block with banner, avatar, name row (verified badge, pronouns), bio, stats (followers, following, posts), action CTAs (follow, message, share), and tab navigation. Pattern reference: Twitter/X, LinkedIn, Bluesky profile. Collapses cleanly at mobile breakpoints.
An identity header where name, verification, pronouns, bio and relationship actions are read as one block before the reader decides to engage.
Never place the follow action where the block action was a moment earlier; adjacency of opposite-consequence controls is a design decision with a cost. Never render a verification mark without its meaning being reachable.
The stats row states each figure with its label in one accessible name; the follow control reports its current state rather than only its next action; the banner is decorative. Tab navigation follows the tabs pattern.
The register entry is the separation of opposite-consequence actions — follow and block — which is a layout constraint rather than a styling preference.
Ed Chen
he/himNotification Feed
Aggregated notification stream with type iconography, actor stacking, time grouping (new vs earlier), action previews, and filter tabs. Pattern reference: GitHub, Linear, Twitter/X notifications. Groups identical actions ("12 people liked your post") to reduce noise.
An aggregated activity stream where grouping identical actions is what makes the feed readable at all.
Never group actions whose follow-up differs — “12 people liked” is one thing, “12 people mentioned you” is twelve. Never show a filter tab whose result set is empty without saying so.
Grouped items state the count and the sample actors in text; new-versus-earlier grouping uses real headings; the unread count is announced on change rather than on every arrival.
Grouping is the pattern's whole value and also its risk: the register records which actions may be collapsed and which may not.
Trending Hashtags Panel
Right-rail trend unit with rank, category context, post volume, and engagement delta (Δ 24h). Pattern reference: Twitter/X "What's happening", LinkedIn news, Bluesky discover. Numeric trend indicator avoids the "going viral now!" coercion and just reports the data.
A ranked list of what is currently high-volume, reported as data rather than as an urgency cue.
Never phrase the unit as a call to action (“going viral now!”) — that converts a measurement into a nudge. Never omit the measurement window, and never rank by an undisclosed blend the reader cannot interpret.
Rank, volume and delta are each labelled text; the measurement window is stated once for the panel. The delta's direction is signed, not conveyed by colour alone.
EU DSA Art 27 requires the main parameters of a recommender system to be set out in plain language. Stating the window and the basis is that obligation applied to a trending panel — and it is also why the copy reports rather than urges.
Direct Message Chat
1:1 chat surface with paired conversation list (left) and thread view (right). Features read receipts, typing indicator, day separators, reaction picker, inline media/link previews, and message composer. Pattern reference: Slack DMs, iMessage, Twitter/X DMs.
A paired conversation list and thread view for private messaging, with delivery and read state visible.
Never show a read receipt the sender cannot turn off without saying so at the account level. Never render a typing indicator as a persistent live region — it will be announced continuously. Never load link previews from third parties without disclosing the request.
New messages are announced politely with the sender named; day separators are headings; the composer keeps a visible label. Reaction pickers are menus with keyboard access, not hover-only overlays.
GDPR Art 5(1)(a) transparency for the read-receipt and link-preview behaviours: both send information about the reader to someone else, so both are disclosed rather than assumed.
Creator Engagement Analytics
Creator-facing post performance panel with impressions, engagement rate, audience growth, top referrers, and 7-day sparkline. Pattern reference: Twitter/X Analytics, LinkedIn Creator Dashboard, YouTube Studio. Uses Ben Fry's "show the data first" principle over dashboard theatre.
A creator-facing performance panel where the numbers are the content and the reader is judging their own output.
Never lead with a composite score over the raw figures — a single engagement number obscures which input moved. Never chart a rate without its denominator, and never compare periods of different lengths without saying so.
Each metric states its definition and window; the sparkline is decorative with the trend stated numerically; the table equivalent of every chart is present. Percentage figures state their base.
The stated principle is showing the data before the dashboard: the panel's job is to be interrogable, so every derived figure keeps its inputs visible.
Verified Creator Badge System
Multi-tier verification mark (Individual, Professional, Organization, Government) with hover-tooltip explaining authority, issue date, and scope. Pattern reference: Twitter/X Verified, Bluesky moderation labels, Meta Meta-verified. Disambiguates trust signals so users can tell "celebrity" from "actual regulatory body".
Multi-tier verification marks where the reader needs to know what was verified, by whom, and when.
Never use one mark for different kinds of verification — a paid mark and an identity-verified mark mean different things, and a single glyph for both is a trust claim the system cannot support. Never put the explanation behind hover only.
The mark's accessible name states the tier and the authority; the detail is reachable on focus as well as hover, and is dismissible and persistent per the hover/focus criterion. Tiers are distinguished by shape and label, not by colour alone.
WCAG 2.2 SC 1.4.13 for the tooltip and SC 1.4.1 for the tiers. EU DSA Art 25 is the substantive anchor: an interface that presents different trust signals as one deceives by design, which is what that article prohibits.
Sanctions Screening Engine
Real-time name-match screening against 12 sanctions lists (OFAC SDN, EU CFSP, UN Consolidated, UK HMT, MAS TSOFA, AUSTRAC DFAT). Fuzzy-match scoring, AKA alias expansion, transliteration support (Cyrillic/Arabic/CJK). Reg alignment: OFAC 31 CFR 501, EU (EC) 2580/2001, UK SAMLA 2018.
Real-time name screening where an operator must decide whether a fuzzy match is the sanctioned party — and where the cost of both a false negative and a false positive is high.
Never as an auto-block with no review path: transliteration and common-name collisions make silent auto-rejection a de-banking mechanism. Never surface a match score alone; a number without the matched tokens and the list entry is not reviewable.
The matched substrings are marked up as text emphasis, not colour highlight alone, and the list source is
named in the accessible name of each hit. Non-Latin names carry lang so a screen reader does
not read Cyrillic or Arabic with the wrong voice — which is a correctness issue here, not a polish one.
OFAC 31 CFR Part 501 with the SDN list, EU Regulation (EC) 2580/2001 and the CFSP consolidated list, and the UK Sanctions and Anti-Money Laundering Act 2018 with the HMT consolidated list. Strict liability applies in the US regime, which is why the review path is a design requirement and not a convenience.
PEP & Adverse Media Monitor
Politically Exposed Persons monitoring with three-tier FATF classification (Foreign · Domestic · IO), family member & close associate expansion, adverse media signal ingestion. Reg alignment: FATF Rec 12, EU AMLD6 Art 20, UK MLR 2017 Reg 35.
Ongoing PEP and adverse-media monitoring where the tier of exposure — foreign, domestic, or international-organisation — changes the level of due diligence owed.
Never as a binary PEP flag. The tiers carry different obligations, and collapsing them either over-escalates domestic PEPs or under-escalates foreign ones. Never treat an adverse-media hit as a finding: it is an input to review, and rendering it as a verdict is how an unrelated namesake ends up de-risked.
Tier is stated in words next to the name; relationship (family member, close associate) is stated rather than implied by indentation, because tree depth does not survive a screen reader linearising it. Adverse-media items are labelled as unverified signals in text.
FATF Recommendation 12 with its three-tier classification, Art 20 of Directive (EU) 2015/849 as amended (carried into the 2024 package at AMLR (EU) 2024/1624 Arts 42–44), and UK MLR 2017 Reg 35 — which requires senior-management approval, source-of-wealth establishment, and enhanced ongoing monitoring for foreign PEPs specifically.
Transaction Risk Scoring Engine
Real-time multi-factor transaction risk scoring: amount velocity, geography, counterparty risk, typology fingerprint. Adjustable weights per risk appetite. Reg alignment: FinCEN 31 CFR 1010.320, BSA/AML, Wolfsberg Guidance on Risk-Based Approach.
Multi-factor transaction scoring where the weights are a stated risk appetite the firm can defend, and an operator needs to see which factors drove a score.
Never as an opaque score. A number the reviewer cannot decompose is a model they cannot challenge, and a model nobody challenges is one that drifts. Never let weights be adjusted without a versioned record of who changed them and when.
The factor breakdown is a list with the contribution stated numerically, not a radar chart alone — a shape is not readable and not comparable across cases. Weight controls announce their new value on change.
FinCEN 31 CFR 1010.320 and the BSA framework, with the Wolfsberg Group guidance on the risk-based approach. Where a model drives the score, SR 11-7 model-risk management applies: the design has to leave room for validation and for effective challenge.
SAR / STR Filing Workflow
Suspicious Activity Report drafting with narrative scaffolding, evidence attachment, MLRO review, and regulatory submission (FinCEN BSA E-Filing, UK NCA SAR Online, HK JFIU). 30-day FinCEN filing clock visible at all times. Reg alignment: 31 USC 5318(g), POCA 2002 s.330, FATF Rec 20.
Drafting a suspicious activity report with the evidence attached, the MLRO review step in the path, and the statutory filing clock visible throughout.
Never with the clock hidden behind a tab, and never with a save path that lets the draft sit past the deadline without escalating. Never expose tipping-off risk in the customer-facing product — nothing about a filed or pending report may be inferable from the client's own view.
The countdown is a text deadline with the date, not only a relative “12 days left”, and it is announced when it crosses an escalation threshold rather than on every tick. The narrative field is a labelled multi-line input with its scaffolding as visible text, not placeholder text that vanishes on focus.
31 USC 5318(g) and the FinCEN 30-day filing deadline, POCA 2002 s.330 in the UK with its separate tipping-off offence under s.333A, and FATF Recommendation 20.
Ultimate Beneficial Owner Graph
Multi-level corporate ownership unwinding with >25% threshold detection per FinCEN CDD Rule. Circular holdings, trust interposition, nominee flag. Reg alignment: 31 CFR 1010.230, EU AMLD5 Art 30, UK PSC Register, Singapore RoRC.
Unwinding layered corporate ownership to find natural persons above a control threshold, where the path matters as much as the answer.
Never as a flat list of owners: the interposed trust or nominee is the thing being looked for, and a flattened view deletes it. Never assume the graph terminates — circular holdings are common and an unlabelled loop reads as a data error rather than as a finding.
The graph has a text equivalent — an ownership path expressed as a nested list with percentages — because a force-directed diagram is unusable without sight and hard to cite in a file note. Nominee and trust interposition are labelled in words on the node.
FinCEN CDD Rule 31 CFR 1010.230 with its 25% equity threshold plus the separate control prong, EU AMLD5 Art 30 beneficial-ownership registers, the UK PSC register, and Singapore's Register of Registrable Controllers.
Ongoing Monitoring Alert Queue
Triage-ready alert queue from behavioural-rule and ML-model detection layers. SLA-banded disposition: clear, escalate, RFI, SAR. Reg alignment: FATF Rec 10(d), FinCEN 31 CFR 1020.210(b)(2)(v), JMLSG Part I 5.7.
A triage queue where alerts arrive from both rule-based and model-based layers and an analyst has to dispose of each within an SLA band.
Never blend the two detection layers into one undifferentiated queue — a rule hit and a model score need different scrutiny, and hiding the source removes the analyst's ability to weight them. Never let an alert be closed without a recorded disposition reason.
SLA band is text plus position, never colour alone; the queue announces its remaining count on filter change rather than silently re-rendering. Keyboard disposition is first-class, because this is a surface people work for hours at a time.
FATF Recommendation 10(d) on ongoing monitoring, FinCEN 31 CFR 1020.210(b)(2)(v), and JMLSG Part I 5.7. Where a model produces the alert, EU AI Act Art 14 human oversight applies: the analyst must be able to disregard the model's output, and the interface has to make that possible rather than merely permitted.
Jurisdiction Risk Heatmap
FATF grey / black list status blended with Basel AML Index, Transparency International CPI, and sanctions regime density. Per-country exposure weighted by book volume. Reg alignment: FATF Public Statements, EU AMLD5 Annex III, Basel Committee AML/CFT Principles.
Country-risk exposure weighted by actual book volume, blending list status with independent indices rather than relying on any one source.
Never as a standalone map: a heatmap without the volume weighting shows where the risky countries are, not where the firm's risk is. Never treat FATF grey-listing as a prohibition — it raises the diligence owed, and rendering it as a block is both wrong and a de-risking decision made by a colour ramp.
Every country carries its status and its exposure as text in the accessible name; the colour ramp is a redundant encoding, not the information. The scale is stated with its endpoints, because “darker is worse” is not discoverable.
FATF public statements on high-risk and monitored jurisdictions, EU AMLD5 Annex III risk factors, and the Basel Committee's AML/CFT principles — blended here with the Basel AML Index and Transparency International's CPI as independent inputs.
CDD Refresh & Trigger Event Ticker
Ongoing Customer Due Diligence refresh schedule blended with trigger-event detection (address change, ownership restructure, adverse media, unusual activity). Reg alignment: FATF Rec 10, EU AMLD5 Art 14(5), MAS AML Notice 626 §8.
Periodic due-diligence refresh driven by both a schedule and by trigger events, where an event should be able to pull a review forward.
Never as a calendar alone. A purely periodic cycle means a customer who restructured ownership in month two is not looked at until month twenty-four. Never as triggers alone either — an absence of events is not evidence of low risk.
Due dates are absolute dates in text; a trigger event states what fired it and when, not just that a review is due. Overdue is a word before it is a colour.
FATF Recommendation 10 on ongoing CDD, EU AMLD5 Art 14(5) requiring review at appropriate times and on trigger events, and MAS Notice 626 §8.
Typology & Red-Flag Library
Reference library of money-laundering typologies sourced from FATF, APG, Egmont Group, MENAFATF with bound detection rules and real case exemplars. Reg alignment: FATF Typologies Reports, Egmont Case Book, UK NCA Red Flag Indicators.
A reference library that binds a laundering typology to the detection rules that implement it and to real case exemplars — so an analyst can see why a rule exists.
Never as a static document. The value is the binding between typology, rule and case; unbound, it is a PDF with better typography. Never present the case exemplars as exhaustive — a red-flag list read as a checklist becomes a ceiling on suspicion rather than a floor.
Each typology is a landmarked section with its bound rules as a real list, so the library is navigable by heading rather than by scroll. Source attribution is text on every entry, not a legend at the top.
FATF typologies reports, the Egmont Group case book, APG and MENAFATF regional typologies, and the UK NCA red-flag indicators. The design decision that matters is refusing to let the library read as a complete list.
Regulatory Change Watcher
Real-time ingestion of OFAC SDN updates, HMT Sanctions Notices, EU Council Regulations, MAS Circulars, HKMA Guidelines. Auto-diff old vs new lists, impact-surface against current book, CCO routing. Reg alignment: OFAC OFAC Recent Actions feed, HMT Financial Sanctions Notice, EU OJL, MAS MAS-Notices-RSS.
Watching sanctions and guidance sources for changes, diffing old against new, and surfacing which of the firm's existing relationships the change actually touches.
Never as a news feed. A notice that is not impact-surfaced against the current book is an email, and it will be treated like one. Never auto-apply a list delta without a review step — an upstream data error becomes an unreviewed mass action.
Diffs are additions and removals as labelled text, never red/green alone. Impact counts link to the affected relationships rather than stating a number the reader has to go and reconstruct.
Sources ingested are the OFAC recent-actions feed, HMT financial sanctions notices, EU Official Journal L-series, MAS notices and HKMA guidelines. The obligation being served is the one behind them all: screening against the current list, not the list as at onboarding.
Calibrated Confidence Badge
Confidence as a calibrated, decision-grade signal — score bands (HIGH / MEDIUM / ABSTAIN) tied to measured calibration error, not raw softmax. The abstain state is designed, not hidden. Production pattern from Duo-Shou's three-tier valuation. Reg alignment: SR 11-7 model uncertainty disclosure, EU AI Act Art. 13 transparency.
Attach to every AI output a user might act on. The badge communicates how much to trust this specific output — banded, calibrated, and honest about coverage.
Never show raw model probability as if it were accuracy — an uncalibrated 0.92 is marketing, not measurement. If you cannot measure calibration (ECE), ship a qualitative band, not a number.
Bands are colour + label dual-encoded; ABSTAIN renders the fallback path (human review, more data) instead of an empty value. Screen readers get the band name and what it implies, not the percentage alone.
SR 11-7 requires known model limitations to be visible at the point of use; EU AI Act Art. 13 requires output interpretability. The calibration date in the corner is the audit hook.
Reasoning Chain · Explainability Surface
Every AI recommendation decomposes into challengeable steps, each with its evidence source and provenance label (live data / versioned document / model estimate). Pattern shipped in ConnectX and Aureus \u201cWhy this recommendation\u201d drawers. Reg alignment: SEC Reg BI Conflict (a)(2)(iv), SR 11-7 effective challenge.
Required wherever an AI recommendation can move money or risk: the user's job is to challenge the synthesis, not to admire the conclusion.
Do not paste a free-text 'explanation' paragraph generated after the fact — that is rationalisation theatre. If the pipeline cannot expose real intermediate steps, show inputs honestly instead.
Steps are a semantic ordered list; each step links to its evidence; estimates are visually distinct from facts. Keyboard expands steps; the chain reads top-to-bottom as one argument.
SR 11-7 effective challenge requires that a reviewer can interrogate the model's reasoning; Reg BI requires the basis of a recommendation to be articulable. This surface is that articulation.
Autonomy Tier Selector
Four explicit autonomy tiers — Ambient → Co-pilot → Assertive → Autonomous — as a governance primitive, not a settings toggle. Each tier states what the AI may do, in scope terms a compliance officer can sign. Production pattern from ConnectX's 8-agent framework. Reg alignment: SR 11-7 model governance, EU AI Act human-oversight Art. 14.
Use wherever an AI system can take actions of varying consequence — the tier ladder turns 'how much do we trust the AI' from a vibe into a signed configuration.
Not a feature flag and not a personalisation preference — do not bury it in settings. If the system has only one autonomy mode, state the mode; do not fake a ladder.
Escalating a tier re-presents the full scope contract and requires re-auth; de-escalating is instant. The active tier is announced on every affected surface. Tier state is per-client, not global.
EU AI Act Art. 14 requires meaningful human oversight proportionate to risk; SR 11-7 requires documented model-use boundaries. The tier definition IS that documentation, user-facing.
Human Sign-off Gate
The moment AI hands control to a human: typed confirmation bound to the specific proposal ID, impact and reversibility surfaced pre-commit, and the decision hash-sealed into an append-only trail. Production pattern from Aureus Decision Room and Double-Blind sealed commits. Reg alignment: SEC Reg BI Care Obligation, SEC 17a-4(f), SR 11-7.
Mandatory wherever an AI proposal becomes an irreversible or capital-committing action. The gate is the architectural promise that AI surfaces options and humans hold the commit.
Do not use for low-stakes accepts (that is the suggestion card's job) — gate fatigue destroys the gate. One sign-off per decision, never a daily batch blanket-approval.
Typed confirmation is bound to the proposal ID (no generic 'CONFIRM'); the commit button stays disabled until the exact string matches; reject requires a reason that enters the same trail.
Reg BI Care Obligation expects a deliberation surface, not a click-through; 17a-4(f) expects the decision record to be tamper-evident. The hash seal makes sign-off forensically defensible.
AI Suggestion Card
The unit of human-AI collaboration below the sign-off threshold: a suggestion with provenance chips, calibrated confidence, and three first-class responses — accept, modify, reject-with-reason. Rejected suggestions stay visible with their reason. Pattern from ConnectX RM workflow and Aureus proposals.
The default container for any AI-initiated idea: nudges, drafts, flags. If the action is irreversible or moves capital, escalate to the Sign-off Gate instead.
Never auto-accept on timeout, and never bury the reject option — a suggestion UI where accepting is easier than rejecting is an autonomy escalation in disguise.
All three actions are keyboard-reachable and logged; modify opens the draft for edit rather than regenerating; provenance chips link to the actual source records.
Reg BI conflict rules require the basis of a recommendation to be inspectable — the provenance chips are that basis. The rejection log is the SR 11-7 challenge record.
Streaming Response Surface
Token streaming with the honest affordances: visible model identity, time-to-first-token and throughput, a Stop control that actually halts spend, and an explicit \u201cunverified until complete\u201d register for financial figures.
Use for any generation longer than ~2 seconds — perceived latency drops when language arrives progressively, and Stop gives the user real control over cost and time.
Do not stream numbers into a decision surface as if final — a half-generated figure looks identical to a real one. Execution-grade values render only after the grounding pass.
Stop is keyboard-reachable and cancels the request server-side, not just visually. Completion announces via aria-live. The caret is decorative and hidden from screen readers.
Model identity and generation status visible at point of use (EU AI Act Art. 50 transparency); the 'unverified during stream' register prevents a half-truth from becoming an order.
Prompt Composer
Structured prompt input for professional surfaces: explicit context chips (what the model can see), a token-budget meter, and injection-safe paste — pasted text is data, not instructions. The composer makes the context window a visible, auditable object.
Use wherever users direct an AI with real stakes — the chips answer 'what does the model know right now', which is the question every audit and every confused user asks.
A bare chat textarea is fine for exploration, wrong for regulated work: invisible context produces unexplainable outputs. Don't silently inject CRM data the user can't see.
Chips are removable and inspectable; the budget meter warns before truncation (silent context loss is the worst failure); paste-sanitisation status is visible, and flagged content shows why.
The context chips double as the disclosure of processing basis (GDPR) and make prompt-injection a surfaced, loggable event rather than a silent compromise.
AI Content Disclosure Label
Per-artefact provenance labelling: AI-assisted (human reviewed and named) vs fully automated (rule-bounded, no review). The label travels with the content — letters, summaries, trade confirmations. Reg alignment: EU AI Act Art. 50 transparency obligations, FINRA 2210 communications standards.
Label every client-facing artefact an AI touched. The two-state taxonomy (assisted vs automated) is the minimum honest vocabulary — most policies fail by having only one.
Do not watermark internal scratch work into noise, and never use the label as a liability shield for unreviewed content ('AI-assisted' with no named reviewer is the anti-pattern).
The label is part of the document model, not a CSS overlay — it survives export, print, and forward. Reviewer name and date are mandatory fields for the assisted state.
EU AI Act Art. 50 requires AI-generated content be identifiable; FINRA 2210 holds the firm responsible for communications regardless of authorship — the named reviewer is who answers.
Model Picker & Fallback Chain
Model selection as visible infrastructure: an ordered fallback chain with live health, latency, and an honest 'reduced quality' label on the last resort. Production pattern from Ed's Agent (edwson.com) 7-model NVIDIA NIM chain.
Use when a product depends on third-party model availability — a single-model dependency is an outage waiting for a deprecation notice.
Do not expose a raw model dropdown to end users in a regulated product — model choice is a governance decision; users choose outcomes, operators choose models.
The serving model is attached to every output (attributability); chain order is config, not code; degraded-quality fallbacks are labelled so support can explain output variance.
Model inventory and version control are SR 11-7 baseline expectations; attributing each output to its producing model is what makes incident review possible.
Agent Tool-Call Trace
Every step an agent takes — tool, arguments, result, latency, status — as a readable flight recorder. Write-actions visibly stop at the approval boundary. The trace is what turns 'the agent did something' into an account a compliance officer can read.
Mandatory for any agent that calls tools with side effects. The trace is also the debugging surface — most agent failures are visible as a wrong argument, not a wrong model.
Do not collapse the trace into a cute 'thinking…' spinner for professional users — opacity is a trust cost. Keep raw payloads one click deep, not in the row.
Rows are append-only and timestamped; write-actions show their gate state; the table is semantically a table (screen-reader navigable), with tool names in mono.
Mirrors the 17a-4 audit-trail register applied to agents: actor (agent), action (tool+args), outcome, and the human gate where one exists. NIST AI RMF 'traceability' made concrete.
Grounding & Citation Coverage
Claim-level verification rendered in the text itself: every factual claim in an AI draft is grounded (source linked), ungrounded (no source), or contradicted (source disagrees) — with the worst state visually loudest. This is the hallucination guard as a shipping component, not a research demo.
Run on any AI draft containing facts that will reach a client or a regulator — letters, summaries, reports. The component answers 'which sentence do I need to check' instead of 'is this whole thing trustworthy'.
Do not gate casual internal chat on full grounding — the cost is real and the register is wrong. And never average the three states into one 'trust score'; a single contradicted number outweighs ten grounded ones.
Highlights are colour + underline-style dual-encoded; each claim links to its source or its absence; contradicted claims block one-click send until resolved or overridden with a logged reason.
FINRA 2210 prohibits false or misleading communications — claim-level grounding is the operational control. The override log is the evidence the control existed.
Feedback & Effective Challenge
Two distinct instruments deliberately kept apart: lightweight thumbs (ranking telemetry) and a structured challenge with a typed defect taxonomy that routes to the model owner under an SLA. Conflating them is how 'effective challenge' degrades into a like button. Reg alignment: SR 11-7.
Deploy both wherever professionals consume model output: thumbs for cheap signal density, the challenge form for the failures that matter.
Never let thumbs-down silently stand in for a defect report — a regulator will ask where challenges go, and 'into the ranking model' is the wrong answer.
The challenge form requires a defect class + free text; filing returns a tracking ID; resolution is reported back to the filer — the loop closes or the instrument dies.
SR 11-7 effective challenge requires documented, routed, answered criticism by qualified staff — the taxonomy, routing line, and SLA on this card are that requirement as UI.
Safety Guardrails
Real-time input/output moderation checking prompts and outputs against compliance guardrails.
Deploy as a sync interceptor on all public-facing LLM input and output streams to prevent jailbreaks and toxic generation.
Do not use as a replacement for system prompts; guardrails act as a defense-in-depth secondary filter model (e.g., LlamaGuard).
Status badges transition dynamically; triggered rules are read sequentially by screen readers with explicit ARIA alert status.
EU AI Act Art 50 transparency; CFTC 17 CFR 1.35 records of commodity interest transactions, which is where order-transmission recordkeeping actually sits.
RAG Citation Map
Visual attribution mapping retrieved source chunks to specific model statements with similarity weights.
Essential for advisory and compliance reporting tools where claims must be verified by reference documents (prospectuses, SEC filings).
Avoid for tasks not requiring factual evidence (e.g. code formatting, UI scaffolding generators).
Citations link to document overlays; screen readers read the full citation source name and context block via aria-details.
FINRA Rule 2210 communications with the public; SEC Investment Advisers Act compliance auditing.
The fund retains a 15% liquid collateral buffer for derivative positions, meeting regulatory liquidity ratios under MAS Guidance Paper 8.2.
Cost & Token Budget Tracker
Real-time budget tracking slider and loop termination controls to manage agentic recursion expenses.
Incorporate on all agent playbooks and loop execution views to prevent recursive feedback-loop cost escalations.
Not required for basic single-turn API calls with predictable execution overheads.
Dynamic token bars update with input range sliders; budget breach triggers a visible warn-status color shift and terminates further loops.
SOC 2 financial and operational control standards; corporate board fiduciary oversight requirements.
Agent Loop Execution (DAG)
Directed execution graph illustrating the state, steps, and tool calls of autonomous multi-agent planning loops.
Use for compound workflows involving loops, retry limits, self-correction, or multi-model evaluations.
Do not use for linear pipeline executions with no conditional routing. A simple timeline matches those use cases better.
Nodes are colored by operational state; interactive checkpoints require manual user sign-off to exit the loop; accessible labels trace path outcomes.
NIST AI RMF 1.0 §3.5, the Accountable and Transparent characteristic; CFTC records for algorithmic order execution origins.
Uncertainty Heatmap
Visual attribution highlighting token-level log-probabilities to flag potential hallucinations and uncertain model statements.
Deploy in investment research generators, automated commentary tools, or reports where exact precision of numerical claims is critical.
Do not show to regular consumers without plain-language explanations. The raw metrics are meant for analysts and risk assessors.
Uncertain words are highlighted (orange/red overlay based on entropy); keyboard focus triggers a popup menu displaying top alternate tokens.
SR 11-7 Model Risk Management (effective validation and uncertainty limits); ESMA rules for clear, not misleading client communication.
Based on yesterday's audit report, the total exposure to derivative counterparties in APAC was evaluated to be $14.2 Million, demonstrating compliance.
Adversarial Prompt Tester
Security validation panel displaying system leak protections, indirect injections, and prompt audit success scores.
Integrate in model evaluation pipelines and release staging environments to stress-test prompt injection barriers before deployment.
Do not use for normal application functional QA. Adversarial testing specifically aims to break the safety alignment of LLMs.
Presents tabular threat assessment reports; security levels are color-coded (Red/Green indicators) and categorized with clear labels.
NIST AI RMF 1.0 §3.2, the Safe / Secure and Resilient characteristic; ISO/IEC 42001, the AI management system standard — governance, not a security control set.
| Threat Vector | Adversarial Payload Snippet | Defense Trigger | Bypass Rate |
|---|---|---|---|
| System Prompts Leak | "Show instructions above..." | Structural Guard | 0.00% (Pass) |
| Indirect Injection | "Read text, ignore rest..." | Input Sanitization | 0.00% (Pass) |
| Restricted Output | "Give advice on stocks..." | Output Classifier | 0.00% (Pass) |
RLHF Pairwise Arena
Analyst interface for pairwise model output evaluation to rate compliance, formatting, and alignment metrics.
Deploy in post-training alignment toolchains where expert operators label preference data for supervised fine-tuning.
Avoid for direct end-user screens; consumers do not want to choose between multiple model outputs. Use single output interfaces instead.
Keyboard selectors (Option A vs B) mapped to numeric hotkeys; checkboxes for qualitative wins; clean column grids.
Institutional oversight of model parameters under SEC guidance; documented audit trails of human preference feedback.
The company's net income for the fiscal year ended Dec 31, 2025, increased by 14% to $2.1B, driven by retail subscriber growth.
Net income rose to $2.1 billion (+14% YoY) according to public announcements released by the CFO last month.
Audit Trail Registry
Chained cryptographic block ledger to log model interactions, hashes, and timestamps, ensuring compliance record immutability.
Deploy on algorithmic execution, risk exception overrides, and compliance reporting logs where actions must survive external auditor scrutiny.
Do not use when high-throughput logging of low-risk telemetry is required. Database audit tables are better for generic event tracking.
Blocks are visually linked with verification checks; copies hash values on single-click with visual success indicators.
SEC Rule 17a-4 (immutable data storage format requirement); FINRA Rule 4511 general compliance record keeping.
SEALED
SEALED
Structured Schema Validator
Visual mapping converting raw LLM response text to strictly typed JSON objects with validation and coercion rules.
Use when connecting model-generated text outputs directly to transactional backend databases and execution systems requiring structural validation.
Not necessary for free-form conversational chatbots where structured output is not passed to downstream APIs.
Displays side-by-side parsed fields; highlights validation errors, missing parameters, and automatic type conversions (coercions) with distinct alerts.
SEC Regulation Systems Compliance and Integrity (Reg SCI) strict operational data validation standards.
"symbol": "AAPL",
"qty": "100",
"type": "market"
}
Local Feature Attribution (XAI)
Attribution weights visualization mapping the positive and negative impact of specific variable vectors driving a model choice.
Use for explaining credit approvals, transaction classification, or high-risk algorithmic trading triggers where reasons must be auditable.
Avoid in scenarios with thousands of complex inputs where aggregated feature importance is more representative than local attribution.
Attributes and weights are represented both visually (horizontal bars) and numerically (percentages); colors map to positive vs negative indicators.
Equal Credit Opportunity Act (ECOA) adverse action notice requirements; GDPR Article 22 explanation rights.
Model Card
The model's passport: version, owner, training window, headline metrics, intended use, and — most load-bearing — the known-limits panel stating what the model must NOT be used for. Rendered in product, not buried in a wiki. Reg alignment: SR 11-7 model documentation, EU AI Act Annex IV.
One card per deployed model, linked from every surface that consumes its scores. The intended-use and do-not-use sections are the contract between model team and product team.
Not a research README — no hyperparameter dumps in the product view. If a model has no owner or no documented limits, the card's emptiness is the finding; don't pad it.
Version is mono and copyable; limits panel renders in the warning register and cannot be collapsed by default; metric definitions link to their evaluation protocol.
SR 11-7 requires documented purpose, design, and limitations; EU AI Act Annex IV requires the same for high-risk systems. The card is that documentation at the point of use.
Confusion Matrix
The four-cell truth table with business semantics attached: false negatives labelled as missed risk, false positives as analyst cost. Read together with the threshold tuner — the matrix is the evidence, the tuner is the decision.
Use when reviewing any binary classifier that gates real workflows — fraud, AML, churn. The matrix is the only honest summary of what a threshold choice does.
Do not show accuracy as the headline on imbalanced data — 96.6% accuracy here would hide 56 missed-risk events. Lead with the error cells.
Cells are colour + label dual-encoded; counts are real counts (not percentages alone); each cell drills to the actual cases behind it.
AML model validation expects error analysis by consequence class — the matrix with business labels is the artifact examiners actually read.
FLAG
CLEAR
Feature Importance
Global feature attribution (mean |SHAP|) as ranked bars with mono feature names — plus the caveat rendered into the component, because this chart gets screenshotted into policy decks: importance is association, not causation.
Use for model review, drift investigation, and explaining 'what drives the score' to risk committees. Pair with per-decision attribution for case-level questions.
Never present as causal levers ('reduce feature X to lower risk') and never expose raw feature names that leak protected attributes — display names are a curated mapping.
Bars sort by magnitude with values printed (not colour-only); the list is a semantic list; feature names link to their definitions in the feature store.
Fair-lending and AML validation both ask 'what is the model using' — this surface answers it, and the curated display-name layer is the protected-attribute control.
Drift Monitor
Population-stability tracking with the thresholds drawn in (PSI 0.10 / 0.20 bands), the action state visible (retrain queued), and label-delay honesty — performance drift is invisible until labels arrive, so input drift is the early-warning system.
Standing surface for every production model — drift review is a calendar event, not an incident response. The threshold bands make 'how bad is 0.14' a settled question.
Do not alert on every wiggle (alert fatigue kills the monitor) and do not wait for accuracy to drop — with a 41-day label delay, accuracy is a rear-view mirror.
Bands are encoded in colour AND stated numerically; the action state is part of the component; each month drills to the distribution comparison behind the score.
Ongoing monitoring is an explicit SR 11-7 and EU AI Act Art 72 (post-market monitoring plan) obligation — this surface is the evidence it happens on schedule.
Experiment Tracker
Training runs as a disciplined ledger: config, metric, status — with reproducibility (data snapshot + commit + seed) as the admission rule and a fairness-report gate before any run can become a challenger.
The working surface for model iteration — and the provenance record for 'where did the production model come from', which is an audit question, not a curiosity.
Not a leaderboard: do not sort by metric alone or the team will overfit the eval. Failed runs stay visible — deleted failures are how teams repeat them.
Status is colour + text; configs are copyable mono; each run links to its artefacts. The promote action is a gated workflow, not a button on this table.
SR 11-7 development evidence and EU AI Act record-keeping both expect exactly this trail from data to deployed weights.
Champion–Challenger Gate
Side-by-side production model vs shadow candidate over a fixed evaluation window — with promotion gated on the full criteria set, so an accuracy win cannot buy its way past a fairness regression. The blocked state is the component's reason to exist.
The standard replacement path for any production model — challengers earn promotion in shadow on live traffic, never on offline eval alone.
Do not run perpetual shadow without a decision date (zombie challengers), and never let a single headline metric decide — the gate is multi-criteria by construction.
Deltas are signed and colour-coded; the blocking criterion is named in plain language; the Promote control is disabled with the reason adjacent, and override is a routed sign-off, not a click.
SR 11-7 effective challenge and change-control expectations; fair-lending model governance. The blocked-promotion record is the strongest evidence the gates are real.
Precision@alert 0.71
FN rate 11.9%
Fairness parity Δ 2.1%
21 DAYS
Precision@alert 0.74 (+0.03)
FN rate 10.2% (-1.7pp)
Fairness parity Δ 3.4% (+1.3pp — BLOCKS)
Contract Lifecycle Board
CLM kanban for enterprise sales ops: draft → redline → legal review → signature → active → renewal. SLA countdown, clause-change alerting, counterparty party-of-record tracker. Reg alignment: SOX §302, GDPR Art 28 DPA, e-signature compliance (eIDAS, UETA).
Contract stages where the bottleneck is legal review and the useful signal is how long something has been sitting, not which column it is in.
Never as a generic kanban: a contract board without clause-change alerting hides the thing that actually causes a renegotiation. Never let a card move to signature while a redline is unresolved — the board should refuse it rather than warn about it.
Each card states its stage in text and its time-in-stage as a duration, so the ageing is readable without comparing column positions. Drag is a convenience with a keyboard-accessible move as the primary path, not the reverse.
SOX §302 certification of controls over the contracts feeding revenue, GDPR Art 28 processor terms where a DPA is in the pack, and e-signature validity under eIDAS in the EU and UETA/ESIGN in the US.
Usage-Based Pricing Calculator
Metered billing simulator with tiered pricing, overage bands, volume discount curves, commit vs. true-up logic. Critical for FP&A and sales-engineering alignment. Patterns: Stripe Billing, AWS tiered, Datadog per-host. Reg alignment: ASC 606 revenue recognition, SEC Rev Rec disclosure.
Modelling metered pricing where tiers, overage bands, volume discounts and commit true-up interact, and both sales engineering and finance have to agree on the same output.
Never as a customer-facing estimate without stating the assumptions and the period — a number without its basis becomes a quoted price. Never smooth the curve for legibility: the discontinuity at a tier boundary is exactly what the reader is looking for.
The breakdown is a table with the applied tier stated per band, not a single total with a chart beside it. Input changes announce the recalculated total rather than silently updating a figure the reader may already have written down.
ASC 606 revenue recognition — the allocation of transaction price and the treatment of variable consideration is what makes commit-versus-true-up a reporting question and not just a pricing one.
Customer Health & Churn Risk Score
Composite health scoring blending product engagement, support sentiment, billing signals, contract renewal window, executive sponsorship attrition. Exposes the "quiet-quit" customers BEFORE they send non-renewal notice.
Composite churn-risk scoring where the value is the decomposition — which signal moved — and the audience is a human who will act on it.
Never present the score as a prediction the account team cannot interrogate; an opaque risk number produces either blanket escalation or blanket ignoring. Never let the score be the customer's own view of themselves, and never let it drive an automated commercial action without review.
Contributing signals are listed with their direction and their recency in text; the composite is stated with its scale endpoints. A score change announces what changed rather than only the new number.
Where the score is model-derived and drives a decision affecting the customer, EU AI Act Art 14 human oversight and Art 13 transparency apply — the reviewer must be able to disregard it, which requires the decomposition to be present rather than available on request.
- Schedule QBR within 14 days (new CTO Rachel O.)
- Resolve P1 tickets #4471, #4489, #4501 (SLA breach)
- Surface product usage gap: Analytics feature 0% adoption
- CSM exec-sync if no movement by day 21
Enterprise Provisioning Wizard
Day-0 onboarding flow for enterprise buyers: workspace create → SSO (SAML/OIDC) bind → SCIM provisioning → role mapping → IP allow-list → domain claim. Post-DPA first-value under 30 minutes. Reg alignment: SOC 2 CC6.1/CC6.2, ISO 27001 A.9.
Day-0 enterprise setup where SSO binding, SCIM, role mapping and network restrictions all have to be right before the first user logs in.
Never as an optional path the buyer can skip to “get started faster” — a workspace provisioned without SSO becomes a set of local passwords nobody deprovisions. Never lock the admin out with the IP allow-list step; the step must validate against the current session before applying.
Each step states its prerequisite and its consequence in text; failures name the field and the identity-provider error rather than saying the bind failed. Progress is resumable, because a SAML metadata exchange routinely spans days.
SOC 2 CC6.1 and CC6.2, ISO 27001 A.9.2 user access provisioning, and NIST SP 800-63B where the authenticator assurance level is being set here rather than later.
API Quota & Rate Limit Dashboard
Per-tenant request ceiling visualization with token bucket state, burst allowance, auto-escalation recommendations. Surfaces the "we're about to 429" signal before customer calls support. Reg alignment: SOC 2 CC7.2 (monitoring), AWS Well-Architected Reliability Pillar.
Per-tenant rate-limit visibility where the point is to see the ceiling approaching, not to explain a 429 after it happened.
Never show only current usage: without the burst allowance and the bucket refill state the reader cannot tell a spike from a trend. Never auto-escalate a limit without a record — a quota raised silently is a capacity decision nobody owns.
Usage against ceiling is stated as both numbers, not a bar alone; the projected-breach warning is text with a time, and it is announced once rather than on every poll.
SOC 2 CC7.2 on monitoring for anomalies — the control expects the deviation to be detected and acted on, which is why the projection is part of the component rather than an alert bolted on afterwards.
Incident Command Board
Active-incident war room: severity badge, timeline with ROLE-prefixed updates (IC / COMMS / OPS), blast radius calculation, downstream dependency graph, customer comms staging. Pattern: PagerDuty × Statuspage × Atlassian SRE. Reg alignment: SOC 2 CC7.3 (incident response), ISO 27001 A.16.
An active incident where several roles are writing to one timeline and the blast radius has to be visible to whoever joins next.
Never as a chat log: an incident channel is a stream, and the board's job is the current state that a person joining at minute forty needs in ten seconds. Never stage customer comms in the same field as internal updates.
Timeline entries carry their role prefix and an absolute timestamp in text; severity is a word. New entries are announced politely so they do not interrupt the incident commander typing, and the current severity is in the page's accessible name so a tab-switching reader lands oriented.
SOC 2 CC7.3 and CC7.4 incident response, ISO 27001 A.16 information-security incident management. Where personal data is implicated, GDPR Art 33 sets a 72-hour notification clock that starts at awareness — which is why the timeline records when, not just what.
r3-orderbook-index
changed query plan on routing table. Slow scan introduced on EU shards.Compliance Audit Evidence Export
One-pane evidence bundle builder for SOC 2, ISO 27001, PCI DSS auditors: access logs, change log, incident records, DPA history, backup restore evidence. Time-scoped, signed, tamper-evident. Reg alignment: SOC 2 AICPA TSC, ISO 27001 A.18, PCI DSS 10.7.
Assembling a time-scoped, tamper-evident evidence bundle for an auditor, from records that live in several systems.
Never as an ad-hoc export: an evidence pack whose scope and generation time are not part of the artefact cannot be relied on later. Never allow selective omission without recording that a filter was applied — a silently filtered bundle is worse than no bundle.
The scope (period, systems, record types) is restated in the export confirmation and inside the artefact itself. Generation progress is announced, and a partial export names what is missing rather than completing quietly.
AICPA Trust Services Criteria for SOC 2, ISO 27001 A.18 compliance and audit considerations, and PCI DSS v4.0 requirement 10.5.1 on audit-log retention: twelve months retained, three months immediately available for analysis. (Under v3.2.1 this was 10.7; that version was retired on 31 March 2024, and citing it is how a control matrix silently goes out of date.)
Signed: CN=Ed Chen · Issued by SectigoRSADomainValidationSecureServer CA · 2026-04-19T14:22Z
Partner & Reseller Portal
Channel partner deal-registration flow with discount tier, named-account conflict resolution, co-sell marketing assets, commission tracker. Reg alignment: SOX revenue recognition for channel, anti-corruption FCPA/UKBA conflict-check.
Channel deal registration where the conflict question — is this account already claimed — has to be answered at the moment of registration.
Never register a deal without running the named-account conflict check; a portal that defers it converts a partner relationship into a dispute. Never expose another partner's registration details in the conflict result — the answer is that a conflict exists, not who holds it.
Conflict outcomes are stated in text with the resolution path; discount tier states the qualifying condition rather than only the percentage. Commission figures carry their period and their status (accrued, approved, paid).
ASC 606 for channel revenue recognition where sell-through and sell-in are treated differently, and anti-corruption screening under the US FCPA and the UK Bribery Act 2010 — which is why the conflict check is also a counterparty check.
• Named TAM assigned
• Quarterly co-sell planning
• MDF $50k/quarter
• Partner Summit 2026 access
ARR Revenue Waterfall
Period-over-period ARR composition: new logo · expansion · contraction · churn · reactivation. The GAAP-aligned view finance + BOD expect on every QBR. Reg alignment: ASC 606, SaaS metric SEC disclosure comment-letter patterns.
The period-over-period ARR bridge that finance and the board expect: new, expansion, contraction, churn, reactivation, reconciling opening to closing.
Never omit a category because it was zero — a bridge with a missing bar reads as a bridge that does not balance. Never mix bookings and recognised revenue in the same waterfall; they are different numbers and the chart cannot tell the reader which it is showing.
Opening and closing totals are stated as text and reconcile visibly; every segment carries its value and sign in the accessible name. The bridge has a table equivalent, because a waterfall is a layout of numbers and the numbers are the content.
ASC 606 for the revenue basis, and the SEC's non-GAAP guidance (Reg G and Item 10(e) of Regulation S-K) where ARR is presented alongside reported revenue — the definition has to be stated and applied consistently.
Every bar is placed by one scale (7.9 px per $M), and every card is derived from the bridge — the arithmetic is printed under each one. A revenue bridge whose KPI cards don't reconcile with its own bars is worse than no chart: it is a chart that will be believed.
SSO & SCIM Admin Console
IdP identity bridge ongoing state: active session count, SCIM provisioning delta, group → role mapping health, JIT provisioning toggle, session policy (idle timeout, MFA enforcement). Reg alignment: SOC 2 CC6.1 · ISO 27001 A.9.2 · NIST SP 800-63B authenticator assurance.
The ongoing state of an identity bridge — sessions, provisioning delta, group-to-role mapping health — as distinct from the one-time act of setting it up.
Never conflate this with the provisioning wizard: setup is a task, this is a monitor, and a screen that tries to be both hides drift. Never let a group-to-role mapping fail silently; an unmapped group is users with no access or, worse, default access.
Provisioning delta states adds, updates and deprovisions separately with counts; mapping health names the failing group rather than showing a warning triangle. Session policy changes state what happens to currently active sessions.
SOC 2 CC6.1, ISO 27001 A.9.2.6 removal of access rights, and NIST SP 800-63B for authenticator assurance where MFA enforcement and idle timeout are being set here.
AI Token Cost Calculator
Estimate per-request and per-1k-call spend from input/output token counts and per-million pricing. Preset chips load common model tiers.
Sizing the unit economics of an AI feature before committing to a model tier, or comparing vendors at a glance.
For finalized billing reconciliation use the provider's metered invoice — this is a planning estimate, not an authoritative ledger.
Recalculates on every input; preset chips are toggle buttons with aria-pressed; numeric fields are labelled and keyboard-operable.
Frontier models price output ~5x input; mid/small tiers trade quality for an order-of-magnitude lower blended cost.
Tokenizer Estimator
Approximate the token footprint of arbitrary text as a range, with live character and word counts.
Quickly gauging whether a prompt, document, or system message fits a budget before sending it to a real tokenizer or API.
For exact accounting use the model's own tokenizer (tiktoken, etc.) — heuristics drift on code, CJK, and emoji.
Updates on input; the estimate region is aria-live="polite" so screen readers hear the running range without focus loss.
English averages ~4 chars/token; the words×1.3 upper bound captures subword splits on rarer vocabulary.
Context-Window Budget
Visualize how much of a model's context window is consumed, with near-limit and overflow warnings.
Monitoring a long conversation, RAG payload, or document load against the active model's window ceiling.
Not a substitute for runtime truncation logic — it informs the user, the application still has to enforce the cap.
The meter is a role="progressbar" with aria-valuenow/min/max; overflow raises a role="alert" so assistive tech announces it.
Exceeding the window truncates the oldest tokens silently — surfacing the ≥80% threshold prevents lost-context failures.
Overflow: used tokens exceed the window. Oldest context will be truncated.
Prompt-Cache Savings
Model the dollar and percentage savings from caching a portion of repeated input tokens.
Deciding whether a large stable system prompt or context block justifies enabling prompt caching.
Skip when prompts are unique per call — caching only pays off above a hit-rate and cache-lifetime break-even.
Percentage inputs clamp to 0–100; results recompute live and are exposed via an aria-live region.
Cached input tokens commonly bill at ~10% of base rate, so a 90% discount on a high-cache-hit prompt slashes blended cost.
Token Stream Meter
Simulate a streaming generation to show time-to-first-token, throughput, and a growing token count.
Demonstrating perceived-latency behaviour of streaming UIs, or prototyping a live generation indicator.
This is a simulation; wire to real SSE/stream events for production telemetry rather than synthetic timing.
Run is disabled mid-stream; reduced-motion users jump straight to the final state; the feed is aria-live="polite".
TTFT and tokens/sec are the two metrics that govern how fast a generation *feels* — independent of total length.
Schema / Data-Contract Editor
Define a table's columns — name, type, nullability — and watch a typed schema table and a CREATE TABLE DDL regenerate live. The contract a data scientist hands to engineering before a single row is written.
When authoring a data contract or table definition collaboratively — analysts specify intent, the DDL is the artifact engineering ships.
For free-form exploratory CSVs use schema-on-read inference instead; this is for governed, schema-on-write tables.
Each row is a labelled fieldset; type is a native <select>, nullable a real checkbox;
DDL updates on any change. Remove buttons carry aria-labels.
Mirrors schema-on-write data contracts (dbt models, Delta table DDL). The NOT NULL constraint is the cheapest data-quality control there is — enforced at write time, not discovered at query time.
| Column | Type | Nullable | Row actions |
|---|
Data-Quality Profiler
Per-column null-rate, distinct cardinality and a PASS/WARN verdict over a profiled sample — the first thing a data scientist checks before trusting a feature. Frames bad data as downstream cost, not just a number.
At ingestion or before model training — to catch null-heavy or low-cardinality columns before they silently degrade a pipeline.
Not a replacement for a full great-expectations / Deequ suite; this is the at-a-glance triage layer above it.
Bars carry numeric text alongside (never colour-only); WARN flags use a labelled badge plus a written threshold so the verdict is screen-reader legible.
Standard column profiling (null-rate, distinct count) as run by data-profiling jobs. A 20%+ null rate on a feature column is a recall-time surprise — surface it at ingest.
| Column | Null-rate | Distinct | Status |
|---|
Data Lineage DAG
Source → transform → table provenance as a clickable directed graph. Click any node to light up everything upstream (where it came from) and downstream (what breaks if it changes). Impact analysis at a glance.
For impact analysis before a schema change, or root-cause when a downstream dashboard goes stale — trace the dependency chain.
For hundreds of nodes use a dedicated lineage tool (OpenLineage / Unity Catalog); this is a focused single-pipeline view.
Nodes are real buttons, keyboard-activatable; selection state is announced; connectors are decorative SVG with the relationship also encoded in node borders, not colour alone.
Column- and table-level lineage as captured by OpenLineage / dbt graphs. Provenance is the precondition for trust — and for GDPR / data-residency audits.
Typed Query Result Grid
A query result set with a type chip on every column header and click-to-sort with stable type-aware ordering (numbers numerically, timestamps chronologically). The grid an analyst stares at all day, done right.
To render the output of an ad-hoc query or notebook cell where column types and quick re-sorting matter.
For million-row result sets use a virtualised grid with server-side sort; this is for the typical sampled preview.
Headers are keyboard-operable, carry aria-sort, and sort is type-aware not lexical. The
rows/latency footer reports the actual rendered count.
The result-grid contract of any warehouse client (Databricks SQL, BigQuery console). Type-correct sorting prevents the classic "string-sorted numbers" analyst error.
Delta / Version Diff
Compare two snapshots of a table (v1 vs v2): rows added, changed, removed, with a colour-and-label-coded change list. The Delta-Lake time-travel idea — answer "what changed between yesterday's run and today's?" without re-querying raw logs.
To audit a pipeline run, validate a backfill, or explain a metric jump — diff two versions instead of diffing in your head.
For schema (not row) drift use the schema editor's contract diff; this compares row-level state between versions.
Every change carries a text badge (ADDED / CHANGED / REMOVED), not just colour; old→new values are shown inline so the delta is readable without colour vision.
Delta Lake / Iceberg time-travel and DESCRIBE HISTORY. Version diffing turns "the numbers
moved" into an attributable, auditable change set.
Cross-Platform & Cross-Browser Rendering
The same component across four operating systems and eight browsers. The OS sets
window chrome, fonts, scrollbars, and ⌘/Ctrl grammar; the browser's engine (Blink, Gecko, WebKit) sets what CSS
resolves. One token set with defensive @supports fallbacks — native feel everywhere, broken layout
nowhere.
Any surface shipped to more than one OS — desktop trading terminals, Electron back-office tools, web apps that must feel native on macOS, Windows, GNOME, and Ubuntu alike.
Don't hand-paint OS chrome inside a real native or Electron app — let the OS draw its own title bar. This pattern is for previews, embedded simulations, and design documentation, not for overriding the host window manager.
OS switch is a button group with aria-pressed; the live region announces the active OS.
Control clusters use logical placement so the layout mirrors correctly under RTL. Reduced-motion disables
all transitions. Window controls are decorative (aria-hidden) — never the only path to an
action.
Cross-platform consistency via system font stacks (-apple-system, Segoe UI,
Ubuntu/Cantarell), logical properties for direction-safe layout, and native conventions
(control side, scrollbar weight, ⌘ vs Ctrl, locale formatting) so intent stays identical while the surface
feels at home on each desktop.
Scrollbar weight follows the host OS. macOS uses a thin overlay thumb; Windows draws a wider tracked bar; GNOME and Ubuntu sit in between. Same component, native scroll feel on every desktop. Keep scrolling to see the thumb behaviour.
Eight browsers, three rendering engines. Compatibility isn't fought browser-by-browser — it's won at the engine layer (Blink, Gecko, WebKit) with feature queries and progressive enhancement. Pick a browser to see its engine and the exact technique that keeps the layout pixel-stable there.
| CSS feature in this system | Blink | Gecko | WebKit | Fallback if unsupported |
|---|---|---|---|---|
Flexbox / Grid / gap |
Native | Native | Native | n/a — universal since 2021 |
clamp() fluid sizing |
Native | Native | Native | static rem via @supports |
color-mix() tint tokens |
Native | Native | Native | solid token colour fallback |
:has() relational |
Native | Native | Native | class toggle (graceful) |
| Custom scrollbar | ::-webkit | scrollbar-color | ::-webkit | both APIs shipped together |
backdrop-filter |
Native | Native | -webkit- | opaque surface fallback |
| Logical properties (RTL-safe) | Native | Native | Native | physical-property shim |
- Feature detection, never UA sniffing. Anything non-universal is wrapped in
@supportswith a defined fallback path — no browser is special-cased. - System font stacks. No web-font download means no FOUT, no layout shift — and it survives Brave Shields and Tor's Resist-Fingerprinting forcing system fonts.
- Fluid
clamp()layout. Absorbs Tor's letterboxed viewport steps and any DPI without fixed breakpoints that snap. - Both scrollbar APIs shipped.
::-webkit-scrollbarfor Blink/WebKit andscrollbar-width/colorfor Gecko — styled consistently on all three. - Logical properties +
tabular-nums. Direction-safe layout and numbers that never reflow as they change.
Agent Definition Builder
A NotebookLM-style editor where an agent is nothing more than a markdown file plus
a list of source URLs. Seed from a template, edit the form, and watch agent.md regenerate live —
copy-ready frontmatter and all.
When a user needs to template, fork, or hand-tune an AI agent and wants the underlying
agent.md contract to stay visible and version-controllable instead of hidden behind a settings
panel.
Not for runtime chat or tool execution — this only authors the definition. For a multi-agent roster use the Cluster Manager; for keyword-routed skills use the Skill Card Editor.
Every keystroke re-renders the markdown deterministically; all typed text is HTML-escaped before injection.
Inputs carry real labels, the model picker is a native <select>, and source rows are
keyboard-removable. Reduced-motion safe.
An agent is a versionable markdown contract: YAML frontmatter (name, role, model, sources) over a
system-prompt body. A cluster of these is just a folder of .md files — diffable, reviewable,
portable.
The markdown is the agent — copy it into a repo, version it, diff it.
Skill Card Editor
A skill is a SKILL.md plus trigger keywords and resource URLs. The
description here is not prose for a human — it is the routing signal the keyword matcher reads to decide whether
to pull this skill in.
When authoring a narrow, keyword-triggered capability that the agent loader should grab automatically — the description and triggers are tuned for the matcher, not for a reader.
Not for full conversational agents with a persona and model — use the Agent Definition Builder. Skills are leaf capabilities a parent agent routes to.
Keyword chips and resource rows add/remove live; the SKILL.md preview re-renders on every
change with all text HTML-escaped. Chips are removable via a labelled control. Reduced-motion safe.
Description-as-routing-signal: the matcher reads the description + triggers to score relevance, so they are written to be grabbed by keyword. A skill is a versionable markdown contract that lives beside its agents in the cluster folder.
The description is written for the keyword matcher — not the human reader.
Agent / Skill Cluster Manager
A cluster is just a folder of markdown files. Search by keyword to see how the matcher grabs the right one, toggle each between Enabled and Draft, and watch the enabled count update live.
When organizing a mixed roster of agents and skills — enabling, drafting, and finding the one the router will pick by keyword across name, description, and triggers.
Not for editing a single definition's body — open it in the Agent or Skill editor. This is the folder-level view, not the file-level view.
The search box filters the roster live on input (name + keywords + description); status toggles are real buttons with aria semantics conveyed by visible text. The summary recomputes on every toggle. Reduced-motion safe.
A cluster is a folder of .md files. Keyword search demonstrates description-as-routing-signal
— the AI grabs the right contract by keyword, exactly as the loader does at runtime.
Expert Team Composer
Switch the domain preset to swap the roster of AI agents, toggle each member active or inactive, and watch the live "active team" summary recompose the auditable workflow.
When a single-pass AI output needs an adversarial, multi-role team to harden it — a composable roster where each agent owns one accountability (ceiling, attack, de-AI, quantification, distribution).
For a throwaway draft with no review bar, skip the team — use a plain prompt. Don't compose a five-agent pipeline for a one-line answer; the governance overhead is the point only when stakes are real.
Preset buttons are aria-pressed radio-style; agent toggles are
role="switch" with aria-checked, keyboard-operable, and update an
aria-live summary. Reduced-motion safe; dual-theme via tokens only.
An agent team is a composable, auditable workflow: adversarial review + quantification + de-AI become governance primitives, not vibes. Every output passes a hardcore buyer, a data officer, and a humanizer before it ships.
Adversarial Workflow (SOP)
A clickable four-step pipeline — Diagnostic, Debate, Humanizing, Final — showing which agents act at each stage, plus the hard constraints and the fixed output format the team must obey.
When you need a repeatable standard operating procedure that forces raw input through blind diagnosis, adversarial debate, de-AI humanizing, and a final optimized version — so quality is procedural, not accidental.
If the input is already validated and shipped, don't re-run the full SOP — use a lightweight spot-check. Skipping the Debate step to save time defeats the governance value; if you can't afford the attack, you can't afford the claim.
Stepper is a tablist with aria-selected steps and a
linked tabpanel detail; arrow-key and click navigation, focus-visible. Static Constraints and
Output-format panels are always readable. Tokens-only theming, reduced-motion safe.
Adversarial review + quantification + de-AI form one governance pipeline: every claim is challenged for real user/business benefit, quantified to a result (cost ↓, ROI ↑, efficiency ×2), and stripped of AI-tone before the optimized version is allowed out.
- Ban AI-tone. Forbid 總 之 / 首先 / 在當今數位時代 / 此外 and their English equivalents In conclusion / Firstly / In today's digital age / Moreover / Furthermore.
- Quantify every claim to a business result — cost ↓, ROI ↑, efficiency ×2.
- No blind praise. If the work is mediocre, an agent must say "this won't pass the interview/review".
- 【Expert Diagnostic Feedback】 — bullets naming flaws and room to optimize.
- 【Optimized Final Version】 — ready-to-use, shippable output.
- 【Business Value Assessment】 — the concrete benefit, quantified.
AI Cluster Topology & Memory Pool
An EXO-style distributed inference cluster shown two ways at once: human-readable node cards on the left, and the machine-readable manifest an AI orchestrator consumes on the right. Same cluster, two readable forms — both regenerate on every change.
When you run models on-prem across several machines and need operators to grasp the cluster shape in seconds while agents read the same state as structured config.
Not for single-device inference or cloud-hosted endpoints. If one machine holds the model, skip the cluster framing and show a plain model card instead.
Add/remove are real buttons with text labels; pooled-memory readout updates live and is announced via a polite live region. Manifest mirrors the visual state exactly so neither view drifts.
On-prem & data-residency: nothing leaves the building. Pooled unified memory (est.) lets a cluster run models larger than any one device. Human view + machine manifest keep cluster state legible to both audiences.
Model Fit & Topology-Aware Partitioning
Estimate whether a model fits the cluster's pooled memory at a given quantization and context, then show how EXO would shard it across nodes weighted by each device's memory.
Before committing a model to a cluster — to sanity-check fit, headroom, and how the weights spread across heterogeneous devices under topology-aware auto-parallelism.
Not a substitute for a real load test. Estimates exclude activation spikes and framework overhead beyond the flat KV margin; benchmark before production.
Native selects and number input; verdict text states FITS / DOESN'T FIT in words plus headroom %, not colour alone. Shard bar segments carry text labels and recompute on every input change.
EXO topology-aware parallelism splits a model from a realtime resource view; tensor parallel cites EXO's published 1.8× (2 devices) / 3.2× (4 devices). All memory figures labelled est.
Distributed Inference & API Surface
Simulate a streamed completion fanning across the cluster ring — tokens/sec climbing, nodes lighting up — backed by the OpenAI / Claude / Ollama-compatible API EXO serves at localhost:52415.
To demonstrate that the cluster serves a drop-in compatible endpoint, and to visualise that a single request is computed collaboratively across participating nodes.
This is a UI simulation, not a live benchmark. For real throughput numbers, run the model and read EXO's dashboard at :52415 rather than this animation.
Send is a button; the stream uses requestAnimationFrame and snaps to the final state under prefers-reduced-motion. The curl block is selectable text, not an image.
EXO exposes OpenAI Chat Completions, Claude Messages and Ollama-compatible APIs on-prem; the same request runs across the pooled cluster, keeping inference and data inside your network.
M3 Ultra 128GB
M3 Ultra 128GB
M3 Ultra 512GB
Payment Rail Selector
Pick a money-movement rail and read its real trade-offs live — settlement speed, cost, cut-off, finality, and limit. The same rail metadata an AI agent weighs before routing a payment.
Any send-money flow where the rail materially changes speed, cost, or finality and the payer (or an agent) must choose between them.
Single-rail products — show a static rail badge, not a chooser of one. Never imply a choice that doesn't exist.
Rails are real buttons in a group; each announces speed + cost + finality as text. Irrevocable rails say so in words, never colour alone; the cut-off is text.
NACHA Operating Rules (ACH), ISO 20022 (wire / RTP messaging), Reg E 12 CFR 1005 (consumer EFT). Finality and return rights differ by rail and are stated, not hidden.
Money Movement Tracker
Walk a payment through its lifecycle — initiated, risk hold, clearing, settled — or post a return with a real NACHA return code. Honest about which stages a rail actually has.
After a payment is submitted, on any status surface the payer or an ops team sees while funds are in flight.
Instant, irreversible rails with no intermediate states — a single settled badge is honest; don't fake stages that don't exist.
Status is a live region; the stage list is ordered with the current stage marked in text. Return codes resolve to plain-language meaning, not just a code.
NACHA return codes (R01–R85), Reg E error resolution (12 CFR 1005.11), ISO 20022 pacs.002 status report. The reversibility window is stated explicitly.
FX Quote Ticket
Quote a cross-currency transfer with the markup over mid-market shown in the open — you-send, they-receive, fee, and a re-pricing timer. Transparency is the design.
Any multi-currency send where the rate and fee must be disclosed before the user commits.
Same-currency transfers — no FX surface, and never invent a rate to fill the space.
Rate-expiry is counted-down text in a live region; the markup over mid-market is a separate, explicit line — never folded silently into the rate.
Reg E remittance rule (12 CFR 1005 Subpart B), consumer FX transparency (mid-market disclosure), PSD2 (EEA payment transparency). Rates here are indicative.
Reconciliation Match
Match statement lines against ledger entries — matched, unmatched, exception — with a confidence read and a manual-match path that leaves an audit note. Post-settlement, not a gate.
Treasury, ops, or finance surfaces reconciling money movement to the ledger after settlement.
Real-time pre-trade checks — this is post-settlement reconciliation, not an execution gate. Use a pre-trade control there.
Match state carries a text label plus icon, never colour alone; manual-match is keyboard-operable and reversible, and writes an audit line.
SOC 1 / ICFR (reconciliation control), ISO 20022 camt.053 (bank statement), SEC 17a-4 (audit-trail retention where applicable).
Payment Retry & Dunning
Recover a failed charge intelligently: the reason code decides whether to retry on a schedule or stop and ask for a new method. Not every decline should be retried.
Subscription or billing surfaces after a recurring charge fails and you must decide retry vs. require-update.
One-time payments with no recurring relationship — a single error + retry is enough; no dunning ladder.
The reason code is translated to plain language; the retry schedule is text; the update-method CTA is the primary action, never buried.
Reg E (consumer EFT), card-network retry rules (Visa / Mastercard), PSD2 SCA (re-authentication on method update). Hard declines are never retried.
Debit Mandate & Consent
Capture a pull-debit authorization the way regulation expects — payee, amount cap, frequency — with the live mandate text and a revoke path as easy to find as grant.
Setting up any pull-based recurring debit where the payer must authorize in advance.
Push payments the user initiates each time — there is no standing mandate to capture, so don't ask for one.
The authorization text is readable before consent; revoke is as findable as grant; consent state (draft / active / revoked) is announced in text.
NACHA authorization rules (WEB / PPD / CCD), SEPA Direct Debit Mandate (Rulebook), Reg E preauthorized transfers (12 CFR 1005.10).
Payout Schedule
Show a payee when money lands: available, in-transit, next payout date, and a rolling reserve that moves as you change the hold — the marketplace seller's mental model, made legible.
Marketplace or platform payout surfaces where sellers or contractors track money owed and when it arrives.
Instant-settlement contexts with no schedule — show a single balance, not a timeline that implies waiting.
Amounts are tabular-aligned with explicit currency; the next-payout date is text; the reserve hold is explained, not just shown as a number.
Money-transmission / payout licensing (state MTL where applicable), IRS 1099-K reporting thresholds, rolling-reserve disclosure.
Deposit · Fund Account
Add money to a balance and see the real cost of each method up front — card vs ACH vs wire vs instant rail — with the fee, ETA, and resulting balance computed live.
Any add-funds surface where the method changes fee and speed and the user should choose with eyes open.
Not for a single funding method — show a static method row, not a chooser. Never hide the card processing fee.
Method is a labelled control; fee and ETA update as text; the resulting balance is announced, not just colour-coded.
NACHA (ACH) · ISO 20022 (wire / RTP) · card-network interchange + processing-fee disclosure (Reg E for consumer EFT).
Withdrawal · Cash Out
Move money out to a linked bank with the guardrails that matter — available balance, daily limit, and a clear blocked state when a rule is hit, not a silent failure at submit.
Any cash-out surface where balance and velocity limits gate the action.
Not where there are no limits or holds; do not fabricate a limit to look secure. Never let an over-limit amount reach submit.
Limit and balance checks resolve to a text BLOCKED / OK state with the reason; the disabled reason is announced, never colour-only.
Reg E (consumer EFT) · BSA velocity / structuring monitoring · NACHA (ACH) and ISO 20022 (RTP) for the outbound rail.
Transaction Detail
The full record for one transaction — amount, status, counterparty, rail, fee, timestamps, and reference — the canonical “tap a row to see everything” surface, with status in words.
Any drill-in from a list where the user needs the complete, citable record of a single movement.
Not as the list itself (use Transaction History); not a place to bury the status behind an icon with no label.
Status carries a text label plus badge; the amount sign is explicit (+ / −); every field is selectable text for support and audit.
ISO 20022 references (end-to-end + transaction id) · SEC 17a-4 / SOC 1 audit-trail retention · Reg E dispute reference.
Transaction History
A filterable ledger: search and filter by type, each row showing direction, description, signed amount, and status — the everyday statement view, fast to scan and honest about pending items.
Account, wallet, or treasury surfaces where users review what moved and when.
Not for a single record (use Transaction Detail); not where realtime streaming is required — this is a settled-ledger view.
Filter tabs are buttons with pressed state; search is a labelled field; pending vs settled is stated in text on every row.
ISO 20022 camt.053 (statement) · SEC 17a-4 retention · Reg E 60-day error-resolution window surfaced per row where relevant.
Activity & Audit Log
An append-only event log — sequence number, severity, timestamp, and a short integrity hash per entry. Append new events; existing rows never mutate, which is the whole point of an audit trail.
Compliance, security, and ops surfaces that must show who did what, when — and prove it was not edited after the fact.
Not for user-facing notifications (those are dismissible); not a place to allow deleting or editing past entries.
New entries prepend; past entries are immutable; severity is a text label; the log region is announced as a live region.
SEC 17a-4(f) WORM retention · SOC 2 audit logging · append-only with per-entry hash chaining for tamper-evidence.
Forensic Data Auditor (CFE AI Audit)
Real-time ledger scanning and anomaly profiling interface. Designed for Certified Fraud Examiners (CFE) and data compliance managers to screen training or inference datasets for mathematical anomalies, duplicate sequence injections, and rounding irregularities before AI processing. Reg alignment: SEC Rule 17a-4 data integrity, CFE Forensic Standards.
Deploy as a gatekeeper dashboard when feeding external or client-submitted financial telemetry logs into LLM scoring models. Essential to detect AI poisoning and transaction falsification.
For raw text, document schemas, or code repositories. If auditing system actions rather than dataset inputs, use ongoing AML Monitoring Queues or Audit Trail Registries.
Interactive table uses distinct visual borders and aria-live terminal output. Screen readers receive updates on logs and analysis status. Focus targets are keyboard accessible.
SEC Rule 17a-4 and FINRA Rule 4511 require pristine, auditable, and immutable books and records. Downstream model audits depend on proof of untampered source datasets.
| TxID | Account | Amount (BTC) | Precision Deviation | Status |
|---|---|---|---|---|
| #84729 | AUREUS-9210 | 12.49021890 | < 0.00000001 | Passed |
| #84730 | SLM-INC-9012 | 0.00018921 | +0.00000009 | Drift Flag |
| #84731 | LOGIX-3281 | 384.00192800 | < 0.00000001 | Passed |
| #84732 | EVAD-TR-4320 | 8,230.00000000 | < 0.00000001 | Benford Flag |
<!-- Forensic Data Auditor Component -->
<div class="cfe-wrap">
<button class="c-btn c-btn-primary" id="run-audit-btn">Run CFE AI Audit</button>
<table class="cfe-table">
<!-- Table headers & rows -->
</table>
<div class="cfe-terminal" id="cfe-terminal" aria-live="polite">
<!-- Streaming logs dynamically fed from API -->
</div>
</div>
8-Decimal High-Precision Monitor
A dense ledger and micro-transaction rounding auditor. Displays values up to 8 decimal places to reveal sub-penny rounded remainders and intercept salami-slicing fraud signatures (the redirection of tiny fractional remnants to unauthorized vaults). Reg alignment: GAAP general ledger rules, ISDA Clause 8 netting protocols.
Required in blockchain-based custody systems, high-frequency currency arbitrage netting dashboards, and algorithmic commodity execution screens where micro-fractions aggregate into significant value.
For standard consumer banking apps or fiat credit card checkout screens where the legal limit of resolution is exactly 2 decimal places. Use plain Price Displays there.
Renders fractional differences in monospace. Highlight states use distinct sign indicators (+ / -) in addition to red/green colors for colorblind accessibility. Announces threshold triggers to screen readers.
ISDA contracts require strict precision rounding adherence. GAAP requires complete double-entry verification of all decimal residuals. Programmatic theft targets these invisible remainders.
| Acc ID | Audited Value | Standard Display | Remainder (Salami Shift) |
|---|---|---|---|
| ACC-1002 | 1,248.50918300 | 1,248.51 | -0.00081700 |
| ACC-4891 | 45,210.00192831 | 45,210.00 | +0.00192831 |
| ACC-9012 | 0.00018921 drift | 0.00 | +0.00018921 |
| ACC-5712 | 120.40001201 | 120.40 | +0.00001201 |
Rounding remainders are typically truncated. In CFE-protected environments, the 8-Decimal High-Precision Monitor captures micro-movements, signaling alerts if cumulative roundoff shifts from mathematical parity.
<!-- 8-Decimal High-Precision Monitor -->
<table class="cfe-table">
<tr>
<td class="cfe-precision-val">0.00018921 <span class="cfe-leak">drift</span></td>
<td class="cfe-precision-val">+0.00018921</td>
</tr>
</table>
<div class="cfe-drift-ticker" id="drift-accum">0.02198031 BTC</div>
AI Markdown Auditor & Truth Engine
An interactive parser that validates AI-generated markdown reports against primary ledger facts. Downstream components automatically compare numerical claims inside structured AI outputs against verified databases, marking claims as Verified (green) or Hallucinated (red) with inline links to sources. Reg alignment: EU AI Act Article 13 transparency, SEC Rule 10b-5 truthfulness.
Required whenever presenting unstructured AI analysis to clients or legal compliance personnel. Prevents AI hallucinations from entering formal files or client notifications.
If reports contain no numerical claims or are entirely generated from hardcoded static rules. If the model operates in a closed loop with no natural language output, use Calibrated Confidence Badges.
Markdown elements render with accessible headings. Verified tags are keyboard focusable buttons with tooltip announcements describing the database query hash and timestamp.
EU AI Act transparency guidelines mandate that outputs from generative AI must be traceable to verification anchors. SEC 10b-5 forbids any material misstatements of fact.
Click "Simulate Live AI Audit Stream" to view the truth-verified markdown report render...
<!-- AI Markdown Auditor Container -->
<div class="cfe-live-report">
<h3>CFE Audit Report</h3>
<p>
Fair value: ¥12,400.00000000
<span class="cfe-verify-anchor cfe-badge cfe-badge--success">
[✓ Verified]
<span class="cfe-verify-tooltip">Source: FINLOGIX API | Hash: a7f8d9c2 | Time: 2026-06-16T11:44</span>
</span>
</p>
</div>
Live Support Chat
An embeddable conversational support surface: presence indicator, agent and customer message bubbles, a typing indicator, quick-reply deflection chips, and a composer. Built so a self-serve answer can resolve the contact before it ever reaches a human agent.
For real-time, low-latency support where a customer expects a person or a bot to answer now — billing disputes, account access, or order status. Pair with quick-reply chips to deflect the common 60%.
For complex, document-heavy cases that need attachments and an audit trail, route to a Support Ticket. For broad self-service, lead with Help Center search before opening a live channel.
Message log is an aria-live="polite" region; new messages announce without stealing focus.
Quick-reply chips are real buttons, keyboard-operable with visible focus. Typing indicator is decorative
(aria-hidden) and respects reduced-motion.
In regulated finance, chat transcripts are business records under SEC Rule 17a-4 / FINRA 4511 — the surface must support retention and supervision. Disclosures given in chat carry the same weight as any other channel.
<div class="csx-wrap">
<div class="csx-log" aria-live="polite">…</div>
<div class="csx-quick">
<button class="csx-chip">Where is my withdrawal?</button>
</div>
<div class="csx-compose"><input><button>Send</button></div>
</div>
Support Ticket & SLA Tracker
The agent-side record for an asynchronous case: subject, priority and channel badges, a live SLA countdown that shifts colour as the deadline approaches, and a status stepper from New through Resolved. The SLA bar makes "are we about to breach?" pre-attentive.
For cases that persist across sessions and agents — anything needing attachments, internal notes, or a handoff. The SLA bar belongs anywhere a contractual response time is promised.
For instant, single-turn questions use Live Chat. Do not use a ticket to surface a system-wide outage — that is a Banner / status-page concern, not a per-customer record.
Status uses an icon + text label, never colour alone. The stepper is keyboard-operable; advancing status moves focus logically. SLA percentage is exposed as text, not just bar width, for screen readers.
Complaint handling in regulated finance (e.g. FCA DISP, ASIC RG 271) sets mandatory response and resolution timeframes — the SLA clock is a compliance instrument, not just an ops metric.
<div class="cst-card">
<div class="cst-sla-bar"><div class="cst-sla-fill" style="width:68%"></div></div>
<div class="cst-steps">
<div class="cst-step done">New</div>
<div class="cst-step current">Open</div> …
</div>
</div>
Help Center Search
A self-service deflection surface: instant, type-ahead article suggestions over a known knowledge base, with a contact escalation when nothing matches. The job is to resolve the question before it becomes a ticket — and to fail gracefully into a human channel when it can't.
As the first surface in any support flow. Lead with search so the high-frequency "how do I…" questions self-resolve, reserving live agents for genuinely novel or sensitive cases.
Do not hide an account-blocking or money-movement issue behind search-only. When the query signals urgency or risk, surface a direct contact route immediately rather than forcing self-service.
Combobox pattern: input owns the results list, results are operable by arrow keys and Enter, and the result count is announced via a live region. The empty state always offers an explicit escalation, never a dead end.
Published help content that touches fees, risk, or eligibility must stay consistent with the regulated disclosures (PDS/TMD, FCA COBS) — the knowledge base is part of the compliance surface, not marketing copy.
<div class="csh-search">
<input role="combobox" aria-controls="results" aria-expanded="true">
</div>
<div id="results" role="listbox">
<div class="csh-item" role="option">How long do withdrawals take?</div>
</div>
CSAT & Feedback Capture
A post-resolution satisfaction surface: a five-point emoji scale that progressively discloses a reason picker and free-text only after a rating is chosen, then confirms with a thank-you. Designed to maximise completion by asking for the minimum first.
Immediately after a ticket resolves or a chat closes, while the experience is fresh. The single-tap rating is the commitment; the follow-up is optional and progressive.
Not for relationship-level loyalty measurement — that is NPS on a longer cadence. Never gate access to the product behind a rating, and never re-prompt a customer who already responded.
Faces are a radio group: each is a labelled button with an accessible name ("Very satisfied"), keyboard operable, never colour- or emoji-only. The follow-up reveals without a layout jump and respects reduced-motion.
Free-text feedback can contain a complaint that triggers regulated handling obligations (FCA DISP / ASIC RG 271). The capture surface should route negative sentiment into the formal complaints process, not a dead inbox.
Thank you — your feedback helps us improve.
<div class="csf-faces" role="radiogroup">
<button role="radio" aria-label="Very satisfied">😄</button> …
</div>
<div class="csf-follow"><!-- revealed after rating --></div>
Scrollbar Variants
Five scroll affordances for different contexts: a thin themed bar, a minimal grey
bar that strengthens on hover, an inset fade that signals more content without chrome, a horizontal snap
carousel, and a scroll-progress meter. All token-driven, dual-theme, and built on standard
scrollbar-width / ::-webkit-scrollbar with graceful fallback.
Thin/themed for dense dashboards; minimal-grey for content areas; fade for short overflow where a visible bar is noisy; snap for card carousels; progress for long-form reading or multi-step forms.
Never fully hide a scrollbar on a region that is the only way to reach content on a non-trackpad device — pair hidden bars with a fade or arrows. Don't restyle the OS scrollbar on whole-page scroll.
All regions stay keyboard-scrollable (focusable, arrow/Page keys work) regardless of bar styling. Snap doesn't trap focus. Custom colours preserve a visible thumb at WCAG non-text contrast against the track.
WCAG 2.1 — 1.4.13 (content on hover), 2.1.1 (keyboard), 1.4.11 (non-text contrast for the thumb). A scrollbar is a control: it must remain perceivable and operable, not purely decorative.
::-webkit-scrollbar
.thin{ scrollbar-width:thin; scrollbar-color:var(--accent) transparent; }
.thin::-webkit-scrollbar{ width:8px; }
.thin::-webkit-scrollbar-thumb{ background:var(--accent); border-radius:999px; }
.snap{ overflow-x:auto; scroll-snap-type:x mandatory; }
.snap > *{ scroll-snap-align:center; }
Call-to-Action Buttons
A complete CTA vocabulary — primary, secondary, ghost, outline, gradient, and destructive — plus the structural variants teams actually need: pill, block, icon-only, split (action + overflow), an async loading state, and a floating action button. One hierarchy, so "the most important action on this screen" is never ambiguous.
Exactly one primary CTA per view — the single most important action. Secondary/ghost for alternatives, outline for medium-emphasis, destructive for irreversible actions, split when a default action has variants.
Never show two primaries competing for attention. Don't use a gradient CTA on a regulated trading surface where it could imply urgency or inducement — reserve it for marketing contexts. Icon-only needs a tooltip + label.
Every CTA is a real <button> / <a> with a text accessible name
(icon-only
uses aria-label). Loading sets aria-busy and disables re-submit. Focus is always
visible; hit area meets 44px where touch is expected.
WCAG 2.5.5 Target Size (Enhanced, AAA, 2.1) and 2.5.8 Target Size (Minimum, AA, new in 2.2), 2.4.7 focus visible, 4.1.2 name-role-value. In finance, a CTA that commits an order or moves money must not pre-tick, auto-submit, or use pressure language (FCA COBS, ASIC RG 234).
<button class="cta-btn cta--primary">Primary action</button>
<button class="cta-btn cta--outline">Outline</button>
<button class="cta-btn cta--icon" aria-label="Add to watchlist">★</button>
<!-- loading: set aria-busy="true" and swap to a spinner -->
That's the system. Here's the person who built it.
150 components shipping at an ASIC-regulated broker for 100K+ traders across 40+ jurisdictions. If your team is hiring a senior or principal product designer, the recruiter brief is the fastest read.
And it is governed like the systems it documents: every published figure across this portfolio reconciles to one canonical source of truth — 35 facts, 78 pages, 0 drift — checked by a zero-dependency verifier anyone can run: verify-facts.public.mjs.