A design language for the platform that runs a high-end stone business.
A honed slab is ground flat and finished matte. There is no gloss to hide behind, and the stone’s character is in plain view. Honed applies the same discipline to software. Quality comes from exact type, true alignment, and numbers you can trust at a glance. Ornament adds nothing to that.
Brand expression sits at the edges: the wordmark, customer documents, and the stone itself. The working surfaces stay quiet, so purchasing, yard, sales, and agent work can happen in them all day without fatigue.
Customers · Suppliers · Imagine Surfaces team · AI agents with their own identities
Reference system
Carbon’s layer, density and token model, adapted. IBM Plex for operations.
This page
Static HTML with compiled Tailwind CSS. All records are fictional; interactions are illustrative.
Travertine
#F5F2EB
Slab white
#FFFFFF
Basalt
#1E1C19
Lapis
#2B4C9B
Bronze
#8A5536
Verde
#3A4433
The core palette, laid out like a board of hand samples. Travertine, slab white and basalt do almost all of the work. Lapis marks interaction. Bronze and verde are reserved for brand moments.
Guide surfaces
Explanatory sections use generous spacing: 17px prose and 96px between sections.
Application examples
Product UI sits inside framed windows at true operational density, with 14px text and 32–40px rows.
Annotations
Mono capitals like these label states and measurements. They are notes on the specimens, not product UI.
01 — Brand direction
Luxury through precision, not ornament
The public site already presents Imagine Surfaces as a curated, design-led stone house. The platform behind it has a different job: thousands of decisions a week about lots, holds, receipts and deliveries. Honed keeps the showroom’s composure and adds the rigor of an operations tool.
Concept brief
Name & central idea
Honed. Refinement by removal. As with a matte-finished stone, the interface’s quality is visible in its flatness, accuracy and restraint.
Attributes
Exacting · Material · Calm · Accountable
Emotional character
The composure of a well-run showroom. Nothing rushed, nothing shouting, and confident enough to leave space for the stone.
Typography & color
Marcellus, an inscriptional serif, for brand moments only. IBM Plex Sans and Mono for every operational surface. Warm mineral neutrals throughout, with lapis for interaction, and bronze and verde as rare brand accents.
Layout, density & components
Carbon-style layers on a warm canvas. 40/32 px rows, 36/28 px controls, 2 px “eased” corners, and hairline separation instead of cards or shadows.
Why it fits
It continues the verified public identity (tracked serif capitals, ivory, olive, copper) while giving staff, suppliers and agents a tool built for long, accurate work.
Main tradeoff / risk
Restraint can tip into austerity. Inside the application, the brand is almost invisible, so customer-facing surfaces, photography and the wordmark have to carry the warmth. If slab photography is weak, the product will feel generic. Marcellus has one weight and no italic, so serif hierarchy comes from size alone. Overused, its Roman capitals drift toward the spa and law-firm look. Keep it to the wordmark and short headings, and never let it reach data.
Brand attributes
Exacting
Precision is the luxury. Prices are aligned to the cent and sizes stated to the inch.
In the UI: tabular numerals, right-aligned figures, one unit system, and IDs in mono.
Material
The stone carries the color. The interface frames it the way a gallery wall does.
In the UI: warm neutral surfaces, real slab photography, and material names spelled in full.
Calm
Nothing competes for attention unless a decision is needed.
In the UI: color reserved for status and focus, one primary action per view, and no motion for its own sake.
Accountable
Every change has an author, human or agent, and an authority behind it.
In the UI: identity on every action, a manager on every agent, and policies named where they apply.
Visual principles
01
Matte, not glossy
No gradients, glass, metallic gold or marble backgrounds. Depth comes from tone steps and 1px hairlines. Shadows appear only on things that float: menus, drawers and dialogs.
02
The stone is the color
The UI palette stays neutral so slab photography and material names are the richest things on screen. Where no photo exists, a small labeled tone chip may stand in.
03
True alignment
Figures align on the decimal and labels on a shared left edge, with spacing on a 4px grid. Misalignment is treated as a defect, not a style choice.
04
Every action has an author
People are round and agents are square-cut. Every attributed action names its actor, and every agent names the person who manages it.
05
Expressive at the edges
Serif display type, verde and bronze appear on customer documents, the guide and the wordmark. Operational screens are typeset entirely in IBM Plex.
What is verified, and what is proposed
Verified from imaginesurfaces.com
Inspected in a browser on October 9, 2026 (home and all-products pages).
—Presents itself as “Curated premium surfaces” serving the Washington, DC metro, with a showroom in Landover, MD.
—Collections: marble, quartzite, dolomite, soapstone, granite and a porcelain line, plus a live full inventory.
—Inventory is listed by lot, with dimensions in inches, thickness in cm (2 cm / 3 cm), finish and slab count.
—Audiences include design professionals (trade login, sample requests) and homeowners.
—Visual identity: wordmark in widely tracked serif capitals, with Cormorant Garamond (light) and Work Sans in use. Warm ivory backgrounds (≈ #F8F4E9), near-black text, and olive (≈ #384131) and copper (≈ #9F6A4D) accents.
Proposed by this exploration
Design decisions, not facts about the company.
—Keep the tracked serif-capital wordmark, but set it in Marcellus, a flared serif modeled on Roman capitals cut in stone. It holds up at small sizes and on dark bars, where the site’s light Cormorant thins out.
—Replace Work Sans with IBM Plex Sans in the application, for tabular figures, a compact width and a matching mono.
—Derive Travertine, Verde and Bronze from the site’s colors, adjusted for text contrast. Add Lapis as the single interaction color.
—Every agent, permission, policy, workflow and data pattern on this page is a proposal for a platform that is not described publicly.
Typographic wordmark
Marcellus, all capitals, tracked +0.18em, never smaller than 15px. Keep clear space equal to the cap height on all sides. No logo project is in scope; this is a typesetting rule.
IMAGINE SURFACES
On travertine · primary
IMAGINE SURFACES
On basalt · app bar
IMAGINE SURFACES
Washington, DC metro
On verde · customer documents
Imagery and material texture
Photography is the brand’s richest asset and the interface should not compete with it. No photographs are embedded in this specimen. The frames below are placeholders that describe each shot.
FULL SLAB 124 × 74 in · edge to edge
Record image.Whole slab, square to the camera, under daylight-balanced light with a gray card. Shown on every slab and lot record.
DETAIL · 1:1 12 × 12 in crop with ruler
Detail image.Veining and finish at true scale, with a ruler in frame. Used for quality checks, claims and customer selection.
INSTALLED · CREDITED designer’s project photo
Context image.Installed work, credited to the designer. Customer-facing surfaces only, never in operational screens.
Show true color. Never tint, filter or crop a slab photo to fit a layout.
Pair every slab image with its slab ID, lot and dimensions.
Never use stone texture as a page, card or button background, or behind text.
No stock marble imagery, and no generated or synthetic stone presented as inventory.
Voice and tone
Specific
Name the slab, the amount, the person and the date.
Plain
Use trade vocabulary with the trade and plain words with homeowners. No hype.
Accountable
Say who did it and under which rule, especially when an agent acted.
Composed
No exclamation marks, emoji or false urgency. Deadlines are stated, never dramatized.
Interface copy examples
Moment
Write
Avoid
Empty search
No slabs match “Viola 3 cm”. Try removing the thickness filter.
Oops! Nothing here 😕
Agent needs input
Intake Reconciler needs a decision on L2083-02: crack reported through full thickness. Claim CLM-0912 ($1,890.00) needs approval under PUR-04.
AI detected an anomaly ✨ Review now!
Customer hold
Your hold on Calacatta Viola (L2080-04) ends Oct 12 at 9:08 AM ET. Reply to extend it.
URGENT: your stone is about to be released!!!
Validation
Hold must end by Oct 23, 2026, 14 days from today.
Invalid date.
Buttons
Approve claim · Place hold · Record receipt · Pause agent
Submit · OK · Go · Let AI handle it
Agent result
Recorded 17 of 18 slabs as received. One slab is quarantined pending a decision.
Money is set in Plex with tabular figures, right-aligned. The display serif’s proportional figures don’t align and read as decoration.
Do
AvailableOn holdQuarantined
Don’t
L2051-04L2051-05L2083-02
Status always pairs an icon shape with a word. A colored dot alone fails for color-blind users and in grayscale print.
Do
IRIntake ReconcilerAgentManaged by Marisol Vega · Receiving
Don’t
✦ AI Assistant
Agents are colleagues with a name, a role and a manager. A sparkle badge says “magic” but doesn’t say which agent acted or who answers for it.
Do
IMAGINE SURFACES
Don’t
IMAGINE SURFACES
Set the wordmark in a solid color on a flat surface. Gold gradients and faux-marble grounds look like imitation, which is the opposite of a stone house.
02 — Typography
A serif for the name, Plex for the work
Two jobs, three families. Marcellus carries the brand’s voice in the wordmark and large headings. IBM Plex Sans and IBM Plex Mono carry every number, label and control, because operational type has to stay legible at 13px in hour eight.
Brand · display only
Aa Qq 3
Marcellus
Astigmatic. SIL OFL 1.1, served by Google Fonts. A flared, inscriptional serif drawn from Roman capitals cut in stone.
Weights
400 only. No italic; faux bold and italic are disabled.
Sizes
24px and up · wordmark caps from 15px
Fallback
"Palatino Linotype", Palatino, Georgia, serif
Never
Numbers in data, labels, buttons, long passages, or anything under 24px
Operational · everything else
Aa Qq 3
IBM Plex Sans
Mike Abbink with Bold Monday for IBM. SIL OFL 1.1. It is Carbon’s typeface: compact, with distinct glyphs (Il1, 0O) and tabular figures.
Weights
400, 400 italic, 500, 600
Sizes
12–28px in the app · 17px guide prose
Fallback
"Helvetica Neue", Arial, system-ui, sans-serif
Numbers
tabular-nums on every column, total and counter
Identifiers · machine voice
L20 0O
IBM Plex Mono
The Plex family’s monospace, SIL OFL 1.1. Used where a character-perfect reading matters, and for agent run states.
Weights
400, 500
Sizes
13px IDs · 11px caps (+0.06em) for states
Fallback
ui-monospace, Menlo, Consolas, monospace
Use for
Slab, lot, PO, claim IDs · rack locations · run states · code
Type scale
Sizes are in px at the default root (1rem = 16px), shown as size/line-height. Every line height falls on the 4px grid. Marcellus has a single weight, so brand headings step down by size only. Emphasis inside them is never bolded or slanted.
display-lg
Marcellus 400 · 72/72 · −0.01em
Cover only
Honed
display
Marcellus 400 · 48/52 · −0.01em
Guide sections · customer document titles
Ellery kitchen
display-sm
Marcellus 400 · 32/38 · 0
Customer page headings · material names in brand moments
Calacatta Macchia Vecchia
title-lg
Plex Sans 600 · 28/36 · −0.01em
Summary figures · large totals
$12,828.50
title
Plex Sans 600 · 20/28 · −0.005em
App page titles
Slabs
ui-lg
Plex Sans 600 / 400 · 16/24
Panel and drawer headings · customer body
Receiving exceptions
ui
Plex Sans 400 / 500 · 14/20
Body, cells, buttons (500), navigation (500)
Recorded 17 of 18 slabs as received. One slab is quarantined pending a decision.
caption
Plex Sans 500 / 600 · 12/16 · +0.01–0.02em
Labels (500), table headers (600), helper (400)
Hold until *
code
Plex Mono 400 · 13/20
IDs · locations · codes
L2083-02 · PO-30418 · CLM-0912 · B-07-2
code-caps
Plex Mono 500 · 11/16 · +0.06em · uppercase
Agent run states · kind tags · annotations
Waiting for approvalAgent
In context: navigation, controls and dense data
Application example · type in use
Calacatta Macchia Vecchia
Marble · Honed · 3 cm · received Oct 9, 2026 on PO-30418
Shown on the pick list. 120 characters.
Slabs in lot 2051 (sample)
Slab
Location
Size (in)
Area (sq ft)
Status
Slab price
L2051-04
B-07-2
124 × 74
63.72
Available
$5,479.92
L2051-05
B-07-2
124 × 74
63.72
On hold
$5,479.92
Navigation Plex Sans 500 · 14/20. Counts in 12px tabular.
Breadcrumb Plex Sans 400 · 12/16. Current record shown in mono.
Page title Plex Sans 600 · 20/28. Never the serif inside the app.
Buttons Plex Sans 500 · 14/20. Verb-first labels.
Labels / helper 12/16 at 500 / 400. Labels sit above fields and persist.
Table header / cells 12/16 at 600 / 13–14px at 400, sentence case, numbers right-aligned.
Numbers, units and identifiers
Plex figures are tabular, so columns align. Turn this on to see Marcellus’s proportional figures drift.
PO-30418 totals, alignment demonstration
Line
Area (sq ft)
Cost
1 · Bardiglio
600.00
$18,900.00
2 · Calacatta MV
509.76
$20,900.16
Total
1,109.76
$39,800.16
Formatting rules
Kind
Rendered
Rule
Currency
$5,479.92 · −$1,890.00
USD with 2 decimals in every operational view. Use a true minus sign and label credits as “Credit”. Right-aligned.
Quantity
17 of 18 slabs
Whole slabs only. Use “n of m” for progress. Units are spelled out, never “pcs”.
Area
1,109.76 sq ft
2 decimals, rounded from nominal dimensions. The unit goes in the column header; cells hold numbers only.
Dimensions
124 × 74 in · 3 cm
Width × height in inches, with a true multiplication sign. Thickness in cm, as the trade lists it (1.2, 2, 3 cm).
Dates & times
Oct 9, 2026 · 8:27 AM ET
Abbreviated month, no ordinals, 12-hour time. Add “ET” whenever the reader may be outside the DC metro. ISO 8601 in exports and APIs.
Identifiers
L2083-02 · PO-30418 · CLM-0912
Plex Mono. Never truncated or wrapped mid-ID. Slab = lot + two-digit sequence.
Locations
B-07-2 · Q-01
Row-rack-level in mono. Q-bays are quarantine.
Status
In transit
Sentence case, icon plus word, from a closed vocabulary per record type.
Expressive moments
Marcellus
Wordmark and app-bar lockup
Customer quote, order and portal headings
Project and collection names on customer documents
This guide’s section titles
Everyday operations
IBM Plex Sans + Mono
Every internal and supplier screen, including page titles
All numbers, everywhere, including customer documents
Forms, tables, navigation, buttons and notifications
Agent activity, run states and audit history
03 — Color and surfaces
Mineral neutrals, one working color
The palette is mostly travertine, slab white and basalt. Lapis is the only color that means “you can act here.” Status colors have plain names and are never borrowed for decoration. Bronze and verde appear only at brand edges and never carry meaning.
Brand and accent
Travertine
#F5F2EB
--surface-canvas
Page canvas, app background. Derived from the public site’s ivory.
Slab white
#FFFFFF
--surface-layer-1
Work surfaces: tables, forms, panels, drawers.
Basalt
#1E1C19
--text-primary · --action-primary
Text, primary buttons, app bar. A warm near-black, never pure #000.
Lapis
#2B4C9B
--interactive · --focus · --text-link
Links, focus, selection, checked controls. Also the info status hue, as in Carbon.
Bronze
#8A5536
--text-brand · --border-brand
Brand eyebrows and rules. Derived from the site’s copper and darkened for text contrast.
Verde
#3A4433
--surface-brand
Customer document headers and brand panels. From the site’s olive. Never used for status.
Surface layers
The layer model is adapted from Carbon: each level up is a distinct tone, and borders and fields follow the layer they sit on. Raised elevation (shadow) is reserved for things that float above the page.
--surface-canvas · page
--surface-layer-1 · panel, table, drawer
--surface-sunken · table header, read-only
Row on layer-1
Row hover · --p-travertine-50
Selected row · --surface-selected + 3px lapis
--surface-layer-2 · well, nested group
--surface-inverse · app bar, toast
--shadow-overlay · drawer, dialog, menu
Hover
--surface-hover: basalt at 4.5% over any layer
Active / pressed
--surface-active: basalt at 9%
Selected
--surface-selected plus a 3px lapis edge, so selection is never shown by tint alone
Focus
--focus: 2px lapis outline with a 2px offset, inset on fields. Lapis 300 on dark bars.
Divider
--border-subtle: basalt at 10%, between rows
Border
--border-default: basalt at 17%, for containers and table headers
Control edge
--border-strong: solid #858075, at least 3:1 on white and canvas (WCAG 1.4.11)
Text
Primary
#1E1C19
--text-primary
Body, titles, cell values
Secondary
#4A463F
--text-secondary
Labels, table headers, descriptions
Muted
#686259
--text-muted
Helper text, timestamps, units. Still AA on every layer.
Disabled
#A39D92
--text-disabled
Disabled controls only (exempt from contrast). Always paired with a reason nearby.
Status
Each status has a foreground, a tint and a border, and is always shown with an icon shape and a word. Brand accents never appear in this set.
L2083-02 quarantined: crack through full thickness.
Foreground / background pairings, measured
These ratios are calculated in your browser from the live token values (WCAG 2.x relative luminance), so the table cannot drift from the stylesheet. Text needs 4.5:1 and UI boundaries need 3:1. Translucent tokens are composited over their background first.
Measured contrast ratios for key token pairings
Sample
Foreground
Background
Used for
Ratio
Needs
Result
Calculating…
Lapis = act
Links, focus, selection and checked controls. Info badges share the hue but always carry an icon and word.
Green, amber, red = state
Only for status. A decorative green panel is a bug, even if it looks good.
Bronze, verde = brand
Customer documents, the wordmark and this guide. Never inside tables, badges or alerts.
04 — Layout and spacing
Measured like a cut list
Everything sits on a 4px grid. The guide is deliberately spacious. The application uses the same scale at its tighter end: 8–16px inside components, 24px between regions, and no decorative whitespace.
Spacing scale
Tailwind’s default 0.25rem step, used as the token scale. Values outside it need a reason.
Spacing tokens
Token
px
Visual
Typical use
1
4
Icon to label, badge padding
2
8
Between buttons, toolbar items, compact cells
3
12
Comfortable cell padding, list gaps
4
16
Field to field, mobile gutter, drawer padding
5
20
Panel padding
6
24
Between app regions, tablet gutter
8
32
Group separation in forms and documents
10
40
Desktop gutter (guide), customer document margins
16
64
Guide sub-sections
24
96
Guide sections only, never in the app
Gutters, widths and the app frame
The app is full-bleed with fixed rails and a fluid work area. The guide caps at 1440px.
APP BAR · 48--appbar-height
SIDENAV208
WORK AREA · fluid, min 024gap
DRAWER368
App frame schematic: 48px app bar, 208px side navigation, fluid work area, 368px detail drawer.
Page gutter: mobile / tablet / desktop
16 / 24 / 40 px
Guide max width
1440 px
Reading measure (prose)
64 ch
Form column
max 448 px
Dialog
640 px max
Customer document
max 880 px, centered
Grid and alignment
—Guide: 12-column grid, 24–32px gaps. App: fixed rails plus fluid regions, with no column grid forced onto data.
—Text and labels share one left edge. Numbers, units and money align right on a shared decimal.
—Icons sit optically centered on the first text line, never vertically centered on a multi-line block.
—Description lists use a fixed label column (6–9rem) so values start on the same edge.
List priceper sq ft$58.00Area120 × 72 in60.00Slab pricelist$3,480.00Costinternal Internal$1,890.00
Left edge for words · right edge for figures (lapis guides)
Comfortable and compact density
Density changes row height and cell padding, never the type size of data below 13px. Comfortable is the default. Compact suits people who live in a single table all day, and the choice persists per user.
Comfortable density sample
Slab
Material
Area (sq ft)
Status
L2051-04
Calacatta Macchia Vecchia
63.72
Available
L2080-04
Calacatta Viola
59.31
On hold
L2083-02
Bardiglio Nuvolato
60.00
Quarantined
Comfortable · Carbon “md”row —
Compact density sample
Slab
Material
Area (sq ft)
Status
L2051-04
Calacatta Macchia Vecchia
63.72
Available
L2080-04
Calacatta Viola
59.31
On hold
L2083-02
Bardiglio Nuvolato
60.00
Quarantined
Compact · Carbon “sm”row —
Control sizes
Two heights only. On touch screens, every target grows to 44px through an invisible hit area, so the visual size stays the same.
—
—
—
—
Chip 28—
Checkbox / radio
16 px (20 on touch)
Switch
36 × 20 px
Table row: comfortable / compact
40 / 32 px
Minimum pointer target (WCAG 2.5.8)
24 × 24 px
Touch target (coarse pointer)
44 × 44 px
Borders, radii, shadows, layers
0 · tables, app bar
2 eased · controls, badges
4 panel · panels, dialogs
round · people, switches
1px hairline
2px focus
3px selected edge
None · default
Raised · frames
Overlay · floating
z 0 · page
z 10 · sticky headers
z 20 · menus
z 30 · drawer
z 40 · page header
z 50 · dialog, toast
Responsive behavior
Desktop is the primary context. The application examples use container queries, so they adapt to their frame rather than the window. Resize the browser to watch the workspace in section 06 change.
Responsive behavior by width
Width
Navigation
Tables
Record detail
Controls
Desktop ≥ 1280 px
Side navigation, 208px
Priority columns first (ID, material, status, owner). Sticky header and ID column. The rest scrolls inside the table.
Drawer (368px) pushes the table once the app frame is at least 1200px wide (about a 1440px window). Below that, it overlays.
Pointer sizes, 36/28px
Tablet 768–1279 px
Navigation behind a menu button in the app bar
Secondary columns (type, finish, supplier, rate) hide below a 960px table width. The rest scrolls inside the table region.
Drawer overlays the table, with shadow
44px targets on touch
Mobile < 768 px
Menu button. Page title and primary action stay visible.
Table scrolls horizontally in its own region. Filter chips scroll in one row. Yard tasks use the card layout (section 07).
Full-height sheet over the work area
16px field text to prevent zoom. 44px targets.
05 — Components and states
Every state, on the record
States are rendered statically with forced classes (.is-hover, .is-focus, .is-active) that mirror the live pseudo-classes, so nothing needs discovering. Every control below is also live: hover it, tab to it, press it.
Buttons
One primary (basalt) per view. Destructive actions use a quiet red outline, and become solid red only as the confirm action inside a dialog. Labels start with a verb.
Button variants by state
Variant
Default
Hover
Focus-visible
Active
Disabled
Loading
Primary
Secondary
Tertiary
Destructive
Icon
Compact 28
Used in toolbars, table rows and compact density.
Fields
Labels sit above the field and never disappear into placeholders. Units live inside the field as affixes. Number and currency inputs right-align their values.
Shown on quotes and pick lists.
Press / to focus search anywhere.
slabs
Whole slabs only.
$/ sq ft
USD, 2 decimals.
Yard loads from 7:00 AM ET.
As listed by the supplier.
Visible to the yard and purchasing.
Field states
Default
Hover
Focus-visible
Required + error
Use row-rack-level, like B-07-2.
Read-only
Set at receiving. Can’t be edited.
Disabled
Quarantined slabs can’t be held.
Compact 28
Loading value
Supplier lead time
Loading
Checkboxes, radio buttons and switches
These are native inputs, styled with CSS only. A switch acts immediately, so use it for settings with instant effect. Checkboxes are for selections that get submitted.
Tabs, navigation, breadcrumbs, pagination
Tabs · use arrow keys
2 lines · 18 slabs · 1,109.76 sq ft · $39,800.16
18 slab labels scanned on Oct 9, 2026. 17 accepted.
Current page: white layer + 3px lapis edge. Second item: hover.
Badges, run states, filter chips, alerts and notifications
Business status · inventory vocabulary
AvailableOn holdReservedIn transitQuarantinedSold
Business status · purchase orders
DraftSentPartially receivedReceivedClosed
Agent run state · execution, not business status
WorkingWaiting for inputWaiting for approvalPausedIdleCompletedFailed
Mono capitals with outline only, so a run state can never be mistaken for a tinted business badge.
Filter chips · toggle buttons with aria-pressed
Alerts · inline, persistent
Approval needed
Claim CLM-0912 ($1,890.00) exceeds the $1,000 limit in policy PUR-04.
Couldn’t record receipt
Label L2083-11 isn’t on PO-30418. Check the label or add the slab to a line.
Notifications
Hold Keeper released 1 expired hold
L2048-02 is available again. Policy INV-02.
IR
Intake Reconciler requested your approval on CLM-0912
8:27 AM · Unread
PR
Priya Raman mentioned you on Q-11872
Yesterday, 4:12 PM
Identity, ownership and assignment
Shape tells kind at a glance: people are round, agents are square with one cut corner, teams are outlined squares. A word confirms it, because shape alone isn’t enough. Agents always show who manages them.
Avatar sizes by identity kind
Kind
20
24
28
40
56
Person
TB
TB
TB
TB
TB
Agent
IR
IR
IR
IR
IR
Team
External
NF
NF
NF
NF
NF
Identity chips
MVMarisol Vega
IRIntake ReconcilerAgent
QDQuote DrafterAgenton behalf ofPRPriya Raman
PurchasingTeam
NFNadia Ferris· Juniper & Gray InteriorsCustomer
Ownership block
Owner
IRIntake ReconcilerAgent
Managed by
MVMarisol Vega
Waiting on
TBTheo Brandtapproval
Authority
PUR-04 · claims over $1,000
Handoff
IRIntake ReconcilerAgentTBTheo Brandt
Handed off for approval at 8:27 AM. The agent resumes when Theo decides.
Collaboration
OCIRTBOwen, Intake Reconciler, Theo
Assignment picker · static specimen
Assign exception on L2083-02
People
TBTheo BrandtPurchasing manager
MVMarisol VegaOperations lead
Agents
IRIntake ReconcilerAgentcan draft & submit claims
QDQuote Drafterno claims permission
DSDelivery Schedulerpaused
Activity timeline
Each entry gives the actor, an observable verb, the record and the time. Agent entries also name the channel (API) and the authority they acted under. Entries never narrate an agent’s reasoning, only what it did, what it found, and what it needs.
OC
Owen Castillo checked in container TGHU 881204-4 at dock 2
7:52 AM · Yard scanner
IR
Intake ReconcilerAgent matched 18 of 18 slab labels to PO-30418
8:21 AM · Receiving API · standing assignment from Marisol Vega
IR
Intake ReconcilerAgent recorded 17 slabs as received and Available
8:26 AM · within permissions · no approval required
IR
Intake ReconcilerAgent requested approval from Theo Brandt
8:27 AM · policy PUR-04
Waiting for approval
Anatomy
Actor
Avatar + name, with “Agent” tag when applicable
Verb
Past tense, observable: recorded, matched, requested
Object
Record ID in mono, linked
Meta
Time · channel · authority (assignment or policy)
State
Run state only when the actor is waiting or failed
Dialog and detail drawer
Dialog · native <dialog>, modal
For decisions that interrupt: confirm, approve, release. Focus moves into the dialog and returns to the trigger. Escape cancels.
Drawer · non-modal side panel
For inspecting a record while keeping the list in view. It pushes the table on wide frames and overlays it on narrow ones. Escape closes it.
Skeletons, not spinners, for regions (Carbon). The shimmer stops under reduced motion.
No slabs match “Viola 3 cm”
Calacatta Viola is only in stock at 2 cm. Try removing the thickness filter.
Couldn’t load supplier lead times
The supplier service didn’t respond within 10 seconds. Your filters are kept.
Form validation · live example
Errors appear on submit, not while typing, and are summarized at the top with links to each field. Fields re-validate as they’re corrected. Try submitting empty, then fix the errors.
Rules demonstrated
Native <form novalidate> with custom messages that say how to fix the problem.
aria-invalid and aria-describedby tie each error to its field. The summary receives focus.
Required is marked with an asterisk, and a legend explains it. Optional fields say “optional”.
Read-only fields look like settled values, not disabled controls.
Success confirms exactly what would happen and states that this demo saves nothing.
06 — Main workspace
Inventory, at working density
The screen a purchasing or sales lead keeps open all day. Search, filter by status and type, sort any column, select rows for batch actions, switch density, and open a record without losing the list. Owners and holders show as people or agents in the same columns.
Viewing as Theo Brandt · Purchasing
14 fictional slabs · nothing is saved
Press / to search · Esc closes the drawer
Application example · Internal · InventoryFictional data
IMAGINE SURFACESOperations
TBSigned in as Theo Brandt
Slabs
0 selected
Slabs in inventory. Sortable columns have buttons in their headers.
Owner
Committed to
Finish
Calacatta Macchia Vecchia
Available
—
—
3
124 × 74
63.72
$5,479.92
B-07-2
Marble
Honed
Marmi Valdera
$86.00
Calacatta Macchia Vecchia
On hold
PRPriya Raman
Juniper & Gray Interiorsuntil Oct 16
3
124 × 74
63.72
$5,479.92
B-07-2
Marble
Honed
Marmi Valdera
$86.00
Taj Mahal
Available
—
—
3
130 × 78
70.42
$4,506.88
A-12-1
Quartzite
Leathered
Pedra Alta Exportação
$64.00
Taj Mahal
Reserved
PRPriya Raman
SO-7734Northfork Stoneworks
3
130 × 78
70.42
$4,506.88
A-12-1
Quartzite
Leathered
Pedra Alta Exportação
$64.00
Arabescato Corchia Extra, bookmatched A
Available
—
—
2
128 × 76
67.56
$6,215.52
B-03-4
Marble
Honed
Marmi Valdera
$92.00
Cristallo
Reserved
PRPriya Raman
SO-7734Northfork Stoneworks
2
128 × 77
68.44
$7,665.28
A-14-2
Quartzite
Polished
Pedra Alta Exportação
$112.00
Barroca
Available
—
—
3
118 × 80
65.56
$3,146.88
C-02-1
Soapstone
Honed
Pedra Alta Exportação
$48.00
Nero Marquina
Sold
PRPriya Raman
SO-7702Northfork Stoneworks
2
116 × 70
56.39
$3,270.62
B-11-3
Marble
Polished
Levante Stone Group
$58.00
Blue Bahia
In transit
—
ETA Oct 15PO-30431
3
112 × 68
52.89
$7,669.05
In transit
Granite
Polished
Pedra Alta Exportação
$145.00
Absolute Black
Available
—
—
3
126 × 75
65.63
$2,559.57
C-06-2
Granite
Leathered
Deccan Granite Exports
$39.00
Calacatta Viola
On hold
QDQuote DrafterAgentfor Priya
Juniper & Gray Interiorsuntil Oct 12
2
122 × 70
59.31
$6,998.58
B-09-1
Marble
Honed
Marmi Valdera
$118.00
Bardiglio Nuvolato
Available
—
—
2
120 × 72
60.00
$3,480.00
B-08-1
Marble
Honed
Marmi Valdera
$58.00
Bardiglio Nuvolato
Quarantined
IRIntake ReconcilerAgent
CLM-0912claim pending
2
120 × 72
60.00
$3,480.00
Q-01
Marble
Honed
Marmi Valdera
$58.00
Statuario Venato (porcelain)
Available
—
—
1.2
126 × 63
55.13
$1,874.42
D-01-4
Porcelain
Matte
Ceramiche Monteluce
$34.00
No slabs match
Try a different search, or clear the status and type filters.
Showing 14 of 14 slabs
Page 1 of 1
Buttons labeled as illustrative (Receive shipment, Export, batch actions) show a notice instead of acting. Sorting, filtering, search, selection, density and the drawer run in this page only.
07 — Role-specific examples
One language, four audiences
Customers get the calmest surface: more space, the serif, verde. Suppliers get a focused, mid-density view of their own orders. The yard gets large touch targets on a phone. Agents get structured assignments that people can read and supervise. The tokens are the same throughout; density, typography and what each audience can see are what change.
Application example · Customer · Quote (trade portal)
IMAGINE SURFACESTrade portal · Nadia Ferris
Quote Q-11872
Ellery kitchen
Issued Oct 9, 2026
Prepared by PRPriya Raman
For Juniper & Gray Interiors, delivered to your fabricator, Northfork Stoneworks.
Your slabs are on hold
Calacatta Viola until Oct 12, 9:08 AM ET. Calacatta Macchia Vecchia until Oct 16, 5:00 PM ET. Approve before then to keep them.
PHOTO
Calacatta Macchia Vecchia
Marble · Honed · 3 cm · 124 × 74 in
Slab L2051-05 · Lot 2051
63.72 sq ft × $86.00
$5,479.92
PHOTO
Calacatta Viola
Marble · Honed · 2 cm · 122 × 70 in
Slab L2080-04 · Lot 2080
59.31 sq ft × $118.00
$6,998.58
Slabs (2)
$12,478.50
Delivery to Northfork Stoneworks
$350.00
Total before tax
$12,828.50
Sales tax, if any, is calculated on the invoice.
Prepared by Priya Raman, trade sales, with help from an Imagine Surfaces agent. Prices hold while your slabs are on hold.
Application example · Supplier · Purchase order receiving update
IMAGINE SURFACESSupplier portal · Marmi Valdera
PO-30418Receiving update
Container TGHU 881204-4 · arrived Oct 9, 2026, 7:52 AM ET · Landover, MD
Partially received
PO-30418 lines, receiving summary
Line
Material
Ordered
Accepted
Under review
Area (sq ft)
Unit cost
Line total
1
Bardiglio Nuvolato · Honed · 2 cm · Lot 2083
10
9
1
600.00
$31.50
$18,900.00
2
Calacatta Macchia Vecchia · Honed · 3 cm · Lot 2051
8
8
0
509.76
$41.00
$20,900.16
Total
18
17
1
1,109.76
$39,800.16
1 slab under review: L2083-02
Our yard reported a crack through the full thickness on arrival. Three photos are attached. We will contact you by Oct 13, 2026 with next steps.
Receipt recorded by IRIntake ReconcilerAgent· ContactTBTheo Brandt
6:47YARD · 375 PX
Pick · SO-7734
Northfork Stoneworks
Load by 7:30 AM, Oct 10 · dock 1
Assigned toOCOwen Castillo
1 of 2 slabs picked50%
Taj Mahal
L2048-03 · A-12-1
Picked
Cristallo
L2066-03 · expected A-12-3
Not found
L2066-03 wasn’t at A-12-3
You scanned it at A-14-2 at 6:47 AM.
Internal · yard lead on a phone. 16px text, 44–48px targets, one task per screen. Exception first, with the fix as the primary action.
Application example · Agent-owned task · autonomous under policy
HK
Hold Keeper Agent
Reservations · managed by Priya Raman
Completed
Assignment
Every day at 9:00 AM ET, release holds that are past expiry.
Authority
INV-02 · holds expire after 14 days unless extended No approval required
Today’s result
Released 1 expired hold: L2048-02 Taj Mahal (Brightwater Builders, expired Oct 8, 5:00 PM). Notified Priya Raman.
Business effect
L2048-02On holdAvailable
Next run
Oct 10, 2026, 9:00 AM ET
Why no approval?
Hold Keeper has permission to release holds, and policy INV-02 makes release automatic at expiry. A person releasing a hold early would need the confirm dialog from section 05. The agent doesn’t.
Where’s the big one?
Section 08 follows Intake Reconciler through a full receiving reconciliation: an autonomous step, an exception, a handoff and an approval.
Agents work through APIs and structured assignments, not through these screens. These surfaces exist so people can see what agents own, what they did, what they’re allowed to do, and when they need a decision, and so people can pause them. An agent has an identity, not a personality. Nothing here is a chat window.
Authorship, execution and business status are three different things
Authorship · who acted
IRIntake ReconcilerAgent
Identity chip. Shape, name and kind tag. Managed by Marisol Vega.
Execution · what the agent is doing
Waiting for approval
Run state: mono capitals, outline only. Describes the actor, never the record.
Business · where the record stands
Partially received
Status badge on PO-30418. It stays the same whoever is working on it, human or agent.
Agent profile, permissions and policy
IR
Intake Reconciler Agent
agent/intake-reconciler
Waiting for approval
Role
Receiving and reconciliation
Managed by
MVMarisol Vega
Team
Operations
Assignment
Standing: reconcile every inbound PO within 4 hours of check-in (RCV-01)
Acts through
Receiving API · Inventory API · Claims API
Can be paused by
Its manager, operations and purchasing leads
Permissions · what it can do
Scopes granted by Marisol Vega. Enforced by the platform, per agent.
Read purchase orders and suppliers purchase_orders:read
Record receipts against POs receipts:write
Change slab status and rack location inventory.status:write · inventory.location:write
Draft and submit supplier claims claims:draft · claims:submit
Message staff and request decisions messages:internal
Not granted
Change prices, PO quantities or costs
Message suppliers or customers directly
Approve anything, including its own requests
Policies · when anyone must ask
Workflow rules. They apply to people and agents alike.
PUR-04 Supplier claims over $1,000 need Purchasing approval.
Approver: Theo Brandt or delegate
INV-05 Damaged slabs are quarantined until a disposition is recorded.
Automatic; no approval
RCV-01 Inbound POs are reconciled within 4 hours of check-in.
Escalates to the manager if late
The distinction: a permission is about the actor. A policy is about the action. Theo filing a $1,890 claim himself would need the same approval as the agent does.
Permission versus approval policy, by action
Action by Intake Reconciler
Permission
Policy
Outcome
Record receipt for 17 matched slabs
receipts:write
None
Done autonomously
Quarantine L2083-02
inventory.status:write
INV-05 requires it
Done autonomously
Submit claim CLM-0912 ($1,890.00)
claims:submit
PUR-04: over $1,000
Waiting for approval
Submit a claim for $640.00
claims:submit
Under threshold
Would proceed autonomously
Change the list price of lot 2083
Not granted
—
Not permitted. Hands off to a person.
Approve its own claim
Not granted
Separation of duties
Never possible
Scenario · reconciling an inbound container against PO-30418
It’s 9:14 AM on Oct 9. Intake Reconciler has done everything its permissions allow and handed one decision to Theo Brandt. You are Theo. Review the exception, or pause the agent.
Application example · Internal · Agent assignmentFictional data · decisions update this page only
Reconcile PO-30418 · Marmi Valdera
Partially received17 of 18 slabs accepted · 1,109.76 sq ft ordered
Owner
IRIntake ReconcilerAgent
Managed by
MVMarisol Vega
Assigned by
Standing rule · all inbound POs
Run state
Waiting for approval
Intake Reconciler is paused
Paused by Theo Brandt (demo). It won’t take new actions. Inbound POs queue for manual reconciliation, and your decision below is kept until it resumes.
Progress
Container checked in
Owen Castillo · 7:52 AM
Person
Labels matched to PO lines
18 of 18 matched · 8:21 AM
Agent
Receipts recorded, inventory updated
17 slabs Available on B-07-2 and B-08-1 · 8:26 AM · within permissions
Agent
Exception resolved
Waiting on Theo Brandt · since 8:27 AM
Person
Claim submitted, receipt closed
Not started
Agent
Business records
PO-30418 reconciliation by line
Line
Lot
Ordered
Matched
Accepted
Quarantined
Area (sq ft)
1 · Bardiglio Nuvolato, 2 cm
2083
10
10
9
1
600.00
2 · Calacatta Macchia Vecchia, 3 cm
2051
8
8
8
0
509.76
Exception · needs a decision
L2083-02 · crack through full thickness
Quarantined
Reported by
OCOwen Castillo· 8:24 AM · 3 photos · “Crack runs top to bottom, about 38 in from the left edge.”
Agent did
Set the slab to Quarantined in bay Q-01 (INV-05). Drafted claim CLM-0912: credit of $1,890.00 = 60.00 sq ft × $31.50 PO unit cost.
Why it stopped
Policy PUR-04: claims over $1,000 need Purchasing approval. Requested from Theo Brandt at 8:27 AM.
Decision recorded
Handoff · approval requested
IRIntake ReconcilerAgentTBTheo Brandt
Approve or change the disposition of L2083-02. Intake Reconciler resumes as soon as you decide. Everything else on this PO is already done.
Requested 8:27 AM · due 11:52 AM (RCV-01)
Activity
OC
Owen Castillo checked in container TGHU 881204-4 · 18 slabs
7:52 AM · Yard scanner
IR
Intake ReconcilerAgent started reconciliation
7:53 AM · standing assignment from Marisol Vega
IR
Intake ReconcilerAgent matched 18 of 18 labels to PO lines
8:21 AM · Receiving API
OC
Owen Castillo flagged L2083-02 as damaged
8:24 AM · 3 photos
IR
Intake ReconcilerAgent recorded 17 slabs as received and Available
8:26 AM · no approval required
IR
Intake ReconcilerAgent quarantined L2083-02 and drafted CLM-0912
8:26–8:27 AM · INV-05
IR
Intake ReconcilerAgent requested approval from Theo Brandt
8:27 AM · PUR-04
Agent directory
The place to answer: which agents exist, who answers for each, what each may touch, and what each is doing right now.
Agents on the platform
Agent
Role
Managed by
Access
Run state
Current or last work
Last action
IRIntake ReconcilerAgent
Receiving
MVMarisol Vega
7 scopes · POs, receipts, inventory, claims
Waiting for approval
PO-30418
8:27 AM
QDQuote DrafterAgent
Quotes
PRPriya Raman
4 scopes · quote drafts, 72-hour holds
Working
Q-11873draft for review
9:11 AM
HKHold KeeperAgent
Reservations
PRPriya Raman
3 scopes · holds read, release, notify
Idle
Next run Oct 10, 9:00 AM
9:02 AM
DSDelivery SchedulerAgent
Logistics
OCOwen Castillo
5 scopes · delivery slots, routes
Paused
Paused by Owen Castillo: truck 2 in service until Oct 12
Oct 7
09 — Accessibility
Comfortable for eight hours, usable for everyone
The target is WCAG 2.2 AA. The checks below run in your browser against this page, so they reflect what is actually rendered. They complement testing with assistive technology; they don’t replace it.
In-page self-checks
Running…
Each check inspects the live DOM and computed styles. “Overflow” is measured at your current window width; resize and run again.
Keyboard
Keyboard behavior
Tab
Moves through controls in reading order. Focus is always visible (2px lapis).
/
Focuses inventory search, unless you’re typing in a field.
EnterSpace
Sorts a column (header buttons), toggles a chip, opens a record (slab ID).
← →
Moves between tabs (roving tabindex). Home/End jump to the first/last tab.
Esc
Closes the drawer, dialog or menu and returns focus to the control that opened it.
Built in
Status uses icon shape plus a word. Selection uses a 3px edge plus tint. Errors use an icon plus text.
Native controls throughout: buttons, inputs, <dialog>, radio groups.
Sortable headers follow the APG pattern: aria-sort on the sorted th, buttons inside, and arrows that differ in shape.
Targets are at least 24px. Coarse pointers get 44px hit areas without changing the layout.
Under prefers-reduced-motion, spinners, shimmers and transitions stop.
Results, selection counts and decisions are announced through polite live regions.
Badges and fields keep their borders in forced-colors mode.
10 — Implementation reference
Three layers of tokens, one source of truth
Primitive colors have material names and are never used directly. Semantic tokens name roles. Tailwind maps utilities onto the semantic layer, so bg-layer-1 and text-ink-2 follow a theme change automatically. Components are plain CSS classes built on the same variables.
<!-- Business status: icon + word -->
<span class="badge badge-warning"><svg…/>On hold</span>
<!-- Agent run state: never a tinted badge -->
<span class="runstate" data-state="waiting">
<span class="glyph"></span>Waiting for approval</span>
<!-- Identity: kind is required; agents need a manager -->
<span class="avatar avatar-agent avatar-sm">IR</span>
<span>Intake Reconciler</span>
<span class="kind-tag kind-tag-agent">Agent</span>
<!-- Density is an attribute, not a class soup -->
<div data-density="compact"><table class="dt">…
<td class="num">$5,479.92</td> <!-- tabular, right -->
<td class="id">L2051-04</td> <!-- Plex Mono -->
Components reference semantic tokens only. A hex value in component code is a review comment.
An identity component requires kind. Agent identities also require managedBy, enforced in the type.
Status vocabularies are closed enums per record type. Run states are a separate enum.
Numbers are formatted by one shared module (currency, area, dimensions), never in templates.
Customer and supplier views read from boundary-specific API projections. Hiding a field in the UI is not a permission.
Build: Tailwind CSS v4.3.3 CLI, with output inlined into this file. The sources are in _source/.
Live token reference
Read from this page’s stylesheet at load, so the list always matches what renders.
Design tokens defined on :root
Swatch
Token
Value
Layer
Loading…
11 — Research and sources
What informed this direction
Ten sources, each inspected directly in a browser or fetched in full on October 9, 2026. The work is synthesized from them, not copied from any one.
Research sources, the principle drawn from each, and how it shaped Honed
Tracked serif-capital wordmark. Cormorant Garamond + Work Sans. Ivory, near-black, olive and copper. Inventory listed as lot · dimensions (in) · thickness (cm) · finish · slab count. Landover, MD showroom. Trade login.
The wordmark lineage, Travertine/Verde/Bronze derivations, and lot and unit conventions. Verified facts are kept separate from proposals in section 01.
Row sizes of 24/32/40/48/64 px. Toolbar and header match the row height. Three sort states with icons only on the sorted column. Skeletons over spinners. Batch actions disable row actions.
The 40/32 px density pair, toolbar sizing, sort indicators, batch bar and skeleton loading.
Role-based token names. The layering model (background → layer-01 → layer-02), where fields and borders follow their layer. Blue 60 serves both interactive and focus.
The semantic token layer, the surface stack, and the decision that one interaction hue (lapis) also carries info.
Agents appear alongside people in assignee menus, have their own user pages and activity, and admins scope which teams they can access. Delegated work stays visible to the person.
Identity parity (agents in the same pickers and columns as people), the agent directory, scoped access, and a manager for every agent.
Fine-grained permissions instead of broad scopes. Actions are attributed to the app, or to the app “on behalf of” a user. The installation isn’t tied to one person’s account.
Mono scope names, the “on behalf of” identity pattern, and agents as identities in their own right rather than borrowed user accounts.
aria-sort only on the sorted th. Header text wrapped in a button. Direction glyphs that differ in shape, not just color. The caption explains sortability.
The inventory table header implementation, the ◇ ▲ ▼ indicators, and the screen-reader caption.
Plex: SIL OFL, with Sans, Mono, Condensed and Serif families, and Carbon’s default typeface. Marcellus (Astigmatic): SIL OFL, one weight, inscriptional Roman forms. Google Fonts metadata checked.
The licensing is clear for web and app use. Marcellus ties the wordmark to carved stone and stays legible at 15px. Plex carries operations, with Plex Mono for identifiers.
Limitations
—Imagine Surfaces’ internal workflows, policies, team and systems are not public. Every operational detail here is a proposal.
—No photography is embedded. Image frames are labeled placeholders, and tone chips approximate stone color.
—Fonts load from Google Fonts. Offline, the fallback stacks render; preview them in section 02.
—No dark theme has been designed. The semantic layer is ready for one.
Verification performed
—Rendered in Chromium (Playwright and the Claude desktop browser pane) at 375, 390, 768, 1024, 1280, 1440 and 1920px widths, with no horizontal page overflow at any of them.
—Exercised by script: search, status and type filters, sorting (with aria-sort), selection with indeterminate state, density (measured 40 and 32px rows), drawer by click, Enter and Esc with focus return, the / shortcut, form validation, both dialogs, all three exception decisions, and agent pause and resume.
—Contrast, labeling, overflow, token sync and font loading are verified by the in-page checks in section 09. All 10 passed at every width tested. No console errors.
—Not performed: screen-reader testing (VoiceOver, NVDA), Safari and Firefox, Windows forced-colors mode, and real touch devices.