UI/UX Part 02 — Desktop Dioxus App Shell, Navigation & Window Architecture
Reusable P2P Communication Platform
Status: UI/UX architecture specification
UI Series: Part 02
Platform: Desktop
UI framework: Dioxus
Primary language: Rust
Primary goal: define the complete desktop application shell, navigation model, multi-pane layout, multi-window behavior, keyboard-first interaction, window persistence, command palette, system tray, drag-and-drop, context menus, local daemon integration, accessibility, and responsive desktop behavior.
1. Purpose
The desktop application is not merely a larger version of the mobile UI.
Desktop users expect:
persistent navigation
split panes
keyboard shortcuts
mouse/trackpad
drag-and-drop
multi-window
system tray
context menus
large-screen density
resizable panels
command palette
The desktop shell must therefore be designed as a dedicated interaction system while still consuming the same Rust core defined in UI/UX Part 01.
The governing principle is:
The desktop shell should feel like a fast native communication workspace, not a phone layout stretched across a large monitor.
2. Architectural Position
Rust Core
│
Presentation Service
│
Desktop Presenter
│
Dioxus Shell
│
┌──┴─────────────────────────────┐
│ Navigation │
│ Workspace Panes │
│ Windows │
│ Command Palette │
│ Tray │
│ Menus │
│ Keyboard Shortcuts │
│ Accessibility │
└────────────────────────────────┘
3. Desktop App Shell Responsibilities
The shell owns:
window topology
workspace layout
navigation
pane sizing
focus
keyboard routing
menu/context menus
command palette
tray
deep-link routing
presentation-state persistence
It does not own:
messages
sync truth
call truth
transfer truth
security truth
search truth
Those remain in Rust core/presentation services.
4. Recommended High-Level Layout
+------------------------------------------------------------------+
| App Chrome / Window Bar / Global Actions |
+------+----------------------+------------------------------------+
| Rail | Secondary Sidebar | Main Workspace |
| | | |
| | Chats / Calls / | Conversation / Call / File / |
| | Contacts / Files | Search / Security / Settings |
| | | |
+------+----------------------+------------------------------------+
| Status / Optional Diagnostics / Transfer Summary |
+------------------------------------------------------------------+
Optional fourth pane:
Details / Inspector
5. Primary Navigation Rail
Recommended top-level destinations:
Chats
Calls
Contacts
Files
Search
Secondary destinations lower in rail:
Devices
Plugins
Settings
Optional:
Emergency
Diagnostics
based on product role.
6. Rail Behavior
Rail can support:
icon-only compact mode
icon + label expanded mode
User preference can persist.
7. Rail Selection
Selecting primary destination changes:
secondary sidebar content
main workspace default
8. Secondary Sidebar
Examples:
Chats
Pinned
Recent
Archived
Requests
Calls
Recent Calls
Missed
Active
Contacts
Contacts
Requests
Nearby
Blocked
Files
Recent
Images
Videos
Documents
Audio
Links
Transfers
9. Main Workspace
Main workspace renders the active entity:
conversation
contact
call
file
search result
security event
device
plugin
settings page
10. Optional Details Pane
Useful for:
conversation info
shared media
contact verification
group members
file details
call diagnostics
security details
11. Inspector Visibility
User toggles with:
toolbar button
keyboard shortcut
The inspector should not permanently consume space in medium-width windows.
12. Responsive Desktop Layout
Use window-width classes:
#![allow(unused)] fn main() { pub enum DesktopWindowClass { Compact, Medium, Wide, UltraWide, } }
13. Compact Desktop
Examples:
small laptop window
narrow snapped window
Layout:
rail
single primary pane
Secondary sidebar may overlay or replace workspace.
14. Medium Desktop
Layout:
rail
secondary list
main workspace
No permanent inspector.
15. Wide Desktop
Layout:
rail
secondary list
main workspace
optional inspector
16. UltraWide Desktop
Can support:
rail
secondary sidebar
main workspace
details pane
optional utility panel
Do not automatically fill every pixel with content.
17. Minimum Window Size
Define practical minimum.
Below minimum:
show constrained compact layout
not broken overlapping panes.
18. Window Size Persistence
Persist:
width
height
position
maximized state
last monitor
locally.
19. Multi-Monitor
On restart:
if old monitor absent
→ reposition safely on available display
Never restore window off-screen.
20. Window Types
Recommended:
#![allow(unused)] fn main() { pub enum DesktopWindowKind { Main, Call, MediaViewer, Settings, Diagnostics, ComposeDetached, } }
21. Main Window
Canonical workspace.
Usually one instance.
22. Call Window
Optional separate floating window for active call.
Can be:
always-on-top optional
compact mode
video-focused
23. Media Viewer Window
Useful for:
images
videos
documents
Can detach from main app.
24. Settings Window
Two valid patterns:
settings in main workspace
or:
separate settings window
Recommendation:
main workspace first
Separate window only if desktop UX benefits.
25. Diagnostics Window
Advanced/developer use.
Can be detachable.
26. Window Ownership
Window state is presentation state.
Rust core remains independent.
27. Active Call Across Windows
If user closes call window:
call does not necessarily end
Product policy can:
minimize call
return to main workspace
or hang up only on explicit action
28. Window Close Semantics
Main window close can mean:
exit app
or
hide to tray
based on user setting.
29. System Tray
Recommended desktop feature.
Tray menu:
Open
New Message
Active Call
Pause/Resume Notifications
Quit
Optional status:
Online
Offline
Syncing
30. Tray and Daemon Mode
If daemon remains running after UI closes:
tray controls daemon/UI
31. Exit Semantics
Distinguish:
Close Window
Hide to Tray
Quit UI
Stop Daemon
Quit Entire App
Do not make these ambiguous.
32. Keyboard-First UX
Desktop should be fully operable without mouse.
Core shortcuts:
Ctrl/Cmd+K → Command Palette
Ctrl/Cmd+N → New Conversation
Ctrl/Cmd+F → Search Current Context
Ctrl/Cmd+Shift+F → Global Search
Ctrl/Cmd+, → Settings
Ctrl/Cmd+W → Close tab/pane
Ctrl/Cmd+Shift+W → Close window
Esc → Dismiss / Back
33. Conversation Shortcuts
Examples:
Alt+Up/Down → Previous/Next conversation
Ctrl/Cmd+Enter → Send
Ctrl/Cmd+Shift+R → Reply
Ctrl/Cmd+E → Edit own last message
Exact bindings configurable.
34. Call Shortcuts
Examples:
Ctrl/Cmd+Shift+M → Mute
Ctrl/Cmd+Shift+V → Video toggle
Ctrl/Cmd+Shift+H → Hang up
35. Shortcut Conflict Handling
Check OS conventions.
Allow customization later.
36. Shortcut Registry
#![allow(unused)] fn main() { pub struct ShortcutRegistry { // command → binding } }
37. Command Palette
One of the strongest desktop productivity features.
Open:
Ctrl/Cmd+K
38. Command Palette Search
Commands can include:
New conversation
Open contact
Open settings
Start call
Search messages
Open transfers
Toggle inspector
Open diagnostics
39. Command Palette Data Sources
static app commands
recent conversations
contacts
files
settings destinations
40. Palette Result Types
#![allow(unused)] fn main() { pub enum CommandPaletteItem { Command(...), Conversation(...), Contact(...), File(...), Setting(...), } }
41. Keyboard Navigation
Palette:
Up/Down
Enter
Esc
42. Fuzzy Search
Use lightweight fuzzy matching.
No semantic search required for command palette.
43. Tabs
Desktop may benefit from tabs for:
multiple conversations
searches
files
settings
44. Tab Model
#![allow(unused)] fn main() { pub struct WorkspaceTab { pub id: TabId, pub destination: DesktopDestination, pub pinned: bool, } }
45. Tab Scope
Recommendation:
optional advanced desktop feature
Do not force tabs if split-pane workspace already works well.
46. Pinned Tabs
Useful for:
frequent conversation
monitoring transfer
diagnostics
47. Tab Persistence
Persist only stable destinations.
Do not restore stale:
typing
call media handle
temporary modal
48. Navigation History
Maintain per-tab:
back
forward
for flows like:
Search
→ Message
→ Contact
→ Back
49. Navigation Destination
#![allow(unused)] fn main() { pub enum DesktopDestination { Chats, Conversation(ConversationId), Calls, Call(CallId), Contacts, Contact(AccountId), Files, File(BlobId), Search(SearchStateId), Devices, Device(DeviceId), Security, Settings(SettingsPage), Plugin(PluginId), Diagnostics, } }
50. Typed Navigation
Do not navigate by arbitrary strings.
51. Deep Links
External/opened links should resolve into typed destinations.
Examples:
conversation
call
device
file
security event
52. Deep-Link Validation
Untrusted external link input must be validated before navigation.
53. Sidebar List Virtualization
Conversation/contact/file lists can grow large.
Virtualize.
54. Row Density
Desktop supports:
Comfortable
Compact
later.
Default should be readable, not overly sparse.
55. Conversation Row
Recommended information:
avatar
title
last-message preview
timestamp
unread count
mute indicator
presence optionally
56. Row Selection
Single click:
open
Double click:
optional detach/new tab
depending UX.
57. Multi-Selection
Useful in:
files
contacts
messages
Support:
Ctrl/Cmd click
Shift click
58. Context Menus
Desktop-native right-click menus.
Examples for conversation:
Pin
Mute
Archive
Mark Read
Open in New Window
Delete
59. Message Context Menu
Reply
Copy
Edit
Delete
Forward
Info
60. File Context Menu
Open
Save As
Reveal in Folder
Forward
Copy Link
Delete Local Copy
61. Context Menu Rule
Every context-menu action should also be accessible via:
keyboard
toolbar
menu
for accessibility.
62. Drag and Drop
Key desktop advantage.
Supported:
file → conversation
conversation → tab
file → file destination
63. File Drop
Flow:
OS file drop
↓
Dioxus platform event
↓
validated path/handle
↓
Rust file subsystem
↓
attachment draft
64. No UI Byte Loading
Dioxus should pass:
file path / handle
not load full file into component state.
65. Drag Attachment Preview
Show:
drop overlay
when user drags file over conversation.
66. Invalid Drop
If unsupported or too large:
show inline rejection
not silent failure.
67. Clipboard
Support:
copy text
copy image
paste image/file
paste text
68. Clipboard Security
Sensitive screens may restrict:
recovery code
copy behavior via explicit action only.
69. Composer Focus
On opening conversation:
do not always steal keyboard focus
unless user navigated to compose intentionally.
70. Global Focus Model
Track:
active pane
focused element
modal
palette
71. Focus Restoration
Closing dialog/palette should return focus to previous meaningful element.
72. Focus Ring
Always visible for keyboard interaction.
73. Mouse/Keyboard Coexistence
Do not hide important actions only on hover.
74. Tooltips
Use for:
icon-only toolbar buttons
shortcut hints
75. Toolbar
Conversation toolbar:
Audio Call
Video Call
Search
Details
More
76. Call Toolbar
Active call:
Mute
Video
Screen Share
Audio Route
More
Hang Up
77. File Toolbar
Search
Sort
Filter
View Mode
78. Global Header
Optional top-level area for:
back/forward
current context
global search
account status
window controls
79. Native Window Decorations
Two strategies:
native OS title bar
custom app title bar
Recommendation:
native where practical
unless custom chrome materially improves product.
80. Custom Chrome Risks
Must handle:
drag region
window controls
accessibility
platform conventions
81. System Menu
Desktop app menu:
File
Edit
View
Conversation
Call
Window
Help
where OS convention supports.
82. File Menu
Examples:
New Conversation
Open File
Export
Quit
83. Edit Menu
Undo
Redo
Cut
Copy
Paste
Select All
84. View Menu
Toggle Sidebar
Toggle Inspector
Zoom
Full Screen
Compact Density
85. Conversation Menu
Search
Mute
Pin
Archive
Details
86. Call Menu
Mute
Video
Screen Share
End Call
87. Window Menu
Minimize
New Window
Bring All to Front
platform-dependent.
88. Help Menu
Keyboard Shortcuts
Diagnostics
Documentation
About
89. Dock/Taskbar Badge
Unread count can appear on app icon where platform supports.
Derived from durable unread projection.
90. Taskbar Progress
Optional for:
long file transfer
Do not overuse.
91. System Notifications
Desktop notification click should navigate to:
conversation
call
security event
using typed deep link.
92. Notification Suppression
If relevant window already focused:
prefer in-app banner
93. In-App Banner
Desktop top-right or top-center ephemeral banner.
Use for:
incoming message while viewing another screen
transfer completed
security warning
94. Call Overlay
When user is elsewhere:
small persistent call bar
shows:
participant
duration
mute
return to call
hang up
95. Persistent Call Bar
Visible across main destinations while call active.
96. Minimized Call
Possible compact floating window.
97. PiP-Like Desktop Video
Optional floating mini video.
98. Multi-Call
If call waiting later added:
active call
held call
incoming call
shell must display clear priority.
99. Sidebar Search
Secondary sidebar can include scoped search.
Examples:
filter chats
filter contacts
filter files
100. Global Search
Separate from sidebar filter.
Part 32 engine.
101. Search Result Pane
Could open:
main workspace
with filters/results.
102. Search Preview
Wide desktop may show:
results
+
preview pane
103. Jump-to-Message
Load conversation around stable MessageId.
104. Search History
Optional local-only.
105. Details Pane Architecture
Potential panels:
Conversation Info
Shared Media
Members
Security
Files
Links
106. Details Pane Navigation
Within inspector, use compact tabs or sections.
107. Inspector Persistence
Persist:
open/closed
width
last section per context optionally
108. Pane Resizing
User can drag divider.
Persist widths.
109. Minimum Pane Widths
Prevent unusable panes.
110. Collapsing Rule
When main workspace becomes too narrow:
collapse inspector first
then secondary sidebar
111. Layout Priority
Priority order:
main content
primary navigation
secondary list
inspector
112. Fullscreen Mode
Useful for:
video call
media viewer
presentation
113. Zen Mode
Optional:
hide rail/sidebar
focus conversation
114. New Conversation Flow
Desktop:
Ctrl/Cmd+N
↓
search/select contact
↓
create/open conversation
115. Compose New Message Modal
Could be:
center modal
or
main workspace
Recommendation:
main workspace or lightweight modal
depending density.
116. Contact Search
Immediate local search.
No network dependency.
117. Unknown Peer Request
Clearly labeled.
118. Group Creation
Desktop wizard/panel:
select members
name group
permissions
create
119. File Browser
Desktop can offer richer view modes:
list
grid
details
120. Sort
Examples:
Newest
Oldest
Name
Size
Type
121. Filters
Conversation
Sender
Type
Date
122. Transfer Center
Dedicated destination or bottom utility panel.
Show:
active uploads
active downloads
queued
failed
complete recent
123. Transfer Utility Panel
Optional collapsible bottom panel.
124. Bottom Status Area
Could expose:
connection health
active transfer count
backup warning
call state
Keep minimal by default.
125. Status Bar
Advanced mode only if product needs.
Avoid overwhelming normal users.
126. Network Indicator
Use simple:
Online
Offline
Reconnecting
Detailed path diagnostics live elsewhere.
127. Diagnostics Entry
Easy to reach from:
Help
Settings
connection indicator context menu
128. Developer Mode
Can add:
protocol inspector
path graph
event viewer
plugin console
without affecting normal UI.
129. Settings Desktop Layout
Recommended:
settings sidebar
+
settings content
130. Settings Search
Useful for large settings set.
131. Settings Navigation
Typed pages:
#![allow(unused)] fn main() { pub enum SettingsPage { Account, PrivacySecurity, Notifications, CallsMedia, StorageData, Devices, Appearance, Plugins, Advanced, About, } }
132. Settings Persistence
UI writes commands to Rust/platform settings services.
133. Appearance
Desktop-specific:
theme
density
font scale
sidebar width
window behavior
134. Theme
Support:
System
Light
Dark
135. Accent Color
Optional product setting.
136. Font Scale
Independent desktop UI scaling.
137. Accessibility
Desktop must support:
keyboard-only navigation
visible focus
screen reader semantics
high contrast
font scaling
reduced motion
138. Tab Order
Predictable:
rail
sidebar
main content
inspector
within screen.
139. Landmark Semantics
Expose meaningful regions:
navigation
conversation list
message timeline
composer
details
140. Screen Reader Message Row
Coherent announcement:
Alice, 10:42 AM, Hello, delivered
141. Message Selection Accessibility
Selection state announced.
142. Context Menu Accessibility
Keyboard accessible via:
Shift+F10
Menu key
where supported.
143. Reduced Motion
Disable/reduce:
pane slide animations
typing dots
large transitions
144. High Contrast
Do not rely solely on subtle gray differences.
145. Focus on New Message
Do not move keyboard focus when new message arrives.
146. Live Region
Screen reader can announce:
new message
without stealing focus.
147. Window Accessibility
Detached windows need descriptive titles.
Examples:
Call with Alice
Photo Viewer
Network Diagnostics
148. Performance
Desktop shell should remain responsive with:
100k+ messages
large contact list
many files
active call
background transfer
149. Virtualization Required
For:
conversation list
message timeline
contacts
files
search
150. Do Not Render Hidden Panes Expensively
Collapsed inspector should not maintain heavy rendering subscriptions.
151. Subscription Scope
Examples:
active conversation → message/presence stream
visible sidebar → conversation summaries
active call → call metrics
152. Background Tabs
Background tabs receive:
low-frequency summary updates
not every high-frequency event.
153. Call Metrics Throttling
UI:
1–10 Hz
depending metric.
Not packet-level.
154. Transfer Progress Throttling
UI:
5–10 Hz
is sufficient.
155. Layout Recalculation
Avoid excessive global recomputation.
Use localized Dioxus signals.
156. Presenter Pattern
Each major desktop screen gets:
Presenter
Snapshot
Event subscription
Commands
157. Example Chat Presenter
#![allow(unused)] fn main() { pub struct ChatPresenter { pub conversations: Signal<Vec<ConversationSummary>>, pub active: Signal<Option<ConversationScreenSnapshot>>, } }
158. Presenter Does Not Own Domain Truth
It maps core state into desktop presentation.
159. Daemon Mode
Desktop UI may run as separate process.
Architecture:
Dioxus UI
↓
Local IPC Client
↓
comm-daemon
↓
Rust Core
160. IPC Semantics
Desktop UI service API remains same shape.
161. Daemon Disconnect
If UI loses daemon:
show reconnecting
disable commands that require core
keep local shell usable
162. Daemon Reconnect
Re-request fresh snapshots.
Do not assume missed events are enough.
163. UI Process Restart
Daemon continues:
call
transfer
sync
if architecture permits.
New UI attaches to snapshots.
164. Core Embedded Mode
Single-process desktop:
Dioxus + Rust Core
same presentation API.
165. Runtime Abstraction
#![allow(unused)] fn main() { pub enum DesktopCoreMode { InProcess, LocalDaemon, } }
166. Mode Transparency
Screen code should not care.
167. Window Manager Service
#![allow(unused)] fn main() { pub trait DesktopWindowManager { fn open(&self, destination: DesktopDestination, kind: DesktopWindowKind); fn close(&self, id: WindowId); } }
168. Navigation Service
#![allow(unused)] fn main() { pub trait DesktopNavigator { fn navigate(&self, destination: DesktopDestination); fn back(&self); fn forward(&self); } }
169. Command Service
#![allow(unused)] fn main() { pub trait DesktopCommandRegistry { fn execute(&self, command: DesktopCommand); } }
170. Desktop Command
Examples:
#![allow(unused)] fn main() { pub enum DesktopCommand { NewConversation, GlobalSearch, ToggleSidebar, ToggleInspector, ToggleMute, ToggleVideo, OpenSettings, OpenDiagnostics, } }
171. Menu Integration
Menus invoke the same command registry.
172. Shortcut Integration
Shortcuts invoke the same command registry.
173. Palette Integration
Command palette invokes the same command registry.
174. Context Menu Integration
Where appropriate, same command model with entity context.
175. Unified Command Architecture
This prevents:
same action implemented differently in menu, shortcut, toolbar
176. Undo System
Presentation/domain actions that support undo can return:
UndoToken
177. Desktop Undo
Show:
toast/banner with Undo
for:
archive
mute
remove local download
178. No Fake Undo
Do not offer undo for:
device revoke
identity reset
cryptographic erasure
unless backend truly supports reversal.
179. Onboarding Desktop
Initial shell should guide:
create/link identity
add contact
link device
test notifications
Detailed onboarding comes later in UI/UX Part 25.
180. Empty Main Workspace
When nothing selected:
welcome panel
recent activity
quick actions
181. Quick Actions
Examples:
New Conversation
Add Contact
Link Device
Search
182. No Marketing Dashboard
Main empty workspace should remain functional/productive.
183. Account Switcher
If multi-account later supported:
account menu in rail/header
184. Profile Menu
Contains:
status
DND
devices
settings
lock app
quit
185. Presence Control
User can set:
Online
Away
DND
Invisible
if product exposes manual presence.
186. Security State Indicator
Small account-level warning badge if:
new device
identity issue
backup stale
187. Backup Health Indicator
Avoid constant icon if healthy.
Show only when action needed.
188. Storage Warning
Global banner when:
disk nearly full
with action:
Manage Storage
189. Update Notification
Desktop update architecture may later show:
Update available
without blocking.
190. Release Notes
Optional modal/page.
191. Crash Recovery UX
On restart after crash:
restore window state conservatively
resume daemon state
show recovery notice only if needed
192. Corrupt UI Layout State
If persisted layout corrupt:
reset UI layout
without affecting core data.
193. Layout Reset
Settings action:
Reset Window Layout
194. Workspace Persistence
Persist:
rail expanded
sidebar width
inspector width
open destination
tabs
window state
195. Sensitive Persistence
Do not persist:
recovery code open
security confirmation modal
temporary passwords
196. History Persistence
Navigation history may be session-only.
197. Sidebar State
Persist last selected top-level destination.
198. Conversation Draft
Handled by message draft feature, not generic shell state.
199. Desktop Deep-Link Examples
Potential URI scheme:
comm://conversation/<id>
comm://call/<id>
comm://device/<id>
Exact scheme later.
200. Single Instance Handling
Opening a deep link when app already running:
route to existing main instance
or open new window based on policy.
201. File Association
Optional for:
backup archive
export archive
plugin package
202. File Open Flow
OS opens file:
validate type
inspect safely
show import/install UI
203. Plugin Package Open
Route to Part 24 plugin manager.
204. Backup Archive Open
Route to restore inspector.
205. External Link Handling
URLs in messages open through:
safe confirmation policy
default browser
206. Potential Link Preview
Preview is separate backend feature.
207. Security for External Links
Warn for suspicious schemes.
208. Desktop Notification Center
Optional app-internal notification history for:
security
transfers
missed calls
Not necessarily all chat messages.
209. Utility Panel
Optional right/bottom utility area for:
transfers
notifications
call
diagnostics
Keep collapsed by default.
210. Do Not Overload Shell
Avoid:
5 permanent panels
30 icons
always-visible debug information
Normal experience should remain calm.
211. Visual Hierarchy
Priority:
active conversation/content
navigation
contextual actions
secondary status
212. Density
Desktop can show more data, but preserve readable line lengths.
213. Message Width
Conversation bubbles/text should not stretch edge-to-edge on ultrawide monitor.
Use max readable width.
214. Centered Timeline
On wide screen:
timeline centered
details pane optional
215. File Grid Width
Adaptive columns.
216. Contacts Layout
List or compact cards.
217. Accessibility + Density
Compact mode must not reduce hit targets below usability.
218. Theme Tokens
Desktop shell consumes shared design tokens from UI/UX Part 22 later.
219. Animation
Use subtle:
pane transitions
selection
notification banner
Avoid mobile-like large sliding screens for every desktop navigation.
220. Reduced Motion
Disable nonessential transitions.
221. Startup Experience
Goal:
window appears quickly
local shell renders
local conversation list loads
network attaches afterward
222. Splash
Avoid long custom splash.
223. Loading Core
If daemon/core not ready:
show shell
"Connecting to local service…"
224. Fatal Core Error
Offer:
Restart Service
Open Diagnostics
Restore Backup
Quit
225. Definition of Done
UI/UX Part 02 is complete when:
- the desktop app has a clear rail/sidebar/workspace architecture
- compact, medium, wide, and ultrawide layouts are defined
- pane collapse priorities are deterministic
- multi-window behavior is defined
- active calls can survive navigation/window changes
- system tray behavior is defined
- close/hide/quit semantics are unambiguous
- keyboard-first navigation is first-class
- command palette, menus, shortcuts, toolbar actions, and context menus share one command model
- drag-and-drop and clipboard flows route into Rust file/message services
- raw files/media do not live in Dioxus component state
- window and pane layout state persists independently of core data
- typed navigation/deep-link destinations are used
- Dioxus can run either in-process with the core or as a local-daemon client
- daemon reconnect uses fresh snapshots
- lists are virtualized
- high-frequency backend events are throttled before UI
- accessibility, focus restoration, keyboard navigation, screen-reader semantics, and reduced motion are explicit requirements
- the shell exposes all major backend systems without surfacing backend implementation complexity to ordinary users
226. Final Desktop Architecture
MAIN WINDOW
+-----------------------------------------------------------------------+
| Header / Back / Forward / Global Search / Account |
+------+----------------------+--------------------------+---------------+
| Rail | Secondary Sidebar | Main Workspace | Inspector |
| | | | |
| Chat | Conversation List | Conversation | Info |
| Call | Call History | Call | Media |
| File | Files | File Viewer | Security |
| ... | ... | Search / Settings | Members |
+------+----------------------+--------------------------+---------------+
| Optional Utility / Transfer / Call Status |
+-----------------------------------------------------------------------+
Supporting windows:
Call Window
Media Viewer
Diagnostics
Input surfaces:
mouse
keyboard
drag/drop
clipboard
menus
command palette
tray
notifications
deep links
All actions converge on:
Rust presentation commands
and all state comes from:
Rust snapshots + events
227. Final Principle
The desktop app should behave like a native productivity workspace built around communication.
The right desktop model is:
persistent navigation
+
large-screen information density
+
keyboard-first interaction
+
multi-pane context
+
optional multi-window workflows
+
shared Rust product truth
not:
mobile screens scaled to desktop
Dioxus should therefore be used to build a desktop-specific shell that fully exploits desktop interaction while remaining a thin, consistent presentation client over the Rust core.