Color — semantic tokens

Components reference these aliases only, never raw hex. The same hue means the same thing across chips, flashes, and the dispatch timeline.

Status
Success
--color-success-*
Warn
--color-warn-*
Error
--color-error-*
Info
--color-info-*
Neutral
--color-neutral-*
Brand & surface
Primary
--color-primary
Background
--color-bg
Surface
--color-surface
Sidebar
--color-sidebar-bg
Border
--color-border

Typography — type scale

System font stack; tables use tabular figures (--numeric).

--text-2xl Page title 28
--text-xl Section heading 22
--text-lg Subheading 18
--text-md Body large 16
--text-base Body / app default 14
--text-sm Dense table 13
--text-xs Caption / label 12
--numeric 1,234,567.89 tabular

Spacing, radius & shadow

Spacing scale (4px base)
--space-1
--space-2
--space-3
--space-4
--space-6
--space-8
--space-12
Radius
Shadow

Buttons

Variants
With icon · small · disabled

Status chips

Semantic vocabulary (top) and the domain ticket-status mapping (bottom). Hover for the next-action hint.

Semantic
Success Warning Error Info Neutral
Domain ticket statuses
pending_review actioned dispatched_with_errors in_progress no_action

Cards

Matter

AIP record

Cards group related content on a surface with an optional header and footer.
Last synced 2 minutes ago

Dispatch summary

Body-only card, no footer.

Prose — long-form content

Rendered markdown for docs / the Help user manual (WP-3.1). Re-establishes heading, list, code, blockquote and table rhythm using tokens only, scoped to .prose. Tables inside prose reuse the .table component. Wrap it in a card body on a page.

Processing a ticket

A ticket is one piece of work derived from an inbound email. Open the top one in your Inbox and work down.

  1. Inbox → click Open on a ticket.
  2. Review the LLM-extracted fields; fix anything wrong.
  3. Stage any Ipiglu CRUD, then click Approve.
Linked staged changes must be dispatched / rejected / discarded before this ticket can be marked actioned.
WhereWhat it is
Left paneThe attachment(s) — PDFs render inline
Right paneThe 60-field form — what you fill out

Tables

Dense variant for queues/history (paralegal scanning); roomy variant for forms/detail. Status cells reuse the chip component; numeric columns use tabular figures.

Dense (queue)
My Work — 4 tickets
Docket ref Subject Status Assignee Due
EP3821994 Communication under Rule 71(3) EPC pending_review Priya Nair 2026-07-24
US11482931 Non-Final Office Action in_progress Sam Okoro 2026-08-02
WO2025123456 Written Opinion (ISA) actioned Priya Nair 2026-07-19
EP4012887 Notice of Loss of Rights dispatched_with_errors Unassigned 2026-07-17
Roomy (detail / form)
Docket ref Subject Status Assignee Due
EP3821994 Communication under Rule 71(3) EPC pending_review Priya Nair 2026-07-24
US11482931 Non-Final Office Action in_progress Sam Okoro 2026-08-02
WO2025123456 Written Opinion (ISA) actioned Priya Nair 2026-07-19
EP4012887 Notice of Loss of Rights dispatched_with_errors Unassigned 2026-07-17

Form fields

Label + control + help / error / disabled-with-reason states. Disabled fields explain WHY (never silently hidden). Note: grant/annuity fields stay always-enabled — see §11.3.

As it appears on the Office Action.

Select the current AIP matter status.

Enabled when Matter Status is Granted.

Visible to the manager on approval.

Empty state

No tickets in triage

New low-confidence email tickets land here for a manager to assign.

Inbox zero

Nothing waiting. New inbound emails will appear here.

Flash messages

Persistent (not toasts that vanish) — see the live examples in the flash region at the top of this page. All four levels:

htmx loading indicator

Hidden until htmx adds .htmx-request during a request (the hx-indicator contract). Shown here forced-visible for documentation, plus a live button that fires a real request.

Appearance (forced visible)
Dispatching…
Live (click — issues a real GET to /health)

Confirm dialog

Replaces the legacy two-click + st.rerun soft-confirm. htmx opens the dialog into a slot; confirm hx-posts and the result swaps back. Warn, never block: a soft-limit shows a warning but the confirm button stays enabled — the user can always proceed (§11.4 / §11.7).

Anatomy — plain confirm vs over-capacity (warn, never block)
Live (htmx open → confirm → swap)

Structured deadline editor & deadline picker

A structured form (not a free-text blob) built on the grouped deadline-name combobox: choosing a category hx-gets the matching names (dependent selects), grouped under the category via <optgroup>. Saving swaps in a read-only summary. Unblocks wizard Step 4 and Doc Review Group C.

Pick a category to narrow the deadline names. Loading names…

Grouped under Prosecution. Change the category to load a different set.

The event the period runs from (e.g. notification date).

Statutory or docketed period.

Computed from trigger + period; override if docketed differently.

As it appears on the Office Action.

Sanitized email preview

Untrusted email HTML rendered in a sandboxed iframe (srcdoc + sandbox, no allow-scripts) — scripts, forms and same-origin access all disabled. Phase 3 feeds it the existing pure-Python sanitizer output; the sandbox is defence-in-depth.

Static include
Live (htmx loads the include)

Staged-change workbench

Pending staged changes as before → after cards (green/red) instead of JSON blobs; “Add change” opens a dialog that appends a new card, and each card can be discarded. Used by My Work + Document Review (the manual workbench is on the “lose nothing” list, §11.7).

Card states — modify · add · remove
Matter status modify
Before pending
After granted
Next annuity year add
Before
After 4
Provisional flag remove
Before true
After
Add-change dialog — anatomy
Live workbench (add appends a card; discard removes one)

Staged changes

Matter status modify
Before pending
After granted
Next annuity year add
Before
After 4
Provisional flag remove
Before true
After