shaders 2.5.116 → 2.5.117

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 (57) hide show
  1. package/dist/core/WorleyNoise-Derik4n-.js +323 -0
  2. package/dist/core/index.js +3 -2
  3. package/dist/core/registry.js +3 -2
  4. package/dist/core/{shaderRegistry-BPtUQU-N.js → shaderRegistry-Ceu0nAxP.js} +4 -2
  5. package/dist/core/shaderRegistry.d.ts.map +1 -1
  6. package/dist/core/shaders/WorleyNoise/index.d.ts +99 -0
  7. package/dist/core/shaders/WorleyNoise/index.d.ts.map +1 -0
  8. package/dist/core/shaders/WorleyNoise/index.js +5 -0
  9. package/dist/core/shaders/ZoomBlur/index.js +1 -1
  10. package/dist/js/createShader.js +1 -1
  11. package/dist/js/utils/generatePresetCode.d.ts.map +1 -1
  12. package/dist/js/utils/generatePresetCode.js +19 -0
  13. package/dist/react/Preview.js +1 -0
  14. package/dist/react/Shader.js +1 -1
  15. package/dist/react/WorleyNoise.js +217 -0
  16. package/dist/react/bundle.js +207 -207
  17. package/dist/react/components/WorleyNoise.d.ts +39 -0
  18. package/dist/react/components/WorleyNoise.d.ts.map +1 -0
  19. package/dist/react/engine/Preview.d.ts.map +1 -1
  20. package/dist/react/index.d.ts +1 -0
  21. package/dist/react/index.d.ts.map +1 -1
  22. package/dist/react/index.js +2 -1
  23. package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
  24. package/dist/react/utils/generatePresetCode.js +19 -0
  25. package/dist/registry.js +519 -0
  26. package/dist/solid/components/WorleyNoise.d.ts +36 -0
  27. package/dist/solid/components/WorleyNoise.d.ts.map +1 -0
  28. package/dist/solid/components/WorleyNoise.js +228 -0
  29. package/dist/solid/engine/Preview.d.ts.map +1 -1
  30. package/dist/solid/engine/Preview.js +216 -214
  31. package/dist/solid/engine/Shader.js +1 -1
  32. package/dist/solid/index.d.ts +1 -0
  33. package/dist/solid/index.d.ts.map +1 -1
  34. package/dist/solid/index.js +8 -6
  35. package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
  36. package/dist/solid/utils/generatePresetCode.js +19 -0
  37. package/dist/svelte/components/WorleyNoise.svelte.d.ts +26 -0
  38. package/dist/svelte/index.d.ts +1 -0
  39. package/dist/svelte/index.js +634 -434
  40. package/dist/svelte/source/components/WorleyNoise.svelte +332 -0
  41. package/dist/svelte/source/engine/Preview.svelte +2 -0
  42. package/dist/svelte/source/index.js +1 -0
  43. package/dist/svelte/utils/generatePresetCode.js +19 -0
  44. package/dist/vue/Preview.vue_vue_type_script_setup_true_lang.js +2 -0
  45. package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +28 -18
  46. package/dist/vue/WorleyNoise.js +3 -0
  47. package/dist/vue/WorleyNoise.vue_vue_type_script_setup_true_lang.js +226 -0
  48. package/dist/vue/components/WorleyNoise.vue.d.ts +61 -0
  49. package/dist/vue/components/WorleyNoise.vue.d.ts.map +1 -0
  50. package/dist/vue/engine/Shader.vue.d.ts.map +1 -1
  51. package/dist/vue/index.d.ts +1 -0
  52. package/dist/vue/index.d.ts.map +1 -1
  53. package/dist/vue/index.js +2 -1
  54. package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
  55. package/dist/vue/utils/generatePresetCode.js +19 -0
  56. package/package.json +9 -1
  57. /package/dist/core/{ZoomBlur-DLaH226M.js → ZoomBlur-BdLC9MCq.js} +0 -0
