PRN UI component system

A self-contained operational interface specimen for the complete Dise migration.

Buttons: Active, Disabled

Segmented control

Click an option — the group keeps its chamfered outline, only the fill moves.

Scrollable segmented control

Choose a view · pin frequently used options 0 pinned

Pinned options move to the start of the same scrolling list. Unpinning restores their native order.

Short rail · all options fit Checking width…

When every option fits, pinning has no benefit, so pin controls become unavailable automatically.

Hierarchical checkboxes

Organization role read-only · left/top wedges mutable · right/bottom wedges

Branch diamonds use interior wedges: left is partial read-only and top joins it for all; right is partial mutable and bottom joins it for all. Hovering a branch row shows the same summary as text.

Form

Title

Status system: badges & glyphs

Running Completed Cancelled Failed Stalled checking…
waiting running done ! graceful failed skipped

Harness chips

O C X G U +3

One letter per harness; finished chips dim. Hover for details.

Chrome: status bar, breadcrumbs, tabs

live · up 3d 14h · v0.4.4

Pick a repo and launch a harness.

live connecting down

Jobs table

JobStatusStartedDurationProcsRepo
j-4f2a9c Running 10:41 3m 12s O C X ⁦~/github/acme/api-server⁩
j-b81d03 Completed 09:15 12m 44s C G ⁦~/github/acme/web-frontend⁩
j-77e6f1 Failed Yesterday 1m 03s X +2 ⁦~/github/dimacurrentai/scsh⁩

Collapsible status rows

build-and-test codex · elapsed 2m 18s
container 9f3a1c…b2e4 · image scsh-codex:0.4.4
Running cargo test --workspace, tail follows below.
lint 0.9s
clippy · 0 warnings · 0 errors
deploy-preview waiting on build-and-test
Queued; starts when its dependency finishes.
integration-tests exit 1 · 4m 02s
2 of 148 tests failed
See the log tail for the failing assertions.

Workflow nodes

lint
codex · 0.9s
build-and-test
codex · 2m 18s
deploy-preview
waiting
integration-tests
exit 1 · 4m 02s
publish
skipped
Job succeeded Job running Job failed when: tests-pass

Loop · iteration 3 of 5

review #2
claude · 58s
review #3
claude · 12s
↻ 2 more planned

Workflow diagram

Job running 6 nodes · 1 running · 3 done · 1 failed · 1 waiting
lint
codex · 0.9s
scsh-codex:0.4.4
image build · 38s
build-and-test
codex · 5m 12s
integration-tests
codex · 1m 44s
deploy-preview
exit 1 · 12s
publish
when: tests-pass

Banners

Log output

Short time-zone name · Time zone

❯ cargo test --workspace
+1.2sCompiling scsh v0.4.4
+6.4sFinished test profile in 5.2s
+8.7s✓ 214 tests passed
+8.9swarning: unused variable `cast_id`
+9.0s✗ e2e::daemon_restart — assertion failed

Long time-zone name · Time zone

❯ cargo test --workspace
+1.2sCompiling scsh v0.4.4
+6.4sFinished test profile in 5.2s
+8.7s✓ 214 tests passed
+8.9swarning: unused variable `cast_id`
+9.0s✗ e2e::daemon_restart — assertion failed

Card & Panel

Composable surfaces

Normal, compact, dense, empty, and loading compositions.

Foundation
Normal panelready

Nested content uses shared borders and the named deep surface.

EngineModeStatus
demo-engine-aobserveActive
No saved viewsCreate a view when a reusable layout is useful.

Button contract

Fields, inputs & select

optional

Visible to operators; does not change the machine identifier.

Required to unlock this synthetic console.

Use at least three characters.
The label must not match a reserved capability name.

Read-only values remain selectable.

The reason remains visible.

Checking availability…

Preferred when rich option content is unnecessary.

Rich invocation route
Codex review routecodex · gpt-5 · code-review
Claude summary routeclaude · sonnet · commit-summary
Unavailable routemodel probe has not completed
Long invocation route label for viewport testingopencode · synthetic-model-with-a-long-name · audit

