{"record":{"id":"70dcc9d896279017","repo":"remotion-dev/remotion","slug":"name-must-be-a-number-number-tuple-70dcc9","errorCode":null,"errorMessage":"\"${name}\" must be a [number, number] tuple","messagePattern":"\"(.+?)\" must be a \\[number, number\\] tuple","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/effects/src/linear-gradient-tint.ts","lineNumber":136,"sourceCode":"const resolve = (p: LinearGradientTintParams): LinearGradientTintResolved => ({\n\tstart: [...(p.start ?? DEFAULT_START)] as LinearGradientTintUvCoordinate,\n\tend: [...(p.end ?? DEFAULT_END)] as LinearGradientTintUvCoordinate,\n\tstartColor: p.startColor ?? DEFAULT_START_COLOR,\n\tendColor: p.endColor ?? DEFAULT_END_COLOR,\n\tamount: p.amount ?? DEFAULT_AMOUNT,\n});\n\nconst assertOptionalUvCoordinate = (value: unknown, name: string): void => {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length !== 2 ||\n\t\tvalue.some((item) => typeof item !== 'number' || !Number.isFinite(item))\n\t) {\n\t\tthrow new TypeError(`\"${name}\" must be a [number, number] tuple`);\n\t}\n};\n\nconst validateLinearGradientTintParams = (\n\tparams: LinearGradientTintParams,\n): void => {\n\tassertEffectParamsObject(params, 'Linear gradient tint');\n\tassertOptionalUvCoordinate(params.start, 'start');\n\tassertOptionalUvCoordinate(params.end, 'end');\n\tassertOptionalColor(params.startColor, 'startColor');\n\tassertOptionalColor(params.endColor, 'endColor');\n\tassertOptionalFiniteNumber(params.amount, 'amount');\n\tvalidateUnitInterval(resolve(params).amount, 'amount');\n};\n\nconst VERTEX_SHADER = /* glsl */ `#version 300 es\nin vec2 aPos;\nin vec2 aUv;","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/linear-gradient-tint.ts#L118-L154","documentation":"Thrown by linearGradientTint when `start` or `end` is provided but is not an array of exactly two finite numbers. These are UV coordinates in [0,1] space defining the gradient endpoints; `undefined` is allowed (the param is optional), but any other non-tuple value is rejected.","triggerScenarios":"Passing `start: [0.5]` (length 1), `start: [0, 0, 0]` (length 3), `start: {x:0,y:0}`, `start: ['0','1']` (strings), `start: [0, NaN]`, or `start: [0, Infinity]`. The guard requires a 2-element array where both entries are finite numbers.","commonSituations":"Mixing up pixel coordinates and UV coordinates; passing a Vec2-like object instead of a tuple; deserializing from JSON where numbers became strings; using `[width/2, height/2]` (pixel-space) instead of `[0.5, 0.5]`.","solutions":["Pass UV (0..1) tuples: `start: [0, 0.5]`, `end: [1, 0.5]`.","Convert pixel coords: `start: [px / width, py / height]`.","Validate before calling: ensure both elements are numbers and finite.","Omit `start`/`end` to accept the documented defaults."],"exampleFix":"// before\nlinearGradientTint({ start: [x, y], end: [w, h] }); // pixel space\n\n// after\nlinearGradientTint({ start: [x / w, y / h], end: [1, 0.5] });","handlingStrategy":"type-guard","validationCode":"const isUvTuple = (v: unknown): v is [number, number] =>\n  Array.isArray(v) &&\n  v.length === 2 &&\n  v.every((x) => typeof x === 'number' && Number.isFinite(x));\n\nconst start = isUvTuple(userStart) ? userStart : undefined;\nlinearGradientTint(start === undefined ? {} : { start });","typeGuard":"const isUvTuple = (v: unknown): v is [number, number] =>\n  Array.isArray(v) &&\n  v.length === 2 &&\n  v.every((x) => typeof x === 'number' && Number.isFinite(x));","tryCatchPattern":null,"preventionTips":["Always pass UV ([0,1]) coordinates, never pixel coordinates.","Validate the tuple shape before calling; omit the prop to use defaults.","When deserializing from JSON, coerce both elements to Number and check finiteness."],"tags":["validation","linear-gradient-tint","effects","api-misuse"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}