Notechondria

Version: 0.1.7 Build Date: 2026-04-07T12:00

What's Changed

Startup splash screen animation (Citric acid cycle)

  • Created _SplashScreen widget with _KrebsCyclePainter CustomPainter that renders an animated Krebs (Citric acid) cycle during app startup.
  • 8 metabolite nodes (Citrate, Isocitrate, alpha-Ketoglutarate, Succinyl-CoA, Succinate, Fumarate, Malate, Oxaloacetate) orbit a central ring with a 4-second animation loop.
  • Byproducts (CO2, NADH, FADH2, GTP) pulse outward at their respective reaction steps. Acetyl-CoA entry arrow shown at the Citrate junction.
  • Active node glow ring cycles through metabolites; tap anywhere to dismiss.
  • Replaces CircularProgressIndicator in all three apps (editor, planner, portal) during initial loading.
  • 10-second cancellable Timer ensures splash dismisses even if network is unavailable. Timer is cancelled in dispose() to avoid test framework warnings.

Page transition animations

  • Added AnimatedSwitcher with combined fade + slide transition to page navigation in all three apps.
  • 300ms duration with easeOut/easeIn curves; subtle horizontal slide (3% offset) for a polished feel.
  • Pages keyed on _selectedIndex via KeyedSubtree so transitions fire on navigation changes.

Staggered card and sidebar animations

  • Created _StaggeredFadeIn widget: fade + slide entrance with index-based stagger delay (50ms per item, 350ms duration).
  • Created _showSlideInDialog helper: fullscreen dialog with slide-from-right + fade entrance (300ms, 8% horizontal offset).
  • Note editor dialog now opens with slide-in-from-right transition instead of default dialog animation.
  • Note cards (editor learner page) fade in top-to-bottom with staggered delay for both local drafts and cloud notes.
  • Course cards (planner), module cards, and discussion note cards fade in with staggered delay.
  • Portal front page cards (intro, route cards, evolution card) fade in sequentially.
  • Editor category sidebar items (both wide layout and drawer) slide in from right with staggered fade.

Fix admin avatar reset on deploy

  • ensure_creator() in creators/utils.py no longer checks creator_has_image_file() — only attaches default avatar when creator is newly created or has no image field set. Prevents overwriting user-uploaded avatars on ephemeral deploy filesystems.

Cross-app feature parity (from 0.1.6)

  • Ported resendVerification client method and "Resend code" button with 60s cooldown to planner and portal apps (editor was done in 0.1.6).
  • Added _resendVerification handler and onResendVerification wiring to planner and portal _AppShellState.

Files Changed

  • frontend/editor_app/lib/components/splash_screen.dart -- New: Krebs cycle splash animation widget
  • frontend/editor_app/lib/main.dart -- Added part 'components/splash_screen.dart'
  • frontend/editor_app/lib/app_shell.dart -- Replaced CircularProgressIndicator with _SplashScreen; added 10s Timer + dispose(); added page transition AnimatedSwitcher
  • frontend/planner_app/lib/components/splash_screen.dart -- New: Krebs cycle splash animation widget
  • frontend/planner_app/lib/main.dart -- Added part 'components/splash_screen.dart'
  • frontend/planner_app/lib/app_shell.dart -- Replaced CircularProgressIndicator with _SplashScreen; added 10s Timer + dispose(); added page transition AnimatedSwitcher
  • frontend/planner_app/lib/core/client.dart -- Added resendVerification(email) to interface and implementation
  • frontend/planner_app/lib/modules/settings.dart -- Added onResendVerification parameter and 60s cooldown resend button
  • frontend/portal_app/lib/components/splash_screen.dart -- New: Krebs cycle splash animation widget
  • frontend/portal_app/lib/main.dart -- Added part 'components/splash_screen.dart'
  • frontend/portal_app/lib/app_shell.dart -- Replaced CircularProgressIndicator with _SplashScreen; added 10s Timer + dispose(); added page transition AnimatedSwitcher
  • frontend/portal_app/lib/core/client.dart -- Added resendVerification(email) to interface and implementation
  • frontend/portal_app/lib/modules/settings.dart -- Added onResendVerification parameter and 60s cooldown resend button
  • frontend/editor_app/lib/core/helpers.dart -- Added _StaggeredFadeIn widget and _showSlideInDialog helper
  • frontend/editor_app/lib/modules/learner.dart -- Note editor uses slide-in dialog; note cards wrapped with staggered fade-in
  • frontend/planner_app/lib/core/helpers.dart -- Added _StaggeredFadeIn widget
  • frontend/planner_app/lib/modules/course.dart -- Course cards, module cards, discussion cards wrapped with staggered fade-in
  • frontend/portal_app/lib/core/helpers.dart -- Added _StaggeredFadeIn widget
  • frontend/portal_app/lib/modules/front.dart -- Front page cards wrapped with staggered fade-in
  • backend/creators/utils.py -- ensure_creator() no longer resets avatar when image file is missing but field is set
  • docs/TASKS.md -- Marked startup animation, page transitions, and avatar reset tasks as complete