{#if migrateFrom && !isExternalServer}
Manga found at previous path — move to new location? {migrateFrom} → {migrateTo} {#if migrateProgress && migrateProgress.total > 0}
{migrateProgress.current} · {migrateProgress.done} / {migrateProgress.total} {/if} {#if migrateError}{migrateError}{/if}
{/if}

Disk Usage

{#if storageLoading}

Reading filesystem…

{:else if storageError}

{storageError}

{:else if isExternalServer}

Disk usage is unavailable for external servers — filesystem access requires a local connection.

{:else if multiStorageInfos.length > 0} {#each multiStorageInfos as info} {@const limitGb = store.settings.storageLimitGb ?? null} {@const limitBytes = limitGb !== null ? limitGb * 1024 ** 3 : null} {@const available = info.manga_bytes + info.free_bytes} {@const cap = limitBytes !== null ? Math.min(limitBytes, available) : available} {@const pct = cap > 0 ? Math.min(100, (info.manga_bytes / cap) * 100) : 0}
{info.label} {fmtBytes(info.manga_bytes)} of {fmtBytes(cap)}
90} class:warn={pct > 75 && pct <= 90} style="width:{pct}%">
{/each} {:else}

No download path configured.

{/if}

Downloads Path

{#if isExternalServer}
Connected to an external server. The path below is read from the server — changes here will update the server's config directly.
{/if}
e.key === "Enter" && savePaths()} oninput={() => { pathsFieldError = { ...pathsFieldError, dl: undefined }; }} /> {#if !isExternalServer} {/if}
{#if pathsFieldError.dl} {pathsFieldError.dl} {/if} {#if pathsError} {pathsError} {/if}
{#if pathsFieldError.dl && !isExternalServer} {/if} {#if downloadsPathInput.trim() !== confirmedDownloadsPath} {/if}

Storage Limit

Warn when limit is reached {store.settings.storageLimitGb === null ? "No limit set" : `Warn above ${store.settings.storageLimitGb} GB`}
{#if store.settings.storageLimitGb === null} {:else}
{ const n = parseFloat(e.currentTarget.value); if (!isNaN(n) && n > 0) updateSettings({ storageLimitGb: n }); }} /> GB
{/if}
{#if advStorageOpen}
Local source path Read manga already on disk without an extension. Leave blank if unused.
e.key === "Enter" && savePaths()} oninput={() => { pathsFieldError = { ...pathsFieldError, loc: undefined }; }} /> {#if !isExternalServer} {/if} {#if pathsFieldError.loc && !isExternalServer} {/if}
{#if pathsFieldError.loc}{pathsFieldError.loc}{/if}
{#each extraScanDirs as dir}
{dir} Extra scan directory
{/each}
Additional scan path Include an extra directory in disk usage readings
e.key === "Enter" && addExtraScanDir()} /> {#if !isExternalServer} {/if}
{/if}
{#if backupSectionOpen}

Library backup

Create backup Snapshot your library, categories, and tracker links
{#if backupError}
{backupError}
{/if} {#if backupList.length === 0}

No backups yet — create one above.

{:else} {#each backupList as backup}
{backup.name}
{/each} {/if}
Restore from file {restoreFile ? restoreFile.name : "Select a .tachibk file"}
{#if restoreFile}
{/if} {#if validateError}
{validateError}
{/if} {#if validateResult} {#if validateResult.missingSources.length === 0 && validateResult.missingTrackers.length === 0}
✓ All sources and trackers present
{:else} {#if validateResult.missingSources.length > 0}
Missing sources {validateResult.missingSources.map(s => s.name).join(", ")}
{/if} {#if validateResult.missingTrackers.length > 0}
Missing trackers {validateResult.missingTrackers.map(t => t.name).join(", ")}
{/if} {/if} {/if} {#if restoreError}
{restoreError}
{/if} {#if restoreStatus}
{restoreStatus.state === "SUCCESS" ? "✓ Restore complete" : restoreStatus.state === "FAILURE" ? "✗ Restore failed" : "Restoring…"} {#if restoreStatus.totalManga > 0} {restoreStatus.mangaProgress} / {restoreStatus.totalManga} manga {/if}
{#if restoreStatus.state !== "SUCCESS" && restoreStatus.state !== "FAILURE" && restoreStatus.totalManga > 0}
{/if}
{/if}

App data backup

Export settings Save all Moku app settings to a .zip via a native save dialog.
Import settings Restore from a previously exported .zip file. Reloads the app immediately.
{#if appDataError}
{appDataError}
{/if} {#if appDataMsg}
{appDataMsg}
{/if} {#if appDataBackupDir}
Auto-backup location Pre-update snapshots are kept here (last 5).
{/if}
{/if}
{#if resetSectionOpen}
{#each resetItems as item}
{item.label} {item.desc} {#if item.error}{item.error}{/if}
{#if item.state === "done"} Done {:else if item.state === "busy"} {:else if confirming === item.key} Sure? {:else} {/if}
{/each}
{/if}