Operator design system
Interface library.
The reference for how Operator looks, feels, and responds. Shared components, considered details, and a consistent experience on every screen.
Every example is local. Nothing is saved or sent.
01 / The foundation
Calm surfaces. Clear decisions.
The ease of the login page, with the warmth and character of Operator.
Studio FormaBusiness overview
Your business, in a good place.
A clear view of what’s happening and what needs you next.
- Revenue this month
- $12,480
- Upcoming appointments
- 24
- Hours returned to you
- 38
Your weekly report is ready to review.
- Comfortable by default
- 44px controls. Consistent alignment. Space to read and act.
- A quiet frame
- Flat surfaces. 8px controls, 16px containers. Fine neutral borders.
- One visual voice
- Lausanne 400. Phosphor Regular. Orange with a purpose.
02 / Components
One component. Every screen.
The building blocks used throughout the app. Every example uses the real shared component.
Button
A clear hierarchy of actions, with room for every state.
32px
36px
44px
48px
Icon · 44px
Input
Comfortable controls with a visible, connected label.
NativeSelect
Familiar selection with native keyboard and mobile behavior.
Textarea
Room for a longer thought. Resizes with the content.
Label
Keep a field’s purpose visible after someone starts typing.
InputField
One pattern for help, validation, and unavailable values.
A label, control and description together.
Review this example value.
AuthenticatorCodeInput
Enter all six digits from your authenticator.
EmailLoginForm
Try both steps with example details. Nothing is sent or saved.
Administrator variant. Try both steps with example details. Nothing is sent or saved.
Checkbox
Explicit choices, with the full label acting as a target.
Alert
Say what happened and what someone can do next.
Ready for your next step
A local example of a clear, accessible notice.
Review this detail
This example illustrates an error. Nothing was submitted.
QrCode
A locally generated example with no account or setup secret.
AuthStory
Your whole business. Working as one. The headline converges once; reduced motion shows the finished word.
Try both steps with example details. Nothing is sent or saved.
WorkspaceSidebar
A compact home for navigation. Related work together, your current location clear.
WorkspaceHeader
A quiet top bar for the signed-in member.
WorkspacePageHeader
A sticky page title, supporting copy, optional actions and underline tabs.
Jobs
A clear view of the work ahead.
WorkspaceRoutePending
A quiet first-entry wait: the loader mark with visible status copy.
Loading workspace
Checking your access and preparing this page.
WorkspacePagePending
Keep the chrome and the page title; skeleton only the content blocks.
Jobs
A clear view of the work ahead.
Card
One related set of information, held in a quiet container.
Studio session
One-to-one pottery workshop
Confirmed
Friday, September 18
10:00–11:00 AM · Studio Forma
10:00–11:00 AM · Studio Forma
Session total$85.00
Empty
Explain the open space and offer a useful first step.
Your schedule starts here
Add your first service to start making space for customers.
Badge
Short status labels. Color supports the words.
ActiveConfirmedDraftAction required
Separator
A light boundary between related information.
Studio session$85.00
Payment is due after your appointment.
Accordion
Progressive detail that stays easy to scan.
Disclosure
Optional detail without losing the surrounding context.
Reference content remains available when reopened.
Nested reference content
Skeleton
Reserve the shape of the content while it loads.
Field
Group related inputs with one clear reading order.
Table
Comparable records, generous rows, and aligned values.
| Service | Date | Status | Amount |
|---|---|---|---|
| Studio session | Sep 18, 10:00 AM | Confirmed | $85.00 |
| Wheel workshop | Sep 19, 2:00 PM | Awaiting payment | $120.00 |
| Glazing session | Sep 20, 11:00 AM | Confirmed | $65.00 |
| 3 appointments | $270.00 | ||
Brand & motion
A familiar face, wherever you are.
CashCycle
A little character for welcoming someone into Operator.
Three vehicles take turns delivering and collecting the same cash pallet.
CashHelicopter
A standalone illustration with the same line and motion language.
A helicopter picks up a money bag and carries it away.
OperatorLogo
The same mark and wordmark across every surface.
operator
The mark reserves its space, then reveals once; static fallbacks respect reduced motion.
OperatorLoader
One restrained loading signal, including centered dark auth entry with accessible context.
Loading example
Auth button outline spinner
Auth first entry: one centered mark on the dark canvas.
Loading Operator
03 / Interaction
A clear next step.
Try a name, a missing detail, and a pending action. Your input stays in this page.
Local example · Nothing is saved or sent.
04 / Focus
Room for a closer look.
Open a focused view, move through it with your keyboard, and return to where you started.
Keep your place
Escape closes the dialog. Focus returns to the button that opened it.
Inline Dialog content stays in its server-rendered page position; portalled Dialog content keeps the default floating layer.
Includes DialogClose · DialogContent · DialogDescription · DialogFooter · DialogHeader · DialogOverlay · DialogPortal · DialogTitle · DialogTrigger
05 / States
Know where things stand.
A reference for progress, interruptions, and recovery. These are examples, not live activity.
Getting things ready
Loading
The next view is loading. No action is needed yet.
A little room to begin
There are no items in this example. A first step would appear here.
One detail needs a look
Check your input
Check the marked field. Your other entries are still here.
We couldn’t load this view
Something went wrong
Try again when you’re ready. No changes have been made.
Waiting for confirmation
Pending confirmation
A request is still pending. It is not complete, so avoid sending it again.
A step needs your attention
Action needed
Review the missing requirement before continuing.
This view may be out of date
Update needed
Refresh the information before making a decision.
Some steps are complete
Partly completed
Completed work stays recorded. The remaining step needs attention.
Completed
- Example details checked
Still to do
- Example confirmation not received
All set for this example
Completed
Every step in this example is complete. No business action took place.
Check the outcome first
Recovery needed
The result is uncertain. Confirm what happened before trying the action again.
06 / Domain example
Payment truth before the next step.
Booking stays separate from payment. These synthetic states show what customers and owners see while Operator confirms the actual outcome.
Illustrative records · No payment or booking exists.
Synthetic deposit · $85.00Original service terms preserved
Payment and booking recovery
The interface states what is recorded, what is still pending, and which actions only create a proposal.
Payment recorded · booking pending
Pending confirmation
The deposit is applied to the invoice. Booking confirmation is still in progress.
Payment received · booking exception
Action needed
The original time is no longer available. Owner review is required; no refund or move happened.
Exact retry available
Recovery needed
Automatic retries are exhausted. A verified owner may request one version-bound retry.
Payment and booking confirmed
Completed
One authoritative booking is attached to the captured deposit.
Alternate-slot and refund-review controls record proposals only. They do not move a booking, send a message, or issue a refund.
07 / Typography
Quietly clear.
TWK Lausanne at 400. Hierarchy comes from size, space, and tone.
Page heading · 30px
Make room for what’s next.
Section heading · 24px
A good day for your business.
Content heading · 18px
Everything in its place.
Body · 16px
Operator keeps the details moving, so you can focus on the direction.
Supporting text · 14px
Your changes are saved. You can come back to them at any time.
Emphasis · 400
Clear words. A little emphasis when it helps.
Icons
Phosphor, in context.
A small reference of the Regular icons used across Operator. The full library is available through the same shared package.
House
Search
Add
Arrow right
Caret down
Close
Appearance
A controlled splash of color.
Compare an accent on the actual shared components. This reference-only choice resets when you reload and does not change the product theme.
Accent color
Custom paired shades
Adjust either shade to compare a custom pair. The picker selects Custom automatically.
Preview mode
The selection in context.
Accent belongs to primary actions and selected states. Keyboard focus uses a clear ink outline.
Theme tokens
Edit packages/ui/src/tokens.css to update the shared theme. Values reflect the appearance selected above, including custom accents.
| Token | Active value |
|---|---|
--auth-input-background | Loading… |
--auth-input-foreground | Loading… |
--auth-input-label | Loading… |
--auth-input-border | Loading… |
--auth-input-hover | Loading… |
--auth-input-focus | Loading… |
--auth-input-disabled-background | Loading… |
--auth-input-confirmed-background | Loading… |
--auth-input-disabled-foreground | Loading… |
--auth-input-disabled-border | Loading… |
--auth-input-weight | Loading… |
--auth-mark-filter | Loading… |
--auth-story-heading-size | Loading… |
--auth-story-heading-leading | Loading… |
--auth-story-heading-offset | Loading… |
--auth-story-heading-offset-tall | Loading… |
--auth-story-image-filter | Loading… |
--auth-story-overlay | Loading… |
| Token | Active value |
|---|---|
--background | Loading… |
--foreground | Loading… |
--card | Loading… |
--card-foreground | Loading… |
--popover | Loading… |
--popover-foreground | Loading… |
--primary | Loading… |
--primary-foreground | Loading… |
--selection-background | Loading… |
--selection-foreground | Loading… |
--secondary | Loading… |
--secondary-foreground | Loading… |
--muted | Loading… |
--muted-foreground | Loading… |
--subheading-foreground | Loading… |
--accent | Loading… |
--accent-foreground | Loading… |
--destructive | Loading… |
--border | Loading… |
--input | Loading… |
--ring | Loading… |
--chart-1 | Loading… |
--chart-2 | Loading… |
--chart-3 | Loading… |
--chart-4 | Loading… |
--chart-5 | Loading… |
--sidebar | Loading… |
--sidebar-foreground | Loading… |
--sidebar-primary | Loading… |
--sidebar-primary-foreground | Loading… |
--sidebar-accent | Loading… |
--sidebar-accent-foreground | Loading… |
--sidebar-border | Loading… |
--sidebar-ring | Loading… |
| Token | Active value |
|---|---|
--palette-lime-light | Loading… |
--palette-lime-dark | Loading… |
--palette-juniper-light | Loading… |
--palette-juniper-dark | Loading… |
--palette-iris-light | Loading… |
--palette-iris-dark | Loading… |
--palette-rust-light | Loading… |
--palette-rust-dark | Loading… |
--palette-ink-light | Loading… |
--palette-ink-dark | Loading… |
| Token | Active value |
|---|---|
--interface-custom-light | Loading… |
--interface-custom-dark | Loading… |
--interface-custom-light-foreground | Loading… |
--interface-custom-dark-foreground | Loading… |
| Token | Active value |
|---|---|
--color-white | Loading… |
| Token | Active value |
|---|---|
--font-family | Loading… |
--font-weight | Loading… |
--font-weight-subheading | Loading… |
--font-weight-heading | Loading… |
--font-weight-strong | Loading… |
--font-size-body | Loading… |
--font-size-label | Loading… |
--font-size-small | Loading… |
--font-size-auth-heading | Loading… |
--font-size-auth-heading-narrow | Loading… |
--font-size-heading | Loading… |
--font-size-section | Loading… |
--font-size-subheading | Loading… |
--font-size-brand | Loading… |
--font-size-logo | Loading… |
--line-height-body | Loading… |
--line-height-heading | Loading… |
--tracking-body | Loading… |
--tracking-heading | Loading… |
| Token | Active value |
|---|---|
--inset-narrow-page | Loading… |
--space-1 | Loading… |
--space-2 | Loading… |
--space-3 | Loading… |
--space-4 | Loading… |
--space-5 | Loading… |
--space-6 | Loading… |
--space-7 | Loading… |
--space-8 | Loading… |
--space-10 | Loading… |
--space-12 | Loading… |
--space-16 | Loading… |
| Token | Active value |
|---|---|
--radius | Loading… |
--radius-control | Loading… |
--radius-surface | Loading… |
--radius-circle | Loading… |
--stroke-width | Loading… |
Supervised identity restoration
Informational example. No proof is exchanged or saved.
Continue your identity check
Return to the private terminal opened for your supervised Operator account restoration. Enter the six-digit email code there when prompted.
Your account is still restricted
Opening this page does not verify your identity or restore access. The terminal guides you through password and authenticator checks. Two administrators must then review and approve the restoration.
If the terminal has closed or the code expired, ask the administrator supervising this process to check the same restoration request before starting again. Do not share your password, email code, or authenticator code with them.
If you did not request account restoration, do not use the code. No restoration request is created by visiting this page.
Invitation acceptance
Static example. These controls cannot send requests or change an account.
Set up your invited account
Password setup required
Choose a new password. Your account remains restricted until setup and session cleanup are confirmed.
Restricted recipient invitation
Static examples. These controls cannot begin a recipient flow, change a password, or grant account access.
Invitation ready to review
Review the intended destination before accepting.
Request pending
The previous action may still be running. Check the same request.
Session cleanup required
Account access remains restricted until global cleanup and the final grant are confirmed.
Account setup complete
Provider sessions are signed out. Sign in normally to continue.
Existing account invitation
Static examples. These controls cannot authenticate, send email, restart proof, or grant a membership.
Confirm your current account
Current password required
This invitation adds a membership to an existing account. It does not set a new password.
Confirm invited email
The email request is recorded. Delivery and proof are not yet confirmed.
Existing authenticator
Local session cleanup
This invitation requires local session cleanup before the grant can finish.
Restart verification
Restart needs an explicit next step; uncertain results retain the same request reference.
Invitation accepted
Local invitation sessions have been cleared. A conversion invitation may finish without a business membership.
Account and business selection
Static account examples. These cards do not sign in, select a business, or change security.
No businesses yet
A signed-in account remains available for account security even when it has no active business membership.
Choose a business
Owner A · owner access
Staff B · staff access
Owner C · owner access
Global account security
Authenticator setup belongs to the account across all selected businesses.
Business creation and directory labels
Static examples. These controls cannot create a business, verify an authenticator or read an account.
No businesses yet
An account can create a business before it has a membership.
Business name unavailable
The account still has a business reference and role; a membership name is not a business label.
ownerOriginal creation request pending
A missing receipt may still finish. Check the same request before another action.
Authenticator verification required
Return with the same request reference after verification.
Business creation confirmed
The owner workspace is ready for ordinary business setup.
