From 55906f9d3dbeace0c7bf42dc19682251bf05059a Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 28 Nov 2025 00:29:44 +0900 Subject: [PATCH] =?UTF-8?q?CI=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/image/[id]/route.ts | 32 ++++------ src/app/editor/forms/FormControllerPanel.tsx | 60 +++++++++++++++++++ .../editor/components/PublicPageRenderer.tsx | 1 + tests/e2e/editor.spec.ts | 14 +++-- tests/e2e/preview.spec.ts | 38 ++++++------ uploads/1ed86c1d-6e01-4059-be10-890688664385 | 1 + uploads/1f911050-34ce-4426-92cc-29feb25ff6aa | 1 + uploads/238b52e7-d648-42c4-b0c8-ab577b199e3c | 1 + uploads/4a87a738-ebd0-49c6-959e-14ab4f1215f5 | 1 + uploads/8a52ffab-ad2b-4619-98f6-3b585f116351 | 1 + uploads/95d863f5-c6fb-46cd-83a7-a8fa098a2089 | 1 + uploads/a1e7e99c-3a45-42fa-909c-714ffe0e33b3 | 1 + uploads/ba9d40cb-ff52-4a71-9101-59bdd4bf9b64 | 1 + uploads/c9353261-05c5-43af-b5d2-5815d3fe5a5e | 1 + uploads/dcd3a3ae-8572-4e07-91e1-282ec59407c9 | 1 + 15 files changed, 112 insertions(+), 43 deletions(-) create mode 100644 uploads/1ed86c1d-6e01-4059-be10-890688664385 create mode 100644 uploads/1f911050-34ce-4426-92cc-29feb25ff6aa create mode 100644 uploads/238b52e7-d648-42c4-b0c8-ab577b199e3c create mode 100644 uploads/4a87a738-ebd0-49c6-959e-14ab4f1215f5 create mode 100644 uploads/8a52ffab-ad2b-4619-98f6-3b585f116351 create mode 100644 uploads/95d863f5-c6fb-46cd-83a7-a8fa098a2089 create mode 100644 uploads/a1e7e99c-3a45-42fa-909c-714ffe0e33b3 create mode 100644 uploads/ba9d40cb-ff52-4a71-9101-59bdd4bf9b64 create mode 100644 uploads/c9353261-05c5-43af-b5d2-5815d3fe5a5e create mode 100644 uploads/dcd3a3ae-8572-4e07-91e1-282ec59407c9 diff --git a/src/app/api/image/[id]/route.ts b/src/app/api/image/[id]/route.ts index 5dff221..83d3ce6 100644 --- a/src/app/api/image/[id]/route.ts +++ b/src/app/api/image/[id]/route.ts @@ -14,27 +14,21 @@ try { prisma = null; } -interface Params { - params: { - id: string; - }; -} +export async function GET(request: Request) { + // Next.js 15 이후 params 가 Promise 로 전달되는 경고를 피하기 위해, + // 동적 세그먼트는 request.url 의 path 에서 직접 파싱한다. + let id: string | undefined; -export async function GET(request: Request, ctx: Params) { - // Next.js 가 params 를 항상 보장하지 않는 상황을 대비해, URL 경로에서 id 를 보완적으로 파싱한다. - let id: string | undefined = ctx?.params?.id; - if (!id) { - try { - const url = new URL(request.url); - const segments = url.pathname.split("/").filter(Boolean); - // [..., "api", "image", ":id"] 형태를 기대한다. - const last = segments[segments.length - 1]; - if (last && last !== "image") { - id = last; - } - } catch { - // URL 파싱 실패 시에는 그대로 둔다. + try { + const url = new URL(request.url); + const segments = url.pathname.split("/").filter(Boolean); + // [..., "api", "image", ":id"] 형태를 기대한다. + const last = segments[segments.length - 1]; + if (last && last !== "image") { + id = last; } + } catch { + // URL 파싱 실패 시에는 그대로 둔다. } if (!id) { diff --git a/src/app/editor/forms/FormControllerPanel.tsx b/src/app/editor/forms/FormControllerPanel.tsx index a3d5996..970c058 100644 --- a/src/app/editor/forms/FormControllerPanel.tsx +++ b/src/app/editor/forms/FormControllerPanel.tsx @@ -1,6 +1,7 @@ "use client"; import type { Block, ButtonBlockProps, FormBlockProps } from "@/features/editor/state/editorStore"; +import { NumericPropertyControl } from "@/features/editor/components/NumericPropertyControl"; interface FormControllerPanelProps { block: Block; // type === "form" @@ -129,6 +130,65 @@ export function FormControllerPanel({ block, blocks, selectedBlockId, updateBloc )} +
+

폼 레이아웃

+ + {(formProps.formWidthMode ?? "auto") === "fixed" && ( + + updateBlock(selectedBlockId, { + formWidthPx: v, + } as any) + } + /> + )} + + updateBlock(selectedBlockId, { + marginYPx: v, + } as any) + } + /> +
+

폼 메시지