OS Shell design language
Parent entry: [DESIGN.md](./DESIGN.md) (product posture, tokens map, anti-pattern summary).
Parent entry: DESIGN.md (product posture, tokens map, anti-pattern summary).
This document is shell-only: desktop scene, top bar, dock, window system, and embed boundaries. Sub-app content rules live in app-design-language.md.
Visual language (shell)
The shell should feel precise, calm, and hardware-ordered: clear stacking, readable controls, thin borders and light shadow before heavy elevation, subtle glass that supports depth (not decoration). Neutral surfaces with restrained accent; accent signals action or system emphasis, not decoration.
Do not clone macOS/Windows/iOS metaphors (traffic lights, Start menu, home grid). Take inspiration from real OS ergonomics without copying trademark UI.
Shell composition
Desktop scene
Spatial host for work: wallpaper / gradient field (--os-desktop-background), optional atmospheric overlay, and normalized window stacking. The scene should imply stable space — edges, safe margins, and max width (--os-desktop-max-width) where the layout demands it.
Top bar (RuntimeCommandStrip)
Global band for identity, shell status, primary navigation anchors, and future command entry. Stays visually lighter than window titlebars; uses compact control height tied to --os-runtime-command-strip-height and density. New shell sessions default to top placement; user placement preferences only affect Desktop Runtime RuntimeCommandStrip, not the public landing nav.
Dock
Launcher strip: persistent apps, temporary running apps, running affordance, and app identity at a glance. Persistent apps remain visible even when closed and should not look disabled or show a running dot until a window exists. Temporary apps appear after a divider when they are running but not kept in Dock. Uses dock-radius (--os-radius-dock) and bottom-safe offsets so it floats above the workspace without fighting window corners.
The Dock belongs to Desktop Runtime, not to the public landing page and not to every Studio Engine. It is a separate floating launcher surface, visually close to a macOS-style icon list without copying the host OS. The existing floating surface position preference controls whether it sits on the bottom, top, left, or right edge. The RuntimeCommandStrip remains a command/status/navigation surface instead of carrying app icons.
Window grammar
- Frame: rounded outer shell (
--os-radius-window), titlebar height (--os-titlebar-height), window shadow (--os-shadow-window) for elevation over desktop. - Body:
WebsiteAppHostand similar use--os-window-body-backgroundand--os-window-body-paddingso content is inset consistently across density. - Chrome: custom macOS-adjacent traffic-light controls and drag targets live in
@prox-os/os-ui(WindowFrame,Titlebar,WindowControls). The controls are Próx shell components, not browser or host OS widgets.
Active / inactive states
Active window: stronger border/contrast, title readability, shadow read as “foreground”. Inactive: toned ink, softer border, no loss of structure — user must still identify the app and recover focus quickly.
Focus, layer, resize, drag
- Focus: keyboard and pointer focus rings stay subtle (thin ring / high contrast on neutral), no neon halos.
- Layering: z-order follows window manager rules; shell popovers, menus, and tooltips sit above frames; toast / system notices use panel/window shadow tokens.
- Drag / resize: interactions should be interruptible and low-latency (
react-rndetc.); ghosting or lag is a bug, not a feature. - Snap geometry: snapped, quartered, fullscreen-space, and desktop-filled windows use the measured workspace bounds with zero visual inset. Readability padding belongs to initial/default placement, not drag clamping or snapped rendering. Floating windows may touch every workspace edge.
Scenes And Mission Control
The shell now separates Studio switching from Scene switching. Studio switching is the global resource layer. Scenes are layout states inside the active Studio. Mission Control should feel like a calm OS-level overview, not a marketing hero:
Control Shift Up: open Prox Mission Control. The top band shows Studio sessions; the main area shows Scenes for the active Studio.Control + ,/.: move to the previous or next Scene inside the active Studio.Control Shift + ,/.: move to the previous or next Studio session.- Titlebar double-click zooms the window inside the current Desktop Runtime Scene.
- The green titlebar control enters focus or full presentation for the active App. Hovering it on the active window opens the window resize menu; inactive windows reveal traffic-light colors on hover without opening menus.
- Mission Control Scene thumbnails show a hover affordance when a Scene can be selected or created. Studio session cards stay visible as the global context layer.
Mission Control thumbnails must reuse the active desktop background token
(--os-desktop-background) when previewing Desktop Runtime Scenes so they read
as miniature work states, not generic white cards. Other Studio Engines can
provide engine-specific Scene previews while preserving the shared overlay
structure.
Dragging a window to the top edge and holding there can open Mission Control as
a Scene drop target. Existing Scene thumbnails use a selected state when
hovered as a drop target; insertion positions show a translucent temporary
Scene with a + between or outside the current Scene queue.
Window edge snap should remain readable and predictable: corners produce quarter layouts, left/right edges produce half layouts, and the top edge toggles desktop zoom. The pointer activation band is intentionally narrow so normal dragging near the workspace does not snap accidentally. A previously snapped window must not re-snap unless the pointer is currently inside an activation band. The resize menu also exposes top-half and bottom-half placement for deliberate keyboard-free arrangement. Dragging an already desktop-zoomed window restores the previous layout before the drag continues.
Desktop zoom, fullscreen Space presentation, titlebar double-click zoom, and
snap-to-fill must keep the same rounded WindowFrame grammar as ordinary
windows. These states may remove body padding for content fit, but they must
not remove the outer radius or create a visual bottom gap.
The resize menu uses compact icon tiles instead of text-heavy directional rows.
Its sections are Move & Resize, Fill & Arrange, and a Full Screen submenu
so common window placement, desktop zoom, centering, and focus presentation
remain in one active-window affordance.
The Storybook contract for this behavior is Shell/WindowSnapGeometry.
Use it when changing @prox-os/os-ui window geometry, Desktop Runtime window
rendering, Alma workspace measurement, or snap preview styling.
Runtime Command Strip popovers, including future locale or translation controls, must be fixed/portal positioned against the trigger and clamped to the viewport. Do not attach absolute popovers inside the Runtime Command Strip overflow container.
Use lightweight blur only on the top strip, avoid stacking blur over every window, and respect prefers-reduced-motion.
Website Mode
Website mode is a single-app browsing surface using /website route suffixes.
App Studio and focused App presentation are separate from Website mode.
Landing Navigation
The public homepage uses its own immersive glass navigation. It is product navigation for a Solutions Studio menu, Community, Docs, Pricing, Alma, sign-in, and Launch OS. It must not reuse ShellTopbar or host the Dock. Runtime Shell chrome starts after the user enters an OS or Studio route.
Studio Surface Shell
Heavy Studio Engines and windowed Studio modes render inside
StudioSurfaceShell: an outer workspace background with responsive padding
and an inner rounded, bordered, shadowed frame. The engine can still use 100%
width and height inside that frame. This keeps Studio spaces visually bounded,
differentiates global shell navigation from local Studio work, and leaves a
clear future escape hatch for focus or fullscreen mode.
The inner frame is also a stacking boundary. Studio-local app dialogs, fixed menus, and high z-index content remain inside the Studio frame and below shell-owned global dialogs. Desktop Runtime renders its floating Dock inside this bounded frame, not in the homepage nav or outside the runtime container.
Local vs iframe / micro apps
The shell hosts local modules and iframe (or remote) surfaces. Boundary: shell owns frame, drag stack, and manifest; hosted app owns interior pixels. Communication crosses app contract, embed URL, or postMessage patterns — not private shell imports.
Technology position
Bundler-agnostic language. Current stack: React, TypeScript, Tailwind CSS v4 (PostCSS), Rsbuild in apps/os-shell. Do not couple look-and-feel to Rsbuild.
UI library policy
Shell chrome is implemented with custom composition in packages/ui/os-ui, backed by packages/ui/design-tokens.
Later allowances: Radix-style primitives for accessibility, Floating UI for positioning, Motion for short functional transitions.
Avoid large visual kits for OS chrome. Sub-apps may adopt other UI libraries when appropriate; shell stays opinionated.
Animation
Motion is subtle, fast, interruptible, functional. Do not use motion to mask unclear state. Respect prefers-reduced-motion (global overrides exist in shell App.css).
Component Layering and UI Encapsulation
Define what belongs in packages/ui/os-ui, what belongs in apps/shell orchestration, and how headless primitives should be sealed. Visual tokens are documented i
Sub-app design language
This document applies to **applications** hosted inside or beside the OS Shell: