Lower layers (data, scene, input) need to surface user-visible
messages — toasts when a recording finishes, error dialogs when
loading fails, the help overlay when the user presses H — but they
can't directly import the ui/ helper modules (toast.ts,
error-overlay.ts, help-overlay.ts, loading-indicator.ts)
without violating the layer order documented in CONVENTIONS.md §10.
This module defines the abstract Notifier surface and a singleton
notifier that lower layers call. The UI bootstrap registers a
concrete backend at startup via setNotifierBackend(...). Until
registered, calls are no-ops with a single warning log so missing
registration doesn't crash code paths that legitimately run before
UI init (and so unit tests don't need a backend).
Cross-layer notification interface.
Lower layers (data, scene, input) need to surface user-visible messages — toasts when a recording finishes, error dialogs when loading fails, the help overlay when the user presses H — but they can't directly import the
ui/helper modules (toast.ts,error-overlay.ts,help-overlay.ts,loading-indicator.ts) without violating the layer order documented in CONVENTIONS.md §10.This module defines the abstract
Notifiersurface and a singletonnotifierthat lower layers call. The UI bootstrap registers a concrete backend at startup viasetNotifierBackend(...). Until registered, calls are no-ops with a single warning log so missing registration doesn't crash code paths that legitimately run before UI init (and so unit tests don't need a backend).