shaders 2.4.78 → 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 -1
  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 -1
  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
@@ -1,7 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte'
3
+ import type { Snippet } from 'svelte'
3
4
 
4
5
  import Shader from './Shader.svelte'
6
+ import RenderComponent from './PreviewRenderComponent.svelte'
5
7
  // <<< SHADERS_PREVIEW_MAP:START >>>
6
8
  import AngularBlur from '../components/AngularBlur.svelte'
7
9
  import Ascii from '../components/Ascii.svelte'
@@ -258,39 +260,56 @@ function fetchAndDecode(url: string, key: string): Promise<ShaderDefinition | nu
258
260
 
259
261
  // --- Props ---
260
262
 
261
- export let shader: string | undefined = undefined
262
- export let presetId: string | undefined = undefined
263
- export let apiBaseUrl: string = 'https://shaders.com'
264
- export let obfuscationKey: string = 'shaders-preview-key'
265
- export let watermarkText: string = 'Unlock your Shaders Pro license'
266
- export let watermarkLink: string = 'https://shaders.com/dashboard?pricing=true'
267
- export let style: string | undefined = undefined
263
+ interface Props {
264
+ shader?: string
265
+ presetId?: string
266
+ apiBaseUrl?: string
267
+ obfuscationKey?: string
268
+ watermarkText?: string
269
+ watermarkLink?: string
270
+ style?: string
271
+ [key: string]: any
272
+ }
273
+
274
+ const {
275
+ shader = undefined,
276
+ presetId = undefined,
277
+ apiBaseUrl = 'https://shaders.com',
278
+ obfuscationKey = 'shaders-preview-key',
279
+ watermarkText = 'Unlock your Shaders Pro license',
280
+ watermarkLink = 'https://shaders.com/dashboard?pricing=true',
281
+ style = undefined,
282
+ ...restProps
283
+ }: Props = $props()
268
284
 
269
285
  // --- Decode & Resolve ---
270
286
 
271
- let resolvedDefinition: ShaderDefinition | null = null
272
- let fetchedDefinition: ShaderDefinition | null = null
273
- let watermarkHovered = false
287
+ let fetchedDefinition: ShaderDefinition | null = $state(null)
288
+ let watermarkHovered = $state(false)
289
+
290
+ let resolvedDefinition: ShaderDefinition | null = $derived(fetchedDefinition ?? null)
274
291
 
275
292
  // Fetch shader by token
276
- $: if (shader) {
277
- fetchedDefinition = null
278
- fetchAndDecode(`${apiBaseUrl}/api/preview/shader/${shader}`, obfuscationKey)
279
- .then(def => { fetchedDefinition = def })
280
- } else if (!presetId) {
281
- fetchedDefinition = null
282
- }
293
+ $effect(() => {
294
+ if (shader) {
295
+ fetchedDefinition = null
296
+ fetchAndDecode(`${apiBaseUrl}/api/preview/shader/${shader}`, obfuscationKey)
297
+ .then(def => { fetchedDefinition = def })
298
+ } else if (!presetId) {
299
+ fetchedDefinition = null
300
+ }
301
+ })
283
302
 
284
303
  // Fetch preset by ID
285
- $: if (presetId) {
286
- fetchedDefinition = null
287
- fetchAndDecode(`${apiBaseUrl}/api/preview/preset/${presetId}`, obfuscationKey)
288
- .then(def => { fetchedDefinition = def })
289
- } else if (!shader) {
290
- fetchedDefinition = null
291
- }
292
-
293
- $: resolvedDefinition = fetchedDefinition ?? null
304
+ $effect(() => {
305
+ if (presetId) {
306
+ fetchedDefinition = null
307
+ fetchAndDecode(`${apiBaseUrl}/api/preview/preset/${presetId}`, obfuscationKey)
308
+ .then(def => { fetchedDefinition = def })
309
+ } else if (!shader) {
310
+ fetchedDefinition = null
311
+ }
312
+ })
294
313
 
295
314
  // --- Licensing Warning ---
296
315
 
