Shell Specification
This page specifies the desktop shell pixel by pixel: the desktop, taskbar, Start menu, quick settings, notifications and calendar, context menus, window chrome and File Explorer. Every number is a token in tokens.json and a THEME_* constant in the generated include/desktop/theme_tokens.h; the token name is given in code. All sizes are at 100% scale and multiply by the display scale factor once DPI scaling lands.
The interactive mockup is the visual reference for everything below. Each surface opens directly by URL hash (#start, #quick, #cal, #ctx, #toast, #alttab, #snap, #taskview, #lock, #signin, #boot, #oobe, #settings, #osd); add ?shot for a deterministic render and ?theme=light for the light theme. Those renders are the references the shell verification items compare against.
Materials
Shell surfaces are acrylic: the wallpaper and windows behind are blurred, tinted and given a faint grain. Windows use mica: the wallpaper alone, heavily blurred and desaturated, tinted toward the window background. Both are implemented by gfx_acrylic() and gfx_mica() in src/kernel/gfx/.
| Surface | Material | Dark tint | Light tint | Blur radius | Grain |
|---|---|---|---|---|---|
| Taskbar | acrylic material.*.taskbar |
#1C1C1C at 184/255 |
#EEEEEE at 176/255 |
24 | 6% |
| Start menu | acrylic material.*.start |
#202020 at 196/255 |
#F3F3F3 at 190/255 |
30 | 6% |
| Flyouts (quick settings, calendar) | acrylic material.*.flyout |
#2C2C2C at 204/255 |
#FCFCFC at 196/255 |
30 | 6% |
| Context menus | acrylic material.*.menu |
#2C2C2C at 214/255 |
#FCFCFC at 214/255 |
20 | 4% |
| Window background | mica material.*.mica |
#202020 at 204/255 |
#F3F3F3 at 204/255 |
wallpaper-only | none |
The blur radius is the box-blur radius passed to gfx_acrylic(). Three box passes approximate a Gaussian about 1.7 times as wide, which is how the web mockup converts it. Frosted surfaces are rendered into a per-surface cache and recomposited only when the region behind them changes, so a static desktop costs no blur work per frame.
Terminal. The terminal window uses mica by default like every window; when the user lowers its background opacity below 100% it switches to acrylic with the menu material values at that opacity. This is the only window that may be acrylic.
Flyout and menu motion. Every flyout (quick settings, notifications and calendar, clipboard history, overflow, hover previews) and every menu opens by fading in while rising size.flyout_rise (12) px over motion.normal (167 ms, decelerate) and closes by fading out over motion.fast (83 ms). Start uses its own larger motion (see Start menu).
Transparency off. When EnableTransparency is 0 under HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize, every material draws its tint at full opacity with no blur and no grain.
Desktop
- The wallpaper fills the screen (
Fillmode by default). The default is the "impossible silk": translucent ribbons that twist as they sweep up from the lower left over a deep field,resources/backgrounds/silk-dark.jpgin dark mode andsilk-light.jpgin light mode. The upper left stays calm for the desktop icons. Both are generated byscripts/site/gen_wallpapers.py. - Desktop icons sit in a column-major grid from the top-left,
size.desktop_margin(8) from the edges. Each cell issize.desktop_cell_widthxsize.desktop_cell_height(76 x 86) with asize.desktop_icon(48) icon, 6 px from the top of the cell, and a two-line label intype.caption(12/16). - Labels are white (
desktop_label) with a soft dark shadow (desktop_label_shadow) in both themes, as on Windows 11. - Hover draws a 12% white fill with a 16% white 1 px stroke. Selection uses
selection_fillandselection_stroke. Radiusradius.control(4). - Icon sizes (View menu): Small
size.desktop_icon_small(32) indesktop_cell_small_*(64 x 70) cells, Medium (default) 48 in 76 x 86 cells, Largesize.desktop_icon_large(96) indesktop_cell_large_*(120 x 132) cells. Icons snap to the grid ("Align icons to grid" on by default). - Shortcuts carry a shortcut arrow overlay at the icon's bottom-left: a square
size.shortcut_overlay_ratio_pct(33%) of the icon size, white with a 1 pxstroke_surfaceand radius 2, holding a curved arrow glyph inaccent. - Default icons, in order: This PC, Recycle Bin, the user folder, Network and Control Panel. Recycle Bin switches between
recycle_bin_emptyandrecycle_bin_full.
Taskbar
- Height
size.taskbar_height(48), full width, docked to the bottom, with a 1 px top border instroke_divider. - Centre group, centred on the screen: Start, the search box, Task view, then pinned and running apps. Buttons are
size.taskbar_button(40) square withsize.taskbar_gap(4) between them andradius.taskbar_button(4) corners; icons aresize.taskbar_icon(24). Hover and the running-focused state drawsubtle_fill_hoverwith a 1 px insetstroke_controloutline. - Start button shows the
starticon, the logo mark. Pressing it scales the icon to 86% for the press duration. - Search box is 196 x 36 with a
radius.search_box(18) pill,control_fillbackground andstroke_controloutline, a search glyph and the word "Search" intext_secondary. Below 1024 px screen width it collapses to a 40 px search button. - Running indicator: a pill
size.taskbar_indicator_height(3) tall, 2 px above the bottom edge. Running but not focused: 6 px wide intaskbar_indicator_idle. Focused: 16 px wide intaskbar_indicator(the accent), and the button gets the hover fill. The width animates overmotion.normal(167 ms) with the decelerate curve. - Badges: a taskbar button can carry a count or alert badge at its icon's top-right corner: a pill
size.badge_height(16) tall and at leastsize.badge_min_width(16) wide,badge_fillwithtext_on_accent, 11 px semibold digits, "99+" above 99. An alert badge usesstatus_criticalwith a "!" glyph. A progress state draws a 3 px bar along the button's bottom edge in the accent (pausedstatus_caution, errorstatus_critical). - Attention: a window that requests attention (
FlashWindow) turns its button filltaskbar_attention_filland its indicator pill full-widthtaskbar_attention_indicatoruntil focused; no blinking. - Hover preview: resting on a running app's button for
motion.taskbar_preview_delay(400 ms) opens a menu-acrylic flyout above it with onesize.taskbar_preview_widthxsize.taskbar_preview_height(200 x 120) thumbnail per window, each with the window title and a close glyph; hovering a thumbnail formotion.peek_delay(500 ms) peeks that window by fading all others to 10%. - Show desktop: the last
size.show_desktop_width(8) px at the far right of the taskbar; clicking it minimizes everything, hovering it peeks at the desktop. - Taskbar settings (Personalisation > Taskbar): Alignment (Centre, default; Left), Search (Hide; Search icon only; Search icon and label; Search box, default), Task view (on by default), Automatically hide the taskbar (off). Height and position are fixed: 48 px at the bottom.
- Right side: an overflow chevron (28 x 40) that opens hidden tray icons, then, only when more than one keyboard layout is installed, a layout button (40 tall, three-letter code such as "ENG" in
type.caption; click opens a menu of layouts), then the system tray cluster (network, volume and battery glyphs in one 40 px tall button that opens quick settings), then the clock (time over date intype.caption, right-aligned) with the notification bell, which opens notifications and the calendar.
Start menu
size.start_widthxsize.start_height(640 x 720, clamped to the space above the taskbar), centred horizontally,size.start_offset_bottom(12) above the taskbar. Radiusradius.overlay(8), shadowelevation.start, 1 pxstroke_surfaceoutline.- Open: fades in over
motion.normalwhile sliding upsize.start_slide(48) px overmotion.start_open(250 ms) with the decelerate curve. Close: reverses overmotion.start_close(167 ms) with the accelerate curve. The Windows key toggles it; Escape or a click outside closes it. - Search box at the top: full width minus 32 px padding each side,
size.start_search_height(36), pill radius, a 1 px accent line along the bottom edge while focused. - Pinned: a "Pinned" heading in
type.body_strongwith an "All" pill button on the right, then a grid ofsize.start_pinned_colsxsize.start_pinned_rows(6 x 3) tiles. Each tile issize.start_tile_widthxsize.start_tile_height(96 x 84) with asize.start_tile_icon(32) icon over atype.captionlabel, radiusradius.start_tile(4). Extra pins page vertically. - Search results: typing replaces the Pinned and Recommended regions below the search box with a two-column results view: left, the matches grouped by type (Apps, Settings, Documents) in 32 px rows with the matched text in
accent; right, a "Best match" card for the selected result (64 px icon, name intype.subtitle, type intype.caption, and Open plus context actions as standard buttons). No results shows "No results for """ in text_secondary. - Recommended: heading plus "More" pill, then a two-column list of up to six recent items: 32 px icon, name in
type.body, a relative time intype.captiontext_secondary. - Footer:
size.start_footer_height(64) tall with a 1 pxstroke_dividertop border and a slightly darker band (8% black in dark mode, 35% white in light mode). The user's avatar (32 px circle) and name on the left, the power button (40 px) on the right, which opens Sleep, Shut down and Restart.
Quick settings
size.flyout_width(360) wide, anchored 12 px from the right screen edge and 12 px above the taskbar,material.*.flyout,elevation.flyout.- A 3 x 2 grid of toggles (Wi-Fi, Bluetooth, Airplane mode, Energy saver, Night light, Accessibility). Each toggle is a 96 x 48 button over a
type.captionlabel. On: accent fill withtext_on_accent. Off:control_fillwith astroke_controloutline. - Brightness and volume sliders: 4 px track in
text_tertiary, filled part in the accent, 20 px thumb with an accent centre. - Footer, 48 px, same band as the Start footer: battery level on the left; edit and Settings buttons on the right.
Notifications and calendar
Same width, anchor and material as quick settings. A "Notifications" header with a bell toggle for Do not disturb (bell with a slash and text_secondary label "Do not disturb" when on) and "Clear all", the notification list or a "No new notifications" empty state, then the month calendar: a month title with previous and next buttons, and a 7-column grid of 40 px day cells. Today is an accent circle with text_on_accent; days outside the month use text_tertiary. Below the calendar, a Focus row: a minutes stepper (standard buttons) and a "Focus" standard button that starts a focus session (Do not disturb on, a countdown in the clock area).
Context menus
size.context_menu_width(256) wide, 4 px inner padding,material.*.menu,elevation.flyout, radiusradius.overlay(8).- Items are
size.context_menu_item_height(32) tall: a 16 px glyph, 12 px gap, label intype.body, and either a submenu chevron or a shortcut hint intext_secondaryon the right. Hover usessubtle_fill_hoverwithradius.control. - Separators are 1 px
stroke_dividerlines that run to the menu edges. - File and folder menus start with a
size.context_menu_icon_row_height(40) row of icon-only subtle buttons (Cut, Copy, Rename, Share, Delete; Paste when applicable), 32 px each with tooltips, separated from the items below by a 1 pxstroke_divider. "Show more options" opens the classic full-length menu. - The desktop menu reads: View, Sort by, Refresh | New | Display settings, Personalize | Open in Terminal, Show more options (Shift+F10).
Window chrome
- Corner radius
radius.window(8), a 1 pxstroke_surfaceoutline, shadowelevation.window_activewhen focused andelevation.window_inactiveotherwise. Maximized windows drop the radius and shadow. - The title bar is
size.caption_height(32) for classic windows; File Explorer-style windows extend it to 40 to hold tabs. It draws mica when active andwindow_bg_inactivewhen not. - Caption buttons are
size.caption_button_width(46) wide and fill the caption height, with 10 px glyphs (size.caption_glyph) at 1 px stroke. Hover:subtle_fill_hover. Close hover:caption_close_hover(#C42B1C) with a white glyph. - The resize grab zone is
size.resize_margin(5) outside the visible edge. - Window motion. Open: scale from
size.window_open_scale_pct(96%) to 100% while fading in overmotion.slow(250 ms, decelerate). Close: the reverse overmotion.normal(167 ms, accelerate). Minimize: shrink and move toward the window's taskbar button while fading overmotion.slow; restore from the taskbar reverses it. Maximize and restore morph the window bounds overmotion.normalwithmotion.ease_standard. Reduced animation makes every transition instant. Win32AnimateWindowrequests (AW_BLEND,AW_SLIDEwith a direction,AW_CENTER) are honoured for compatibility with the requested effect overmotion.normalandmotion.ease_standard, regardless of the duration the app passes.
File Explorer
- Title bar (40 px): tabs. The active tab is 220 px minimum,
layer_bgfill,radius.overlaytop corners, 16 px icon, title intype.captionand a close glyph; then a new-tab button and the caption buttons. - Address row (48 px): back, forward, up and refresh (36 x 32 each), a breadcrumb field with the location icon, then a 260 px search field.
- Command bar (48 px): an accent "New" button, then cut, copy, paste, rename, share and delete, a separator, then Sort and View menus and an overflow button. A 1 px
stroke_dividerline closes it. - Body: a 220 px navigation pane (Desktop, Downloads, Documents, Pictures, Music, Videos, a separator, then This PC, drives and Network) beside the content area. The selected nav item gets a 3 px accent bar on its left edge. The content area shows "Devices and drives" as 48 px drive icons with a 6 px usage bar in the accent colour and free space in
type.caption, then "Folders" as a grid of 48 px folder icons. - Views: icon view tiles are
size.explorer_tile_width(96) wide with a 48 px icon 10 px from the top, a 6 px gap and a two-line caption; details view has asize.explorer_header_height(32) sortable column header (Name 240, Date modified 160, Type 120, Size 80 right-aligned, all resizable) and 32 px rows with no alternating fills, selection per lists. - Status bar: 24 px, item count in
type.captiontext_secondary.
Display scaling
Every size in this specification is at 100% and multiplies by the display scale. The default scale follows the screen: 100% below 2560 px wide, 150% from 2560, 200% from 3840; the user can choose 100% to 300% in 25% steps in Settings > System > Display. Icons pick the nearest rendered size at or above the scaled size; blur radii scale too.
Toast notifications
size.toast_width(364) wide, flyout acrylic,radius.overlay,elevation.flyout, anchored 12 px from the right edge and 12 px above the taskbar; new toasts stack upwardsize.toast_gap(12) apart, at most three visible.- Layout: app icon (16) and app name in
type.captiontext_secondaryon the top row with a close glyph on hover; title intype.body_strong; body intype.body, up to three lines; optional action buttons (standard buttons, equal width) along the bottom. - Slides in from the right over
motion.toast_in(250 ms, decelerate), staysmotion.toast_dwell(5 s, paused while hovered), then fades out and moves into the notification center.
Alt+Tab
- A full-width row of window thumbnails centred on the screen over a menu-acrylic panel (
radius.overlay,elevation.start), 24 px padding. - Each thumbnail is
size.alt_tab_thumb_height(158) tall, width by aspect ratio,radius.control, with the app icon (16) and title intype.captionabove it. The selected window has a 2 pxfocus_outerring 4 px outside the thumbnail. - Appears after 100 ms of Alt+Tab held; cycles with Tab and Shift+Tab; Escape cancels.
Snap layouts
- Hovering the maximize button for
motion.snap_hover_delay(500 ms), or pressing Win+Z, opens a menu-acrylic flyout below the button with six layouts: halves, 2/3 + 1/3, thirds, quarters, 1/2 + two quarters, 1/4 + 1/2 + 1/4. - Each layout is a
size.snap_flyout_tile(72) wide miniature withradius.controlzones incontrol_fill; the hovered zone fills withaccent. Dragging a window to a screen edge previews the zone as a translucent accent-tinted rectangle withradius.window.
Task View
- Win+Tab or the taskbar button dims the desktop with
smokeover a strong blur of the wallpaper and lays out every window as a thumbnail grid (same thumbnail rules as Alt+Tab), with a close button on hover. - A strip along the bottom shows the virtual desktops as 16:9 cards with names and a "New desktop" card; the current desktop has the accent ring.
Lock and sign-in screens
- Lock screen: the wallpaper at full brightness; time centred in the top third at
size.lock_clock(96) semibold, the date below intype.subtitle; network and battery glyphs bottom right. Any key or click lifts the image with an upward slide overmotion.slowto reveal sign-in. - Sign-in: the wallpaper under a strong acrylic blur; a
size.login_avatar(192) circular avatar, the user name intype.title, then asize.login_field_width(296) password box with an accent submit arrow button inside its right end. Other users are listed bottom left as 48 px avatars; accessibility, network and power buttons bottom right.
Boot splash
- Black background; the logo mark at
size.boot_logo(128, 256 on 2160p and above) centred at 40% of the screen height; asize.boot_spinner(40) dot-ring spinner in white centred at 70%. No text unless boot fails, which switches to the boot error screen. Verbose boot (boot.confverbose mode) adds asize.boot_progress_width(240) wide,size.progress_bar(3) tall accent progress bar 48 px below the spinner, driven by the boot progress milestones; normal boot shows no bar. The splash fades to black over 8 steps before the desktop appears.
First-run setup
- Operating system setup (the installer and the first-boot experience) is full screen: the dark silk wallpaper under acrylic; a centred card 800 x 600 (
radius.overlay,window_bg,elevation.start) with an illustration or icon on the left third and the step on the right: title intype.title, body intype.body, controls per controls, and an accent Next button bottom right with Back as a standard button. - App installers are NOT full screen: they are normal windows of
size.app_installer_widthxsize.app_installer_height(640 x 480) with the window chrome and the same step layout (icon or illustration left third, step content right, Next and Back bottom right).
Settings and Control Panel frame
- A window with the standard chrome. Left: a
size.nav_pane_width(280) navigation pane with the user card on top, a search box, andsize.nav_item_height(36) items (16 px glyph, label,radius.controlhover, 3 x 16 accent pill on the selected item). - Right: the page title in
type.title, then settings rows per the cards and settings rows spec, grouped undertype.body_strongheadings, 4 px apart within a group and 24 px between groups.
Volume and brightness overlay
- Changing volume or brightness with keys shows a
size.osd_widthxsize.osd_height(196 x 48) flyout-acrylic pill centred horizontally 24 px above the taskbar: glyph, a slider track per slider without a thumb, and the value. It fades out 2 s after the last change.
App window layout
Every app window uses the window chrome. Below the title bar, an app that has commands shows a size.command_bar_height (48) command bar of subtle buttons (16 px glyph plus label where space allows, separators between groups, overflow "..." at the end), like File Explorer. Document and canvas apps (Paint, Photos, WordPad) centre their canvas on layer_bg with 24 px of breathing room and put zoom and page state in a size.status_bar_height (24) status bar in type.caption. Side panels are 280-320 px, separated by a 1 px stroke_divider. Classic Win32 menu bars use the menu bar spec. App-specific colours (sticky notes use note_*) are tokens, never literals. Keypad apps (Calculator) use standard buttons that grow to fill the window on a 2 px gap, never smaller than size.keypad_button_min (40) square; operator keys are subtle, the equals key is accent.
Clipboard history
Win+V opens a size.clipboard_width (360) wide, up to size.clipboard_max_height (480) tall flyout-acrylic panel beside the text caret (or 12 px above the taskbar at the right when there is no caret), radius 8, elevation.flyout. A header with "Clipboard" and "Clear all", then one card per item (text clipped to three lines, or an image thumbnail) with a "..." menu for Pin and Delete. Enter pastes the selected item.
Snipping toolbar
Print Screen (or Win+Shift+S) dims the screen with smoke and shows a size.snip_toolbar_height (48) flyout-acrylic toolbar centred 12 px from the top: capture modes as toggle buttons (Rectangle, Window, Full screen, Freeform), then a close button. The selection draws with selection_fill and a 1 px selection_stroke. The captured image raises a toast per toast notifications.
Magnifier
Win+Plus starts the magnifier in lens mode: a size.magnifier_lens_width x size.magnifier_lens_height (400 x 300) lens following the pointer, radius.overlay, a 2 px accent border, elevation.flyout. A compact flyout-acrylic toolbar (zoom out, zoom level, zoom in, view menu for Full screen / Lens / Docked, settings) appears at the top centre and fades after 3 s without interaction. Docked mode takes the top third of the screen, separated by a 2 px accent line.
Accessibility
- Focus is a 2 px
focus_outerring outside a 1 pxfocus_innerring, drawn on keyboard focus only. - Text on acrylic must meet WCAG AA (4.5:1) against the worst-case region of the default wallpaper; the tint opacities above are chosen to guarantee that.
- High contrast mode replaces every token with the system high-contrast colours; the mapping is owned by the theme system.
- Every motion respects the reduced-animation setting by jumping straight to the final state.