{sources.length} sources
(showAdd ? cancelForm() : startAdd())}> {showAdd ? 'Cancel' : '+ Add source'}
{#if showAdd}
RSS
API
Telegram
YouTube
Custom
{#if form.type === 'youtube'}
{:else}
{/if}
Every 5 minutes
Every 15 minutes
Every hour
Categories
{#each assignableCategories as cat (cat.id)}
toggleCategory(cat.name)} /> {cat.name}
{/each}
Cancel
{editingId ? 'Save' : 'Add'}
{/if}
Name
Type
Category
Poll
{#each sources as source (source.id)}
pollNow(source)} disabled={pollingId === source.id} title="Poll now" aria-label={`Poll ${source.name} now`} > {typeIcon(source.type)}
{source.name}
{#if justCleared?.id === source.id} ✓ cleared {justCleared.items} item(s), {justCleared.articles} article(s) {:else if justPolled?.id === source.id} {justPolled.count > 0 ? `✓ ${justPolled.count} new item(s)` : '✓ up to date, nothing new'} {:else if source.lastError} last poll failed · {source.lastError} {:else} {source.url} {/if}
{source.type.toUpperCase()}
{source.category.join(', ')}
{source.pollIntervalMinutes} min
startEdit(source)} title="Edit">✎
toggleEnabled(source)} title={source.enabled ? 'Disable' : 'Enable'}> {source.enabled ? '⏸' : '▶'}
handleClearContent(source)} disabled={clearingId === source.id} title="Clear content (keep source)" > ⟲
handleDelete(source.id)} title="Delete">✕
{/each}