0.1.89 — offline-mode gates + planner export/import + cross-app tests

Offline-mode secondary fetch gates

  • "Load public notes" button added to _LearnerPage in all three apps (editor, planner, portal). When offlineMode is true and the notes list is empty, an OutlinedButton.icon appears that triggers an explicit fetch via _loadLearnerNotes() (which bypasses the offline gate by calling widget.client.listNotes() directly).
  • Category auto-sync guard in _loadInitialData for all three apps: when offlineMode is true AND the user is authenticated, the early-return now still fetches courses via widget.client.getCourses() before returning, so the sidebar category list stays current even when notes/page fetches are skipped.

Planner export/import

  • New core/local_archive_io.dart modeled on the portal app's version, adding planner-specific buckets: plannerEvents, calendarFeeds, activityWeek. Wired through _SettingsPage as "Download local data" and "Restore from local archive" buttons.

Cross-app export round-trip tests

  • Three new tests covering planner→editor, editor→planner, and portal→planner round-trips, verifying shared buckets survive and app-specific buckets parse cleanly with empty defaults.

Files changed

 M VERSION                                                (0.1.88 → 0.1.89)
 M docs/TODO.md                                           (marked items done)
 A docs/versions/0.1.89.md                                (this file)
 M frontend/editor_app/lib/core/build_helpers.dart         (wire offlineMode)
 M frontend/editor_app/lib/core/initial_data.dart          (category auto-sync)
 M frontend/editor_app/lib/modules/learner.dart            (offline-mode button)
 M frontend/planner_app/lib/app_shell.dart                 (wire offlineMode + export/import)
 M frontend/planner_app/lib/core/initial_data.dart         (category auto-sync)
 A frontend/planner_app/lib/core/local_archive_io.dart     (new export/import)
 M frontend/planner_app/lib/main.dart                      (+local_archive_io part)
 M frontend/planner_app/lib/modules/learner.dart            (offline-mode button)
 M frontend/planner_app/lib/modules/settings.dart          (+export/import callbacks)
 M frontend/portal_app/lib/app_shell.dart                   (wire offlineMode)
 M frontend/portal_app/lib/core/initial_data.dart           (category auto-sync)
 M frontend/portal_app/lib/modules/learner.dart             (offline-mode button)
 M frontend/notechondria_shared/test/local_archive_test.dart (cross-app tests)