Arrow keys, Home/End, typeahead, Enter, Escape, and Tab are supported.

Stat, MetricGrid & ValuePair

Retained jobs
12,480

updated 4s ago

Results ready
8,120

65.1% complete

Active routes
14

across 4 harnesses

Retrying steps
2

within retry budget

Stream readers
4

all synthetic

Unavailable

source offline

jobs.events

Structured stream · age 180ms

Head12,480
Replica12,476
artifacts.events

Stale · last update 46s ago

Head
Replica

Feedback & status

Readiness blocked by four checks
  • Synthetic daemon handshake incomplete
  • Two required observation scopes are missing
  • Result stream is stale
  • Commit import awaits review
All checks clear
Observation may continue; no mutation capability is enabled.
Two simultaneous workflow pauses
Retry budget pause · 2m 14s
Operator review pause · 38s
Synthetic stream stale
Read-only inspection remains available. Actions requiring current evidence are disabled.

Dialog, Tooltip & CopyPopover

Dialogs trap focus, close with Escape, restore focus, and keep long output inside their body.

·

Job · Exact duration · Session

Docked Inspector

Use an Inspector—not a Tooltip—for structured, selectable, or link-bearing detail. Its layout space is always reserved: hover or focus previews, click pins, and Escape or Clear releases it.

DataTable & ProgressiveReveal

Synthetic invocation routes
InvocationHarnessModelProfileAttemptsBudgetResultStatusStartedAction
codexgpt-5code-review1900sreview.jsonComplete10:41:12
claudesonnetcommit-summary1600sRunning10:42:03
opencodeglm-demoaudit3480sFailed10:42:18
6 shown · 20 retained

Disclosure & EventLogRow

2m agoNormalSynthetic daemon connected to the observation stream.
{"event":"demo.connected","stream":"synthetic"}
58s ago+71sSuccessSynthetic readiness checks completed without mutation access.
{
  "event": "demo.readiness",
  "result": "ready",
  "mutation_enabled": false
}
24s ago+34sPipelineSynthetic transform waited because its upstream artifact was not ready.
{"decision":"wait","upstream":"review-codex"}
12s ago+12sPausedRetry pause activated because the synthetic result stream is stale.
{"pause":"stale_result_stream","duration_ms":12000}
7s ago+5sFailureSynthetic command was rejected safely; no retained state changed.
{"error":"demo_rejection","retryable":true}

CodeBlock & SecretValue

Synthetic JSON response
{
  "repository": "repo_demo_alpha",
  "capability": "observation-only",
  "expires_at": "2099-01-01T00:00:00Z"
}
Synthetic capability token
••••••••••••••••••••••••••••••••

Synthetic example. Real one-time values should be stored before this dialog is closed.

Plot

Published rateApplied rateLive sample
Window −1.00…1.00Live 0.18 / 101.26Cursor 0.00 / 100.00

AppShell & StickyChrome

Synthetic daemon onlineup 3d 14h
jobs.eventsHead 12,480Replica 12,476
All jobscode-reviewcommit-summary · runninggorgeous-pipeline
Result stream stale
The shell keeps the current mode and read-only inspection available.
Streams · jobs.events

Popover and dialog bounds are measured from rendered sticky chrome.

Cross-component states & responsive contract

ComponentEmptyLoadingErrorStale
CardNamed absenceSkeletonCalloutAge retained
SelectNo optionsTrigger busyInlineMessageLast value labeled
DataTableColspan messageStable rowsRows preservedTimestamped
EventLogNo eventsExisting open rowsRetry detailAges continue
PlotNo seriesViewport reservedText alternativeMarker labeled
DialogResult absentLocal actionFull messageExisting result kept
ScopeSwitcherNo routesSelection retainedUnavailable reasonRunning route distinct

Dialog & toast

The dialog replaces the browser confirm; the toast is non-blocking feedback.

Tooltip

Job is running ; one earlier process exited .

Hover or focus after a short delay. Tooltip content is supplementary and never interactive; Escape, blur, and pointer leave close it.