interactive-bg 0.1.1 → 0.2.0

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.
Files changed (122) hide show
  1. package/README.md +55 -7
  2. package/dist/fluid/canvas2d.cjs +14 -0
  3. package/dist/fluid/canvas2d.cjs.map +1 -0
  4. package/dist/fluid/canvas2d.d.cts +5 -0
  5. package/dist/fluid/canvas2d.d.ts +5 -0
  6. package/dist/fluid/canvas2d.js +13 -0
  7. package/dist/fluid/canvas2d.js.map +1 -0
  8. package/dist/fluid/index.cjs +16 -0
  9. package/dist/fluid/index.cjs.map +1 -0
  10. package/dist/fluid/index.d.cts +5 -0
  11. package/dist/fluid/index.d.ts +5 -0
  12. package/dist/fluid/index.js +15 -0
  13. package/dist/fluid/index.js.map +1 -0
  14. package/dist/fluid/webgl.cjs +14 -0
  15. package/dist/fluid/webgl.cjs.map +1 -0
  16. package/dist/fluid/webgl.d.cts +5 -0
  17. package/dist/fluid/webgl.d.ts +5 -0
  18. package/dist/fluid/webgl.js +13 -0
  19. package/dist/fluid/webgl.js.map +1 -0
  20. package/dist/index.cjs +4 -0
  21. package/dist/index.d.cts +4 -0
  22. package/dist/index.d.ts +4 -0
  23. package/dist/index.js +3 -1
  24. package/dist/index.umd.js +255 -12
  25. package/dist/index.umd.js.map +1 -1
  26. package/dist/shimmer/canvas2d.cjs +14 -0
  27. package/dist/shimmer/canvas2d.cjs.map +1 -0
  28. package/dist/shimmer/canvas2d.d.cts +5 -0
  29. package/dist/shimmer/canvas2d.d.ts +5 -0
  30. package/dist/shimmer/canvas2d.js +13 -0
  31. package/dist/shimmer/canvas2d.js.map +1 -0
  32. package/dist/shimmer/index.cjs +16 -0
  33. package/dist/shimmer/index.cjs.map +1 -0
  34. package/dist/shimmer/index.d.cts +5 -0
  35. package/dist/shimmer/index.d.ts +5 -0
  36. package/dist/shimmer/index.js +15 -0
  37. package/dist/shimmer/index.js.map +1 -0
  38. package/dist/shimmer/webgl.cjs +14 -0
  39. package/dist/shimmer/webgl.cjs.map +1 -0
  40. package/dist/shimmer/webgl.d.cts +5 -0
  41. package/dist/shimmer/webgl.d.ts +5 -0
  42. package/dist/shimmer/webgl.js +13 -0
  43. package/dist/shimmer/webgl.js.map +1 -0
  44. package/dist/styles/fluid/canvas2d.cjs +155 -0
  45. package/dist/styles/fluid/canvas2d.cjs.map +1 -0
  46. package/dist/styles/fluid/canvas2d.d.cts +8 -0
  47. package/dist/styles/fluid/canvas2d.d.ts +8 -0
  48. package/dist/styles/fluid/canvas2d.js +155 -0
  49. package/dist/styles/fluid/canvas2d.js.map +1 -0
  50. package/dist/styles/fluid/color.cjs +40 -0
  51. package/dist/styles/fluid/color.cjs.map +1 -0
  52. package/dist/styles/fluid/color.d.cts +4 -0
  53. package/dist/styles/fluid/color.d.ts +4 -0
  54. package/dist/styles/fluid/color.js +40 -0
  55. package/dist/styles/fluid/color.js.map +1 -0
  56. package/dist/styles/fluid/definition.cjs +14 -0
  57. package/dist/styles/fluid/definition.cjs.map +1 -0
  58. package/dist/styles/fluid/definition.d.cts +8 -0
  59. package/dist/styles/fluid/definition.d.ts +8 -0
  60. package/dist/styles/fluid/definition.js +15 -0
  61. package/dist/styles/fluid/definition.js.map +1 -0
  62. package/dist/styles/fluid/options.cjs +29 -0
  63. package/dist/styles/fluid/options.cjs.map +1 -0
  64. package/dist/styles/fluid/options.d.cts +31 -0
  65. package/dist/styles/fluid/options.d.ts +31 -0
  66. package/dist/styles/fluid/options.js +28 -0
  67. package/dist/styles/fluid/options.js.map +1 -0
  68. package/dist/styles/fluid/settings.cjs +32 -0
  69. package/dist/styles/fluid/settings.cjs.map +1 -0
  70. package/dist/styles/fluid/settings.d.cts +24 -0
  71. package/dist/styles/fluid/settings.d.ts +24 -0
  72. package/dist/styles/fluid/settings.js +23 -0
  73. package/dist/styles/fluid/settings.js.map +1 -0
  74. package/dist/styles/fluid/simulation.cjs +183 -0
  75. package/dist/styles/fluid/simulation.cjs.map +1 -0
  76. package/dist/styles/fluid/simulation.d.cts +22 -0
  77. package/dist/styles/fluid/simulation.d.ts +22 -0
  78. package/dist/styles/fluid/simulation.js +183 -0
  79. package/dist/styles/fluid/simulation.js.map +1 -0
  80. package/dist/styles/fluid/size.cjs +17 -0
  81. package/dist/styles/fluid/size.cjs.map +1 -0
  82. package/dist/styles/fluid/size.d.cts +5 -0
  83. package/dist/styles/fluid/size.d.ts +5 -0
  84. package/dist/styles/fluid/size.js +17 -0
  85. package/dist/styles/fluid/size.js.map +1 -0
  86. package/dist/styles/fluid/webgl.cjs +607 -0
  87. package/dist/styles/fluid/webgl.cjs.map +1 -0
  88. package/dist/styles/fluid/webgl.d.cts +3 -0
  89. package/dist/styles/fluid/webgl.d.ts +3 -0
  90. package/dist/styles/fluid/webgl.js +607 -0
  91. package/dist/styles/fluid/webgl.js.map +1 -0
  92. package/dist/styles/shimmer/canvas2d.cjs +84 -0
  93. package/dist/styles/shimmer/canvas2d.cjs.map +1 -0
  94. package/dist/styles/shimmer/canvas2d.d.cts +3 -0
  95. package/dist/styles/shimmer/canvas2d.d.ts +3 -0
  96. package/dist/styles/shimmer/canvas2d.js +84 -0
  97. package/dist/styles/shimmer/canvas2d.js.map +1 -0
  98. package/dist/styles/shimmer/definition.cjs +15 -0
  99. package/dist/styles/shimmer/definition.cjs.map +1 -0
  100. package/dist/styles/shimmer/definition.d.cts +8 -0
  101. package/dist/styles/shimmer/definition.d.ts +8 -0
  102. package/dist/styles/shimmer/definition.js +16 -0
  103. package/dist/styles/shimmer/definition.js.map +1 -0
  104. package/dist/styles/shimmer/field.cjs +79 -0
  105. package/dist/styles/shimmer/field.cjs.map +1 -0
  106. package/dist/styles/shimmer/field.d.cts +11 -0
  107. package/dist/styles/shimmer/field.d.ts +11 -0
  108. package/dist/styles/shimmer/field.js +78 -0
  109. package/dist/styles/shimmer/field.js.map +1 -0
  110. package/dist/styles/shimmer/options.cjs +28 -0
  111. package/dist/styles/shimmer/options.cjs.map +1 -0
  112. package/dist/styles/shimmer/options.d.cts +22 -0
  113. package/dist/styles/shimmer/options.d.ts +22 -0
  114. package/dist/styles/shimmer/options.js +27 -0
  115. package/dist/styles/shimmer/options.js.map +1 -0
  116. package/dist/styles/shimmer/webgl.cjs +89 -0
  117. package/dist/styles/shimmer/webgl.cjs.map +1 -0
  118. package/dist/styles/shimmer/webgl.d.cts +4 -0
  119. package/dist/styles/shimmer/webgl.d.ts +4 -0
  120. package/dist/styles/shimmer/webgl.js +89 -0
  121. package/dist/styles/shimmer/webgl.js.map +1 -0
  122. package/package.json +75 -1
