shaders 2.4.77 → 2.5.80

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 (47) hide show
  1. package/dist/core/index.d.ts +1 -1
  2. package/dist/core/index.d.ts.map +1 -1
  3. package/dist/core/index.js +57 -51
  4. package/dist/core/presetRenderer.d.ts.map +1 -1
  5. package/dist/core/renderer.d.ts +5 -1
  6. package/dist/core/renderer.d.ts.map +1 -1
  7. package/dist/js/codegen.d.ts +1 -0
  8. package/dist/js/codegen.js +1 -0
  9. package/dist/js/createPreview.d.ts +19 -0
  10. package/dist/js/createPreview.d.ts.map +1 -0
  11. package/dist/js/createPreview.js +64 -0
  12. package/dist/js/createShader.d.ts +24 -0
  13. package/dist/js/createShader.d.ts.map +1 -0
  14. package/dist/js/createShader.js +132 -0
  15. package/dist/js/decode.d.ts +7 -0
  16. package/dist/js/decode.d.ts.map +1 -0
  17. package/dist/js/decode.js +22 -0
  18. package/dist/js/index.d.ts +6 -0
  19. package/dist/js/index.d.ts.map +1 -0
  20. package/dist/js/index.js +4 -0
  21. package/dist/js/types.d.ts +23 -0
  22. package/dist/js/types.d.ts.map +1 -0
  23. package/dist/js/utils/generatePresetCode.d.ts +13 -0
  24. package/dist/js/utils/generatePresetCode.d.ts.map +1 -0
  25. package/dist/js/utils/generatePresetCode.js +1248 -0
  26. package/dist/js/utils/generatePresetCode.template.d.ts +13 -0
  27. package/dist/js/utils/generatePresetCode.template.d.ts.map +1 -0
  28. package/dist/react/Shader.js +1 -2
  29. package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
  30. package/dist/react/utils/generatePresetCode.js +42 -6
  31. package/dist/react/utils/generatePresetCode.template.d.ts.map +1 -1
  32. package/dist/solid/engine/Shader.js +1 -1
  33. package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
  34. package/dist/solid/utils/generatePresetCode.js +48 -4
  35. package/dist/solid/utils/generatePresetCode.template.d.ts.map +1 -1
  36. package/dist/svelte/engine/Preview.svelte.d.ts +11 -25
  37. package/dist/svelte/engine/PreviewRenderComponent.svelte.d.ts +5 -19
  38. package/dist/svelte/{generatePresetCode-Bpe8YcaW.js → generatePresetCode-BN1puRG_.js} +31 -4
  39. package/dist/svelte/index.js +41 -67
  40. package/dist/svelte/source/engine/Preview.svelte +49 -35
  41. package/dist/svelte/source/engine/PreviewRenderComponent.svelte +9 -5
  42. package/dist/svelte/utils/generatePresetCode.js +1 -1
  43. package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +1 -2
  44. package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
  45. package/dist/vue/utils/generatePresetCode.js +45 -8
  46. package/dist/vue/utils/generatePresetCode.template.d.ts.map +1 -1
  47. package/package.json +15 -1
@@ -14,7 +14,7 @@ export { grain } from './helpers/grain';
14
14
  export { distort } from './helpers/distort';
15
15
  export { glow } from './helpers/glow';
16
16
  export { edgeMask } from './helpers/edgeMask';
17
- export type { UniformsMap, PropConfig, NodeMetadata, MaskConfig, MapConfig, MapChannel, PropDriver, MousePositionConfig, MouseMapConfig, AutoAnimateConfig, TransformConfig } from './types';
17
+ export type { UniformsMap, PropConfig, NodeMetadata, MaskConfig, MapConfig, MapChannel, PropDriver, MousePositionConfig, MouseMapConfig, AutoAnimateConfig, TransformConfig, ComponentDefinition } from './types';
18
18
  export type { BlendMode } from './blendModes';
19
19
  export type { PerformanceStats } from './performanceTracker';
