From c236b0f62122e943c8af45f1fe7cecdf04a4a328 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Thu, 20 Aug 2026 14:20:16 +0330 Subject: [PATCH] Add display frames and improve create-page page management. Store phone/tablet/photo-frame shells with catalogs, append pages from extra images or PDFs, and reorder drafts with drag-and-drop. Co-authored-by: Cursor --- client/src/api.ts | 4 +- client/src/components/CatalogShell.vue | 38 + client/src/components/CatalogViewer.vue | 90 ++- client/src/components/FrameSelect.vue | 29 + client/src/components/PageList.vue | 71 +- .../src/components/effects/CssPageEffect.vue | 24 +- .../src/components/effects/MagazineEffect.vue | 81 ++- .../src/components/effects/ScrollEffect.vue | 19 +- client/src/constants.ts | 11 +- client/src/pages/CreatePage.vue | 100 +-- client/src/pages/ViewPage.vue | 3 +- client/src/styles.css | 653 +++++++++++++++++- docs/PROJECT.md | 8 +- package.json | 5 +- scripts/migrate-db.ts | 6 + server/catalog-repo.ts | 13 +- server/db.ts | 5 + server/errors.ts | 1 + server/routes/catalogs.ts | 9 + server/schema.ts | 1 + shared/types.ts | 16 + tests/server/catalog-repo.test.ts | 1 + tests/server/catalogs.test.ts | 15 + 23 files changed, 1069 insertions(+), 134 deletions(-) create mode 100644 client/src/components/CatalogShell.vue create mode 100644 client/src/components/FrameSelect.vue create mode 100644 scripts/migrate-db.ts diff --git a/client/src/api.ts b/client/src/api.ts index 6d1bfd0..5245521 100644 --- a/client/src/api.ts +++ b/client/src/api.ts @@ -1,4 +1,4 @@ -import type { CatalogPublic, CreateCatalogResponse, EffectId } from "@shared/types"; +import type { CatalogPublic, CreateCatalogResponse, EffectId, FrameId } from "@shared/types"; async function readError(res: Response): Promise { try { @@ -14,10 +14,12 @@ export async function createCatalog(input: { effect: EffectId; pages: Blob[]; flipMs: number; + frame: FrameId; }): Promise { const data = new FormData(); data.set("title", input.title); data.set("effect", input.effect); + data.set("frame", input.frame); data.set("flipMs", String(input.flipMs)); input.pages.forEach((page, i) => { data.append("pages", page, `page-${String(i + 1).padStart(3, "0")}.jpg`); diff --git a/client/src/components/CatalogShell.vue b/client/src/components/CatalogShell.vue new file mode 100644 index 0000000..9b6e5a1 --- /dev/null +++ b/client/src/components/CatalogShell.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/client/src/components/CatalogViewer.vue b/client/src/components/CatalogViewer.vue index 996cfb4..1139a50 100644 --- a/client/src/components/CatalogViewer.vue +++ b/client/src/components/CatalogViewer.vue @@ -1,10 +1,11 @@