Home
- Header. Today’s date, a time-of-day greeting with the profile display name when one is set (“Good morning, Linh”), and a workspace switcher pill that opens the existing workspace picker. The shell navbar keeps the “Home” title, so the greeting is not a second page title.
- Widgets. The existing widgets keep their order, visibility and Customize Home editor: assigned tasks, upcoming events, mail, meetings, finance, notes and the Today summary. Each widget is a caption with an Open link above one grouped card.
- Task rows show the due state first: Overdue (destructive tone), Today (warning), Tomorrow (primary) or the localized date, then board and list. Event rows show a calendar-leaf date tile, weekday and time.
- States. First loads show placeholder rows inside the card. Failed loads show an inline “Something went wrong / Pull down to try again.” row. Empty widgets show an inline message with the widget’s icon.
- Responsive. Page kind
root. Widgets flow in content-sized columns of at least 340dp: one column on phones, two on portrait tablets and up to three on laptops and desktops. The header puts the switcher beside the greeting from 560dp of content width.
Notifications
- Grouping. The inbox and archive are grouped by device-local calendar day: Today, Yesterday, Last 7 days and Earlier. Groups keep the server’s newest-first order; an out-of-order item starts a new group instead of being moved.
- Rows. Each row has a type tile (invites warning, security and rejections destructive, completions and approvals success, mentions and mail info), a primary unread dot on the tile, a semibold title while unread, the body (up to three lines), then the workspace and relative age. Open invites show Decline and Accept; answered invites show a status badge. A 48dp read toggle sits at the trailing edge.
- States. First loads show placeholder rows; load failures and empty tabs show a centred message, with Retry on failures. Raw error text is never shown.
- Responsive. Page kind
detail: full width on phones and a centred readable column (600dp on tablets, 720dp on desktops). A notification opens its destination route, so the list does not use a list-detail split.
Regression coverage
test/features/shell/view/appearance_root_tabs_render_test.dart(partshome_render_cases.dartandnotifications_render_cases.dart) renders both screens in the real shell with fixture data at 390x844, 820x1180 and 1440x900 in Classic light/dark, a gradient and a blob theme. It asserts the phone gutter, the column count, the 44dp targets, the four group captions, and the loading, error and empty states. SetSETTINGS_RENDER_DIR(plusSETTINGS_MATERIAL_FONTpointing at a Roboto TTF, and optionallySETTINGS_RENDER_PIXEL_RATIO) to write PNG captures.test/features/notifications/widgets/notification_day_groups_test.dartcovers calendar-day bucketing and feed-order preservation.test/core/layout/grouped_rows_test.dartcovers tones, row targets and state actions.