···56565757## M6 — Collapsible Threaded Replies
58585959-- [ ] Recursive `ThreadReplyNode` widget that renders nested replies from `ThreadViewPost.replies`
6060-- [ ] Indentation with cumulative `24px` left padding per depth level
6161-- [ ] Color-coded vertical threadlines (cycle palette of 6 muted theme-derived colors)
6262-- [ ] Tap-threadline-to-collapse interaction with `24dp` touch target
6363-- [ ] Long-press-to-collapse as secondary affordance
6464-- [ ] Collapsed state: header visible, body/children hidden, "N replies hidden" indicator
6565-- [ ] `AnimatedSize` / `AnimatedCrossFade` collapse transition (`200ms`)
6666-- [ ] Depth cap at 6 with "Continue this thread →" navigation link
6767-- [ ] Local collapse state via `Set<String>` of post URIs in screen `State`
6868-- [ ] `thread_auto_collapse_depth` setting in Drift + Drift migration
6969-- [ ] Expose auto-collapse depth in Layout Settings screen
7070-- [ ] Never auto-collapse OP replies
7171-- [ ] Tests for thread tree rendering, collapse/expand, depth cap, and auto-collapse behavior
5959+- [x] Recursive `ThreadReplyNode` widget that renders nested replies from `ThreadViewPost.replies`
6060+- [x] Indentation with cumulative `24px` left padding per depth level
6161+- [x] Color-coded vertical threadlines (cycle palette of 6 muted theme-derived colors)
6262+- [x] Tap-threadline-to-collapse interaction with `24dp` touch target
6363+- [x] Long-press-to-collapse as secondary affordance
6464+- [x] Collapsed state: header visible, body/children hidden, "N replies hidden" indicator
6565+- [x] `AnimatedSize` / `AnimatedCrossFade` collapse transition (`200ms`)
6666+- [x] Depth cap at 6 with "Continue this thread →" navigation link
6767+- [x] Local collapse state via `Set<String>` of post URIs in screen `State`
6868+- [x] `thread_auto_collapse_depth` setting in Drift + Drift migration
6969+- [x] Expose auto-collapse depth in Layout Settings screen
7070+- [x] Never auto-collapse OP replies
7171+- [x] Tests for thread tree rendering, collapse/expand, depth cap, and auto-collapse behavior
+7-1
lib/core/database/app_database.dart
···2323 AppDatabase({QueryExecutor? executor}) : super(executor ?? _openConnection());
24242525 @override
2626- int get schemaVersion => 10;
2626+ int get schemaVersion => 11;
27272828 @override
2929 MigrationStrategy get migration => MigrationStrategy(
···6363 await customStatement(
6464 "INSERT OR IGNORE INTO settings (key, value) VALUES ('ui_density', 'standard'), ('feed_architecture', 'grid')",
6565 );
6666+ }
6767+ if (from < 11) {
6868+ /*
6969+ The thread auto-collapse setting is nullable and represented by
7070+ the presence or absence of a row in the existing settings table.
7171+ */
6672 }
6773 },
6874 );