@@ -303,15 +322,10 @@ onMount(() => {
303
322
 
304
323
  </script>
305
324
 
306
- <script lang="ts" context="module">
307
- // Recursive component for rendering nested shader components
308
- import { default as RenderComponent } from './PreviewRenderComponent.svelte'
309
- </script>
310
-
311
325
  {#if resolvedDefinition}
312
- <div class="shaders-preview" style="position: relative; width: 100%; height: 100%;{style ? ' ' + style : ''}" {...$$restProps}>
326
+ <div class="shaders-preview" style="position: relative; width: 100%; height: 100%;{style ? ' ' + style : ''}" {...restProps}>
313
327
  <Shader
314
- colorSpace={resolvedDefinition.colorSpace || 'p3-linear'}
328
+ colorSpace={resolvedDefinition.colorSpace || 'p3-linear'}
315
329
  isPreview={true}
316
330
  enablePerformanceTracking={true}
317
331
  style="width: 100%; height: 100%;"
@@ -342,8 +356,8 @@ colorSpace={resolvedDefinition.colorSpace || 'p3-linear'}
342
356
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
343
357
  transition: color 0.2s ease;
344
358
  "
345
- on:mouseenter={() => watermarkHovered = true}
346
- on:mouseleave={() => watermarkHovered = false}
359
+ onmouseenter={() => watermarkHovered = true}
360
+ onmouseleave={() => watermarkHovered = false}
347
361
  >
348
362
  {watermarkText}
349
363
  </a>
@@ -1,10 +1,14 @@
1
1
  <script lang="ts">
2
- export let config: any
3
- export let componentMap: Record<string, any>
4
- export let structureVersion: number | undefined = undefined
2
+ interface Props {
3
+ config: any
4
+ componentMap: Record<string, any>
5
+ structureVersion?: number
6
+ }
5
7
 
6
- $: Component = componentMap[config.type]
7
- $: componentProps = config.props ? { ...config.props } : {}
8
+ const { config, componentMap, structureVersion = undefined }: Props = $props()
9
+
10
+ const Component = $derived(componentMap[config.type])
11
+ const componentProps = $derived(config.props ? { ...config.props } : {})
8
12
  </script>
9
13
 
10
14
  {#if Component}
@@ -1,2 +1,2 @@
1
- import { n as generatePresetCode, t as availableComponents } from "../generatePresetCode-Bpe8YcaW.js";
1
+ import { n as generatePresetCode, t as availableComponents } from "../generatePresetCode-BN1puRG_.js";
2
2
  export { availableComponents, generatePresetCode };
@@ -57,7 +57,7 @@ var Shader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
57
57
  const startTelemetryWhenReady = () => {
58
58
  const checkRendering = () => {
59
59
  if (rendererInstance.value.getPerformanceStats().fps > 0) {
60
- telemetryCollector = startTelemetry(rendererInstance.value, "2.4.78", props.disableTelemetry, props.isPreview);
60
+ telemetryCollector = startTelemetry(rendererInstance.value, "2.5.80", props.disableTelemetry, props.isPreview);
61
61
  if (telemetryCollector) telemetryCollector.start();
62
62
  telemetryStartTimeout = null;
63
63
  } else telemetryStartTimeout = setTimeout(checkRendering, 500);
@@ -1 +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;AA2rCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CA4ClG;AAGD,eAAO,MAAM,mBAAmB,UA4F/B,CAAA"}
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;AAotCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAiFlG;AAGD,eAAO,MAAM,mBAAmB,UA4F/B,CAAA"}
@@ -1082,7 +1082,7 @@ function isPropMapValue(value) {
1082
1082
  function generatePropString(props, componentType, indent = " ") {
1083
1083
  return Object.entries(props).sort(([a], [b]) => a.localeCompare(b)).filter(([key, value]) => {
1084
1084
  if (key === "maskType" && value === "alpha") return false;
1085
- if (componentType === "Glass" && key === "shape" && props.shapeType === "svg") return false;
1085
+ if (key === "shape" && props.shapeSdfUrl) return false;
1086
1086
  if (key === "transform" && typeof value === "object") {
1087
1087
  if (Object.keys(DEFAULT_TRANSFORM).every((k) => value[k] === DEFAULT_TRANSFORM[k])) return false;
1088
1088
  }
@@ -1101,23 +1101,38 @@ function generatePropString(props, componentType, indent = " ") {
1101
1101
  const nonDefaultKeys = {};
1102
1102
  for (const k in value) if (value[k] !== DEFAULT_TRANSFORM[k]) nonDefaultKeys[k] = value[k];
1103
1103
  const keys = Object.keys(nonDefaultKeys).sort();
1104
- if (keys.length > 1) return `:${kebabKey}="{\n${indent} ${keys.map((k) => `'${k}':${typeof nonDefaultKeys[k] === "string" ? `'${nonDefaultKeys[k]}'` : nonDefaultKeys[k]}`).join(`,\n${indent} `)}\n${indent} }"`;
1104
+ if (keys.length > 1) return `:${kebabKey}="{\n${indent} ${keys.map((k) => `${k}: ${typeof nonDefaultKeys[k] === "string" ? `'${nonDefaultKeys[k]}'` : nonDefaultKeys[k]}`).join(`,\n${indent} `)}\n${indent} }"`;
1105
1105
  else if (keys.length === 1) {
1106
1106
  const k = keys[0];
1107
1107
  const v = nonDefaultKeys[k];
1108
- return `:${kebabKey}="{'${k}':${typeof v === "string" ? `'${v}'` : v}}"`;
1108
+ return `:${kebabKey}="{ ${k}: ${typeof v === "string" ? `'${v}'` : v} }"`;
1109
1109
  }
1110
1110
  }
1111
1111
  if (isPropMapValue(value)) return `:${kebabKey}="{\n${indent} ${Object.keys(value).map((k) => {
1112
1112
  const v = value[k];
1113
1113
  return `${k}: ${typeof v === "string" ? `'${v}'` : v}`;
1114
1114
  }).join(`,\n${indent} `)}\n${indent} }"`;
1115
- if (typeof value === "string") return `${kebabKey}="${value}"`;
1116
- else if (value !== null && typeof value === "object") {
1115
+ if (typeof value === "string") {
1116
+ if (value.startsWith("{") && value.endsWith("}")) try {
1117
+ const parsed = JSON.parse(value);
1118
+ if (typeof parsed === "object" && parsed !== null) {
1119
+ const keys = Object.keys(parsed);
1120
+ if (keys.length === 0) return `:${kebabKey}="{}"`;
1121
+ if (keys.length > 1) return `:${kebabKey}="{\n${indent} ${keys.map((k) => `${k}: ${typeof parsed[k] === "string" ? `'${parsed[k]}'` : parsed[k]}`).join(`,\n${indent} `)}\n${indent} }"`;
1122
+ const [pk] = keys;
1123
+ return `:${kebabKey}="{ ${pk}: ${typeof parsed[pk] === "string" ? `'${parsed[pk]}'` : parsed[pk]} }"`;
1124
+ }
1125
+ } catch {}
1126
+ return `${kebabKey}="${value}"`;
1127
+ } else if (value !== null && typeof value === "object") {
1117
1128
  const roundedValue = { ...value };
1118
1129
  if ("x" in roundedValue && typeof roundedValue.x === "number") roundedValue.x = Math.round(roundedValue.x * 100) / 100;
1119
1130
  if ("y" in roundedValue && typeof roundedValue.y === "number") roundedValue.y = Math.round(roundedValue.y * 100) / 100;
1120
- return `:${kebabKey}="${JSON.stringify(roundedValue).replace(/"/g, "'")}"`;
1131
+ const keys = Object.keys(roundedValue);
1132
+ if (keys.length === 0) return `:${kebabKey}="{}"`;
1133
+ if (keys.length > 1) return `:${kebabKey}="{\n${indent} ${keys.map((k) => `${k}: ${typeof roundedValue[k] === "string" ? `'${roundedValue[k]}'` : roundedValue[k]}`).join(`,\n${indent} `)}\n${indent} }"`;
1134
+ const [rk] = keys;
1135
+ return `:${kebabKey}="{ ${rk}: ${typeof roundedValue[rk] === "string" ? `'${roundedValue[rk]}'` : roundedValue[rk]} }"`;
1121
1136
  } else return `:${kebabKey}="${value}"`;
1122
1137
  }).join("\n" + indent + " ");
1123
1138
  }
@@ -1139,7 +1154,15 @@ function isIdReferenced(id, allComponents) {
1139
1154
  });
1140
1155
  }
1141
1156
  function generatePresetCode(preset, colorSpace) {
1142
- const generateComponentString = (config, indent = " ") => {
1157
+ const componentTypes = /* @__PURE__ */ new Set();
1158
+ function collectTypes(components) {
1159
+ for (const config of components) {
1160
+ componentTypes.add(config.type);
1161
+ if (config.children) collectTypes(config.children);
1162
+ }
1163
+ }
1164
+ collectTypes(preset.components);
1165
+ const generateComponentString = (config, indent = " ") => {
1143
1166
  const propString = config.props ? generatePropString(config.props, config.type, indent) : "";
1144
1167
  let idString = "";
1145
1168
  if (config.id) {
@@ -1154,7 +1177,21 @@ function generatePresetCode(preset, colorSpace) {
1154
1177
  else return `${indent}<${config.type}/>`;
1155
1178
  };
1156
1179
  const componentStrings = preset.components.map((config) => generateComponentString(config)).join("\n");
1157
- return `<Shader${colorSpace && colorSpace !== "p3-linear" ? ` color-space="${colorSpace}"` : ""}>\n${componentStrings}\n</Shader>`;
1180
+ const shaderProps = colorSpace && colorSpace !== "p3-linear" ? ` color-space="${colorSpace}"` : "";
1181
+ const allImports = ["Shader", ...Array.from(componentTypes).sort()];
1182
+ const uniqueImports = [...new Set(allImports)];
1183
+ const imports = uniqueImports.length > 3 ? uniqueImports.join(",\n ") : uniqueImports.join(", ");
1184
+ return [
1185
+ "<script setup lang=\"ts\">",
1186
+ uniqueImports.length > 3 ? `import {\n ${imports}\n} from 'shaders/vue'` : `import { ${imports} } from 'shaders/vue'`,
1187
+ "<\/script>",
1188
+ "",
1189
+ "<template>",
1190
+ ` <Shader${shaderProps}>`,
1191
+ componentStrings,
1192
+ " </Shader>",
1193
+ "</template>"
1194
+ ].join("\n");
1158
1195
  }
1159
1196
  const availableComponents = [
1160
1197
  "AngularBlur",
@@ -1 +1 @@
1
- {"version":3,"file":"generatePresetCode.template.d.ts","sourceRoot":"","sources":["../../src/utils/generatePresetCode.template.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;AAkJD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CA4ClG;AAGD,eAAO,MAAM,mBAAmB,OAG/B,CAAA"}
1
+ {"version":3,"file":"generatePresetCode.template.d.ts","sourceRoot":"","sources":["../../src/utils/generatePresetCode.template.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;AA2KD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAiFlG;AAGD,eAAO,MAAM,mBAAmB,OAG/B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shaders",
3
- "version": "2.4.78",
3
+ "version": "2.5.80",
4
4
  "description": "Shader magic for modern frontends",
5
5
  "author": "Shader Effects Inc.",
6
6
  "homepage": "https://shaders.com/",
@@ -55,6 +55,14 @@
55
55
  "types": "./dist/pixi/index.d.ts",
56
56
  "import": "./dist/pixi/index.js"
57
57
  },
58
+ "./js": {
59
+ "types": "./dist/js/index.d.ts",
60
+ "import": "./dist/js/index.js"
61
+ },
62
+ "./js/codegen": {
63
+ "types": "./dist/js/codegen.d.ts",
64
+ "import": "./dist/js/codegen.js"
65
+ },
58
66
  "./core": {
59
67
  "types": "./dist/core/index.d.ts",
60
68
  "import": "./dist/core/index.js",
@@ -570,6 +578,12 @@
570
578
  "pixi": [
571
579
  "./dist/pixi/index.d.ts"
572
580
  ],
581
+ "js": [
582
+ "./dist/js/index.d.ts"
583
+ ],
584
+ "js/codegen": [
585
+ "./dist/js/codegen.d.ts"
586
+ ],
573
587
  "core": [
574
588
  "./dist/core/index.d.ts"
575
589
  ],