···3131 It would be cool to display this and allow exporting the feed or a link to it.
3232- In dev tools, show Firehose, Jetstream, and [spacedust](https://spacedust.microcosm.blue/#GET/subscribe) as tabs.
33333434+---
3535+3636+- Markdown support (toggleable)
3737+- Collapsible threads
3838+3439## Privacy Policy
35403641- Should mention that Lazurite is an AppView that doesn't store any user data.
+8-6
docs/specs/ui-refactor.md
···9696Current: `NestedScrollView` with collapsible header, `CircleAvatar`,
9797`TabBar` (Posts / Replies / Media).
98989999-Refactor to an asymmetric "bento" layout:
9999+Refactor to a larger-card profile layout:
100100101101### Header
102102···122122123123### Content Area
124124125125-Profile posts use a `12-column` asymmetric bento grid:
125125+Profile posts use a simple large-card stack when the feed architecture is set
126126+to "Grid Matrix":
126127127127-- Pinned post spans `8 columns` (featured, with full image embed)
128128-- Metadata / info card spans `4 columns` (`surfaceContainerHigh` background)
129129-- Remaining posts in `6+6` two-column pairs
128128+- Keep the metadata/info card as a standalone block above the posts
129129+- Use the grid post card variant
130130+- Render one card per row
131131+- Center cards with a comfortable max width so they stay visually larger than
132132+ the linear feed on wide screens
130133131131-The bento grid applies when the feed architecture is set to "Grid Matrix".
132134When set to "Linear Flow", profile posts render as a standard vertical list
133135using the linear post card.
134136
+11-11
docs/tasks/ui-refactor.md
···30303131## M3 — Home Feed Grid Layout
32323333-- [ ] `HomeFeedScreen` reads `feed_architecture` from `SettingsCubit`
3434-- [ ] Grid mode: responsive `SliverGrid` with breakpoint-based column count
3535-- [ ] Linear mode: existing `ListView` of linear post cards (no change)
3636-- [ ] Feed architecture toggle triggers rebuild without re-fetch
3737-- [ ] Tests for grid/linear switching and column count at breakpoints
3333+- [x] `HomeFeedScreen` reads `feed_architecture` from `SettingsCubit`
3434+- [x] Grid mode: responsive `SliverGrid` with breakpoint-based column count
3535+- [x] Linear mode: existing `ListView` of linear post cards (with more space around cards)
3636+- [x] Feed architecture toggle triggers rebuild without re-fetch
3737+- [x] Tests for grid/linear switching and column count at breakpoints
38383939## M4 — Profile Screen Refactor
40404141-- [ ] Profile header: square avatar, cover image (grayscale, opacity), stats row with border
4242-- [ ] Display name uppercase + tight tracking, handle below
4343-- [ ] Sticky tab bar with backdrop blur and uppercase labels
4444-- [ ] Bento grid layout for profile posts (8+4 featured row, 6+6 pairs) in grid mode
4545-- [ ] Linear fallback for profile posts when feed architecture is "linear"
4646-- [ ] Tests for profile header rendering and layout mode switching
4141+- [x] Profile header: square avatar, cover image (grayscale, opacity), stats row with border
4242+- [x] Display name uppercase + tight tracking, handle below
4343+- [x] Sticky tab bar with backdrop blur and uppercase labels
4444+- [x] Large-card grid layout for profile posts in grid mode, with the metadata info card retained above the feed
4545+- [x] Linear fallback for profile posts when feed architecture is "linear"
4646+- [x] Tests for profile header rendering and layout mode switching
47474848## M5 — Layout Settings Screen
4949
+11-8
lib/core/router/app_shell.dart
···2525 @override
2626 Widget build(BuildContext context) {
2727 final shellScope = AppShellScope.maybeOf(context);
2828-2929- return IconButton(tooltip: 'Open menu', onPressed: shellScope?.openMenu, icon: const Icon(Icons.menu));
2828+ final onPressed = shellScope?.openMenu ?? AppShell.openDrawer;
2929+ return IconButton(tooltip: 'Open menu', onPressed: onPressed, icon: const Icon(Icons.menu));
3030 }
3131}
3232···35353636 final StatefulNavigationShell navigationShell;
37373838+ /// Global key for the shell [Scaffold]. Accessible from anywhere — even
3939+ /// screens pushed onto the root navigator that are outside [AppShellScope].
4040+ static final scaffoldKey = GlobalKey<ScaffoldState>();
4141+4242+ /// Opens the navigation drawer from any context.
4343+ static void openDrawer() => AppShell.scaffoldKey.currentState?.openDrawer();
4444+3845 @override
3946 State<AppShell> createState() => _AppShellState();
4047}
41484249class _AppShellState extends State<AppShell> {
4343- final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
4444-4545- void _openMenu() {
4646- _scaffoldKey.currentState?.openDrawer();
4747- }
5050+ void _openMenu() => AppShell.openDrawer();
48514952 @override
5053 Widget build(BuildContext context) {
···5255 return AppShellScope(
5356 openMenu: _openMenu,
5457 child: Scaffold(
5555- key: _scaffoldKey,
5858+ key: AppShell.scaffoldKey,
5659 drawer: _AppMenu(navigationShell: widget.navigationShell, rootContext: context),
5760 body: widget.navigationShell,
5861 bottomNavigationBar: Container(