@@ -0,0 +1,332 @@
1
+ <script lang="ts">
2
+ import { getContext, setContext, onMount, onDestroy } from 'svelte';
3
+ import {
4
+ createUniformsMap,
5
+ type UniformsMap,
6
+ type BlendMode,
7
+ type NodeMetadata,
8
+ type PropConfig,
9
+ type MaskConfig,
10
+ type PropDriver,
11
+ type TransformConfig
12
+ } from '../../../core/index.js';
13
+ import {setColorSpaceMode} from '../../../core/utilities/transformations/index.js';
14
+
15
+ // @ts-ignore - this import is replaced at build time
16
+ import { componentDefinition, type ComponentProps } from '../../../core/shaders/WorleyNoise/index.js';
17
+
18
+ // Warn once per page load if this is an experimental component
19
+ let _experimentalWarnedOnce = false;
20
+ if ((componentDefinition as any).experimental && !_experimentalWarnedOnce) {
21
+ _experimentalWarnedOnce = true;
22
+ const _e = (componentDefinition as any).experimental;
23
+ console.info(`%c⚠ [Shaders] ${componentDefinition.name} is experimental: ${_e.message}`, 'color: #f59e0b; font-weight: bold');
24
+ }
25
+
26
+ /**
27
+ * Define component props including blend mode, opacity, visibility, masking, and transformation
28
+ */
29
+ interface ExtendedComponentProps extends Partial<ComponentProps> {
30
+ scale?: ComponentProps['scale'] | PropDriver;
31
+ lacunarity?: ComponentProps['lacunarity'] | PropDriver;
32
+ persistence?: ComponentProps['persistence'] | PropDriver;
33
+ jitter?: ComponentProps['jitter'] | PropDriver;
34
+ contrast?: ComponentProps['contrast'] | PropDriver;
35
+ balance?: ComponentProps['balance'] | PropDriver;
36
+ seed?: ComponentProps['seed'] | PropDriver;
37
+ blendMode?: BlendMode;
38
+ opacity?: number;
39
+ visible?: boolean;
40
+ id?: string;
41
+ maskSource?: string;
42
+ maskType?: string;
43
+ renderOrder?: number;
44
+ transform?: Partial<TransformConfig>;
45
+ children?: import('svelte').Snippet;
46
+ }
47
+
48
+ function isPropDriver(value: unknown): value is PropDriver {
49
+ return typeof value === 'object' && value !== null && 'type' in value &&
50
+ ((value as any).type === 'map' || (value as any).type === 'mouse' || (value as any).type === 'mouse-position' || (value as any).type === 'auto-animate');
51
+ }
52
+
53
+ /**
54
+ * Default transform configuration (optimized for zero overhead)
55
+ */
56
+ const DEFAULT_TRANSFORM: TransformConfig = {
57
+ offsetX: 0,
58
+ offsetY: 0,
59
+ rotation: 0,
60
+ scale: 1,
61
+ anchorX: 0.5,
62
+ anchorY: 0.5,
63
+ edges: 'transparent'
64
+ };
65
+
66
+ // Define the component props and their default values from the shader definition
67
+ const componentDefaults = {
68
+ blendMode: 'normal' as BlendMode,
69
+ visible: true,
70
+ // opacity intentionally has no default - handled by renderer
71
+ // transform intentionally has no default - handled by effectiveTransform
72
+ ...Object.entries(componentDefinition.props).reduce(
73
+ (acc, [key, config]) => {
74
+ acc[key] = (config as unknown as PropConfig<typeof config>).default;
75
+ return acc;
76
+ },
77
+ {} as Record<string, any>
78
+ )
79
+ };
80
+
81
+ // Declare props using Svelte 5's syntax
82
+ const props: ExtendedComponentProps = $props();
83
+
84
+ // Apply defaults manually since Svelte 5 doesn't have withDefaults equivalent
85
+ // Use $derived so the metadata $effect re-runs when any of these change at runtime
86
+ const blendMode = $derived(props.blendMode ?? componentDefaults.blendMode);
87
+ const opacity = $derived(props.opacity); // No default - handled by renderer
88
+ const visible = $derived(props.visible ?? componentDefaults.visible); // Default to true
89
+ const id = $derived(props.id);
90
+ const maskSource = $derived(props.maskSource);
91
+ const maskType = $derived(props.maskType);
92
+ const renderOrder = $derived(props.renderOrder);
93
+ const { children } = props;
94
+
95
+ // Collect PropDriver values from shader props into the maps metadata structure
96
+ const mapsFromProps = $derived.by(() => {
97
+ const maps: Record<string, PropDriver> = {};
98
+ for (const key of Object.keys(componentDefinition.props)) {
99
+ const val = (props as any)[key];
100
+ if (isPropDriver(val)) maps[key] = val as PropDriver;
101
+ }
102
+ return Object.keys(maps).length > 0 ? maps : undefined;
103
+ });
104
+
105
+ /**
106
+ * Computed transform that merges user-provided values with defaults
107
+ */
108
+ const effectiveTransform = $derived({
109
+ ...DEFAULT_TRANSFORM,
110
+ ...props.transform
111
+ });
112
+
113
+ /**
114
+ * FIRST: Get the parent ID from context BEFORE setting our own context
115
+ */
116
+ const parentId = getContext<string>('shaderParentId');
117
+ if (parentId === undefined) {
118
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
119
+ }
120
+
121
+ /**
122
+ * Use the provided ID or generate a unique identifier for this component instance
123
+ */
124
+ const instanceId = (id ? id.replace(/[^a-zA-Z0-9_]/g, '_') : null) || Math.random().toString(36).substring(2, 10);
125
+
126
+ /**
127
+ * THEN: Provide our unique identifier to child components
128
+ */
129
+ setContext('shaderParentId', instanceId);
130
+
131
+ /**
132
+ * Creates a non-reactive object containing only props that differ from defaults
133
+ * This optimization prevents unnecessary GPU uniform updates for unchanged values
134
+ * Special props like blendMode and opacity are handled separately
135
+ */
136
+ const shaderReadyProps = $derived.by(() => {
137
+ let baseProps = { ...componentDefaults };
138
+
139
+ // Only include props that differ from defaults (excluding special props and PropDrivers)
140
+ for (const key in props) {
141
+ if (key !== 'blendMode' && key !== 'opacity' && key !== 'visible' &&
142
+ key !== 'id' && key !== 'maskSource' && key !== 'maskType' && key !== 'renderOrder' &&
143
+ key !== 'transform' && key !== 'children') {
144
+ const propValue = (props as any)[key];
145
+ if (isPropDriver(propValue)) continue; // PropDrivers go to metadata.maps, not uniforms
146
+ const defaultValue = (componentDefaults as any)[key];
147
+ if (propValue !== undefined && propValue !== defaultValue) {
148
+ (baseProps as any)[key] = propValue;
149
+ }
150
+ }
151
+ }
152
+ return baseProps;
153
+ });
154
+
155
+ /**
156
+ * Get the color space from the root Shader component.
157
+ * Used to set the global color space mode before creating uniforms.
158
+ */
159
+ const shaderColorSpace = getContext<() => 'p3-linear' | 'srgb'>('shaderColorSpace');
160
+
161
+ /**
162
+ * Creates the GPU uniform values map using only the changed props
163
+ * Set the global color space mode before creating uniforms so colors are transformed correctly
164
+ * Note: Intentionally captures initial value - props are immutable after initialization
165
+ */
166
+ if (shaderColorSpace) {
167
+ setColorSpaceMode(shaderColorSpace());
168
+ }
169
+ // svelte-ignore state_referenced_locally
170
+ const uniforms: UniformsMap = createUniformsMap(componentDefinition, shaderReadyProps, instanceId);
171
+
172
+ /**
173
+ * Get the node registration function from parent context
174
+ */
175
+ const parentRegister = getContext<(id: string, fragmentNodeFunc: any, parentId: string | null, metadata: NodeMetadata | null, uniforms: UniformsMap | null, componentDefinition: any, domCanvas?: HTMLCanvasElement) => void>('shaderNodeRegister');
176
+ if (parentRegister === undefined) {
177
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
178
+ }
179
+
180
+ /**
181
+ * Get the uniform update function from parent context
182
+ */
183
+ const parentUniformUpdate = getContext<(nodeId: string, uniformName: string, value: any) => void>('shaderUniformUpdate');
184
+ if (parentUniformUpdate === undefined) {
185
+ throw new Error('Shader components require shaderUniformUpdate from parent');
186
+ }
187
+
188
+ /**
189
+ * Get the metadata update function from parent context
190
+ */
191
+ const parentMetadataUpdate = getContext<(nodeId: string, metadata: NodeMetadata) => void>('shaderMetadataUpdate');
192
+ if (parentMetadataUpdate === undefined) {
193
+ throw new Error('Shader components require shaderMetadataUpdate from parent');
194
+ }
195
+
196
+ // capturesDOM — canvas layoutsubtree portal for DOMTexture-style shaders
197
+ const isCapturesDOM = !!(componentDefinition as any).capturesDOM;
198
+ let captureCanvas: HTMLCanvasElement | undefined;
199
+ let captureW = $state(typeof window !== 'undefined' ? Math.round(window.innerWidth * Math.min(window.devicePixelRatio, 2)) : 0);
200
+ let captureH = $state(typeof window !== 'undefined' ? Math.round(window.innerHeight * Math.min(window.devicePixelRatio, 2)) : 0);
201
+
202
+ function teleportToBody(node: HTMLElement) {
203
+ document.body.appendChild(node);
204
+ return { destroy() { node.remove(); } };
205
+ }
206
+
207
+ if (isCapturesDOM) {
208
+ const onWinResize = () => {
209
+ const d = Math.min(window.devicePixelRatio, 2);
210
+ captureW = Math.round(window.innerWidth * d);
211
+ captureH = Math.round(window.innerHeight * d);
212
+ };
213
+ onMount(() => { window.addEventListener('resize', onWinResize); });
214
+ onDestroy(() => { window.removeEventListener('resize', onWinResize); });
215
+ }
216
+
217
+ // DOM marker ref for determining render order from template position
218
+ let orderMarker: HTMLSpanElement;
219
+
220
+ // Stores the DOM-detected render order
221
+ let detectedRenderOrder: number | undefined = undefined;
222
+
223
+ // Flag to track when component is registered
224
+ let isRegistered = $state(false);
225
+
226
+ // Setup uniform watchers with registration guard
227
+ Object.entries(uniforms).forEach(([propName, { uniform, transform }]) => {
228
+ $effect(() => {
229
+ // Only run after component is registered
230
+ if (!isRegistered) return;
231
+
232
+ if (uniform && uniform.value !== undefined) {
233
+ const newValue = (props as any)[propName];
234
+ if (newValue !== undefined && !isPropDriver(newValue)) {
235
+ // Send raw value - renderer will handle transformation
236
+ // PropDriver values go to metadata.maps, not uniforms
237
+ parentUniformUpdate(instanceId, propName, newValue);
238
+ }
239
+ }
240
+ });
241
+ });
242
+
243
+ // Watch blend mode, opacity, visibility, masking, transformations, and prop maps changes
244
+ $effect(() => {
245
+ // Only run after component is registered
246
+ if (!isRegistered) return;
247
+
248
+ const metadata: NodeMetadata = {
249
+ blendMode,
250
+ opacity,
251
+ visible: visible === false ? false : true,
252
+ id,
253
+ mask: maskSource ? {
254
+ source: maskSource,
255
+ type: (maskType || 'alpha') as MaskConfig['type']
256
+ } : undefined,
257
+ maps: mapsFromProps,
258
+ renderOrder: renderOrder ?? detectedRenderOrder,
259
+ transform: effectiveTransform
260
+ };
261
+ parentMetadataUpdate(instanceId, metadata);
262
+ });
263
+
264
+ // Register this component after mount to ensure parent is ready
265
+ onMount(() => {
266
+ // Register this component with safety check
267
+ if (componentDefinition && typeof componentDefinition.fragmentNode === 'function') {
268
+ parentRegister(
269
+ instanceId,
270
+ componentDefinition.fragmentNode,
271
+ parentId,
272
+ {
273
+ blendMode,
274
+ opacity,
275
+ visible: visible !== false ? true : false,
276
+ id,
277
+ mask: maskSource ? {
278
+ source: maskSource,
279
+ type: (maskType || 'alpha') as MaskConfig['type']
280
+ } as MaskConfig : undefined,
281
+ maps: mapsFromProps,
282
+ renderOrder: renderOrder ?? detectedRenderOrder,
283
+ transform: effectiveTransform
284
+ },
285
+ uniforms,
286
+ componentDefinition,
287
+ isCapturesDOM ? captureCanvas : undefined
288
+ );
289
+
290
+ // Set flag to enable effects after successful registration
291
+ isRegistered = true;
292
+
293
+ // Detect DOM position for correct render ordering
294
+ if (renderOrder === undefined && orderMarker) {
295
+ const parent = orderMarker.parentElement;
296
+ if (parent) {
297
+ const siblings = parent.querySelectorAll(':scope > [data-shader-id]');
298
+ const position = Array.from(siblings).indexOf(orderMarker);
299
+ if (position >= 0) {
300
+ detectedRenderOrder = position;
301
+ parentMetadataUpdate(instanceId, { renderOrder: position } as NodeMetadata);
302
+ }
303
+ }
304
+ }
305
+ } else {
306
+ console.error('componentDefinition.fragmentNode is not a function:', {
307
+ componentDefinition,
308
+ fragmentNode: componentDefinition?.fragmentNode,
309
+ type: typeof componentDefinition?.fragmentNode
310
+ });
311
+ }
312
+ });
313
+
314
+ // Clean up node from registry when component is unmounted
315
+ onDestroy(() => {
316
+ isRegistered = false;
317
+ parentRegister(instanceId, null, null, null, null);
318
+ });
319
+ </script>
320
+
321
+ <span bind:this={orderMarker} style="display:contents" data-shader-id={instanceId}>
322
+ {#if !isCapturesDOM}
323
+ {@render children?.()}
324
+ {/if}
325
+ </span>
326
+ {#if isCapturesDOM}
327
+ <canvas use:teleportToBody bind:this={captureCanvas} layoutsubtree
328
+ width={captureW} height={captureH}
329
+ style="position:fixed;inset:0;width:100vw;height:100vh;z-index:-9999">
330
+ {@render children?.()}
331
+ </canvas>
332
+ {/if}
@@ -112,6 +112,7 @@ import Voronoi from '../components/Voronoi.svelte'
112
112
  import WaveDistortion from '../components/WaveDistortion.svelte'
113
113
  import Weave from '../components/Weave.svelte'
114
114
  import WebcamTexture from '../components/WebcamTexture.svelte'
115
+ import WorleyNoise from '../components/WorleyNoise.svelte'
115
116
  import ZoomBlur from '../components/ZoomBlur.svelte'
116
117
 
117
118
  // --- Component Map ---
@@ -224,6 +225,7 @@ const componentMap: Record<string, any> = {
224
225
  WaveDistortion,
225
226
  Weave,
226
227
  WebcamTexture,
228
+ WorleyNoise,
227
229
  ZoomBlur,
228
230
  }
229
231
  // <<< SHADERS_PREVIEW_MAP:END >>>
@@ -105,6 +105,7 @@ export { default as Voronoi } from './components/Voronoi.svelte';
105
105
  export { default as WaveDistortion } from './components/WaveDistortion.svelte';
106
106
  export { default as Weave } from './components/Weave.svelte';
107
107
  export { default as WebcamTexture } from './components/WebcamTexture.svelte';
108
+ export { default as WorleyNoise } from './components/WorleyNoise.svelte';
108
109
  export { default as ZoomBlur } from './components/ZoomBlur.svelte';
109
110
  export { default as Shader } from './engine/Shader.svelte';
110
111
  export { default as Preview } from './engine/Preview.svelte';
@@ -1346,6 +1346,24 @@ var shaderMetadata = {
1346
1346
  "objectFit": "cover",
1347
1347
  "mirror": true
1348
1348
  },
1349
+ "WorleyNoise": {
1350
+ "opacity": 1,
1351
+ "blendMode": "normal",
1352
+ "colorA": "#ffffff",
1353
+ "colorB": "#000000",
1354
+ "colorSpace": "linear",
1355
+ "scale": 6,
1356
+ "mode": "f1",
1357
+ "distance": "euclidean",
1358
+ "octaves": 1,
1359
+ "lacunarity": 2,
1360
+ "persistence": .5,
1361
+ "jitter": 1,
1362
+ "contrast": 1,
1363
+ "balance": 0,
1364
+ "seed": 0,
1365
+ "speed": .5
1366
+ },
1349
1367
  "ZoomBlur": {
1350
1368
  "opacity": 1,
1351
1369
  "blendMode": "normal",
@@ -1573,6 +1591,7 @@ const availableComponents = [
1573
1591
  "WaveDistortion",
1574
1592
  "Weave",
1575
1593
  "WebcamTexture",
1594
+ "WorleyNoise",
1576
1595
  "ZoomBlur"
1577
1596
  ];
1578
1597
  export { availableComponents, generatePresetCode };
@@ -105,6 +105,7 @@ import Voronoi_default from "./Voronoi.js";
105
105
  import WaveDistortion_default from "./WaveDistortion.js";
106
106
  import Weave_default from "./Weave.js";
107
107
  import WebcamTexture_default from "./WebcamTexture.js";
108
+ import WorleyNoise_default from "./WorleyNoise.js";
108
109
  import ZoomBlur_default from "./ZoomBlur.js";
109
110
  import Shader_default from "./Shader.js";
110
111
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, h, mergeProps, onMounted, openBlock, ref, renderList, toDisplayString, watch, withCtx } from "vue";
@@ -270,6 +271,7 @@ var Preview_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
270
271
  WaveDistortion: WaveDistortion_default,
271
272
  Weave: Weave_default,
272
273
  WebcamTexture: WebcamTexture_default,
274
+ WorleyNoise: WorleyNoise_default,
273
275
  ZoomBlur: ZoomBlur_default
274
276
  };
275
277
  function xorCrypt(data, key) {
@@ -60,7 +60,7 @@ var Shader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
60
60
  const startTelemetryWhenReady = () => {
61
61
  const checkRendering = () => {
62
62
  if (rendererInstance.value.getPerformanceStats().fps > 0) {
63
- telemetryCollector = startTelemetry(rendererInstance.value, "2.5.116", props.disableTelemetry, props.isPreview);
63
+ telemetryCollector = startTelemetry(rendererInstance.value, "2.5.117", props.disableTelemetry, props.isPreview);
64
64
  if (telemetryCollector) telemetryCollector.start();
65
65
  telemetryStartTimeout = null;
66
66
  } else telemetryStartTimeout = setTimeout(checkRendering, 500);
@@ -117,26 +117,36 @@ var Shader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
117
117
  await rendererInstance.value.renderAndWait();
118
118
  } catch (error) {
119
119
  console.warn("[Shaders] Failed to force render before capture:", error);
120
- throw error;
121
120
  }
122
121
  };
123
- const canvasToBlob = (source, targetWidth, targetHeight, mimeType, quality) => new Promise((resolve, reject) => {
124
- const tempCanvas = document.createElement("canvas");
125
- tempCanvas.width = targetWidth;
126
- tempCanvas.height = targetHeight;
127
- const ctx = tempCanvas.getContext("2d");
128
- if (!ctx) {
129
- reject(/* @__PURE__ */ new Error("Failed to get canvas context"));
130
- return;
122
+ const canvasToBlob = async (source, targetWidth, targetHeight, mimeType, quality) => {
123
+ const sourceBlob = await new Promise((resolve, reject) => {
124
+ source.toBlob((blob) => {
125
+ if (blob) resolve(blob);
126
+ else reject(/* @__PURE__ */ new Error("Failed to read source canvas"));
127
+ }, "image/png");
128
+ });
129
+ if (!(mimeType !== "image/png" || targetWidth !== source.width || targetHeight !== source.height)) return sourceBlob;
130
+ const bitmap = await createImageBitmap(sourceBlob);
131
+ try {
132
+ const tempCanvas = document.createElement("canvas");
133
+ tempCanvas.width = targetWidth;
134
+ tempCanvas.height = targetHeight;
135
+ const ctx = tempCanvas.getContext("2d");
136
+ if (!ctx) throw new Error("Failed to get canvas context");
137
+ ctx.imageSmoothingEnabled = true;
138
+ ctx.imageSmoothingQuality = "high";
139
+ ctx.drawImage(bitmap, 0, 0, targetWidth, targetHeight);
140
+ return await new Promise((resolve, reject) => {
141
+ tempCanvas.toBlob((blob) => {
142
+ if (blob) resolve(blob);
143
+ else reject(/* @__PURE__ */ new Error("Failed to encode image"));
144
+ }, mimeType, quality);
145
+ });
146
+ } finally {
147
+ bitmap.close();
131
148
  }
132
- ctx.imageSmoothingEnabled = true;
133
- ctx.imageSmoothingQuality = "high";
134
- ctx.drawImage(source, 0, 0, targetWidth, targetHeight);
135
- tempCanvas.toBlob((blob) => {
136
- if (blob) resolve(blob);
137
- else reject(/* @__PURE__ */ new Error("Failed to encode image"));
138
- }, mimeType, quality);
139
- });
149
+ };
140
150
  const captureImage = async (options = {}) => {
141
151
  if (!canvasRef.value) throw new Error("Canvas not available");
142
152
  await renderForCapture();
@@ -0,0 +1,3 @@
1
+ import WorleyNoise_vue_vue_type_script_setup_true_lang_default from "./WorleyNoise.vue_vue_type_script_setup_true_lang.js";
2
+ var WorleyNoise_default = WorleyNoise_vue_vue_type_script_setup_true_lang_default;
3
+ export { WorleyNoise_default as default };