feat: Takeout walkthrough, design-system restyle, replacing import

Adds a seven-step in-app guide to exporting subscriptions from Google
Takeout, with the real URLs opened in the system browser.

Restyles the app onto the supplied design system: slate/sky palette,
9-15px type ladder, outline-first controls, tiered radii, borders for
separation and shadows only for elevation. Light and dark are both
designed, with a System/Light/Dark control and a pre-paint script so
the window does not flash light on a dark machine.

Importing now replaces the subscription list rather than merging, per
request. Because that can delete downloaded files, a confirmation
dialog names exactly what will go first.
This commit is contained in:
vincent
2026-08-29 03:00:54 +02:00
parent 11331671c5
commit cac6727072
18 changed files with 1202 additions and 306 deletions
+10 -3
View File
@@ -7,6 +7,7 @@ import type {
DownloadStateEvent,
FeedFilter,
FeedItem,
ImportPreview,
Prereqs,
RefreshProgress,
RefreshSummary,
@@ -39,16 +40,22 @@ export const openExternal = (url: string) =>
invoke<void>("open_external", { url });
/** Opens the native file picker for a Takeout subscriptions.csv. */
export async function pickAndImportTakeout(): Promise<number | null> {
export async function pickTakeoutFile(): Promise<string | null> {
const path = await open({
multiple: false,
directory: false,
filters: [{ name: "Takeout subscriptions", extensions: ["csv"] }],
});
if (typeof path !== "string") return null;
return invoke<number>("import_takeout_csv", { path });
return typeof path === "string" ? path : null;
}
export const previewTakeoutImport = (path: string) =>
invoke<ImportPreview>("preview_takeout_import", { path });
/** Replaces the whole subscription list. Confirm with the user first. */
export const importTakeoutCsv = (path: string) =>
invoke<number>("import_takeout_csv", { path });
export async function pickLibraryFolder(): Promise<string | null> {
const path = await open({ directory: true, multiple: false });
if (typeof path !== "string") return null;