History
{history.length} saved
(showStarredOnly = !showStarredOnly)} aria-pressed={showStarredOnly} title={showStarredOnly ? "Showing starred only (click to show all)" : "Show starred only"} >
Starred
{#if history.some((i) => !i.llmTags || i.llmTags.length === 0)}
{bulkTagging ? `Tagging ${bulkTaggingProgress}` : "Tag all untagged"}
{/if} {#if history.length > 0}
Clear All
{/if}
{#if searchQuery}
{filtered.length} results
searchQuery = ""} >Clear
{/if}
{#if allTags.length > 0}
Tags
{#if activeTagFilter}
(activeTagFilter = null)} title="Clear tag filter" > {activeTagFilter}
×
{:else} {#each allTags.slice(0, 7) as t (t.tag)}
(activeTagFilter = t.tag)} > {t.tag}
{t.count}
{/each} {/if}
{/if} {#if selected.size > 0}
{selected.size} selected
Select all
Clear
Export selected
Delete selected
{/if}
{#if filtered.length === 0}
{:else}
{#each visibleItems as { item, top, height, preview } (item.id)}
toggleExpand(item.id)} onkeydown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); toggleExpand(item.id); } }} role="button" tabindex="0" aria-expanded={expandedId === item.id} >
{ e.stopPropagation(); toggleSelected(item.id); }} onkeydown={(e) => { if (e.key === " " || e.key === "Enter") e.stopPropagation(); }} /> {#if item.audioPath}
{ e.stopPropagation(); togglePlay(item); }} aria-label={playingId === item.id && audioEl && !audioEl.paused ? "Pause" : "Play"} > {#if playingId === item.id && audioEl && !audioEl.paused}
{:else}
{/if}
{:else}
{/if}
{preview?.text || compactPreviewText(item)}
{#if item.duration}
{formatDuration(item.duration)}
{/if}
{#if item.source && item.source.toLowerCase().includes("file")}
{:else}
{/if}
{item.date}
{#if expandedId === item.id}
{#if item.audioPath && playingId === item.id}
{formatTime(currentTime)} / {formatTime(duration)}
e.stopPropagation()} />
{#each PLAYBACK_SPEEDS as speed}
{ e.stopPropagation(); setSpeed(speed); }} >{speed}x
{/each}
{/if}
{ item.title = e.target.value; }} onblur={() => renameHistoryEntry(item.id, { title: (item.title || "").trim() }).catch(() => {})} onclick={(e) => e.stopPropagation()} data-no-transition />
e.stopPropagation()} role="presentation"> {#each deriveAutoTags(item) as t (t)}
{t}
{/each} {#each (item.manualTags || []) as t (t)}
{t}
removeManualTag(item, t)} title="Remove tag" aria-label="Remove tag {t}" >×
{/each} {#each (item.llmTags || []) as t (t)}
promoteLlmTag(item, t)} title="Click to keep as a manual tag" aria-label={`Promote ${t} to manual tag`} >{t}
{/each}
handleAddTagKey(e, item)} data-no-transition />
{item.text}
{ e.stopPropagation(); copyItem(item); }} >Copy
{ e.stopPropagation(); openEditor(item); }} title="Open transcript in a popout editor" > Edit
{ e.stopPropagation(); exportMarkdown(item); }} title="Export this transcript as a Markdown file with YAML frontmatter" >Export .md
{ e.stopPropagation(); tagRow(item); }} disabled={tagging.has(item.id)} title="Generate AI content tags (topic and intent)" aria-label="Generate content tags with AI" >
{tagging.has(item.id) ? "Tagging…" : "Tag"}
{#if item.audioPath && item.segments && item.segments.length > 0}
{ e.stopPropagation(); openViewer(item); }} >Open viewer
{/if}
{ e.stopPropagation(); removeItem(item); }} >Delete
{/if}
{/each}
{/if}