diff --git a/src/components/DuplicateFinder.tsx b/src/components/DuplicateFinder.tsx index ba07724..417045b 100644 --- a/src/components/DuplicateFinder.tsx +++ b/src/components/DuplicateFinder.tsx @@ -193,7 +193,7 @@ export function DuplicateFinder() { {/* Batch select — only shown when there are groups and nothing is selected yet */} {hasResults && selectedCount === 0 && !deleting && ( {open ? ( -
+
) : ( {open ? ( -
+
{options.map((option) => (
) : null} {!taggerModelPreparing && taggerModelError ? ( -

+

Download failed: {taggerModelError}

) : null} @@ -92,11 +92,11 @@ export function StepAiFeatures() {

Semantic search & similarity — built in

-
+

Search by meaning, find look-alikes

- Powers /s search, + Powers /s search, "find similar", and the Explore view, so it's part of the standard pipeline: the CLIP model (~580 MB) downloads automatically the first time embeddings run. Nothing to do — you'll see it in the background-tasks bar. diff --git a/src/components/onboarding/StepGalleryPreview.tsx b/src/components/onboarding/StepGalleryPreview.tsx index 292bdbd..44faf5f 100644 --- a/src/components/onboarding/StepGalleryPreview.tsx +++ b/src/components/onboarding/StepGalleryPreview.tsx @@ -37,14 +37,14 @@ export function StepGalleryPreview() { carry your favorites, star ratings, and video durations; hover for filename and quick actions.

-
+
{TILE_PROPS.map((props, i) => ( ))}
-
+

Click any tile to open the lightbox — keyboard navigation, zoom, inline tag editing, ratings, and a full video player. diff --git a/src/components/onboarding/StepPipeline.tsx b/src/components/onboarding/StepPipeline.tsx index c6c3550..5e47043 100644 --- a/src/components/onboarding/StepPipeline.tsx +++ b/src/components/onboarding/StepPipeline.tsx @@ -49,7 +49,7 @@ export function StepPipeline() {

{/* Fake BackgroundTasks slim bar */} -
+
{!finished ? ( @@ -57,7 +57,7 @@ export function StepPipeline() { ) : null} - Holiday Photos + Holiday Photos
{STAGES.map((stage, i) => (
-
+

It's all interruptible. Close the app whenever you like — the queue picks up where it left off next launch. diff --git a/src/components/onboarding/StepSearchDemo.tsx b/src/components/onboarding/StepSearchDemo.tsx index be81f3e..5a318ef 100644 --- a/src/components/onboarding/StepSearchDemo.tsx +++ b/src/components/onboarding/StepSearchDemo.tsx @@ -64,12 +64,12 @@ export function StepSearchDemo() { return (

- One search bar, three modes — picked by prefix. No prefix searches filenames, /s searches - by meaning, /t searches tags. + One search bar, three modes — picked by prefix. No prefix searches filenames, /s searches + by meaning, /t searches tags.

{/* Mock search bar */} -
+
@@ -77,7 +77,7 @@ export function StepSearchDemo() { {demo.query.slice(0, typed)} {!finished ? | : null} - + {demo.mode}
@@ -90,7 +90,7 @@ export function StepSearchDemo() { demo's visible state. */}
{demo.results.map((src, i) => (
diff --git a/src/components/onboarding/StepUpdates.tsx b/src/components/onboarding/StepUpdates.tsx index 5442580..fa12b73 100644 --- a/src/components/onboarding/StepUpdates.tsx +++ b/src/components/onboarding/StepUpdates.tsx @@ -24,9 +24,9 @@ export function StepUpdates() {

{/* Mini app-window mockup: the lit mark shown in a real title bar. */} -
-
-
+
+
+
@@ -48,16 +48,16 @@ export function StepUpdates() { {/* Ghosted window body, just enough to read as the app. */}
-
-
-
-
+
+
+
+
-
+
{Array.from({ length: 5 }).map((_, i) => ( -
+
))}
diff --git a/src/components/onboarding/StepViews.tsx b/src/components/onboarding/StepViews.tsx index 32f633d..76c2ad4 100644 --- a/src/components/onboarding/StepViews.tsx +++ b/src/components/onboarding/StepViews.tsx @@ -22,7 +22,7 @@ function ExplorePreview() { { size: 16, x: 70, y: 44, i: 6 }, ]; return ( -
+
{blobs.map((blob, idx) => (
+
{[2024, 2023].map((year, row) => (
{year} @@ -51,7 +51,7 @@ function TimelinePreview() { function DuplicatesPreview() { return ( -
+
@@ -69,7 +69,7 @@ export function StepViews() {

Beyond the main grid, the sidebar switches between three more ways to look at your library:

-
+
s.ffmpegStatus); const ffmpegProgress = useGalleryStore((s) => s.ffmpegProgress); @@ -10,7 +56,7 @@ export function FfmpegStatusRow() { if (ffmpegStatus === "installed") { return (
- +
@@ -27,14 +73,14 @@ export function FfmpegStatusRow() {

Media engine download failed

-

{ffmpegError}

+

{ffmpegError}

You can keep going — photos work without it. Video thumbnails and metadata will start automatically once the download succeeds.

+ ); + })} +
+

First-time setup

-
+
diff --git a/src/components/onboarding/fakes.tsx b/src/components/onboarding/fakes.tsx index 873ed62..19e569d 100644 --- a/src/components/onboarding/fakes.tsx +++ b/src/components/onboarding/fakes.tsx @@ -82,7 +82,7 @@ export function FakeTile({ className?: string; }) { return ( -
+
{loaded ? ( ) : ( @@ -116,16 +116,16 @@ export function FakeTile({ export function FakeStageTag({ label, state }: { label: string; state: "active" | "done" | "waiting" }) { const className = state === "active" - ? "bg-white/5 text-gray-300" + ? "bg-gray-900 text-gray-300 light-theme:bg-gray-900 light-theme:text-gray-300" : state === "done" - ? "bg-emerald-500/10 text-emerald-400" - : "bg-white/4 text-gray-600"; + ? "bg-emerald-500/10 text-emerald-400 light-theme:bg-emerald-100 light-theme:text-emerald-700" + : "bg-gray-900/60 text-gray-600 light-theme:bg-gray-800 light-theme:text-gray-500"; return {label}; } export function FakeProgressBar({ fraction, className = "" }: { fraction: number | null; className?: string }) { return ( -
+
{fraction === null ? (
) : ( @@ -143,7 +143,7 @@ export function ReplayButton({ onClick, label = "Replay" }: { onClick: () => voi