Weekly digest
Runs, spend and failures every Monday at 8:00.
Every seenry-ui and contract class in Graphite, in each of its states. Hover and focus are pinned with data-state so they read side by side; everything is live too. Copy markup from the source, without the gx- gallery wrappers.
The values every component reads from tokens.css.
Three surface greys and a hairline do all the structure. Hue is reserved for status marks, the failure series and app logos.
--bg --surface --surface-2 --hover --line --text --text-2 --text-3 --ok --warn --bad --info --idle
Inter at 400 and 500 only. Hierarchy comes from size and grey, never weight above 500, capitals or tracking.
--type-title --type-heading --type-label --type-body --type-small --type-micro --type-stat --type-code
Radius 6 for controls, 10 for cards, 12 for dialogs. Space runs on 4px; cards pad 14 and sit 20 apart.
--r-sm --r-lg --r-xl · --space-1 … --space-8 · --control-h --row-h --nav-h --topbar-h
Lucide 0.469.0, outline, 16px, stroke 1.5 in the meta grey; they rise to the text color on hover and selection.
<i data-lucide="name"></i>
Buttons, chips and shortcuts.
One filled primary per view, for the one action of the screen. Everything else is the default grey or ghost.
.ui-button data-variant="primary | ghost | danger" data-size="sm | lg" data-icon data-loading
Filters above a list or activity feed. Pressed fills one grey step; the count stays quiet.
.ui-chip aria-pressed .ui-chips
Only for a real shortcut, written beside the action it triggers.
.ui-kbd
Fields, choices and controls that take a value.
A visible label above, help or error below in the small size. Errors turn the border and message red; nothing else changes.
.ui-field .ui-label .ui-input .ui-help .ui-error data-invalid .ui-control .ui-affix .ui-addon
Multi-line input with the same border, focus and error rules as the field.
.ui-textarea
Native select for short fixed lists; the combobox suggests from a datalist and still accepts anything typed.
.ui-select .ui-combobox <input list> + <datalist>
Checkbox for independent choices, radio for one of several, switch for a setting that applies at once.
.ui-choice .ui-radio-group .ui-switch role="switch"
A 4px track filled to the value with the number beside it. Use for a bounded amount where the position means something.
.ui-slider <input type="range"> + <output> --pct
Two to four mutually exclusive views of the same content.
.ui-segmented aria-pressed
A larger selectable row for one-question steps, with the logo or icon that makes it recognisable.
.ui-option
State, progress and messages.
State is a word with a 6px mark, never a filled pill or color alone. Badges are outlined categories.
.ui-status data-status="ok | warn | bad | info | idle" .ui-badge
One sentence about the page, with the icon carrying the hue and at most one action.
.ui-alert data-status
Changes approved now reach Salesforce by 10:15.
3 queued runs resumed.
Runs pause before CRM writes, as the approval policy requires.
Ad spend digest failed 3 times since Oct 26.
Progress is work under way; meter is usage against a limit and only takes a status color past its thresholds.
<progress class="ui-progress"> <meter class="ui-meter" low high optimum> .ui-usage
Skeletons match the shape that is loading. Toasts confirm a result and leave on their own.
.ui-skeleton SeenryUI.toast(message, {description}) data-toast-message
New runs use these defaults.
Say what is missing, why it matters, and one next step.
.ui-empty
Create a key to trigger agents from your own services.
Records, rows, facts and history.
Initials on the raised grey; app logos are the only brand color in the room, bare at 16 or in a 24 tile.
.ui-avatar .ui-avatar-group .ui-logo[data-brand] .ui-logo-tile
Cards are the surface grey with a hairline, never a shadow. Three stats at most, each with what it is compared to.
.ui-card .ui-card-head data-flush data-link .ui-stat-strip
Runs, spend and failures every Monday at 8:00.
Rows of a name and one line of meta, with a logo or avatar before and a status or value after.
.ui-list .ui-list-item .ui-list-meta aria-current="true"
Sortable headers in the meta grey, numbers right aligned in tabular figures, the first column as the name.
.ui-filter-bar .ui-table-wrap .ui-table data-ui-table th[data-sort] .num
| Agent | Status | Runs | Spend |
|---|---|---|---|
| Lead enrichment | Needs review | 6,412 | $412.80 |
| Inbox triage (hover) | Healthy | 5,208 | $186.20 |
| Ad spend digest | Failing | 1,122 | $137.40 |
| Release notes | Scheduled | 412 | $58.40 |
Label and value pairs on hairlines: the facts of one record.
.ui-data-list .ui-detail .ui-detail-head .ui-detail-row
Writes 38 contacts to HubSpot.
Activity history: a mark, who did what, one line of detail, and when. Marks are a status dot, an avatar or an app tile.
.ui-timeline .ui-timeline-item data-status
REQUEST_LIMIT_EXCEEDEDMono at 12px for IDs, model names and payloads. Blocks sit on the field surface with a caption and a copy button.
code.ui-code figure.ui-code data-copy .ui-mono
Trigger the agent with POST /v1/agents/agt_3KD92P/runs and an API key.
curl https://api.halyard.app/v1/agents/agt_3KD92P/runs \
-H "Authorization: Bearer $HALYARD_KEY" \
-d '{"list_id": "q4-webinar", "dry_run": true}' # returns run_idCounts over time are square-topped bars on a zero baseline; failures stack on top in the only red series.
.ui-chart .ui-chart-legend .ui-chart-axis --chart-1 … --chart-5
Succeeded and failed
Layers above the page. They are the only surfaces with a shadow.
Dialogs confirm one decision; sheets hold a related task; the command menu opens with ⌘K.
.ui-dialog .ui-sheet .ui-command data-dialog-open
Optional detail on a page, separated by hairlines.
details.ui-accordion
How components compose into screens.
The sidebar, top bar and page header every block is framed with. Under 768px the sidebar becomes a drawer opened by the menu button.
.ui-shell .ui-sidebar .ui-topbar [data-nav-toggle] .ui-page-header .ui-section-head
A label and one line of help on the left, the control on the right; destructive actions live in their own outlined group.
.ui-settings-group .ui-settings-row .ui-danger
Each agent can override these.
These actions affect every member of Northbeam.
One centered column on the page color: mark, title, providers, a divider, fields and the legal line. See the sign-in block for the full page.
.ui-auth .ui-auth-providers .ui-auth-divider .ui-auth-legal
Agents for revenue and marketing ops
or with email
By continuing you agree to the Terms and Privacy Policy.
Whole screens for one product, Halyard, an agent console for revenue and marketing ops. Start a new screen from the nearest one.
blocks/*.html
Stats, runs per day, review queue, agents table
Filterable runs with the selection open beside it
One agent: alert, facts, budget, activity timeline
Grouped fields, switches, integrations, danger zone
Plan, usage meters, payment method, invoices
Stepper, one question, the empty state after setup
SSO, email, create account and the error state