Repository navigation
web: Claude Desktop design system and app shell - #70
Merged
Merged
Conversation
Adds a token-based design system and rebuilds the page frame in the Claude Desktop layout: - style/tokens.css holds every color, type size, radius, shadow and motion value from the Claude Desktop Figma kit, light and dark. An inline boot script applies the saved or OS theme before first paint. - src/ui: Icon (own 20px line glyphs), Button, IconButton, Field, Callout. src/shell: 52px sidebar rail that expands as an overlay, and a 48px titlebar with the remote-desktop actions. - The video stays mounted in a stage; setup, sign-in and connect are cards over it. Errors become a toast; focus mode hides the chrome and peeks the titlebar from a top handle. No blur over the video. - Video uses object-fit: contain; absolute pointer positions map through the letterboxed picture (hid::content_rect). - zh/en switch (Chinese by default) for the shell; settings sheet, terminal and OCR dialog restyled onto the tokens. - docs/design-system.md is the rule book for later UI work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Selects bound with prop:value got their value before Leptos inserted the options, so the browser kept selectedIndex -1 and showed an empty box (keyboard layout, log level, TLS mode and others). Each option now carries prop:selected instead, which holds no matter when the options arrive. The settings and OCR scrims covered the sidebar, so the first click on theme, language or nav only closed the sheet. The scrims now start right of the rail and the sidebar sits above them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Focus mode hid the sidebar but kept the two-column grid, so the main column auto-placed into the 0px track and the whole stage collapsed into the top-left corner. The focus grid is now a single track. Settings, advanced settings, connection errors, REST errors and status messages now follow the zh/en switch, so the UI is never half Chinese and half English. Option labels (keyboard layouts, extensions) carry both languages; network, virtual-media and ATX status are stored as device data and described at render time so they switch live. Code without a reactive owner uses i18n::tr. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Sidebar pushes the content instead of covering the titlebar chip (overlay only below 720px). Theme and language become segmented controls that show the current choice. Reboot moves from the titlebar corner to a labeled, confirmed row in the sidebar footer. Titlebar actions are grouped and focus mode gets a glyph unlike fullscreen. Keys stay in the page inside sheets, dialogs and keyboard-focused chrome; Esc closes the settings sheet and the OCR dialog; clicking the video takes focus. 44px targets on touch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
The sidebar rail peeks the full sidebar over the content on hover and hides it when the pointer leaves; clicking the logo pins it open (pushing the content). Settings becomes a centered modal like Claude Desktop: search and page list on the left, the page's sections on the right, closed by Esc, the close button or the backdrop; full screen on narrow windows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Theme (system/light/dark), language and reboot move from the sidebar into the settings dialog (General and System pages); the sidebar keeps only navigation and connection status. Selected segments stayed hidden while hovered because a generic button hover rule outranked the selected style; choices are now a shared segmented control with hover, press, focus and disabled states, and switches gain the same. Settings update at once and roll back with a toast if the device refuses the change. Removes the dead sidebar preference styles, unused icons, Danger button styles and an unused keyframe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Web UI redesign on the Claude Desktop layout and design system. Builds on #69 (merged).
Before: one floating toolbar with symbol glyphs (⚙ ⏻ ✕) and blur over the video. Dark theme only, English only, video stretched with
object-fit: fill, settings as a long side drawer.After:
object-fit: contain; absolute pointer maps through the letterboxed picture.How
style/tokens.cssholds every color, size, radius, shadow and motion value; other stylesheets use only these variables.src/uicomponents (Icon, Button, IconButton, Field, Callout),src/shell(Sidebar, Titlebar),src/i18n.rs,src/theme.rs,src/settings_nav.rs.util::fire_revertfor optimistic updates;util::report_errorwrites the toast.docs/design-system.mdis the rule book;AGENTS.mdlists the new modules.Testing
cargo +nightly fmt --alland wasm32 clippy-D warningsincrates/rkvm-web;trunk buildin CIChecklist
#[allow(...)]suppressions and no newunwrap()/expect()in production pathsrkvm-proto(none added)AGENTS.mdupdated🤖 Generated with Claude Code
https://claude.ai/code/session_01EtYBDrZbatHFGiL5uUvyY1