{"record":{"id":"5680cd4a59de2453","repo":"remotion-dev/remotion","slug":"blur-passed-to-blurslide-must-be-a-finite-number","errorCode":null,"errorMessage":"blur passed to blurSlide() must be a finite number, received ${blur}","messagePattern":"blur passed to blurSlide\\(\\) must be a finite number, received (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/transitions/src/presentations/blur-slide.tsx","lineNumber":196,"sourceCode":"\t\tcase 'from-bottom':\n\t\t\treturn [0, -1];\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid direction: ${direction}`);\n\t}\n};\n\nconst validateProps = (props: BlurSlideProps) => {\n\tconst direction = props.direction ?? DEFAULT_DIRECTION;\n\tconst blur = props.blur ?? DEFAULT_BLUR;\n\n\tif (!VALID_DIRECTIONS.includes(direction)) {\n\t\tthrow new TypeError(\n\t\t\t`direction passed to blurSlide() must be one of ${VALID_DIRECTIONS.map((d) => `\"${d}\"`).join(', ')}, received ${JSON.stringify(direction)}`,\n\t\t);\n\t}\n\n\tif (typeof blur !== 'number' || !Number.isFinite(blur)) {\n\t\tthrow new TypeError(\n\t\t\t`blur passed to blurSlide() must be a finite number, received ${blur}`,\n\t\t);\n\t}\n\n\tif (blur < 0) {\n\t\tthrow new TypeError(\n\t\t\t`blur passed to blurSlide() must be greater than or equal to 0, received ${blur}`,\n\t\t);\n\t}\n};\n\nexport const blurSlideShader = (\n\tcanvas: OffscreenCanvas,\n): ReturnType<HtmlInCanvasShader<BlurSlideProps>> => {\n\tconst gl = canvas.getContext('webgl2', {premultipliedAlpha: true});\n\tif (!gl) {\n\t\tthrow new Error('Failed to create WebGL2 context');\n\t}","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/remotion-dev/remotion/blob/b2f4e34732f3c6c222ea029413e22dc402218cd7/packages/transitions/src/presentations/blur-slide.tsx#L178-L214","documentation":"validateProps throws a TypeError when the blur prop is not a finite number (NaN, Infinity, wrong type, or null/undefined coerced unexpectedly). blur must be a plain finite number to be used in the shader.","triggerScenarios":"blurSlide({blur: Infinity}), blur: NaN (e.g. from a failed parseFloat), blur: '10' as any, or blur computed from division by zero.","commonSituations":"Blur values parsed from user input or config files without validation; arithmetic producing NaN/Infinity; JSON configs containing null.","solutions":["Pass a finite number, e.g. blur: 20","Guard with Number.isFinite(blur) before calling blurSlide()","Fix the upstream computation that yields NaN/Infinity","Omit blur to use DEFAULT_BLUR"],"exampleFix":"// before\nblurSlide({blur: config.blurAmount}) // could be undefined/NaN\n// after\nconst blur = Number(config.blurAmount);\nblurSlide({blur: Number.isFinite(blur) ? blur : 20})","handlingStrategy":"validation","validationCode":"if (typeof blur !== 'number' || !Number.isFinite(blur)) {\n  throw new TypeError('blur must be a finite number');\n}","typeGuard":"const isFiniteNumber = (v: unknown): v is number =>\n  typeof v === 'number' && Number.isFinite(v);","tryCatchPattern":"try {\n  presentation = blurSlide({blur: rawBlur as any});\n} catch (err) {\n  if (err instanceof TypeError && err.message.includes('blur passed to blurSlide()')) {\n    presentation = blurSlide({}); // default blur\n  }\n}","preventionTips":["Validate parsed numbers with Number.isFinite before use","Avoid arithmetic that can yield NaN/Infinity when deriving blur","Omit blur to use the library default","Coerce config values with Number() and check the result"],"tags":["props","validation","typescript"],"backgroundTag":"invalid-argument-value","analyzedSha":"b2f4e34732f3c6c222ea029413e22dc402218cd7","analyzedAt":"2026-09-09T13:27:51.281Z","contentChangedAt":"2026-09-09T13:27:51.281Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}