// useSyncExternalStore over a low-frequency set of HTMLAudioElement events. // Snapshot is cached; consumers only re-render when one of the tracked fields // actually changes (Object.is on the snapshot). See ADR-001 / research 03 §2. import { useSyncExternalStore } from 'react'; import type { PlayerErrorReason, PlayerState, PlayerStateKind } from '../types'; const TRACKED = [ 'play', 'pause', 'ended', 'loadstart', 'loadedmetadata', 'durationchange', 'emptied', 'waiting', 'canplay', 'error', ] as const; // A detached