From f55e584e34ddcf3956c7a1a8a7314e65760273de Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 29 Jul 2026 15:58:32 +0000 Subject: [PATCH] fix: address review feedback for margin input clamping Move clamp helpers above PageSectionForm for consistent scope/indentation, and only persist finite numeric values so empty or invalid input cannot enter resume metadata. Co-authored-by: Amruth Pillai --- .../-sidebar/right/sections/page.tsx | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx index d5bb2fbc9..a7bd21d69 100644 --- a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx +++ b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx @@ -29,6 +29,11 @@ const formSchema = pageSchema; type FormValues = z.infer; +const CLAMP_MIN = 0; +const CLAMP_MAX = 100; + +const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max); + function PageSectionForm() { const resume = useResume(); const page = resume?.data.metadata.page; @@ -53,16 +58,11 @@ function PageSectionForm() { persist({ ...form.state.values, [name]: value }); }; - const CLAMP_MIN = 0; -const CLAMP_MAX = 100; - -const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max); - -const pageNumberFields = [ - { name: "marginX" as const, label: Margin (Horizontal), min: CLAMP_MIN, max: CLAMP_MAX }, - { name: "marginY" as const, label: Margin (Vertical), min: CLAMP_MIN, max: CLAMP_MAX }, - { name: "gapX" as const, label: Spacing (Horizontal), min: 0, max: undefined }, - { name: "gapY" as const, label: Spacing (Vertical), min: 0, max: undefined }, + const pageNumberFields = [ + { name: "marginX" as const, label: Margin (Horizontal), min: CLAMP_MIN, max: CLAMP_MAX }, + { name: "marginY" as const, label: Margin (Vertical), min: CLAMP_MIN, max: CLAMP_MAX }, + { name: "gapX" as const, label: Spacing (Horizontal), min: 0, max: undefined }, + { name: "gapY" as const, label: Spacing (Vertical), min: 0, max: undefined }, ]; const pageSwitchFields = [ @@ -156,8 +156,13 @@ const pageNumberFields = [ onBlur={field.handleBlur} onChange={(e) => { const v = e.target.value; - const raw = v === "" ? ("" as unknown as number) : Number(v); - const num = max !== undefined && typeof raw === "number" ? clamp(raw, min ?? 0, max) : raw; + // Ignore transient empty/invalid input so resume metadata stays numeric + if (v === "") return; + + const raw = Number(v); + if (!Number.isFinite(raw)) return; + + const num = max !== undefined ? clamp(raw, min ?? 0, max) : Math.max(raw, min ?? 0); field.handleChange(num); handleAutoSave(name, num); }}