@@ -0,0 +1,89 @@
1
+ const require_color = require("../../core/color.cjs");
2
+ const require_webgl = require("../../core/webgl.cjs");
3
+ const require_field = require("./field.cjs");
4
+ const require_options = require("./options.cjs");
5
+ // src/styles/shimmer/webgl.ts
6
+ var FRAGMENT = `#version 300 es
7
+ precision highp float;
8
+
9
+ uniform vec2 uRes;
10
+ uniform float uTime;
11
+ uniform float uFrequency;
12
+ uniform float uColorScale;
13
+ uniform vec3 uBaseColor;
14
+ uniform float uChroma;
15
+ uniform float uWarp;
16
+ uniform float uOpacity;
17
+ uniform vec3 uPointer; // x, y, strength × influence
18
+
19
+ out vec4 fragColor;
20
+
21
+ vec2 distort(vec2 p, float offset) {
22
+ p += offset;
23
+ for (float i = 1.0; i < 7.0; i++) {
24
+ p.x += uWarp * 0.3 / i * sin(i * 5.0 * p.y + uTime);
25
+ p.y += uWarp * 0.1 / i * cos(i * 3.0 * p.x + uTime);
26
+ }
27
+ return p;
28
+ }
29
+
30
+ void main() {
31
+ // gl_FragCoord is bottom-up; flip it so pointer coordinates are top-down.
32
+ vec2 uv = vec2(gl_FragCoord.x / uRes.x, 1.0 - gl_FragCoord.y / uRes.y);
33
+
34
+ float aspect = uRes.x / uRes.y;
35
+ vec2 d = (uv - uPointer.xy) * vec2(aspect, 1.0);
36
+ uv += vec2(d.x / aspect, d.y) * exp(-dot(d, d) / 0.03) * uPointer.z;
37
+
38
+ float r = sin(distort(uv, 0.0).x * uFrequency) * 0.5 + 0.5;
39
+ float g = sin(distort(uv, uChroma).x * uFrequency) * 0.5 + 0.5;
40
+ float b = sin(distort(uv, 2.0 * uChroma).x * uFrequency) * 0.5 + 0.5;
41
+ vec3 colour = pow(vec3(r, g, b), vec3(uColorScale));
42
+ vec3 finalColour = mix(uBaseColor, colour, 0.8);
43
+ fragColor = vec4(finalColour * uOpacity, uOpacity);
44
+ }`;
45
+ var UNIFORMS = [
46
+ "uRes",
47
+ "uTime",
48
+ "uFrequency",
49
+ "uColorScale",
50
+ "uBaseColor",
51
+ "uChroma",
52
+ "uWarp",
53
+ "uOpacity",
54
+ "uPointer"
55
+ ];
56
+ /** The exact analytic band field from the reference, running in WebGL2. */
57
+ function createShimmerWebGL(gl, initial) {
58
+ let options = require_options.resolveShimmerOptions(initial);
59
+ let clock = 0;
60
+ const program = require_webgl.createProgram(gl, require_webgl.FULLSCREEN_VERTEX_SHADER, FRAGMENT);
61
+ const uniforms = program ? require_webgl.getUniforms(gl, program, UNIFORMS) : null;
62
+ return {
63
+ update(next) {
64
+ options = require_options.resolveShimmerOptions(next);
65
+ },
66
+ render(frame) {
67
+ if (!program || !uniforms) return;
68
+ if (!frame.reducedMotion && options.speed > 0) clock += frame.dt;
69
+ const [baseR, baseG, baseB] = require_color.parseColor(options.baseColor);
70
+ gl.useProgram(program);
71
+ gl.uniform2f(uniforms.uRes, gl.drawingBufferWidth, gl.drawingBufferHeight);
72
+ gl.uniform1f(uniforms.uTime, clock * require_field.TIME_RATE * options.speed);
73
+ gl.uniform1f(uniforms.uFrequency, options.frequency);
74
+ gl.uniform1f(uniforms.uColorScale, options.colorScale);
75
+ gl.uniform3f(uniforms.uBaseColor, baseR, baseG, baseB);
76
+ gl.uniform1f(uniforms.uChroma, options.chroma);
77
+ gl.uniform1f(uniforms.uWarp, options.warp);
78
+ gl.uniform1f(uniforms.uOpacity, options.opacity);
79
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x / Math.max(1, frame.width), frame.pointer.y / Math.max(1, frame.height), frame.reducedMotion ? 0 : options.pointerStrength * frame.pointer.influence);
80
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
81
+ },
82
+ destroy() {
83
+ gl.deleteProgram(program);
84
+ }
85
+ };
86
+ }
87
+ exports.createShimmerWebGL = createShimmerWebGL;
88
+
89
+ //# sourceMappingURL=webgl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.cjs","names":["resolveShimmerOptions","createProgram","FULLSCREEN_VERTEX_SHADER","getUniforms","parseColor","TIME_RATE"],"sources":["../../../src/styles/shimmer/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { Frame, StyleRenderer } from '../../core/style';\nimport { createProgram, FULLSCREEN_VERTEX_SHADER, getUniforms } from '../../core/webgl';\nimport { TIME_RATE } from './field';\nimport { resolveShimmerOptions, type ShimmerOptions } from './options';\n\n// A faithful port of the reference's `sr-ground-canvas` shader: a pair of\n// coupled sine waves warp the UVs six times, the three channels are offset\n// slightly, and the resulting sine bands are raised to a high power.\nconst FRAGMENT = `#version 300 es\nprecision highp float;\n\nuniform vec2 uRes;\nuniform float uTime;\nuniform float uFrequency;\nuniform float uColorScale;\nuniform vec3 uBaseColor;\nuniform float uChroma;\nuniform float uWarp;\nuniform float uOpacity;\nuniform vec3 uPointer; // x, y, strength × influence\n\nout vec4 fragColor;\n\nvec2 distort(vec2 p, float offset) {\n p += offset;\n for (float i = 1.0; i < 7.0; i++) {\n p.x += uWarp * 0.3 / i * sin(i * 5.0 * p.y + uTime);\n p.y += uWarp * 0.1 / i * cos(i * 3.0 * p.x + uTime);\n }\n return p;\n}\n\nvoid main() {\n // gl_FragCoord is bottom-up; flip it so pointer coordinates are top-down.\n vec2 uv = vec2(gl_FragCoord.x / uRes.x, 1.0 - gl_FragCoord.y / uRes.y);\n\n float aspect = uRes.x / uRes.y;\n vec2 d = (uv - uPointer.xy) * vec2(aspect, 1.0);\n uv += vec2(d.x / aspect, d.y) * exp(-dot(d, d) / 0.03) * uPointer.z;\n\n float r = sin(distort(uv, 0.0).x * uFrequency) * 0.5 + 0.5;\n float g = sin(distort(uv, uChroma).x * uFrequency) * 0.5 + 0.5;\n float b = sin(distort(uv, 2.0 * uChroma).x * uFrequency) * 0.5 + 0.5;\n vec3 colour = pow(vec3(r, g, b), vec3(uColorScale));\n vec3 finalColour = mix(uBaseColor, colour, 0.8);\n fragColor = vec4(finalColour * uOpacity, uOpacity);\n}`;\n\nconst UNIFORMS = [\n 'uRes',\n 'uTime',\n 'uFrequency',\n 'uColorScale',\n 'uBaseColor',\n 'uChroma',\n 'uWarp',\n 'uOpacity',\n 'uPointer',\n] as const;\n\n/** The exact analytic band field from the reference, running in WebGL2. */\nexport function createShimmerWebGL(gl: WebGL2RenderingContext, initial: ShimmerOptions): StyleRenderer<ShimmerOptions> {\n let options = resolveShimmerOptions(initial);\n let clock = 0;\n\n const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n\n return {\n update(next) {\n options = resolveShimmerOptions(next);\n },\n render(frame: Frame) {\n if (!program || !uniforms) return; // context lost during setup\n if (!frame.reducedMotion && options.speed > 0) clock += frame.dt;\n\n const [baseR, baseG, baseB] = parseColor(options.baseColor);\n gl.useProgram(program);\n gl.uniform2f(uniforms.uRes, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.uniform1f(uniforms.uTime, clock * TIME_RATE * options.speed);\n gl.uniform1f(uniforms.uFrequency, options.frequency);\n gl.uniform1f(uniforms.uColorScale, options.colorScale);\n gl.uniform3f(uniforms.uBaseColor, baseR, baseG, baseB);\n gl.uniform1f(uniforms.uChroma, options.chroma);\n gl.uniform1f(uniforms.uWarp, options.warp);\n gl.uniform1f(uniforms.uOpacity, options.opacity);\n gl.uniform3f(\n uniforms.uPointer,\n frame.pointer.x / Math.max(1, frame.width),\n frame.pointer.y / Math.max(1, frame.height),\n frame.reducedMotion ? 0 : options.pointerStrength * frame.pointer.influence,\n );\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy() {\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":";;;;;AASA,IAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCjB,IAAM,WAAW;CACf;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,SAAgB,mBAAmB,IAA4B,SAAwD;CACrH,IAAI,UAAUA,gBAAAA,sBAAsB,OAAO;CAC3C,IAAI,QAAQ;CAEZ,MAAM,UAAUC,cAAAA,cAAc,IAAIC,cAAAA,0BAA0B,QAAQ;CACpE,MAAM,WAAW,UAAUC,cAAAA,YAAY,IAAI,SAAS,QAAQ,IAAI;CAEhE,OAAO;EACL,OAAO,MAAM;GACX,UAAUH,gBAAAA,sBAAsB,IAAI;EACtC;EACA,OAAO,OAAc;GACnB,IAAI,CAAC,WAAW,CAAC,UAAU;GAC3B,IAAI,CAAC,MAAM,iBAAiB,QAAQ,QAAQ,GAAG,SAAS,MAAM;GAE9D,MAAM,CAAC,OAAO,OAAO,SAASI,cAAAA,WAAW,QAAQ,SAAS;GAC1D,GAAG,WAAW,OAAO;GACrB,GAAG,UAAU,SAAS,MAAM,GAAG,oBAAoB,GAAG,mBAAmB;GACzE,GAAG,UAAU,SAAS,OAAO,QAAQC,cAAAA,YAAY,QAAQ,KAAK;GAC9D,GAAG,UAAU,SAAS,YAAY,QAAQ,SAAS;GACnD,GAAG,UAAU,SAAS,aAAa,QAAQ,UAAU;GACrD,GAAG,UAAU,SAAS,YAAY,OAAO,OAAO,KAAK;GACrD,GAAG,UAAU,SAAS,SAAS,QAAQ,MAAM;GAC7C,GAAG,UAAU,SAAS,OAAO,QAAQ,IAAI;GACzC,GAAG,UAAU,SAAS,UAAU,QAAQ,OAAO;GAC/C,GAAG,UACD,SAAS,UACT,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,GACzC,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,GAC1C,MAAM,gBAAgB,IAAI,QAAQ,kBAAkB,MAAM,QAAQ,SACpE;GACA,GAAG,WAAW,GAAG,WAAW,GAAG,CAAC;EAClC;EACA,UAAU;GACR,GAAG,cAAc,OAAO;EAC1B;CACF;AACF"}
@@ -0,0 +1,4 @@
1
+ import type { StyleRenderer } from '../../core/style.cjs';
2
+ import { type ShimmerOptions } from './options.cjs';
3
+ /** The exact analytic band field from the reference, running in WebGL2. */
4
+ export declare function createShimmerWebGL(gl: WebGL2RenderingContext, initial: ShimmerOptions): StyleRenderer<ShimmerOptions>;
@@ -0,0 +1,4 @@
1
+ import type { StyleRenderer } from '../../core/style.js';
2
+ import { type ShimmerOptions } from './options.js';
3
+ /** The exact analytic band field from the reference, running in WebGL2. */
4
+ export declare function createShimmerWebGL(gl: WebGL2RenderingContext, initial: ShimmerOptions): StyleRenderer<ShimmerOptions>;
@@ -0,0 +1,89 @@
1
+ import { parseColor } from "../../core/color.js";
2
+ import { FULLSCREEN_VERTEX_SHADER, createProgram, getUniforms } from "../../core/webgl.js";
3
+ import { TIME_RATE } from "./field.js";
4
+ import { resolveShimmerOptions } from "./options.js";
5
+ // src/styles/shimmer/webgl.ts
6
+ var FRAGMENT = `#version 300 es
7
+ precision highp float;
8
+
9
+ uniform vec2 uRes;
10
+ uniform float uTime;
11
+ uniform float uFrequency;
12
+ uniform float uColorScale;
13
+ uniform vec3 uBaseColor;
14
+ uniform float uChroma;
15
+ uniform float uWarp;
16
+ uniform float uOpacity;
17
+ uniform vec3 uPointer; // x, y, strength × influence
18
+
19
+ out vec4 fragColor;
20
+
21
+ vec2 distort(vec2 p, float offset) {
22
+ p += offset;
23
+ for (float i = 1.0; i < 7.0; i++) {
24
+ p.x += uWarp * 0.3 / i * sin(i * 5.0 * p.y + uTime);
25
+ p.y += uWarp * 0.1 / i * cos(i * 3.0 * p.x + uTime);
26
+ }
27
+ return p;
28
+ }
29
+
30
+ void main() {
31
+ // gl_FragCoord is bottom-up; flip it so pointer coordinates are top-down.
32
+ vec2 uv = vec2(gl_FragCoord.x / uRes.x, 1.0 - gl_FragCoord.y / uRes.y);
33
+
34
+ float aspect = uRes.x / uRes.y;
35
+ vec2 d = (uv - uPointer.xy) * vec2(aspect, 1.0);
36
+ uv += vec2(d.x / aspect, d.y) * exp(-dot(d, d) / 0.03) * uPointer.z;
37
+
38
+ float r = sin(distort(uv, 0.0).x * uFrequency) * 0.5 + 0.5;
39
+ float g = sin(distort(uv, uChroma).x * uFrequency) * 0.5 + 0.5;
40
+ float b = sin(distort(uv, 2.0 * uChroma).x * uFrequency) * 0.5 + 0.5;
41
+ vec3 colour = pow(vec3(r, g, b), vec3(uColorScale));
42
+ vec3 finalColour = mix(uBaseColor, colour, 0.8);
43
+ fragColor = vec4(finalColour * uOpacity, uOpacity);
44
+ }`;
45
+ var UNIFORMS = [
46
+ "uRes",
47
+ "uTime",
48
+ "uFrequency",
49
+ "uColorScale",
50
+ "uBaseColor",
51
+ "uChroma",
52
+ "uWarp",
53
+ "uOpacity",
54
+ "uPointer"
55
+ ];
56
+ /** The exact analytic band field from the reference, running in WebGL2. */
57
+ function createShimmerWebGL(gl, initial) {
58
+ let options = resolveShimmerOptions(initial);
59
+ let clock = 0;
60
+ const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);
61
+ const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;
62
+ return {
63
+ update(next) {
64
+ options = resolveShimmerOptions(next);
65
+ },
66
+ render(frame) {
67
+ if (!program || !uniforms) return;
68
+ if (!frame.reducedMotion && options.speed > 0) clock += frame.dt;
69
+ const [baseR, baseG, baseB] = parseColor(options.baseColor);
70
+ gl.useProgram(program);
71
+ gl.uniform2f(uniforms.uRes, gl.drawingBufferWidth, gl.drawingBufferHeight);
72
+ gl.uniform1f(uniforms.uTime, clock * TIME_RATE * options.speed);
73
+ gl.uniform1f(uniforms.uFrequency, options.frequency);
74
+ gl.uniform1f(uniforms.uColorScale, options.colorScale);
75
+ gl.uniform3f(uniforms.uBaseColor, baseR, baseG, baseB);
76
+ gl.uniform1f(uniforms.uChroma, options.chroma);
77
+ gl.uniform1f(uniforms.uWarp, options.warp);
78
+ gl.uniform1f(uniforms.uOpacity, options.opacity);
79
+ gl.uniform3f(uniforms.uPointer, frame.pointer.x / Math.max(1, frame.width), frame.pointer.y / Math.max(1, frame.height), frame.reducedMotion ? 0 : options.pointerStrength * frame.pointer.influence);
80
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
81
+ },
82
+ destroy() {
83
+ gl.deleteProgram(program);
84
+ }
85
+ };
86
+ }
87
+ export { createShimmerWebGL };
88
+
89
+ //# sourceMappingURL=webgl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.js","names":[],"sources":["../../../src/styles/shimmer/webgl.ts"],"sourcesContent":["import { parseColor } from '../../core/color';\nimport type { Frame, StyleRenderer } from '../../core/style';\nimport { createProgram, FULLSCREEN_VERTEX_SHADER, getUniforms } from '../../core/webgl';\nimport { TIME_RATE } from './field';\nimport { resolveShimmerOptions, type ShimmerOptions } from './options';\n\n// A faithful port of the reference's `sr-ground-canvas` shader: a pair of\n// coupled sine waves warp the UVs six times, the three channels are offset\n// slightly, and the resulting sine bands are raised to a high power.\nconst FRAGMENT = `#version 300 es\nprecision highp float;\n\nuniform vec2 uRes;\nuniform float uTime;\nuniform float uFrequency;\nuniform float uColorScale;\nuniform vec3 uBaseColor;\nuniform float uChroma;\nuniform float uWarp;\nuniform float uOpacity;\nuniform vec3 uPointer; // x, y, strength × influence\n\nout vec4 fragColor;\n\nvec2 distort(vec2 p, float offset) {\n p += offset;\n for (float i = 1.0; i < 7.0; i++) {\n p.x += uWarp * 0.3 / i * sin(i * 5.0 * p.y + uTime);\n p.y += uWarp * 0.1 / i * cos(i * 3.0 * p.x + uTime);\n }\n return p;\n}\n\nvoid main() {\n // gl_FragCoord is bottom-up; flip it so pointer coordinates are top-down.\n vec2 uv = vec2(gl_FragCoord.x / uRes.x, 1.0 - gl_FragCoord.y / uRes.y);\n\n float aspect = uRes.x / uRes.y;\n vec2 d = (uv - uPointer.xy) * vec2(aspect, 1.0);\n uv += vec2(d.x / aspect, d.y) * exp(-dot(d, d) / 0.03) * uPointer.z;\n\n float r = sin(distort(uv, 0.0).x * uFrequency) * 0.5 + 0.5;\n float g = sin(distort(uv, uChroma).x * uFrequency) * 0.5 + 0.5;\n float b = sin(distort(uv, 2.0 * uChroma).x * uFrequency) * 0.5 + 0.5;\n vec3 colour = pow(vec3(r, g, b), vec3(uColorScale));\n vec3 finalColour = mix(uBaseColor, colour, 0.8);\n fragColor = vec4(finalColour * uOpacity, uOpacity);\n}`;\n\nconst UNIFORMS = [\n 'uRes',\n 'uTime',\n 'uFrequency',\n 'uColorScale',\n 'uBaseColor',\n 'uChroma',\n 'uWarp',\n 'uOpacity',\n 'uPointer',\n] as const;\n\n/** The exact analytic band field from the reference, running in WebGL2. */\nexport function createShimmerWebGL(gl: WebGL2RenderingContext, initial: ShimmerOptions): StyleRenderer<ShimmerOptions> {\n let options = resolveShimmerOptions(initial);\n let clock = 0;\n\n const program = createProgram(gl, FULLSCREEN_VERTEX_SHADER, FRAGMENT);\n const uniforms = program ? getUniforms(gl, program, UNIFORMS) : null;\n\n return {\n update(next) {\n options = resolveShimmerOptions(next);\n },\n render(frame: Frame) {\n if (!program || !uniforms) return; // context lost during setup\n if (!frame.reducedMotion && options.speed > 0) clock += frame.dt;\n\n const [baseR, baseG, baseB] = parseColor(options.baseColor);\n gl.useProgram(program);\n gl.uniform2f(uniforms.uRes, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.uniform1f(uniforms.uTime, clock * TIME_RATE * options.speed);\n gl.uniform1f(uniforms.uFrequency, options.frequency);\n gl.uniform1f(uniforms.uColorScale, options.colorScale);\n gl.uniform3f(uniforms.uBaseColor, baseR, baseG, baseB);\n gl.uniform1f(uniforms.uChroma, options.chroma);\n gl.uniform1f(uniforms.uWarp, options.warp);\n gl.uniform1f(uniforms.uOpacity, options.opacity);\n gl.uniform3f(\n uniforms.uPointer,\n frame.pointer.x / Math.max(1, frame.width),\n frame.pointer.y / Math.max(1, frame.height),\n frame.reducedMotion ? 0 : options.pointerStrength * frame.pointer.influence,\n );\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy() {\n gl.deleteProgram(program);\n },\n };\n}\n"],"mappings":";;;;;AASA,IAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCjB,IAAM,WAAW;CACf;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,SAAgB,mBAAmB,IAA4B,SAAwD;CACrH,IAAI,UAAU,sBAAsB,OAAO;CAC3C,IAAI,QAAQ;CAEZ,MAAM,UAAU,cAAc,IAAI,0BAA0B,QAAQ;CACpE,MAAM,WAAW,UAAU,YAAY,IAAI,SAAS,QAAQ,IAAI;CAEhE,OAAO;EACL,OAAO,MAAM;GACX,UAAU,sBAAsB,IAAI;EACtC;EACA,OAAO,OAAc;GACnB,IAAI,CAAC,WAAW,CAAC,UAAU;GAC3B,IAAI,CAAC,MAAM,iBAAiB,QAAQ,QAAQ,GAAG,SAAS,MAAM;GAE9D,MAAM,CAAC,OAAO,OAAO,SAAS,WAAW,QAAQ,SAAS;GAC1D,GAAG,WAAW,OAAO;GACrB,GAAG,UAAU,SAAS,MAAM,GAAG,oBAAoB,GAAG,mBAAmB;GACzE,GAAG,UAAU,SAAS,OAAO,QAAQ,YAAY,QAAQ,KAAK;GAC9D,GAAG,UAAU,SAAS,YAAY,QAAQ,SAAS;GACnD,GAAG,UAAU,SAAS,aAAa,QAAQ,UAAU;GACrD,GAAG,UAAU,SAAS,YAAY,OAAO,OAAO,KAAK;GACrD,GAAG,UAAU,SAAS,SAAS,QAAQ,MAAM;GAC7C,GAAG,UAAU,SAAS,OAAO,QAAQ,IAAI;GACzC,GAAG,UAAU,SAAS,UAAU,QAAQ,OAAO;GAC/C,GAAG,UACD,SAAS,UACT,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,GACzC,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,GAC1C,MAAM,gBAAgB,IAAI,QAAQ,kBAAkB,MAAM,QAAQ,SACpE;GACA,GAAG,WAAW,GAAG,WAAW,GAAG,CAAC;EAClC;EACA,UAAU;GACR,GAAG,cAAc,OAAO;EAC1B;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "interactive-bg",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Lightweight, interactive animated backgrounds for websites: pick a style, drop it behind your content. WebGL with a Canvas 2D fallback, zero dependencies, import only the renderer you need.",
5
5
  "keywords": [
6
6
  "background",
@@ -10,6 +10,8 @@
10
10
  "webgl",
11
11
  "topographic",
12
12
  "contour",
13
+ "fluid",
14
+ "shimmer",
13
15
  "hero",
14
16
  "generative"
15
17
  ],
