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 inshell_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 inproduct_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.