fix: clamp page margin values to [0, 100] to prevent crash on paste

When a user pastes a large value (e.g. '1224') into the margin
input field, the value bypasses the HTML <input type='number' max='100'>
and gets stored directly into resume metadata. The PDF renderer then
cannot handle an absurdly large margin, crashing the builder entirely.

This fix adds two layers of defense:
1. Zod schema: add .max(100) to marginX and marginY in pageSchema,
   so any value > 100 is rejected at the validation level.
2. Input handler: clamp the onChange value to [0, 100] so the input
   never even temporarily stores an out-of-range value.

The same pattern can apply to any other numeric inputs that need
a reasonable upper bound.

Fixes: #3263
This commit is contained in:
Emran-Y
2026-07-29 15:57:32 +00:00
committed by Cursor Agent
parent b303b89758
commit 3e2c991344
2 changed files with 14 additions and 8 deletions
+2 -2
View File
@@ -444,8 +444,8 @@ export const layoutSchema = z.object({
export const pageSchema = z.object({
gapX: z.number().min(0).describe("The horizontal gap between the sections of the page, defined in points (pt)."),
gapY: z.number().min(0).describe("The vertical gap between the sections of the page, defined in points (pt)."),
marginX: z.number().min(0).describe("The horizontal margin of the page, defined in points (pt)."),
marginY: z.number().min(0).describe("The vertical margin of the page, defined in points (pt)."),
marginX: z.number().min(0).max(100).describe("The horizontal margin of the page, defined in points (pt)."),
marginY: z.number().min(0).max(100).describe("The vertical margin of the page, defined in points (pt)."),
format: z
.enum(["a4", "letter", "free-form"])
.describe("The format of the page. Can be 'a4', 'letter', or 'free-form'.")