Notechondria

Version: 0.1.22 Build Date: 2026-04-15T02:00

What's Changed

Frontend — splash / start-up animation

  • SplashScreen now accepts a ValueListenable<String>? loadingStatus. Host apps push phase strings (e.g. Restoring session, Connecting to server, Loading public notes data, Loading notes) and the splash cross-fades between them with an AnimatedSwitcher. When the listenable is omitted or empty the fallback Loading... is used.
  • Title (Notechondria) and loading-status text now fade+slide in on first mount via a second AnimationController, so the texts are no longer popped in at full opacity. The status line fades in ~320 ms after the title, giving the sequence a deliberate feel instead of a single cut.
  • Acetyl-CoA feeding the cycle is now drawn as a skeletal structural formula (CH3–C(=O)–S–CoA) pointing inward along the feed arrow, replacing the plain Acetyl-CoA English label. Byproduct labels (NADH, CO2, GTP, FADH2) retain their English names — changing those is out of scope for this round.
  • When the active metabolite's step crosses stepFraction = 0.6, the incoming metabolite's skeletal formula is cross-faded in at the next node position. This makes the "one chemical becoming the other" morph visible on each cycle step without requiring per-atom morph-target logic.
  • Cycle rotation slowed from 12 s to 16 s per full revolution so the cross-fade reads clearly.

Frontend — app_shell.dart status wiring (three apps)

  • editor_app, planner_app, portal_app each declare a ValueNotifier<String> _splashStatus field (disposed in dispose). The notifier is threaded into SplashScreen(loadingStatus: _splashStatus) and updated in _bootstrapApp() (and, for editor, inside _loadInitialData()) at each phase boundary:
    • Editor: Starting editorLoading local workspaceRestoring sessionCompleting sign-inConnecting to serverLoading public notes dataLoading categoriesLoading notes.
    • Planner: Starting plannerLoading local planner dataCompleting sign-inConnecting to server.
    • Portal: Starting portalLoading local stateCompleting sign-inConnecting to server.

Files Changed

Modified

  • frontend/notechondria_shared/lib/src/components/splash_screen.dart — adds loadingStatus parameter, _HeaderColumn + _LoadingStatusText widgets, fade/slide-in on mount, cross-fade between loading strings, _drawAcetylCoA skeletal-formula painter, and a cross-fade between adjacent metabolite skeletal formulas near each step boundary. flutter/foundation import added for ValueListenable.
  • frontend/editor_app/lib/app_shell.dart_splashStatus ValueNotifier<String> field (+ dispose); status updates in _bootstrapApp and inside _loadInitialData at front-page, courses, and listNotes boundaries; SplashScreen(loadingStatus: _splashStatus).
  • frontend/planner_app/lib/app_shell.dart — same wiring.
  • frontend/portal_app/lib/app_shell.dart — same wiring.
  • VERSION — 0.1.21 -> 0.1.22.
  • docs/TODO.md — completed start-up animation items removed.

Verification

  • notechondria_shared: flutter pub get && flutter analyze — no new issues (only 2 pre-existing surfaceVariant deprecation infos).
  • Each of editor_app / planner_app / portal_app: flutter test test/smoke_test.dart -r compact — all pass. flutter analyze — no new errors; existing warnings unchanged.

Notes / follow-ups

  • Debug log window upgrades (log levels, per-request timings, terminal input with ls / cd / clear) remain pending in docs/TODO.md.
  • Note-view local-category delete semantics remain pending.
  • Planner / portal app_shell.dart still needs the 0.1.20 editor_app invalid-token session-clear and bind-without-token short-circuit replicated (pre-existing bug from docs/TODO.md).