Drop your photos…
diff --git a/apps/web/src/hooks/use-add-photos.ts b/apps/web/src/hooks/use-add-photos.ts
new file mode 100644
index 0000000..b30aecf
--- /dev/null
+++ b/apps/web/src/hooks/use-add-photos.ts
@@ -0,0 +1,26 @@
+import { type ChangeEvent, useCallback, useRef } from "react";
+
+import { usePhotoStore } from "@/stores/photo-store";
+
+/**
+ * Shared wiring for every "add photos" affordance (sidebar button, hero CTA,
+ * mobile FAB, filmstrip tile): a hidden file input plus an `open()` trigger.
+ * Render the input with {@link PHOTO_ACCEPT} and spread `inputRef`/`onChange`.
+ */
+export function useAddPhotos() {
+ const addFiles = usePhotoStore((state) => state.addFiles);
+ const inputRef = useRef(null);
+
+ const open = useCallback(() => inputRef.current?.click(), []);
+
+ const onChange = useCallback(
+ (event: ChangeEvent) => {
+ const files = Array.from(event.target.files ?? []);
+ if (files.length > 0) addFiles(files);
+ event.target.value = "";
+ },
+ [addFiles],
+ );
+
+ return { inputRef, open, onChange };
+}
diff --git a/apps/web/src/lib/upload.ts b/apps/web/src/lib/upload.ts
new file mode 100644
index 0000000..81f4aa2
--- /dev/null
+++ b/apps/web/src/lib/upload.ts
@@ -0,0 +1,3 @@
+/** Image types the photo picker and drop targets accept. */
+export const PHOTO_ACCEPT =
+ "image/jpeg,image/png,image/webp,image/heic,image/heif,.jpg,.jpeg,.png,.webp,.heic,.heif";
diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx
index a922819..e2f0bf8 100644
--- a/apps/web/src/routes/index.tsx
+++ b/apps/web/src/routes/index.tsx
@@ -1,16 +1,22 @@
import { createFileRoute } from '@tanstack/react-router'
import { A4Preview } from '@/components/a4-preview'
+import { AddPhotosFab } from '@/components/add-photos-fab'
import { OptionsPanel } from '@/components/options-panel'
+import { PhotoFilmstrip } from '@/components/photo-filmstrip'
import { PhotoSidebar } from '@/components/photo-sidebar'
import { ProjectControls } from '@/components/project-controls'
import { ThemeToggle } from '@/components/theme-toggle'
+import { cn } from '@/lib/utils'
+import { usePhotoStore } from '@/stores/photo-store'
export const Route = createFileRoute('/')({
component: Home,
})
function Home() {
+ const hasPhotos = usePhotoStore((state) => state.photos.length > 0)
+
return (
@@ -28,8 +34,16 @@ function Home() {