20
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,YAAY,EACV,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,UAAU,EACX,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAG7C,YAAY,EAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAC,MAAM,SAAS,CAAA;AAC1L,YAAY,EAAC,SAAS,EAAC,MAAM,cAAc,CAAA;AAC3C,YAAY,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,YAAY,EACV,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,UAAU,EACX,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAG7C,YAAY,EAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAC/M,YAAY,EAAC,SAAS,EAAC,MAAM,cAAc,CAAA;AAC3C,YAAY,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAA"}
@@ -1336,14 +1336,15 @@ function shaderRenderer() {
1336
1336
  let transformUniforms = void 0;
1337
1337
  if (metadata?.transform) {
1338
1338
  const aspectRatio = currentWidth / Math.max(1, currentHeight);
1339
+ const t = metadata.transform;
1339
1340
  transformUniforms = {
1340
- offsetX: uniform(metadata.transform.offsetX),
1341
- offsetY: uniform(metadata.transform.offsetY),
1342
- rotation: uniform(metadata.transform.rotation),
1343
- scale: uniform(metadata.transform.scale),
1344
- anchorX: uniform(metadata.transform.anchorX),
1345
- anchorY: uniform(metadata.transform.anchorY),
1346
- edges: uniform(metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3),
1341
+ offsetX: uniform(t.offsetX ?? 0),
1342
+ offsetY: uniform(t.offsetY ?? 0),
1343
+ rotation: uniform(t.rotation ?? 0),
1344
+ scale: uniform(t.scale ?? 1),
1345
+ anchorX: uniform(t.anchorX ?? .5),
1346
+ anchorY: uniform(t.anchorY ?? .5),
1347
+ edges: uniform(t.edges === "stretch" ? 0 : t.edges === "transparent" ? 1 : t.edges === "mirror" ? 2 : t.edges === "wrap" ? 3 : 1),
1347
1348
  aspectRatio: uniform(aspectRatio)
1348
1349
  };
1349
1350
  }
@@ -1512,29 +1513,38 @@ function shaderRenderer() {
1512
1513
  }
1513
1514
  }