@@ -50,6 +52,18 @@
50
52
  ],
51
53
  "plus/*": [
52
54
  "./dist/plus/*.d.ts"
55
+ ],
56
+ "fluid": [
57
+ "./dist/fluid/index.d.ts"
58
+ ],
59
+ "fluid/*": [
60
+ "./dist/fluid/*.d.ts"
61
+ ],
62
+ "shimmer": [
63
+ "./dist/shimmer/index.d.ts"
64
+ ],
65
+ "shimmer/*": [
66
+ "./dist/shimmer/*.d.ts"
53
67
  ]
54
68
  }
55
69
  },
@@ -156,6 +170,66 @@
156
170
  "default": "./dist/plus/canvas2d.cjs"
157
171
  }
158
172
  },
173
+ "./fluid": {
174
+ "import": {
175
+ "types": "./dist/fluid/index.d.ts",
176
+ "default": "./dist/fluid/index.js"
177
+ },
178
+ "require": {
179
+ "types": "./dist/fluid/index.d.cts",
180
+ "default": "./dist/fluid/index.cjs"
181
+ }
182
+ },
183
+ "./fluid/webgl": {
184
+ "import": {
185
+ "types": "./dist/fluid/webgl.d.ts",
186
+ "default": "./dist/fluid/webgl.js"
187
+ },
188
+ "require": {
189
+ "types": "./dist/fluid/webgl.d.cts",
190
+ "default": "./dist/fluid/webgl.cjs"
191
+ }
192
+ },
193
+ "./fluid/canvas2d": {
194
+ "import": {
195
+ "types": "./dist/fluid/canvas2d.d.ts",
196
+ "default": "./dist/fluid/canvas2d.js"
197
+ },
198
+ "require": {
199
+ "types": "./dist/fluid/canvas2d.d.cts",
200
+ "default": "./dist/fluid/canvas2d.cjs"
201
+ }
202
+ },
203
+ "./shimmer": {
204
+ "import": {
205
+ "types": "./dist/shimmer/index.d.ts",
206
+ "default": "./dist/shimmer/index.js"
207
+ },
208
+ "require": {
209
+ "types": "./dist/shimmer/index.d.cts",
210
+ "default": "./dist/shimmer/index.cjs"
211
+ }
212
+ },
213
+ "./shimmer/webgl": {
214
+ "import": {
215
+ "types": "./dist/shimmer/webgl.d.ts",
216
+ "default": "./dist/shimmer/webgl.js"
217
+ },
218
+ "require": {
219
+ "types": "./dist/shimmer/webgl.d.cts",
220
+ "default": "./dist/shimmer/webgl.cjs"
221
+ }
222
+ },
223
+ "./shimmer/canvas2d": {
224
+ "import": {
225
+ "types": "./dist/shimmer/canvas2d.d.ts",
226
+ "default": "./dist/shimmer/canvas2d.js"
227
+ },
228
+ "require": {
229
+ "types": "./dist/shimmer/canvas2d.d.cts",
230
+ "default": "./dist/shimmer/canvas2d.cjs"
231
+ }
232
+ },
159
233
  "./package.json": "./package.json"
160
234
  },
161
235
  "scripts": {