Skip to main content

Settings detail shell and profile settings

All mobile Settings children use the same shell background and one shell top navbar with the destination title and actions. In-app Back appears only in the floating bottom navbar, never in the top navbar. Android system Back remains available. Offline is /settings/offline; its Finance, Inventory, Tasks and Calendar details are /settings/offline/<module>. They do not add body title/back bars, nested AppBars or another top safe area. Their scroll content reserves the shell-provided bottom padding, so the floating dock clears the last actionable row. Pushed destinations return to the screen that opened them; direct links fall back to their Settings parent. Settings → You now opens identity, avatar and account-status settings at /settings/profile, with account management at /settings/accounts. Legacy /profile/edit and /profile/accounts links redirect to those destinations. /profile retains the Overview/Timeline activity surface. Its edit entry is a compact icon with an accessible Identity label and tooltip. Account-switching shortcuts remain available there. These defaults apply in both mobile languages; workspace permissions and queued profile writes retain their existing rules. Profile identity fields use the shared Settings tiles and panel material, with read-only values until a field is opened for editing. Manage accounts uses the same grouped Add account row and account panels; its shell title is not repeated in a hero card. The Profile account-management entry has one label, and What’s new keeps its description and installed version without repeating the shell heading. Account removal confirmations and queued profile writes are unchanged. These defaults apply to both languages, light/dark themes and enlarged text. Licenses, onboarding replay and explicit admin edit forms intentionally open above the shell on the root navigator with their own full-screen chrome. Sheet editors retain their existing modal presentation. They never stack a second navbar within a shell body. Home Agenda, Profile Overview/Timeline and Calendar Agenda reclaim the dock’s bottom scroll clearance while it is hidden, retaining the physical safe area. The viewport remains full height; reverse scrolling or idle restores the dock and its clearance. Other screens keep stable clearance by default. Text Assistant publishes a lifecycle-scoped composer/action slot into the same shell-owned floating dock used by every root and detail destination. The material stays mounted as navigation and prompt content change; width and root bodies animate independently, with only the current dock controls interactive. No page mounts a second dock. Reduced motion disables transitions, and a focused composer remains visible above the keyboard. Draft controllers stay with the cached Assistant page, while disposed publishers cannot overwrite a newer registration. Text immersive mode retains the same composer and navigation toggle, including when entered through an Assistant tool. Live retains its existing shell navigation and fullscreen policy. While no workspace is resolved, shell navigation remains available. Shell profile reads and cache mutations are fenced by current actor and request generation. Account changes, logout and newer edits reject late results; cache writes and clearing remain ordered. Feature-level identity guards also remain. Regression coverage: settings_detail_shell_checks.dart exercises actual Offline registrations, inherited background/header and dock clearance, enlarged text, system/dock back without a top Back button, and unknown module links; profile_overview_shell_test.dart covers the icon edit entry and return path. floating_shell_dock_test.dart verifies hidden clearance and stable viewport; shell_assistant_composer_test.dart verifies one dock, draft/focus and Live transitions, and shell_profile_races_test.dart covers delayed account/cache completion. These widget checks do not establish installed-device or production evidence.

Centered navigation and action group

Root and mini-app destinations center the combined visible navigation island and its actions whenever they fit. Empty action columns do not consume space after exit. Dynamic actions reserve width first, moving navigation left, then fade and scale into the free space. On exit, controls disappear before their width is released and navigation recenters. The combined navigation/action group stays centered at every intermediate frame; actions do not animate through a size clip. An interrupted transition reverses from its current geometry, and a replaced outgoing action cannot accept input or accessibility focus. Reduced motion settles both phases immediately. Actions keep 52px slots and share the bottom baseline, including when large text makes the composer taller; narrow layouts keep secondary actions in the top navbar. When the viewport becomes too narrow, the second dock column is removed immediately rather than retaining it while shrinking navigation touch targets. The navigation and Assistant dock share horizontal and safe-area bottom insets, and switching root destinations retains one dock while bodies ease between tabs. Only the active body receives pointer input or semantics. Visited tabs remain mounted, preserving drafts and scroll positions; reduced-motion changes retain the same page elements. Navigation and prompt slots never paint two docks. Coverage: dock_action_choreography_test.dart, persistent_shell_dock_test.dart, lazy_indexed_stack_test.dart, floating_dock_rail_test.dart, apps_search_submit_test.dart, and shell_assistant_composer_test.dart. Leaving Apps or launching a module clears Apps search so returning starts in navigation mode. Workspace picker search replaces the shell title, and its visible footer actions are centered. Hiding and restoring workspace shortcuts belongs to Settings; the normal picker never exposes hide buttons. Coverage: workspace_picker_sheet_test.dart. Native dark launch backgrounds match the actual app theme, checked by native_splash_theme_test.dart; the locked screen shows only the lock status and unlock action. Device visual, transition, and keyboard checks on the exact CI-built artifact remain required.

Notification navigation and refresh

Mobile Notifications keeps its scoped snapshot visible while revalidating on entry. Concurrent unread badge refreshes share one awaitable request; the visible feed owns its push listener, and count-only changes do not rebuild page rows. Unchanged counts do not serialize the retained feed again. Workspace switches clear the visible feed and reload the selected tab; responses from an older workspace or actor cannot replace current reads. Pagination and offline pending read overlays retain their existing behavior. These defaults apply to the native Inbox and Archive; the sheet also updates its unread header. Empty and error messages use a minimum height rather than a fixed height, so narrow screens and enlarged text can wrap without clipping. The real 320px root transition matrix in shell_assistant_composer_test.dart covers this responsive empty-state path. notifications_cubit_test.dart covers coalescing, retry, delayed scope responses and close safety. Focused tests establish request behavior, not a measured device frame-time improvement. The persistent notifications action button coalesces unread refreshes only for the same signed-in actor and workspace. An account transition clears the badge, retained feeds and pending state before starting a new request, including a switch away and back in the same workspace. Delayed old requests cannot replace the new count or end its loading state. This applies to the native shell action button and shared notifications cubit; delayed-actor and same-workspace ABA regressions are in notifications_cubit_test.dart.

Product settings entry points

The central Settings overview lists native products with maintained settings entries in product_settings_registry.dart. Calendar and Finance open the existing shared Preferences controls; Mail resolves the selected workspace’s mailboxes and opens its existing quick-settings editor. Entries are shown only when the product’s corresponding state/access is available; this registry does not grant permissions or fabricate settings for unimplemented products. App quick settings and central entries share implementations and persisted state. Mail’s nested editor uses the shell title, bottom navigation/actions and inherited background. A scoped route is cancelled on any account/workspace transition; request completion cannot replace an editor opened for another scope.