1514
1515
  if (metadata.transform !== void 0) {
1515
- const newTransformState = needsTransformation(metadata.transform);
1516
- existingNode.metadata.transform = metadata.transform;
1517
- if (!existingNode.transformUniforms && metadata.transform) {
1516
+ const mergedTransform = {
1517
+ offsetX: metadata.transform.offsetX ?? existingNode.metadata.transform?.offsetX ?? 0,
1518
+ offsetY: metadata.transform.offsetY ?? existingNode.metadata.transform?.offsetY ?? 0,
1519
+ rotation: metadata.transform.rotation ?? existingNode.metadata.transform?.rotation ?? 0,
1520
+ scale: metadata.transform.scale ?? existingNode.metadata.transform?.scale ?? 1,
1521
+ anchorX: metadata.transform.anchorX ?? existingNode.metadata.transform?.anchorX ?? .5,
1522
+ anchorY: metadata.transform.anchorY ?? existingNode.metadata.transform?.anchorY ?? .5,
1523
+ edges: metadata.transform.edges ?? existingNode.metadata.transform?.edges ?? "transparent"
1524
+ };
1525
+ const newTransformState = needsTransformation(mergedTransform);
1526
+ existingNode.metadata.transform = mergedTransform;
1527
+ if (!existingNode.transformUniforms && mergedTransform) {
1518
1528
  const aspectRatio = currentWidth / Math.max(1, currentHeight);
1519
1529
  existingNode.transformUniforms = {
1520
- offsetX: uniform(metadata.transform.offsetX),
1521
- offsetY: uniform(metadata.transform.offsetY),
1522
- rotation: uniform(metadata.transform.rotation),
1523
- scale: uniform(metadata.transform.scale),
1524
- anchorX: uniform(metadata.transform.anchorX),
1525
- anchorY: uniform(metadata.transform.anchorY),
1526
- edges: uniform(metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3),
1530
+ offsetX: uniform(mergedTransform.offsetX),
1531
+ offsetY: uniform(mergedTransform.offsetY),
1532
+ rotation: uniform(mergedTransform.rotation),
1533
+ scale: uniform(mergedTransform.scale),
1534
+ anchorX: uniform(mergedTransform.anchorX),
1535
+ anchorY: uniform(mergedTransform.anchorY),
1536
+ edges: uniform(mergedTransform.edges === "stretch" ? 0 : mergedTransform.edges === "transparent" ? 1 : mergedTransform.edges === "mirror" ? 2 : 3),
1527
1537
  aspectRatio: uniform(aspectRatio)
1528
1538
  };
1529
1539
  } else if (existingNode.transformUniforms) {
1530
- existingNode.transformUniforms.offsetX.value = metadata.transform.offsetX;
1531
- existingNode.transformUniforms.offsetY.value = metadata.transform.offsetY;
1532
- existingNode.transformUniforms.rotation.value = metadata.transform.rotation;
1533
- existingNode.transformUniforms.scale.value = metadata.transform.scale;
1534
- existingNode.transformUniforms.anchorX.value = metadata.transform.anchorX;
1535
- existingNode.transformUniforms.anchorY.value = metadata.transform.anchorY;
1540
+ existingNode.transformUniforms.offsetX.value = mergedTransform.offsetX;
1541
+ existingNode.transformUniforms.offsetY.value = mergedTransform.offsetY;
1542
+ existingNode.transformUniforms.rotation.value = mergedTransform.rotation;
1543
+ existingNode.transformUniforms.scale.value = mergedTransform.scale;
1544
+ existingNode.transformUniforms.anchorX.value = mergedTransform.anchorX;
1545
+ existingNode.transformUniforms.anchorY.value = mergedTransform.anchorY;
1536
1546
  const oldEdgesValue = existingNode.transformUniforms.edges.value;
1537
- existingNode.transformUniforms.edges.value = metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3;
1547
+ existingNode.transformUniforms.edges.value = mergedTransform.edges === "stretch" ? 0 : mergedTransform.edges === "transparent" ? 1 : mergedTransform.edges === "mirror" ? 2 : 3;
1538
1548
  if (existingNode.transformUniforms.edges.value !== oldEdgesValue) needsRecompose = true;
1539
1549
  }
1540
1550
  if (newTransformState && !existingNode.transformRTTActive) {
@@ -1870,7 +1880,7 @@ function shaderRenderer() {
1870
1880
  pendingRegistrationQueue = [];
1871
1881
  for (const { id, fragmentNodeFunc, parentId, metadata, uniforms, componentDefinition } of queue) if (fragmentNodeFunc) registerNode(id, fragmentNodeFunc, parentId, metadata, uniforms, componentDefinition);
1872
1882
  };
1873
- const initialize = async ({ canvas, enablePerformanceTracking: enableTracking = true, colorSpace = "p3-linear", context, gpu, forceFullFrameRate: forceFullFps = false }) => {
1883
+ const initialize = async ({ canvas, resizeTarget, enablePerformanceTracking: enableTracking = true, colorSpace = "p3-linear", context, gpu, forceFullFrameRate: forceFullFps = false }) => {
1874
1884
  if (isInitialized || isInitializing) return;
1875
1885
  enablePerformanceTracking = enableTracking;
1876
1886
  forceFullFrameRate = forceFullFps;
@@ -1952,19 +1962,18 @@ function shaderRenderer() {
1952
1962
  material.fragmentNode = vec4(0, 0, 0, 0);
1953
1963
  mesh = new Mesh(new PlaneGeometry(2, 2), material);
1954
1964
  scene.add(mesh);
1955
- const parentElement = canvas.parentElement;
1956
- if (!parentElement) {
1957
- console.warn("[Shaders] Canvas has no parent element for resize observation");
1958
- return;
1959
- }
1960
- resizeObserver = new ResizeObserver(handleResize);
1961
- resizeObserver.observe(parentElement);
1965
+ const elementToObserve = resizeTarget ?? canvas.parentElement;
1966
+ if (elementToObserve) {
1967
+ resizeObserver = new ResizeObserver(handleResize);
1968
+ resizeObserver.observe(elementToObserve);
1969
+ } else console.warn("[Shaders] No element available for resize observation — use resize() manually");
1962
1970
  intersectionObserver = new IntersectionObserver(handleVisibilityChange, { threshold: 0 });
1963
1971
  intersectionObserver.observe(canvas);
1964
1972
  const rect = canvas.getBoundingClientRect();
1965
1973
  isVisible = rect.width > 0 && rect.height > 0 && rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
1966
1974
  shouldAnimate = true;
1967
- const { width, height } = canvas.getBoundingClientRect();
1975
+ const width = rect.width > 0 ? rect.width : canvas.width;
1976
+ const height = rect.height > 0 ? rect.height : canvas.height;
1968
1977
  const roundedWidth = Math.round(width);
1969
1978
  const roundedHeight = Math.round(height);
1970
1979
  if (roundedWidth > 0 && roundedHeight > 0) {
@@ -2081,6 +2090,10 @@ function shaderRenderer() {
2081
2090
  updateUniformValue: updateUniformValue$1,
2082
2091
  updateNodeMetadata,
2083
2092
  isInitialized: () => isInitialized,
2093
+ resize: (width, height) => {
2094
+ if (!renderer || !camera || !mesh) return;
2095
+ updateRendererDimensions(width, height);
2096
+ },
2084
2097
  startAnimation,
2085
2098
  stopAnimation,
2086
2099
  renderAndWait,
@@ -2164,7 +2177,7 @@ function createRendererFromJSON(preset, options) {
2164
2177
  }
2165
2178
  const nodeId = component.id || `${component.type}_${Date.now()}_${Math.random()}`;
2166
2179
  nodeIdMap.set(nodeId, component.type);
2167
- const uniforms = propsToUniforms(component.props || {}, componentDef);
2180
+ const uniforms = createUniformsMap(componentDef, Object.fromEntries(Object.entries(componentDef.props).map(([key, propConfig]) => [key, component.props?.[key] !== void 0 ? component.props[key] : propConfig.default])), nodeId);
2168
2181
  const metadata = {
2169
2182
  blendMode: component.props?.blendMode || "normal",
2170
2183
  opacity: component.props?.opacity,
@@ -2175,29 +2188,22 @@ function createRendererFromJSON(preset, options) {
2175
2188
  source: component.props.maskSource,
2176
2189
  type: component.props.maskType || "alpha"
2177
2190
  } : void 0,
2178
- transform: component.props?.transform
2191
+ transform: component.props?.transform ? {
2192
+ offsetX: 0,
2193
+ offsetY: 0,
2194
+ rotation: 0,
2195
+ scale: 1,
2196
+ anchorX: .5,
2197
+ anchorY: .5,
2198
+ edges: "transparent",
2199
+ ...component.props.transform
2200
+ } : void 0
2179
2201
  };
2180
2202
  coreRenderer.registerNode(nodeId, componentDef.fragmentNode, parentId, metadata, uniforms, componentDef);
2181
2203
  component.children?.forEach((child, index) => {
2182
2204
  registerComponent(child, nodeId, index);
2183
2205
  });
2184
2206
  }
2185
- function propsToUniforms(props, componentDef) {
2186
- const uniforms = {};
2187
- Object.entries(componentDef.props).forEach(([key, propConfig]) => {
2188
- const value = props[key] !== void 0 ? props[key] : propConfig.default;
2189
- const transformedValue = propConfig.transform ? propConfig.transform(value) : value;
2190
- if (transformedValue && typeof transformedValue === "object" && "node" in transformedValue) uniforms[key] = {
2191
- uniform: transformedValue.node,
2192
- transform: propConfig.transform
2193
- };
2194
- else uniforms[key] = {
2195
- uniform: uniform(transformedValue),
2196
- transform: propConfig.transform
2197
- };
2198
- });
2199
- return uniforms;
2200
- }
2201
2207
  return {
2202
2208
  initialize,
2203
2209
  renderFrame,
@@ -1 +1 @@
1
- {"version":3,"file":"presetRenderer.d.ts","sourceRoot":"","sources":["../src/presetRenderer.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yBAAyB,CAAC,EAAE,OAAO,CAAA;IAEnC,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,SAAS,CAAA;QACjB,OAAO,EAAE,UAAU,CAAA;KACpB,CAAA;IACD,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAAA;IAExD,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAAA;IACxD,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,qBAAqB;yBAgBG,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAAC;uBAoBrC,OAAO,CAAC,IAAI,CAAC;8BAaV,YAAY,KAAG,IAAI;yBAgB1B,UAAU;mBAwBhB,IAAI;EAyHzB"}
1
+ {"version":3,"file":"presetRenderer.d.ts","sourceRoot":"","sources":["../src/presetRenderer.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yBAAyB,CAAC,EAAE,OAAO,CAAA;IAEnC,GAAG,CAAC,EAAE;QACJ,MAAM,EAAE,SAAS,CAAA;QACjB,OAAO,EAAE,UAAU,CAAA;KACpB,CAAA;IACD,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAAA;IAExD,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAAA;IACxD,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,qBAAqB;yBAgBG,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAAC;uBAoBrC,OAAO,CAAC,IAAI,CAAC;8BAaV,YAAY,KAAG,IAAI;yBAgB1B,UAAU;mBAwBhB,IAAI;EA6FzB"}
@@ -135,6 +135,9 @@ interface NodeRegistry {
135
135
  */
136
136
  interface InitializeOptions {
137
137
  canvas: HTMLCanvasElement;
138
+ /** Element to observe for resize events. Defaults to canvas.parentElement.
139
+ * Pass the canvas itself when the user controls the canvas directly (e.g. the JS package). */
140
+ resizeTarget?: HTMLElement;
138
141
  enablePerformanceTracking?: boolean;
139
142
  colorSpace?: 'p3-linear' | 'srgb';
140
143
  context?: WebGLRenderingContext | WebGL2RenderingContext;
@@ -148,13 +151,14 @@ interface InitializeOptions {
148
151
  * The core renderer for Shaders
149
152
  */
150
153
  export declare function shaderRenderer(): {
151
- initialize: ({ canvas, enablePerformanceTracking: enableTracking, colorSpace, context, gpu, forceFullFrameRate: forceFullFps }: InitializeOptions) => Promise<void>;
154
+ initialize: ({ canvas, resizeTarget, enablePerformanceTracking: enableTracking, colorSpace, context, gpu, forceFullFrameRate: forceFullFps }: InitializeOptions) => Promise<void>;
152
155
  cleanup: () => void;
153
156
  registerNode: (id: string, fragmentNodeFunc: ComponentDefinition["fragmentNode"] | null, parentId: string | null, metadata: NodeMetadata | null, uniforms?: UniformsMap, componentDefinition?: ComponentDefinition) => void;
154
157
  removeNode: (id: string) => void;
155
158
  updateUniformValue: (nodeId: string, uniformName: string, value: any) => void;
156
159
  updateNodeMetadata: (nodeId: string, metadata: Partial<NodeMetadata>) => void;
157
160
  isInitialized: () => boolean;
161
+ resize: (width: number, height: number) => void;
158
162
  startAnimation: () => void;
159
163
  stopAnimation: () => void;
160
164
  renderAndWait: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './utils/generatePresetCode'
@@ -0,0 +1 @@
1
+ export * from './utils/generatePresetCode.js'
@@ -0,0 +1,19 @@
1
+ import { ShaderInstance, PreviewOptions } from './types';
2
+
3
+ /**
4
+ * Create a watermarked shader preview from a preview token or preset ID.
5
+ * Fetches the encoded (and server-watermarked) definition from the API,
6
+ * decodes it, renders it to the canvas, and adds a DOM watermark overlay.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const preview = await createPreview(canvas, {
11
+ * presetId: 'abc123'
12
+ * })
13
+ *
14
+ * // Cleanup
15
+ * preview.destroy()
16
+ * ```
17
+ */
18
+ export declare function createPreview(canvas: HTMLCanvasElement, options: PreviewOptions): Promise<ShaderInstance>;
19
+ //# sourceMappingURL=createPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPreview.d.ts","sourceRoot":"","sources":["../src/createPreview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAO7D;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAuCzB"}
@@ -0,0 +1,64 @@
1
+ import { createShader } from "./createShader.js";
2
+ import { decodePreviewDefinition } from "./decode.js";
3
+ var DEFAULT_API_BASE = "https://shaders.com";
4
+ var WATERMARK_TEXT = "Unlock your Shaders Pro license";
5
+ var WATERMARK_LINK = "https://shaders.com/dashboard?pricing=true";
6
+ async function createPreview(canvas, options) {
7
+ if (!options.shader && !options.presetId || options.shader && options.presetId) throw new Error("Exactly one of shader (preview token) or presetId must be provided");
8
+ const apiBase = options.apiBaseUrl || DEFAULT_API_BASE;
9
+ const url = options.shader ? `${apiBase}/api/preview/shader/${encodeURIComponent(options.shader)}` : `${apiBase}/api/preview/preset/${encodeURIComponent(options.presetId)}`;
10
+ const response = await fetch(url);
11
+ if (!response.ok) throw new Error(`Failed to fetch preview: ${response.status} ${response.statusText}`);
12
+ const instance = await createShader(canvas, decodePreviewDefinition(await response.text()), {
13
+ isPreview: true,
14
+ enablePerformanceTracking: true
15
+ });
16
+ const { overlay, savedPosition, parentEl } = createWatermarkOverlay(canvas);
17
+ const originalDestroy = instance.destroy.bind(instance);
18
+ instance.destroy = () => {
19
+ if (parentEl && savedPosition !== void 0) parentEl.style.position = savedPosition;
20
+ overlay.remove();
21
+ originalDestroy();
22
+ };
23
+ return instance;
24
+ }
25
+ function createWatermarkOverlay(canvas) {
26
+ const parent = canvas.parentElement;
27
+ let savedPosition;
28
+ if (parent) {
29
+ if (getComputedStyle(parent).position === "static") {
30
+ savedPosition = parent.style.position;
31
+ parent.style.position = "relative";
32
+ }
33
+ }
34
+ const link = document.createElement("a");
35
+ link.href = WATERMARK_LINK;
36
+ link.target = "_blank";
37
+ link.rel = "noopener noreferrer";
38
+ link.textContent = WATERMARK_TEXT;
39
+ Object.assign(link.style, {
40
+ position: "absolute",
41
+ bottom: "8px",
42
+ right: "12px",
43
+ fontSize: "11px",
44
+ fontFamily: "system-ui, -apple-system, sans-serif",
45
+ color: "rgba(255, 255, 255, 0.5)",
46
+ textDecoration: "none",
47
+ zIndex: "10",
48
+ pointerEvents: "auto",
49
+ transition: "color 0.2s ease"
50
+ });
51
+ link.addEventListener("mouseenter", () => {
52
+ link.style.color = "rgba(255, 255, 255, 0.8)";
53
+ });
54
+ link.addEventListener("mouseleave", () => {
55
+ link.style.color = "rgba(255, 255, 255, 0.5)";
56
+ });
57
+ if (parent) parent.appendChild(link);
58
+ return {
59
+ overlay: link,
60
+ savedPosition,
61
+ parentEl: parent
62
+ };
63
+ }
64
+ export { createPreview };
@@ -0,0 +1,24 @@
1
+ import { PresetConfig } from '../core';
2
+ import { ShaderOptions, ShaderInstance } from './types';
3
+
4
+ /**
5
+ * Create a shader instance from preset JSON.
6
+ * Auto-starts animation loop — no manual render needed.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const shader = await createShader(canvas, {
11
+ * components: [
12
+ * { type: 'Circle', id: 'c1', props: { color: '#ff0000', radius: 0.5 } }
13
+ * ]
14
+ * })
15
+ *
16
+ * // Update at runtime
17
+ * shader.update('c1', { radius: 0.8 })
18
+ *
19
+ * // Cleanup
20
+ * shader.destroy()
21
+ * ```
22
+ */
23
+ export declare function createShader(canvas: HTMLCanvasElement, preset: PresetConfig, options?: ShaderOptions): Promise<ShaderInstance>;
24
+ //# sourceMappingURL=createShader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createShader.d.ts","sourceRoot":"","sources":["../src/createShader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,cAAc,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAa5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC,CAqOzB"}
@@ -0,0 +1,132 @@
1
+ import { createUniformsMap, shaderRenderer } from "../core/index.js";
2
+ import { getAllShaders } from "../core/registry.js";
3
+ import { isExternalUser, shouldCollectTelemetry, startTelemetry } from "../core/telemetry/index.js";
4
+ import { vec4 } from "three/tsl";
5
+ var METADATA_PROPS = new Set([
6
+ "opacity",
7
+ "blendMode",
8
+ "visible",
9
+ "transform",
10
+ "maskSource",
11
+ "maskType"
12
+ ]);
13
+ async function createShader(canvas, preset, options) {
14
+ const renderer = shaderRenderer();
15
+ const componentRegistry = /* @__PURE__ */ new Map();
16
+ getAllShaders().forEach((shader) => {
17
+ componentRegistry.set(shader.definition.name, shader.definition);
18
+ });
19
+ const nodeEntryMap = /* @__PURE__ */ new Map();
20
+ if (!canvas.style.width || !canvas.style.height) {
21
+ const rect = canvas.getBoundingClientRect();
22
+ const w = rect.width > 0 ? rect.width : canvas.width;
23
+ const h = rect.height > 0 ? rect.height : canvas.height;
24
+ if (w > 0 && !canvas.style.width) canvas.style.width = `${w}px`;
25
+ if (h > 0 && !canvas.style.height) canvas.style.height = `${h}px`;
26
+ }
27
+ await renderer.initialize({
28
+ canvas,
29
+ resizeTarget: canvas,
30
+ enablePerformanceTracking: options?.enablePerformanceTracking || false,
31
+ colorSpace: options?.colorSpace
32
+ });
33
+ const rootId = "shader-root";
34
+ renderer.registerNode(rootId, ({ childNode }) => childNode || vec4(0, 0, 0, 0), null, null, {}, void 0);
35
+ preset.components.forEach((component, index) => {
36
+ registerComponent(component, rootId, index);
37
+ });
38
+ let telemetryCollector = null;
39
+ let telemetryStartTimeout = null;
40
+ if (isExternalUser() && shouldCollectTelemetry(options?.disableTelemetry || false, options?.isPreview || false)) {
41
+ const checkRendering = () => {
42
+ if (renderer.getPerformanceStats().fps > 0) {
43
+ telemetryCollector = startTelemetry(renderer, "2.5.80", options?.disableTelemetry || false, false);
44
+ if (telemetryCollector) telemetryCollector.start();
45
+ telemetryStartTimeout = null;
46
+ } else telemetryStartTimeout = setTimeout(checkRendering, 500);
47
+ };
48
+ telemetryStartTimeout = setTimeout(checkRendering, 500);
49
+ }
50
+ function registerComponent(component, parentId, renderOrder) {
51
+ const componentDef = componentRegistry.get(component.type);
52
+ if (!componentDef) {
53
+ console.warn(`[createShader] Unknown component type: ${component.type}`);
54
+ return;
55
+ }
56
+ const nodeId = component.id || `${component.type}_${Date.now()}_${Math.random()}`;
57
+ const uniforms = createUniformsMap(componentDef, Object.fromEntries(Object.entries(componentDef.props).map(([key, propConfig]) => [key, component.props?.[key] !== void 0 ? component.props[key] : propConfig.default])), nodeId);
58
+ const metadata = {
59
+ blendMode: component.props?.blendMode || "normal",
60
+ opacity: component.props?.opacity,
61
+ visible: component.props?.visible,
62
+ renderOrder,
63
+ id: component.id,
64
+ mask: component.props?.maskSource ? {
65
+ source: component.props.maskSource,
66
+ type: component.props.maskType || "alpha"
67
+ } : void 0,
68
+ transform: component.props?.transform ? {
69
+ offsetX: 0,
70
+ offsetY: 0,
71
+ rotation: 0,
72
+ scale: 1,
73
+ anchorX: .5,
74
+ anchorY: .5,
75
+ edges: "transparent",
76
+ ...component.props.transform
77
+ } : void 0
78
+ };
79
+ renderer.registerNode(nodeId, componentDef.fragmentNode, parentId, metadata, uniforms, componentDef);
80
+ nodeEntryMap.set(nodeId, {
81
+ componentDef,
82
+ uniforms,
83
+ nodeId,
84
+ component
85
+ });
86
+ component.children?.forEach((child, index) => {
87
+ registerComponent(child, nodeId, index);
88
+ });
89
+ }
90
+ function update(componentId, props) {
91
+ const entry = nodeEntryMap.get(componentId);
92
+ if (!entry) {
93
+ console.warn(`[createShader] Component ID not found: ${componentId}`);
94
+ return;
95
+ }
96
+ for (const [key, value] of Object.entries(props)) if (METADATA_PROPS.has(key)) if (key === "maskSource") renderer.updateNodeMetadata(entry.nodeId, { mask: value ? {
97
+ source: value,
98
+ type: props.maskType || entry.component.props?.maskType || "alpha"
99
+ } : void 0 });
100
+ else if (key === "maskType") continue;
101
+ else if (key === "transform") renderer.updateNodeMetadata(entry.nodeId, { transform: value });
102
+ else renderer.updateNodeMetadata(entry.nodeId, { [key]: value });
103
+ else renderer.updateUniformValue(entry.nodeId, key, value);
104
+ }
105
+ function resize(width, height) {
106
+ const rect = canvas.getBoundingClientRect();
107
+ const w = width ?? (rect.width > 0 ? rect.width : canvas.width);
108
+ const h = height ?? (rect.height > 0 ? rect.height : canvas.height);
109
+ if (w > 0 && h > 0) {
110
+ canvas.style.width = `${w}px`;
111
+ canvas.style.height = `${h}px`;
112
+ renderer.resize(w, h);
113
+ }
114
+ }
115
+ function destroy() {
116
+ if (telemetryCollector) {
117
+ telemetryCollector.stop();
118
+ telemetryCollector = null;
119
+ }
120
+ if (telemetryStartTimeout !== null) {
121
+ clearTimeout(telemetryStartTimeout);
122
+ telemetryStartTimeout = null;
123
+ }
124
+ renderer.cleanup();
125
+ }
126
+ return {
127
+ update,
128
+ resize,
129
+ destroy
130
+ };
131
+ }
132
+ export { createShader };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Decode a preview definition (simple XOR + Base64, no name mapping).
3
+ * Preview definitions are version-proof — they use readable JSON
4
+ * instead of index-based name mapping.
5
+ */
6
+ export declare function decodePreviewDefinition(encoded: string): Record<string, unknown>;
7
+ //# sourceMappingURL=decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBhF"}
@@ -0,0 +1,22 @@
1
+ var PREVIEW_KEY = "shaders-preview-key";
2
+ function xorCrypt(data, key) {
3
+ const keyBytes = new TextEncoder().encode(key);
4
+ const result = new Uint8Array(data.length);
5
+ for (let i = 0; i < data.length; i++) result[i] = data[i] ^ keyBytes[i % keyBytes.length];
6
+ return result;
7
+ }
8
+ function decodePreviewDefinition(encoded) {
9
+ try {
10
+ const binaryString = atob(encoded);
11
+ const encrypted = new Uint8Array(binaryString.length);
12
+ for (let i = 0; i < binaryString.length; i++) encrypted[i] = binaryString.charCodeAt(i);
13
+ const decrypted = xorCrypt(encrypted, PREVIEW_KEY);
14
+ const json = new TextDecoder().decode(decrypted);
15
+ const result = JSON.parse(json);
16
+ if (typeof result !== "object" || result === null || Array.isArray(result)) throw new Error("unexpected shape");
17
+ return result;
18
+ } catch {
19
+ throw new Error("Failed to decode preview definition: invalid data");
20
+ }
21
+ }
22
+ export { decodePreviewDefinition };
@@ -0,0 +1,6 @@
1
+ export { createShader } from './createShader';
2
+ export { createPreview } from './createPreview';
3
+ export type { ShaderInstance, ShaderOptions, PreviewOptions } from './types';
4
+ export type { PresetConfig, ComponentConfig } from '../core';
5
+ export { generatePresetCode } from './utils/generatePresetCode';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { createShader } from "./createShader.js";
2
+ import { createPreview } from "./createPreview.js";
3
+ import { generatePresetCode } from "./utils/generatePresetCode.js";
4
+ export { createPreview, createShader, generatePresetCode };
@@ -0,0 +1,23 @@
1
+ export type { PresetConfig, ComponentConfig } from '../core';
2
+ export interface ShaderOptions {
3
+ colorSpace?: 'p3-linear' | 'srgb';
4
+ disableTelemetry?: boolean;
5
+ enablePerformanceTracking?: boolean;
6
+ isPreview?: boolean;
7
+ }
8
+ export interface PreviewOptions {
9
+ shader?: string;
10
+ presetId?: string;
11
+ apiBaseUrl?: string;
12
+ }
13
+ export interface ShaderInstance {
14
+ update(componentId: string, props: Record<string, any>): void;
15
+ /**
16
+ * Sync the renderer to the canvas's current dimensions.
17
+ * Call this after changing canvas.style.width/height or the width/height attributes.
18
+ * Optionally pass explicit pixel dimensions to force a specific size.
19
+ */
20
+ resize(width?: number, height?: number): void;
21
+ destroy(): void;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC7D;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,OAAO,IAAI,IAAI,CAAA;CAChB"}
@@ -0,0 +1,13 @@
1
+ interface ComponentConfig {
2
+ type: string;
3
+ id?: string;
4
+ props?: Record<string, any>;
5
+ children?: ComponentConfig[];
6
+ }
7
+ interface PresetConfig {
8
+ components: ComponentConfig[];
9
+ }
10
+ export declare function generatePresetCode(preset: PresetConfig, colorSpace?: 'p3-linear' | 'srgb'): string;
11
+ export declare const availableComponents: string[];
12
+ export {};
13
+ //# sourceMappingURL=generatePresetCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatePresetCode.d.ts","sourceRoot":"","sources":["../../src/utils/generatePresetCode.ts"],"names":[],"mappings":"AAAA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B;AAED,UAAU,YAAY;IACpB,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B;AA2sCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAoBlG;AAGD,eAAO,MAAM,mBAAmB,UA4F/B,CAAA"}