{#snippet expander(how: 'down' | 'up' | 'all', g: Gap)} {@const label = how === 'all' ? 'Expand all' : how === 'down' ? 'Expand down' : 'Expand up'} {/snippet}
{path}{#if tag}{tag}{/if}+{f.added}−{f.removed}{#if (!none && !f.note && !waiting) || actions.length}{#if !none && !f.note && !waiting}{/if}{/if} {#if f.note}
{f.note}
{:else if waiting && 'held' in waiting}
{`${f.added + f.removed} lines changed: not loaded until asked for.`}
{:else if waiting && 'failed' in waiting}
{waiting.failed}
{:else if waiting}
{:else} {#if more.failed}
{more.failed}
{/if}
{#each drawn.shown as s (s.key)} {@const row = s.row} {@const line = row.line && !s.back ? at(row) : undefined} {#if row.line} {#if line && notes?.has(line)}{/if} {:else if s.gap} {@const g = s.gap} {@const few = s.left != null && s.left <= STEP} {:else} {/if} {/each}
{#if line && notes?.add}{@const to = line}{/if} {row.text}
{@render notes.below(line)}
{#if g.to === null}{@render expander('down', g)}{:else if few}{@render expander( 'all', g )}{:else}{#if g.from > 1}{@render expander('down', g)}{/if}{@render expander( 'up', g )}{/if}{row.text}
{row.text}
{/if}