@remotion/effects 4.0.475 → 4.0.476

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -115,6 +115,17 @@ var DEFAULT_GAP = 0;
115
115
  var DEFAULT_OFFSET = 0;
116
116
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
117
117
  var ringsSchema = {
118
+ colors: {
119
+ type: "array",
120
+ item: {
121
+ type: "color"
122
+ },
123
+ default: DEFAULT_COLORS,
124
+ minLength: 2,
125
+ newItemDefault: "#ff0000",
126
+ description: "Colors",
127
+ keyframable: false
128
+ },
118
129
  center: {
119
130
  type: "uv-coordinate",
120
131
  min: 0,
@@ -505,6 +516,17 @@ var DEFAULT_AMPLITUDE = 40;
505
516
  var DEFAULT_WAVELENGTH = 160;
506
517
  var DEFAULT_MASK_TO_SOURCE_ALPHA2 = false;
507
518
  var zigzagSchema = {
519
+ colors: {
520
+ type: "array",
521
+ item: {
522
+ type: "color"
523
+ },
524
+ default: DEFAULT_COLORS2,
525
+ minLength: 2,
526
+ newItemDefault: "#ff0000",
527
+ description: "Colors",
528
+ keyframable: false
529
+ },
508
530
  direction: {
509
531
  type: "enum",
510
532
  variants: {
@@ -117,6 +117,17 @@ var DEFAULT_ANGLE = 0;
117
117
  var DEFAULT_OFFSET = 0;
118
118
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
119
119
  var linesSchema = {
120
+ colors: {
121
+ type: "array",
122
+ item: {
123
+ type: "color"
124
+ },
125
+ default: DEFAULT_COLORS,
126
+ minLength: 2,
127
+ newItemDefault: "#ff0000",
128
+ description: "Colors",
129
+ keyframable: false
130
+ },
120
131
  direction: {
121
132
  type: "enum",
122
133
  variants: {
@@ -115,6 +115,17 @@ var DEFAULT_GAP = 0;
115
115
  var DEFAULT_OFFSET = 0;
116
116
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
117
117
  var ringsSchema = {
118
+ colors: {
119
+ type: "array",
120
+ item: {
121
+ type: "color"
122
+ },
123
+ default: DEFAULT_COLORS,
124
+ minLength: 2,
125
+ newItemDefault: "#ff0000",
126
+ description: "Colors",
127
+ keyframable: false
128
+ },
118
129
  center: {
119
130
  type: "uv-coordinate",
120
131
  min: 0,
@@ -0,0 +1,317 @@
1
+ // src/tv-signal-off.ts
2
+ import { Internals } from "remotion";
3
+
4
+ // src/validate-effect-param.ts
5
+ var assertEffectParamsObject = (params, effectLabel) => {
6
+ if (params === null || typeof params !== "object") {
7
+ throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
8
+ }
9
+ };
10
+ var assertRequiredFiniteNumber = (value, name) => {
11
+ if (typeof value !== "number" || !Number.isFinite(value)) {
12
+ throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
13
+ }
14
+ };
15
+ var assertRequiredColor = (value, name) => {
16
+ if (typeof value !== "string" || value.length === 0) {
17
+ throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
18
+ }
19
+ };
20
+ var assertOptionalColor = (value, name) => {
21
+ if (value === undefined) {
22
+ return;
23
+ }
24
+ assertRequiredColor(value, name);
25
+ };
26
+ var assertOptionalBoolean = (value, name) => {
27
+ if (value === undefined) {
28
+ return;
29
+ }
30
+ if (typeof value !== "boolean") {
31
+ throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
32
+ }
33
+ };
34
+
35
+ // src/color-utils.ts
36
+ var DEFAULT_AMOUNT = 1;
37
+ var DEFAULT_BRIGHTNESS_AMOUNT = 0;
38
+ var DEFAULT_HUE_DEGREES = 0;
39
+ var colorAmountSchema = {
40
+ type: "number",
41
+ min: 0,
42
+ max: 1,
43
+ step: 0.01,
44
+ default: DEFAULT_AMOUNT,
45
+ description: "Amount",
46
+ hiddenFromList: false
47
+ };
48
+ var colorMultiplierSchema = {
49
+ type: "number",
50
+ min: 0,
51
+ step: 0.01,
52
+ default: DEFAULT_AMOUNT,
53
+ description: "Amount",
54
+ hiddenFromList: false
55
+ };
56
+ var brightnessAmountSchema = {
57
+ type: "number",
58
+ min: -1,
59
+ max: 1,
60
+ step: 0.01,
61
+ default: DEFAULT_BRIGHTNESS_AMOUNT,
62
+ description: "Amount",
63
+ hiddenFromList: false
64
+ };
65
+ var hueDegreesSchema = {
66
+ type: "rotation-degrees",
67
+ step: 1,
68
+ default: DEFAULT_HUE_DEGREES,
69
+ description: "Degrees"
70
+ };
71
+ var assertOptionalFiniteNumber = (value, name) => {
72
+ if (value === undefined) {
73
+ return;
74
+ }
75
+ assertRequiredFiniteNumber(value, name);
76
+ };
77
+ var validateUnitInterval = (value, name) => {
78
+ if (value < 0) {
79
+ throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
80
+ }
81
+ if (value > 1) {
82
+ throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
83
+ }
84
+ };
85
+ var validateNonNegative = (value, name) => {
86
+ if (value < 0) {
87
+ throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
88
+ }
89
+ };
90
+ var validateSignedUnitInterval = (value, name) => {
91
+ if (value < -1) {
92
+ throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
93
+ }
94
+ if (value > 1) {
95
+ throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
96
+ }
97
+ };
98
+ var clampColorChannel = (value) => {
99
+ return Math.max(0, Math.min(255, value));
100
+ };
101
+ var parseColorRgba = (ctx, color) => {
102
+ ctx.clearRect(0, 0, 1, 1);
103
+ ctx.fillStyle = color;
104
+ ctx.fillRect(0, 0, 1, 1);
105
+ const { data } = ctx.getImageData(0, 0, 1, 1);
106
+ return [data[0], data[1], data[2], data[3]];
107
+ };
108
+
109
+ // src/tv-signal-off.ts
110
+ var { createEffect, createWebGL2ContextError } = Internals;
111
+ var DEFAULT_AMOUNT2 = 1;
112
+ var tvSignalOffSchema = {
113
+ amount: {
114
+ type: "number",
115
+ min: 0,
116
+ max: 1,
117
+ step: 0.01,
118
+ default: DEFAULT_AMOUNT2,
119
+ description: "Amount",
120
+ hiddenFromList: false
121
+ }
122
+ };
123
+ var resolve = (params) => ({
124
+ amount: params.amount ?? DEFAULT_AMOUNT2
125
+ });
126
+ var validateTvSignalOffParams = (params) => {
127
+ assertEffectParamsObject(params, "TV signal off");
128
+ assertOptionalFiniteNumber(params.amount, "amount");
129
+ validateUnitInterval(params.amount ?? DEFAULT_AMOUNT2, "amount");
130
+ };
131
+ var VERTEX_SHADER = `#version 300 es
132
+ in vec2 aPos;
133
+ in vec2 aUv;
134
+ out vec2 vUv;
135
+
136
+ void main() {
137
+ vUv = aUv;
138
+ gl_Position = vec4(aPos, 0.0, 1.0);
139
+ }
140
+ `;
141
+ var FRAGMENT_SHADER = `#version 300 es
142
+ precision highp float;
143
+
144
+ in vec2 vUv;
145
+ out vec4 fragColor;
146
+
147
+ uniform sampler2D uSource;
148
+ uniform float uAmount;
149
+
150
+ vec3 topBar(float x) {
151
+ if (x < 1.0 / 7.0) return vec3(0.74);
152
+ if (x < 2.0 / 7.0) return vec3(1.0, 1.0, 0.0);
153
+ if (x < 3.0 / 7.0) return vec3(0.0, 1.0, 1.0);
154
+ if (x < 4.0 / 7.0) return vec3(0.0, 1.0, 0.0);
155
+ if (x < 5.0 / 7.0) return vec3(1.0, 0.0, 1.0);
156
+ if (x < 6.0 / 7.0) return vec3(1.0, 0.0, 0.0);
157
+ return vec3(0.0, 0.0, 1.0);
158
+ }
159
+
160
+ vec3 middleBar(float x) {
161
+ if (x < 1.0 / 7.0) return vec3(0.0, 0.0, 1.0);
162
+ if (x < 2.0 / 7.0) return vec3(0.0);
163
+ if (x < 3.0 / 7.0) return vec3(1.0, 0.0, 1.0);
164
+ if (x < 4.0 / 7.0) return vec3(0.0);
165
+ if (x < 5.0 / 7.0) return vec3(0.0, 1.0, 1.0);
166
+ if (x < 6.0 / 7.0) return vec3(0.0);
167
+ return vec3(0.74);
168
+ }
169
+
170
+ vec3 tvPattern(vec2 uv) {
171
+ if (uv.y < 0.64) {
172
+ return topBar(uv.x);
173
+ }
174
+
175
+ if (uv.y < 0.76) {
176
+ return middleBar(uv.x);
177
+ }
178
+
179
+ if (uv.y < 0.88) {
180
+ if (uv.x < 0.58) return vec3(1.0);
181
+ float ramp = smoothstep(0.58, 1.0, uv.x);
182
+ return vec3(1.0 - ramp);
183
+ }
184
+
185
+ if (uv.x < 0.58) {
186
+ float stepValue = floor(uv.x * 12.0) / 11.0;
187
+ return vec3(stepValue);
188
+ }
189
+
190
+ return vec3(0.0);
191
+ }
192
+
193
+ void main() {
194
+ vec4 color = texture(uSource, vUv);
195
+ vec3 sourceColor = color.a == 0.0 ? vec3(0.0) : color.rgb / color.a;
196
+ vec3 bars = tvPattern(vUv);
197
+ vec3 mixed = mix(sourceColor, bars, uAmount);
198
+
199
+ fragColor = vec4(mixed * color.a, color.a);
200
+ }
201
+ `;
202
+ var compileShader = (gl, type, source) => {
203
+ const shader = gl.createShader(type);
204
+ if (!shader) {
205
+ throw new Error("Failed to create shader");
206
+ }
207
+ gl.shaderSource(shader, source);
208
+ gl.compileShader(shader);
209
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
210
+ const info = gl.getShaderInfoLog(shader) ?? "Unknown shader compile error";
211
+ gl.deleteShader(shader);
212
+ throw new Error(info);
213
+ }
214
+ return shader;
215
+ };
216
+ var createProgram = (gl, vertexSource, fragmentSource) => {
217
+ const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
218
+ const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
219
+ const program = gl.createProgram();
220
+ if (!program) {
221
+ throw new Error("Failed to create program");
222
+ }
223
+ gl.attachShader(program, vertex);
224
+ gl.attachShader(program, fragment);
225
+ gl.linkProgram(program);
226
+ gl.deleteShader(vertex);
227
+ gl.deleteShader(fragment);
228
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
229
+ const info = gl.getProgramInfoLog(program) ?? "Unknown program link error";
230
+ gl.deleteProgram(program);
231
+ throw new Error(info);
232
+ }
233
+ return program;
234
+ };
235
+ var createTvSignalOffState = (gl, vertexSource, fragmentSource) => {
236
+ const program = createProgram(gl, vertexSource, fragmentSource);
237
+ const vao = gl.createVertexArray();
238
+ const vbo = gl.createBuffer();
239
+ const texture = gl.createTexture();
240
+ if (!vao || !vbo || !texture) {
241
+ throw new Error("Failed to create WebGL resources");
242
+ }
243
+ gl.bindVertexArray(vao);
244
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
245
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 0, 0, 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1]), gl.STATIC_DRAW);
246
+ const aPos = gl.getAttribLocation(program, "aPos");
247
+ const aUv = gl.getAttribLocation(program, "aUv");
248
+ gl.enableVertexAttribArray(aPos);
249
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
250
+ gl.enableVertexAttribArray(aUv);
251
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
252
+ gl.bindTexture(gl.TEXTURE_2D, texture);
253
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
254
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
255
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
256
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
257
+ return {
258
+ gl,
259
+ program,
260
+ vao,
261
+ vbo,
262
+ texture,
263
+ uSource: gl.getUniformLocation(program, "uSource"),
264
+ uAmount: gl.getUniformLocation(program, "uAmount")
265
+ };
266
+ };
267
+ var tvSignalOff = createEffect({
268
+ type: "remotion/tv-signal-off",
269
+ label: "tvSignalOff()",
270
+ documentationLink: "https://www.remotion.dev/docs/effects/tv-signal-off",
271
+ backend: "webgl2",
272
+ calculateKey: (params) => {
273
+ const resolved = resolve(params);
274
+ return `tv-signal-off-${resolved.amount}`;
275
+ },
276
+ setup: (target) => {
277
+ const gl = target.getContext("webgl2", {
278
+ premultipliedAlpha: true,
279
+ alpha: true,
280
+ preserveDrawingBuffer: true
281
+ });
282
+ if (!gl) {
283
+ throw createWebGL2ContextError("TV signal off effect");
284
+ }
285
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
286
+ return createTvSignalOffState(gl, VERTEX_SHADER, FRAGMENT_SHADER);
287
+ },
288
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
289
+ const resolved = resolve(params);
290
+ state.gl.viewport(0, 0, width, height);
291
+ state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
292
+ state.gl.activeTexture(state.gl.TEXTURE0);
293
+ state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
294
+ state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
295
+ state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
296
+ state.gl.useProgram(state.program);
297
+ if (state.uSource) {
298
+ state.gl.uniform1i(state.uSource, 0);
299
+ }
300
+ if (state.uAmount) {
301
+ state.gl.uniform1f(state.uAmount, resolved.amount);
302
+ }
303
+ state.gl.bindVertexArray(state.vao);
304
+ state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, 4);
305
+ },
306
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
307
+ gl.deleteTexture(texture);
308
+ gl.deleteBuffer(vbo);
309
+ gl.deleteProgram(program);
310
+ gl.deleteVertexArray(vao);
311
+ },
312
+ schema: tvSignalOffSchema,
313
+ validateParams: validateTvSignalOffParams
314
+ });
315
+ export {
316
+ tvSignalOff
317
+ };
@@ -120,6 +120,17 @@ var DEFAULT_WAVELENGTH = 160;
120
120
  var DEFAULT_PHASE = 0;
121
121
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
122
122
  var wavesSchema = {
123
+ colors: {
124
+ type: "array",
125
+ item: {
126
+ type: "color"
127
+ },
128
+ default: DEFAULT_COLORS,
129
+ minLength: 2,
130
+ newItemDefault: "#ff0000",
131
+ description: "Colors",
132
+ keyframable: false
133
+ },
123
134
  direction: {
124
135
  type: "enum",
125
136
  variants: {
@@ -119,6 +119,17 @@ var DEFAULT_AMPLITUDE = 40;
119
119
  var DEFAULT_WAVELENGTH = 160;
120
120
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
121
121
  var zigzagSchema = {
122
+ colors: {
123
+ type: "array",
124
+ item: {
125
+ type: "color"
126
+ },
127
+ default: DEFAULT_COLORS,
128
+ minLength: 2,
129
+ newItemDefault: "#ff0000",
130
+ description: "Colors",
131
+ keyframable: false
132
+ },
122
133
  direction: {
123
134
  type: "enum",
124
135
  variants: {
package/dist/lines.d.ts CHANGED
@@ -1,5 +1,16 @@
1
1
  declare const LINE_DIRECTIONS: readonly ["horizontal", "vertical"];
2
2
  export declare const linesSchema: {
3
+ readonly colors: {
4
+ readonly type: "array";
5
+ readonly item: {
6
+ readonly type: "color";
7
+ };
8
+ readonly default: readonly ["#dff4ff", "#7cc6ff"];
9
+ readonly minLength: 2;
10
+ readonly newItemDefault: "#ff0000";
11
+ readonly description: "Colors";
12
+ readonly keyframable: false;
13
+ };
3
14
  readonly direction: {
4
15
  readonly type: "enum";
5
16
  readonly variants: {
package/dist/rings.d.ts CHANGED
@@ -1,4 +1,15 @@
1
1
  export declare const ringsSchema: {
2
+ readonly colors: {
3
+ readonly type: "array";
4
+ readonly item: {
5
+ readonly type: "color";
6
+ };
7
+ readonly default: readonly ["#dff4ff", "#7cc6ff"];
8
+ readonly minLength: 2;
9
+ readonly newItemDefault: "#ff0000";
10
+ readonly description: "Colors";
11
+ readonly keyframable: false;
12
+ };
2
13
  readonly center: {
3
14
  readonly type: "uv-coordinate";
4
15
  readonly min: 0;
@@ -0,0 +1,7 @@
1
+ export type TvSignalOffParams = {
2
+ /** Blend amount from `0` to `1`. Defaults to `1`. */
3
+ readonly amount?: number;
4
+ };
5
+ export declare const tvSignalOff: (params?: (TvSignalOffParams & {
6
+ readonly disabled?: boolean | undefined;
7
+ }) | undefined) => import("remotion").EffectDescriptor<unknown>;
package/dist/waves.d.ts CHANGED
@@ -1,5 +1,16 @@
1
1
  declare const WAVE_DIRECTIONS: readonly ["horizontal", "vertical"];
2
2
  export declare const wavesSchema: {
3
+ readonly colors: {
4
+ readonly type: "array";
5
+ readonly item: {
6
+ readonly type: "color";
7
+ };
8
+ readonly default: readonly ["#dff4ff", "#7cc6ff"];
9
+ readonly minLength: 2;
10
+ readonly newItemDefault: "#ff0000";
11
+ readonly description: "Colors";
12
+ readonly keyframable: false;
13
+ };
3
14
  readonly direction: {
4
15
  readonly type: "enum";
5
16
  readonly variants: {
package/dist/zigzag.d.ts CHANGED
@@ -1,5 +1,16 @@
1
1
  declare const ZIGZAG_DIRECTIONS: readonly ["horizontal", "vertical"];
2
2
  export declare const zigzagSchema: {
3
+ readonly colors: {
4
+ readonly type: "array";
5
+ readonly item: {
6
+ readonly type: "color";
7
+ };
8
+ readonly default: readonly ["#dff4ff", "#7cc6ff"];
9
+ readonly minLength: 2;
10
+ readonly newItemDefault: "#ff0000";
11
+ readonly description: "Colors";
12
+ readonly keyframable: false;
13
+ };
3
14
  readonly direction: {
4
15
  readonly type: "enum";
5
16
  readonly variants: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/effects",
3
- "version": "4.0.475",
3
+ "version": "4.0.476",
4
4
  "description": "Effects that can be applied to Remotion-based canvas components",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "url": "https://github.com/remotion-dev/remotion/issues"
27
27
  },
28
28
  "dependencies": {
29
- "remotion": "4.0.475"
29
+ "remotion": "4.0.476"
30
30
  },
31
31
  "exports": {
32
32
  ".": {
@@ -189,6 +189,11 @@
189
189
  "module": "./dist/esm/translate.mjs",
190
190
  "import": "./dist/esm/translate.mjs"
191
191
  },
192
+ "./tv-signal-off": {
193
+ "types": "./dist/tv-signal-off.d.ts",
194
+ "module": "./dist/esm/tv-signal-off.mjs",
195
+ "import": "./dist/esm/tv-signal-off.mjs"
196
+ },
192
197
  "./vignette": {
193
198
  "types": "./dist/vignette.d.ts",
194
199
  "module": "./dist/esm/vignette.mjs",
@@ -311,6 +316,9 @@
311
316
  "translate": [
312
317
  "dist/translate.d.ts"
313
318
  ],
319
+ "tv-signal-off": [
320
+ "dist/tv-signal-off.d.ts"
321
+ ],
314
322
  "vignette": [
315
323
  "dist/vignette.d.ts"
316
324
  ],
@@ -330,7 +338,7 @@
330
338
  },
331
339
  "homepage": "https://www.remotion.dev/docs/effects/api",
332
340
  "devDependencies": {
333
- "@remotion/eslint-config-internal": "4.0.475",
341
+ "@remotion/eslint-config-internal": "4.0.476",
334
342
  "@vitest/browser-playwright": "4.0.9",
335
343
  "eslint": "9.19.0",
336
344
  "vitest": "4.0.9",