Skip to main content

Zyvor Fabric web UX conventions

Hybrid surface: public Apple-style marketing pages and a light, sparse authenticated console under /app.

Visual reference: apple.com/airpods — SF Pro typography, high-contrast ink on #f5f5f7.

Surfaces​

SurfaceRoutesShell
Marketing/, /product, /platform, /securityMarketingLayout
Sign-in/sign-in (legacy /login redirects here)Standalone card
Console/app/*ConsoleLayout — top bar + left nav

Visual system​

Light-first Apple tokens in web/src/styles/main.css:

TokenValueRole
--zf-ink#1d1d1fHeadlines and primary body
--zf-secondary#333336Supporting copy (clearly readable)
--zf-muted#6e6e73Captions, table headers, footnotes
--zf-canvas#f5f5f7Page background
--zf-surface#ffffffCards and panels
--zf-hairline#d2d2d7Borders
--zf-link#0066ccLinks and primary accents

Typography: SF Pro Text / Display via -apple-system / BlinkMacSystemFont (same stack as apple.com). Themes dark / steel / aurora are removed.

Buttons: .zf-btn / .zf-btn-primary / .zf-btn-ghost / .zf-btn-secondary.

Console table cells stay ink; muted is for captions only. Avoid #86868b — too faint on #f5f5f7.

Primitives​

ComponentUse when
EmptyStateZero rows; include primary CTA
ErrorBannerPage load or action failure with hints
PageHeaderTitle, description, refresh, primary action
WizardStepperMulti-step Create VM / wizard flows
BreadcrumbPath trail under /app
CopyButtonClipboard copy with toast
PageSkeletonSuspense fallback for lazy routes
HelpDialogShortcuts and About

API errors​

Daemon returns { "error": "…", "error_code": "operation_failed" } on failure.

UtilityUse when
formatHttpErrorBodyParsing non-OK fetch bodies
formatUserErrorAny catch shown in toasts or banners
toastFailuretoastFailure(toast, 'Label', e) shorthand

Wire daemonHints.ts via ErrorBanner hints={hintsForError(loadError, 'vm')} on Dashboard, VM list/detail, Storage, Network, and Operations pages.

Console chrome​

  • Command palette — Ctrl/Cmd+K; fuzzy search VMs and pages (/app/... routes)
  • Sequence shortcuts — g then d/v/n/s/c/l/b/i/e → /app/...
  • Help — ?
  • Connection — live WebSocket badge in the top bar

Create VM​

Canonical route: /app/create.

Interfaces​

Human UI is web only. CLI (fabricctl), Kubernetes operator, and Terraform remain. The former terminal UI (zyvorctl-tui) has been removed.