diff --git a/src/assets/onboarding/alpinelake.webp b/src/assets/onboarding/alpinelake.webp new file mode 100644 index 0000000..2a882da Binary files /dev/null and b/src/assets/onboarding/alpinelake.webp differ diff --git a/src/assets/onboarding/architecture.webp b/src/assets/onboarding/architecture.webp new file mode 100644 index 0000000..85ab218 Binary files /dev/null and b/src/assets/onboarding/architecture.webp differ diff --git a/src/assets/onboarding/balloon.webp b/src/assets/onboarding/balloon.webp new file mode 100644 index 0000000..d72000e Binary files /dev/null and b/src/assets/onboarding/balloon.webp differ diff --git a/src/assets/onboarding/beach.webp b/src/assets/onboarding/beach.webp new file mode 100644 index 0000000..bbb23ea Binary files /dev/null and b/src/assets/onboarding/beach.webp differ diff --git a/src/assets/onboarding/cat.webp b/src/assets/onboarding/cat.webp new file mode 100644 index 0000000..0971559 Binary files /dev/null and b/src/assets/onboarding/cat.webp differ diff --git a/src/assets/onboarding/citynight.webp b/src/assets/onboarding/citynight.webp new file mode 100644 index 0000000..4101a4f Binary files /dev/null and b/src/assets/onboarding/citynight.webp differ diff --git a/src/assets/onboarding/cozy.webp b/src/assets/onboarding/cozy.webp new file mode 100644 index 0000000..3fb0564 Binary files /dev/null and b/src/assets/onboarding/cozy.webp differ diff --git a/src/assets/onboarding/dunes.webp b/src/assets/onboarding/dunes.webp new file mode 100644 index 0000000..c02e5cf Binary files /dev/null and b/src/assets/onboarding/dunes.webp differ diff --git a/src/assets/onboarding/flower.webp b/src/assets/onboarding/flower.webp new file mode 100644 index 0000000..323a1b8 Binary files /dev/null and b/src/assets/onboarding/flower.webp differ diff --git a/src/assets/onboarding/forest.webp b/src/assets/onboarding/forest.webp new file mode 100644 index 0000000..55031d0 Binary files /dev/null and b/src/assets/onboarding/forest.webp differ diff --git a/src/assets/onboarding/landscape1.webp b/src/assets/onboarding/landscape1.webp new file mode 100644 index 0000000..912187e Binary files /dev/null and b/src/assets/onboarding/landscape1.webp differ diff --git a/src/assets/onboarding/landscape2.webp b/src/assets/onboarding/landscape2.webp new file mode 100644 index 0000000..6767ac4 Binary files /dev/null and b/src/assets/onboarding/landscape2.webp differ diff --git a/src/assets/onboarding/sunset.webp b/src/assets/onboarding/sunset.webp new file mode 100644 index 0000000..7d159d9 Binary files /dev/null and b/src/assets/onboarding/sunset.webp differ diff --git a/src/components/onboarding/StepSearchDemo.tsx b/src/components/onboarding/StepSearchDemo.tsx index 57af0c8..926ba54 100644 --- a/src/components/onboarding/StepSearchDemo.tsx +++ b/src/components/onboarding/StepSearchDemo.tsx @@ -1,24 +1,24 @@ import { useEffect, useState } from "react"; -import { FakeTile } from "./fakes"; +import { SEARCH_RESULTS } from "./fakes"; const DEMOS = [ { query: "beach-day_042.jpg", mode: "Filename", description: "Plain text matches file names — the default, instant search.", - tiles: [2, 5, 0], + results: SEARCH_RESULTS.filename, }, { query: "/s golden sunset over water", mode: "Semantic", description: "Describe what's in the picture. Visual embeddings find matches even when filenames say nothing.", - tiles: [1, 7, 5], + results: SEARCH_RESULTS.semantic, }, { query: "/t landscape", mode: "Tags", description: "Search by AI or manual tags. Autocomplete suggests tags as you type.", - tiles: [4, 2, 6], + results: SEARCH_RESULTS.tags, }, ] as const; @@ -69,9 +69,11 @@ export function StepSearchDemo() { {/* Fake results */} -
- {demo.tiles.map((tileIndex, i) => ( - +
+ {demo.results.map((src, i) => ( +
+ +
))}
diff --git a/src/components/onboarding/fakes.tsx b/src/components/onboarding/fakes.tsx index e0d147f..c3e2896 100644 --- a/src/components/onboarding/fakes.tsx +++ b/src/components/onboarding/fakes.tsx @@ -1,7 +1,51 @@ // Shared placeholder primitives for the onboarding tour. Everything here is -// deliberately fake — gradient stand-ins for media, looping demo progress — -// so new users see the real UI's shapes before their own library exists. +// deliberately fake — rights-clean demo stills (generated, owned), looping +// demo progress — so new users see the real UI's shapes before their own +// library exists. +import sunset from "../../assets/onboarding/sunset.webp"; +import beach from "../../assets/onboarding/beach.webp"; +import landscape1 from "../../assets/onboarding/landscape1.webp"; +import landscape2 from "../../assets/onboarding/landscape2.webp"; +import forest from "../../assets/onboarding/forest.webp"; +import citynight from "../../assets/onboarding/citynight.webp"; +import flower from "../../assets/onboarding/flower.webp"; +import alpinelake from "../../assets/onboarding/alpinelake.webp"; +import dunes from "../../assets/onboarding/dunes.webp"; +import cozy from "../../assets/onboarding/cozy.webp"; +import cat from "../../assets/onboarding/cat.webp"; +import balloon from "../../assets/onboarding/balloon.webp"; +import architecture from "../../assets/onboarding/architecture.webp"; +// Ordered for grid variety: adjacent indices are visually distinct. +const FAKE_IMAGES = [ + sunset, + cozy, + landscape1, + citynight, + flower, + dunes, + alpinelake, + cat, + forest, + balloon, + landscape2, + beach, + architecture, +]; + +export function fakeImage(index: number): string { + return FAKE_IMAGES[index % FAKE_IMAGES.length]; +} + +// Curated result sets so each search demo returns thematically right images. +export const SEARCH_RESULTS = { + filename: [beach, dunes, sunset], // "beach-day_042.jpg" + semantic: [sunset, alpinelake, beach], // "golden sunset over water" + tags: [landscape1, landscape2, forest], // "landscape" +} as const; + +// Abstract gradient blobs/ticks for the Explore & Timeline mini-previews, +// where small non-photographic shapes read more clearly than tiny stills. const TILE_GRADIENTS = [ "from-sky-900/70 via-slate-800 to-slate-900", "from-amber-900/60 via-stone-800 to-stone-900", @@ -35,7 +79,7 @@ export function FakeTile({ return (
{loaded ? ( -
+ ) : (
)}