    <!-- the announcement: one node, always here, so a change of its words
         is what gets read out. The toasts below stay where they were and
         say nothing on their own — two announcers say everything twice -->
    <div class="sr-live" data-live aria-live="polite" aria-atomic="true">{announce}</div>
    {#if player.error || lib.error}
        <div class="toast" onclick={() => { player.error = ""; lib.error = ""; }} role="button" tabindex="0" onkeydown={() => {}} aria-label="Dismiss this message">{player.error || lib.error}</div>
    {/if}
    {#if notice.text}
        <div class="toast notice">
            <span class="nt" aria-hidden="true">{notice.text}</span>
            {#if notice.action}<button class="na" onclick={() => { const f = notice.action.fn; clearNote(); f?.(); }}>{notice.action.label}</button>{/if}
        </div>
    {/if}
