@paper-design/shaders-react 0.0.56 → 0.0.58-next.1
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.
- package/dist/color-props-are-equal.js +15 -2
- package/dist/color-props-are-equal.js.map +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/shader-mount.js +52 -76
- package/dist/shader-mount.js.map +2 -2
- package/dist/shaders/heatmap.js +46 -23
- package/dist/shaders/heatmap.js.map +2 -2
- package/dist/shaders/liquid-metal.d.ts +7 -5
- package/dist/shaders/liquid-metal.js +61 -61
- package/dist/shaders/liquid-metal.js.map +2 -2
- package/package.json +2 -2
- package/dist/fast-deep-equal.d.ts +0 -1
- package/dist/fast-deep-equal.js +0 -33
- package/dist/fast-deep-equal.js.map +0 -7
|
@@ -3,11 +3,24 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { fastDeepEqual } from "./fast-deep-equal.js";
|
|
7
6
|
function colorPropsAreEqual(prevProps, nextProps) {
|
|
8
7
|
for (const key in prevProps) {
|
|
9
8
|
if (key === "colors") {
|
|
10
|
-
|
|
9
|
+
const prevIsArray = Array.isArray(prevProps.colors);
|
|
10
|
+
const nextIsArray = Array.isArray(nextProps.colors);
|
|
11
|
+
if (!prevIsArray || !nextIsArray) {
|
|
12
|
+
if (Object.is(prevProps.colors, nextProps.colors) === false) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (prevProps.colors?.length !== nextProps.colors?.length) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (!prevProps.colors?.every((color, index) => color === nextProps.colors?.[index])) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
continue;
|
|
11
24
|
}
|
|
12
25
|
if (Object.is(prevProps[key], nextProps[key]) === false) {
|
|
13
26
|
return false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/color-props-are-equal.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;
|
|
4
|
+
"sourcesContent": ["interface PropsWithColors {\n colors?: string[];\n [key: string]: unknown;\n}\n\nexport function colorPropsAreEqual(prevProps: PropsWithColors, nextProps: PropsWithColors): boolean {\n for (const key in prevProps) {\n if (key === 'colors') {\n const prevIsArray = Array.isArray(prevProps.colors);\n const nextIsArray = Array.isArray(nextProps.colors);\n\n if (!prevIsArray || !nextIsArray) {\n if (Object.is(prevProps.colors, nextProps.colors) === false) {\n return false;\n }\n\n continue;\n }\n\n if (prevProps.colors?.length !== nextProps.colors?.length) {\n return false;\n }\n\n if (!prevProps.colors?.every((color, index) => color === nextProps.colors?.[index])) {\n return false;\n }\n\n continue;\n }\n\n if (Object.is(prevProps[key], nextProps[key]) === false) {\n return false;\n }\n }\n\n return true;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAKO,SAAS,mBAAmB,WAA4B,WAAqC;AAClG,aAAW,OAAO,WAAW;AAC3B,QAAI,QAAQ,UAAU;AACpB,YAAM,cAAc,MAAM,QAAQ,UAAU,MAAM;AAClD,YAAM,cAAc,MAAM,QAAQ,UAAU,MAAM;AAElD,UAAI,CAAC,eAAe,CAAC,aAAa;AAChC,YAAI,OAAO,GAAG,UAAU,QAAQ,UAAU,MAAM,MAAM,OAAO;AAC3D,iBAAO;AAAA,QACT;AAEA;AAAA,MACF;AAEA,UAAI,UAAU,QAAQ,WAAW,UAAU,QAAQ,QAAQ;AACzD,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,UAAU,QAAQ,MAAM,CAAC,OAAO,UAAU,UAAU,UAAU,SAAS,KAAK,CAAC,GAAG;AACnF,eAAO;AAAA,MACT;AAEA;AAAA,IACF;AAEA,QAAI,OAAO,GAAG,UAAU,GAAG,GAAG,UAAU,GAAG,CAAC,MAAM,OAAO;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -48,9 +48,6 @@ export type { DitheringUniforms, DitheringParams } from '@paper-design/shaders';
|
|
|
48
48
|
export { GrainGradient, grainGradientPresets } from './shaders/grain-gradient.js';
|
|
49
49
|
export type { GrainGradientProps } from './shaders/grain-gradient.js';
|
|
50
50
|
export type { GrainGradientUniforms, GrainGradientParams } from '@paper-design/shaders';
|
|
51
|
-
export { LiquidMetal, liquidMetalPresets } from './shaders/liquid-metal.js';
|
|
52
|
-
export type { LiquidMetalProps } from './shaders/liquid-metal.js';
|
|
53
|
-
export type { LiquidMetalUniforms, LiquidMetalParams } from '@paper-design/shaders';
|
|
54
51
|
export { PulsingBorder, pulsingBorderPresets } from './shaders/pulsing-border.js';
|
|
55
52
|
export type { PulsingBorderProps } from './shaders/pulsing-border.js';
|
|
56
53
|
export type { PulsingBorderUniforms, PulsingBorderParams } from '@paper-design/shaders';
|
|
@@ -78,6 +75,9 @@ export type { ImageDitheringUniforms, ImageDitheringParams } from '@paper-design
|
|
|
78
75
|
export { Heatmap, heatmapPresets } from './shaders/heatmap.js';
|
|
79
76
|
export type { HeatmapProps } from './shaders/heatmap.js';
|
|
80
77
|
export type { HeatmapUniforms, HeatmapParams } from '@paper-design/shaders';
|
|
78
|
+
export { LiquidMetal, liquidMetalPresets } from './shaders/liquid-metal.js';
|
|
79
|
+
export type { LiquidMetalProps } from './shaders/liquid-metal.js';
|
|
80
|
+
export type { LiquidMetalUniforms, LiquidMetalParams } from '@paper-design/shaders';
|
|
81
81
|
export { isPaperShaderElement, getShaderColorFromString } from '@paper-design/shaders';
|
|
82
82
|
export type { PaperShaderElement, ShaderFit, ShaderSizingParams, ShaderSizingUniforms } from '@paper-design/shaders';
|
|
83
83
|
export { colorPanelsMeta, dotOrbitMeta, godRaysMeta, grainGradientMeta, meshGradientMeta, metaballsMeta, pulsingBorderMeta, simplexNoiseMeta, smokeRingMeta, swirlMeta, voronoiMeta, warpMeta, heatmapMeta, staticMeshGradientMeta, staticRadialGradientMeta, } from '@paper-design/shaders';
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,6 @@ import { Spiral, spiralPresets } from "./shaders/spiral.js";
|
|
|
21
21
|
import { Swirl, swirlPresets } from "./shaders/swirl.js";
|
|
22
22
|
import { Dithering, ditheringPresets } from "./shaders/dithering.js";
|
|
23
23
|
import { GrainGradient, grainGradientPresets } from "./shaders/grain-gradient.js";
|
|
24
|
-
import { LiquidMetal, liquidMetalPresets } from "./shaders/liquid-metal.js";
|
|
25
24
|
import { PulsingBorder, pulsingBorderPresets } from "./shaders/pulsing-border.js";
|
|
26
25
|
import { ColorPanels, colorPanelsPresets } from "./shaders/color-panels.js";
|
|
27
26
|
import { StaticMeshGradient, staticMeshGradientPresets } from "./shaders/static-mesh-gradient.js";
|
|
@@ -33,6 +32,7 @@ import {} from "@paper-design/shaders";
|
|
|
33
32
|
import { Water, waterPresets } from "./shaders/water.js";
|
|
34
33
|
import { ImageDithering, imageDitheringPresets } from "./shaders/image-dithering.js";
|
|
35
34
|
import { Heatmap, heatmapPresets } from "./shaders/heatmap.js";
|
|
35
|
+
import { LiquidMetal, liquidMetalPresets } from "./shaders/liquid-metal.js";
|
|
36
36
|
import { isPaperShaderElement, getShaderColorFromString } from "@paper-design/shaders";
|
|
37
37
|
import {
|
|
38
38
|
colorPanelsMeta,
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["'use client';\n\nexport { ShaderMount } from './shader-mount.js';\nexport type { ShaderMountProps, ShaderComponentProps } from './shader-mount.js';\n\nexport { MeshGradient, meshGradientPresets } from './shaders/mesh-gradient.js';\nexport type { MeshGradientProps } from './shaders/mesh-gradient.js';\nexport type { MeshGradientUniforms, MeshGradientParams } from '@paper-design/shaders';\n\nexport { SmokeRing, smokeRingPresets } from './shaders/smoke-ring.js';\nexport type { SmokeRingProps } from './shaders/smoke-ring.js';\nexport type { SmokeRingUniforms, SmokeRingParams } from '@paper-design/shaders';\n\nexport { NeuroNoise, neuroNoisePresets } from './shaders/neuro-noise.js';\nexport type { NeuroNoiseProps } from './shaders/neuro-noise.js';\nexport type { NeuroNoiseUniforms, NeuroNoiseParams } from '@paper-design/shaders';\n\nexport { DotOrbit, dotOrbitPresets } from './shaders/dot-orbit.js';\nexport type { DotOrbitProps } from './shaders/dot-orbit.js';\nexport type { DotOrbitUniforms, DotOrbitParams } from '@paper-design/shaders';\n\nexport { DotGrid, dotGridPresets } from './shaders/dot-grid.js';\nexport type { DotGridProps } from './shaders/dot-grid.js';\nexport type { DotGridUniforms, DotGridParams } from '@paper-design/shaders';\n\nexport { SimplexNoise, simplexNoisePresets } from './shaders/simplex-noise.js';\nexport type { SimplexNoiseProps } from './shaders/simplex-noise.js';\nexport type { SimplexNoiseUniforms, SimplexNoiseParams } from '@paper-design/shaders';\n\nexport { Metaballs, metaballsPresets } from './shaders/metaballs.js';\nexport type { MetaballsProps } from './shaders/metaballs.js';\nexport type { MetaballsUniforms, MetaballsParams } from '@paper-design/shaders';\n\nexport { Waves, wavesPresets } from './shaders/waves.js';\nexport type { WavesProps } from './shaders/waves.js';\nexport type { WavesUniforms, WavesParams } from '@paper-design/shaders';\n\nexport { PerlinNoise, perlinNoisePresets } from './shaders/perlin-noise.js';\nexport type { PerlinNoiseProps } from './shaders/perlin-noise.js';\nexport type { PerlinNoiseUniforms, PerlinNoiseParams } from '@paper-design/shaders';\n\nexport { Voronoi, voronoiPresets } from './shaders/voronoi.js';\nexport type { VoronoiProps } from './shaders/voronoi.js';\nexport type { VoronoiUniforms, VoronoiParams } from '@paper-design/shaders';\n\nexport { Warp, warpPresets } from './shaders/warp.js';\nexport type { WarpProps } from './shaders/warp.js';\nexport type { WarpUniforms, WarpParams, WarpPattern } from '@paper-design/shaders';\n\nexport { GodRays, godRaysPresets } from './shaders/god-rays.js';\nexport type { GodRaysProps } from './shaders/god-rays.js';\nexport type { GodRaysUniforms, GodRaysParams } from '@paper-design/shaders';\n\nexport { Spiral, spiralPresets } from './shaders/spiral.js';\nexport type { SpiralProps } from './shaders/spiral.js';\nexport type { SpiralUniforms, SpiralParams } from '@paper-design/shaders';\n\nexport { Swirl, swirlPresets } from './shaders/swirl.js';\nexport type { SwirlProps } from './shaders/swirl.js';\nexport type { SwirlUniforms, SwirlParams } from '@paper-design/shaders';\n\nexport { Dithering, ditheringPresets } from './shaders/dithering.js';\nexport type { DitheringProps } from './shaders/dithering.js';\nexport type { DitheringUniforms, DitheringParams } from '@paper-design/shaders';\n\nexport { GrainGradient, grainGradientPresets } from './shaders/grain-gradient.js';\nexport type { GrainGradientProps } from './shaders/grain-gradient.js';\nexport type { GrainGradientUniforms, GrainGradientParams } from '@paper-design/shaders';\n\nexport {
|
|
5
|
-
"mappings": ";;;;;;AAEA,SAAS,mBAAmB;AAG5B,SAAS,cAAc,2BAA2B;AAIlD,SAAS,WAAW,wBAAwB;AAI5C,SAAS,YAAY,yBAAyB;AAI9C,SAAS,UAAU,uBAAuB;AAI1C,SAAS,SAAS,sBAAsB;AAIxC,SAAS,cAAc,2BAA2B;AAIlD,SAAS,WAAW,wBAAwB;AAI5C,SAAS,OAAO,oBAAoB;AAIpC,SAAS,aAAa,0BAA0B;AAIhD,SAAS,SAAS,sBAAsB;AAIxC,SAAS,MAAM,mBAAmB;AAIlC,SAAS,SAAS,sBAAsB;AAIxC,SAAS,QAAQ,qBAAqB;AAItC,SAAS,OAAO,oBAAoB;AAIpC,SAAS,WAAW,wBAAwB;AAI5C,SAAS,eAAe,4BAA4B;AAIpD,SAAS,
|
|
4
|
+
"sourcesContent": ["'use client';\n\nexport { ShaderMount } from './shader-mount.js';\nexport type { ShaderMountProps, ShaderComponentProps } from './shader-mount.js';\n\nexport { MeshGradient, meshGradientPresets } from './shaders/mesh-gradient.js';\nexport type { MeshGradientProps } from './shaders/mesh-gradient.js';\nexport type { MeshGradientUniforms, MeshGradientParams } from '@paper-design/shaders';\n\nexport { SmokeRing, smokeRingPresets } from './shaders/smoke-ring.js';\nexport type { SmokeRingProps } from './shaders/smoke-ring.js';\nexport type { SmokeRingUniforms, SmokeRingParams } from '@paper-design/shaders';\n\nexport { NeuroNoise, neuroNoisePresets } from './shaders/neuro-noise.js';\nexport type { NeuroNoiseProps } from './shaders/neuro-noise.js';\nexport type { NeuroNoiseUniforms, NeuroNoiseParams } from '@paper-design/shaders';\n\nexport { DotOrbit, dotOrbitPresets } from './shaders/dot-orbit.js';\nexport type { DotOrbitProps } from './shaders/dot-orbit.js';\nexport type { DotOrbitUniforms, DotOrbitParams } from '@paper-design/shaders';\n\nexport { DotGrid, dotGridPresets } from './shaders/dot-grid.js';\nexport type { DotGridProps } from './shaders/dot-grid.js';\nexport type { DotGridUniforms, DotGridParams } from '@paper-design/shaders';\n\nexport { SimplexNoise, simplexNoisePresets } from './shaders/simplex-noise.js';\nexport type { SimplexNoiseProps } from './shaders/simplex-noise.js';\nexport type { SimplexNoiseUniforms, SimplexNoiseParams } from '@paper-design/shaders';\n\nexport { Metaballs, metaballsPresets } from './shaders/metaballs.js';\nexport type { MetaballsProps } from './shaders/metaballs.js';\nexport type { MetaballsUniforms, MetaballsParams } from '@paper-design/shaders';\n\nexport { Waves, wavesPresets } from './shaders/waves.js';\nexport type { WavesProps } from './shaders/waves.js';\nexport type { WavesUniforms, WavesParams } from '@paper-design/shaders';\n\nexport { PerlinNoise, perlinNoisePresets } from './shaders/perlin-noise.js';\nexport type { PerlinNoiseProps } from './shaders/perlin-noise.js';\nexport type { PerlinNoiseUniforms, PerlinNoiseParams } from '@paper-design/shaders';\n\nexport { Voronoi, voronoiPresets } from './shaders/voronoi.js';\nexport type { VoronoiProps } from './shaders/voronoi.js';\nexport type { VoronoiUniforms, VoronoiParams } from '@paper-design/shaders';\n\nexport { Warp, warpPresets } from './shaders/warp.js';\nexport type { WarpProps } from './shaders/warp.js';\nexport type { WarpUniforms, WarpParams, WarpPattern } from '@paper-design/shaders';\n\nexport { GodRays, godRaysPresets } from './shaders/god-rays.js';\nexport type { GodRaysProps } from './shaders/god-rays.js';\nexport type { GodRaysUniforms, GodRaysParams } from '@paper-design/shaders';\n\nexport { Spiral, spiralPresets } from './shaders/spiral.js';\nexport type { SpiralProps } from './shaders/spiral.js';\nexport type { SpiralUniforms, SpiralParams } from '@paper-design/shaders';\n\nexport { Swirl, swirlPresets } from './shaders/swirl.js';\nexport type { SwirlProps } from './shaders/swirl.js';\nexport type { SwirlUniforms, SwirlParams } from '@paper-design/shaders';\n\nexport { Dithering, ditheringPresets } from './shaders/dithering.js';\nexport type { DitheringProps } from './shaders/dithering.js';\nexport type { DitheringUniforms, DitheringParams } from '@paper-design/shaders';\n\nexport { GrainGradient, grainGradientPresets } from './shaders/grain-gradient.js';\nexport type { GrainGradientProps } from './shaders/grain-gradient.js';\nexport type { GrainGradientUniforms, GrainGradientParams } from '@paper-design/shaders';\n\nexport { PulsingBorder, pulsingBorderPresets } from './shaders/pulsing-border.js';\nexport type { PulsingBorderProps } from './shaders/pulsing-border.js';\nexport type { PulsingBorderUniforms, PulsingBorderParams } from '@paper-design/shaders';\n\nexport { ColorPanels, colorPanelsPresets } from './shaders/color-panels.js';\nexport type { ColorPanelsProps } from './shaders/color-panels.js';\nexport type { ColorPanelsUniforms, ColorPanelsParams } from '@paper-design/shaders';\n\nexport { StaticMeshGradient, staticMeshGradientPresets } from './shaders/static-mesh-gradient.js';\nexport type { StaticMeshGradientProps } from './shaders/static-mesh-gradient.js';\nexport type { StaticMeshGradientUniforms, StaticMeshGradientParams } from '@paper-design/shaders';\n\nexport { StaticRadialGradient, staticRadialGradientPresets } from './shaders/static-radial-gradient.js';\nexport type { StaticRadialGradientProps } from './shaders/static-radial-gradient.js';\nexport type { StaticRadialGradientUniforms, StaticRadialGradientParams } from '@paper-design/shaders';\n\nexport { PaperTexture, paperTexturePresets } from './shaders/paper-texture.js';\nexport type { PaperTextureProps } from './shaders/paper-texture.js';\nexport type { PaperTextureUniforms, PaperTextureParams } from '@paper-design/shaders';\n\nexport { FlutedGlass, flutedGlassPresets } from './shaders/fluted-glass.js';\nexport { type FlutedGlassProps } from './shaders/fluted-glass.js';\nexport { type FlutedGlassUniforms, type FlutedGlassParams } from '@paper-design/shaders';\n\nexport { Water, waterPresets } from './shaders/water.js';\nexport type { WaterProps } from './shaders/water.js';\nexport type { WaterUniforms, WaterParams } from '@paper-design/shaders';\n\nexport { ImageDithering, imageDitheringPresets } from './shaders/image-dithering.js';\nexport type { ImageDitheringProps } from './shaders/image-dithering.js';\nexport type { ImageDitheringUniforms, ImageDitheringParams } from '@paper-design/shaders';\n\nexport { Heatmap, heatmapPresets } from './shaders/heatmap.js';\nexport type { HeatmapProps } from './shaders/heatmap.js';\nexport type { HeatmapUniforms, HeatmapParams } from '@paper-design/shaders';\n\nexport { LiquidMetal, liquidMetalPresets } from './shaders/liquid-metal.js';\nexport type { LiquidMetalProps } from './shaders/liquid-metal.js';\nexport type { LiquidMetalUniforms, LiquidMetalParams } from '@paper-design/shaders';\n\nexport { isPaperShaderElement, getShaderColorFromString } from '@paper-design/shaders';\nexport type { PaperShaderElement, ShaderFit, ShaderSizingParams, ShaderSizingUniforms } from '@paper-design/shaders';\n\nexport {\n colorPanelsMeta,\n dotOrbitMeta,\n godRaysMeta,\n grainGradientMeta,\n meshGradientMeta,\n metaballsMeta,\n pulsingBorderMeta,\n simplexNoiseMeta,\n smokeRingMeta,\n swirlMeta,\n voronoiMeta,\n warpMeta,\n heatmapMeta,\n staticMeshGradientMeta,\n staticRadialGradientMeta,\n} from '@paper-design/shaders';\n"],
|
|
5
|
+
"mappings": ";;;;;;AAEA,SAAS,mBAAmB;AAG5B,SAAS,cAAc,2BAA2B;AAIlD,SAAS,WAAW,wBAAwB;AAI5C,SAAS,YAAY,yBAAyB;AAI9C,SAAS,UAAU,uBAAuB;AAI1C,SAAS,SAAS,sBAAsB;AAIxC,SAAS,cAAc,2BAA2B;AAIlD,SAAS,WAAW,wBAAwB;AAI5C,SAAS,OAAO,oBAAoB;AAIpC,SAAS,aAAa,0BAA0B;AAIhD,SAAS,SAAS,sBAAsB;AAIxC,SAAS,MAAM,mBAAmB;AAIlC,SAAS,SAAS,sBAAsB;AAIxC,SAAS,QAAQ,qBAAqB;AAItC,SAAS,OAAO,oBAAoB;AAIpC,SAAS,WAAW,wBAAwB;AAI5C,SAAS,eAAe,4BAA4B;AAIpD,SAAS,eAAe,4BAA4B;AAIpD,SAAS,aAAa,0BAA0B;AAIhD,SAAS,oBAAoB,iCAAiC;AAI9D,SAAS,sBAAsB,mCAAmC;AAIlE,SAAS,cAAc,2BAA2B;AAIlD,SAAS,aAAa,0BAA0B;AAChD,eAAsC;AACtC,eAAiE;AAEjE,SAAS,OAAO,oBAAoB;AAIpC,SAAS,gBAAgB,6BAA6B;AAItD,SAAS,SAAS,sBAAsB;AAIxC,SAAS,aAAa,0BAA0B;AAIhD,SAAS,sBAAsB,gCAAgC;AAG/D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/shader-mount.js
CHANGED
|
@@ -4,13 +4,12 @@
|
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
6
|
"use client";
|
|
7
|
-
import { useEffect, useRef, forwardRef, useState
|
|
7
|
+
import { useEffect, useRef, forwardRef, useState } from "react";
|
|
8
8
|
import {
|
|
9
|
-
ShaderMount as ShaderMountVanilla
|
|
9
|
+
ShaderMount as ShaderMountVanilla,
|
|
10
|
+
getEmptyPixel
|
|
10
11
|
} from "@paper-design/shaders";
|
|
11
12
|
import { useMergeRefs } from "./use-merge-refs.js";
|
|
12
|
-
import { transparentPixel } from "./transparent-pixel.js";
|
|
13
|
-
import { fastDeepEqual } from "./fast-deep-equal.js";
|
|
14
13
|
import { jsx } from "react/jsx-runtime";
|
|
15
14
|
async function processUniforms(uniformsProp) {
|
|
16
15
|
const processedUniforms = {};
|
|
@@ -35,6 +34,10 @@ async function processUniforms(uniformsProp) {
|
|
|
35
34
|
};
|
|
36
35
|
Object.entries(uniformsProp).forEach(([key, value]) => {
|
|
37
36
|
if (typeof value === "string") {
|
|
37
|
+
if (!value) {
|
|
38
|
+
processedUniforms[key] = getEmptyPixel();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
38
41
|
if (!isValidUrl(value)) {
|
|
39
42
|
console.warn(`Uniform "${key}" has invalid URL "${value}". Skipping image loading.`);
|
|
40
43
|
return;
|
|
@@ -52,7 +55,7 @@ async function processUniforms(uniformsProp) {
|
|
|
52
55
|
console.error(`Could not set uniforms. Failed to load image at ${value}`);
|
|
53
56
|
reject();
|
|
54
57
|
};
|
|
55
|
-
img.src = value
|
|
58
|
+
img.src = value;
|
|
56
59
|
});
|
|
57
60
|
imageLoadPromises.push(imagePromise);
|
|
58
61
|
} else {
|
|
@@ -64,7 +67,7 @@ async function processUniforms(uniformsProp) {
|
|
|
64
67
|
}
|
|
65
68
|
const ShaderMount = forwardRef(
|
|
66
69
|
function ShaderMountImpl({
|
|
67
|
-
fragmentShader
|
|
70
|
+
fragmentShader,
|
|
68
71
|
uniforms: uniformsProp,
|
|
69
72
|
webGlContextAttributes,
|
|
70
73
|
speed = 0,
|
|
@@ -76,90 +79,63 @@ const ShaderMount = forwardRef(
|
|
|
76
79
|
style,
|
|
77
80
|
...divProps
|
|
78
81
|
}, forwardedRef) {
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (uniformsDidChange) {
|
|
91
|
-
let cancelPromise = false;
|
|
92
|
-
processUniforms(uniformsProp).then((uniforms) => {
|
|
93
|
-
if (cancelPromise || !containerRef.current) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
uniformsRegistered.current = uniformsProp;
|
|
97
|
-
if (shaderMount) {
|
|
98
|
-
shaderMount.setUniforms(uniforms);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const canvas = new ShaderMountVanilla(
|
|
102
|
-
containerRef.current,
|
|
103
|
-
initialShaderFragment,
|
|
82
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
83
|
+
const divRef = useRef(null);
|
|
84
|
+
const shaderMountRef = useRef(null);
|
|
85
|
+
const webGlContextAttributesRef = useRef(webGlContextAttributes);
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
const initShader = async () => {
|
|
88
|
+
const uniforms = await processUniforms(uniformsProp);
|
|
89
|
+
if (divRef.current && !shaderMountRef.current) {
|
|
90
|
+
shaderMountRef.current = new ShaderMountVanilla(
|
|
91
|
+
divRef.current,
|
|
92
|
+
fragmentShader,
|
|
104
93
|
uniforms,
|
|
105
|
-
|
|
94
|
+
webGlContextAttributesRef.current,
|
|
106
95
|
speed,
|
|
107
96
|
frame,
|
|
108
97
|
minPixelRatio,
|
|
109
98
|
maxPixelCount
|
|
110
99
|
);
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
if (!shaderMount) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const targetSpeed = documentVisible ? speed : 0;
|
|
121
|
-
if (shaderMount.speed !== targetSpeed) {
|
|
122
|
-
shaderMount.setSpeed(targetSpeed);
|
|
123
|
-
}
|
|
124
|
-
if (initialFrame.current !== frame) {
|
|
125
|
-
initialFrame.current = frame;
|
|
126
|
-
shaderMount.setFrame(frame);
|
|
127
|
-
}
|
|
128
|
-
if (shaderMount.minPixelRatio !== minPixelRatio) {
|
|
129
|
-
shaderMount.setMinPixelRatio(minPixelRatio);
|
|
130
|
-
}
|
|
131
|
-
if (shaderMount.maxPixelCount !== maxPixelCount) {
|
|
132
|
-
shaderMount.setMaxPixelCount(maxPixelCount);
|
|
133
|
-
}
|
|
134
|
-
}, [
|
|
135
|
-
documentVisible,
|
|
136
|
-
frame,
|
|
137
|
-
initialContextAttrs,
|
|
138
|
-
initialShaderFragment,
|
|
139
|
-
maxPixelCount,
|
|
140
|
-
minPixelRatio,
|
|
141
|
-
shaderMount,
|
|
142
|
-
speed,
|
|
143
|
-
uniformsProp
|
|
144
|
-
]);
|
|
145
|
-
useEffect(() => {
|
|
100
|
+
setIsInitialized(true);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
initShader();
|
|
146
104
|
return () => {
|
|
147
|
-
|
|
105
|
+
shaderMountRef.current?.dispose();
|
|
106
|
+
shaderMountRef.current = null;
|
|
148
107
|
};
|
|
149
|
-
}, [
|
|
108
|
+
}, [fragmentShader]);
|
|
150
109
|
useEffect(() => {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
110
|
+
let isStale = false;
|
|
111
|
+
const updateUniforms = async () => {
|
|
112
|
+
const uniforms = await processUniforms(uniformsProp);
|
|
113
|
+
if (!isStale) {
|
|
114
|
+
shaderMountRef.current?.setUniforms(uniforms);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
updateUniforms();
|
|
155
118
|
return () => {
|
|
156
|
-
|
|
119
|
+
isStale = true;
|
|
157
120
|
};
|
|
158
|
-
}, []);
|
|
121
|
+
}, [uniformsProp, isInitialized]);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
shaderMountRef.current?.setSpeed(speed);
|
|
124
|
+
}, [speed, isInitialized]);
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
shaderMountRef.current?.setMaxPixelCount(maxPixelCount);
|
|
127
|
+
}, [maxPixelCount, isInitialized]);
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
shaderMountRef.current?.setMinPixelRatio(minPixelRatio);
|
|
130
|
+
}, [minPixelRatio, isInitialized]);
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
shaderMountRef.current?.setFrame(frame);
|
|
133
|
+
}, [frame, isInitialized]);
|
|
134
|
+
const mergedRef = useMergeRefs([divRef, forwardedRef]);
|
|
159
135
|
return /* @__PURE__ */ jsx(
|
|
160
136
|
"div",
|
|
161
137
|
{
|
|
162
|
-
ref:
|
|
138
|
+
ref: mergedRef,
|
|
163
139
|
style: width !== void 0 || height !== void 0 ? { width, height, ...style } : style,
|
|
164
140
|
...divProps
|
|
165
141
|
}
|
package/dist/shader-mount.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/shader-mount.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client';\n\nimport { useEffect, useRef, forwardRef, useState
|
|
5
|
-
"mappings": ";;;;;;AAEA,SAAS,WAAW,QAAQ,YAAY,
|
|
4
|
+
"sourcesContent": ["'use client';\n\nimport { useEffect, useRef, forwardRef, useState } from 'react';\nimport {\n ShaderMount as ShaderMountVanilla,\n getEmptyPixel,\n type PaperShaderElement,\n type ShaderMotionParams,\n type ShaderMountUniforms,\n} from '@paper-design/shaders';\nimport { useMergeRefs } from './use-merge-refs.js';\n\n/**\n * React Shader Mount can also accept strings as uniform values, which will assumed to be URLs and loaded as images\n *\n * We accept undefined as a convenience for server rendering, when some things may be undefined\n * We just skip setting the uniform if it's undefined. This allows the shader mount to still take up space during server rendering\n */\ninterface ShaderMountUniformsReact {\n [key: string]: string | boolean | number | number[] | number[][] | HTMLImageElement | undefined;\n}\n\nexport interface ShaderMountProps extends Omit<React.ComponentProps<'div'>, 'color' | 'ref'>, ShaderMotionParams {\n ref?: React.Ref<PaperShaderElement>;\n fragmentShader: string;\n uniforms: ShaderMountUniformsReact;\n minPixelRatio?: number;\n maxPixelCount?: number;\n webGlContextAttributes?: WebGLContextAttributes;\n\n /** Inline CSS width style */\n width?: string | number;\n /** Inline CSS height style */\n height?: string | number;\n}\n\nexport interface ShaderComponentProps extends Omit<React.ComponentProps<'div'>, 'color' | 'ref'> {\n ref?: React.Ref<PaperShaderElement>;\n minPixelRatio?: number;\n maxPixelCount?: number;\n webGlContextAttributes?: WebGLContextAttributes;\n\n /** Inline CSS width style */\n width?: string | number;\n /** Inline CSS height style */\n height?: string | number;\n}\n\n/** Parse the provided uniforms, turning URL strings into loaded images */\nasync function processUniforms(uniformsProp: ShaderMountUniformsReact): Promise<ShaderMountUniforms> {\n const processedUniforms = {} as ShaderMountUniforms;\n const imageLoadPromises: Promise<void>[] = [];\n\n const isValidUrl = (url: string): boolean => {\n try {\n // Handle absolute paths\n if (url.startsWith('/')) return true;\n // Check if it's a valid URL\n new URL(url);\n return true;\n } catch {\n return false;\n }\n };\n\n const isExternalUrl = (url: string): boolean => {\n try {\n if (url.startsWith('/')) return false;\n const urlObject = new URL(url, window.location.origin);\n return urlObject.origin !== window.location.origin;\n } catch {\n return false;\n }\n };\n\n Object.entries(uniformsProp).forEach(([key, value]) => {\n if (typeof value === 'string') {\n // Use a transparent pixel for empty strings\n if (!value) {\n processedUniforms[key] = getEmptyPixel();\n return;\n }\n\n // Make sure the provided string is a valid URL or just skip trying to set this uniform entirely\n if (!isValidUrl(value)) {\n console.warn(`Uniform \"${key}\" has invalid URL \"${value}\". Skipping image loading.`);\n return;\n }\n\n const imagePromise = new Promise<void>((resolve, reject) => {\n const img = new Image();\n if (isExternalUrl(value)) {\n img.crossOrigin = 'anonymous';\n }\n img.onload = () => {\n processedUniforms[key] = img;\n resolve();\n };\n img.onerror = () => {\n console.error(`Could not set uniforms. Failed to load image at ${value}`);\n reject();\n };\n img.src = value;\n });\n imageLoadPromises.push(imagePromise);\n } else {\n processedUniforms[key] = value;\n }\n });\n\n await Promise.all(imageLoadPromises);\n return processedUniforms;\n}\n\n/**\n * A React component that mounts a shader and updates its uniforms as the component's props change\n * If you pass a string as a uniform value, it will be assumed to be a URL and attempted to be loaded as an image\n */\nexport const ShaderMount: React.FC<ShaderMountProps> = forwardRef<PaperShaderElement, ShaderMountProps>(\n function ShaderMountImpl(\n {\n fragmentShader,\n uniforms: uniformsProp,\n webGlContextAttributes,\n speed = 0,\n frame = 0,\n width,\n height,\n minPixelRatio,\n maxPixelCount,\n style,\n ...divProps\n },\n forwardedRef\n ) {\n const [isInitialized, setIsInitialized] = useState(false);\n const divRef = useRef<PaperShaderElement>(null);\n const shaderMountRef: React.RefObject<ShaderMountVanilla | null> = useRef<ShaderMountVanilla>(null);\n const webGlContextAttributesRef = useRef(webGlContextAttributes);\n\n // Initialize the ShaderMountVanilla\n useEffect(() => {\n const initShader = async () => {\n const uniforms = await processUniforms(uniformsProp);\n\n if (divRef.current && !shaderMountRef.current) {\n shaderMountRef.current = new ShaderMountVanilla(\n divRef.current,\n fragmentShader,\n uniforms,\n webGlContextAttributesRef.current,\n speed,\n frame,\n minPixelRatio,\n maxPixelCount\n );\n\n setIsInitialized(true);\n }\n };\n\n initShader();\n\n return () => {\n shaderMountRef.current?.dispose();\n shaderMountRef.current = null;\n };\n }, [fragmentShader]);\n\n // Uniforms\n useEffect(() => {\n let isStale = false;\n\n const updateUniforms = async () => {\n const uniforms = await processUniforms(uniformsProp);\n\n if (!isStale) {\n // We only use the freshest uniforms otherwise we can get into race conditions\n // if some uniforms (images!) take longer to load in subsequent effect runs.\n shaderMountRef.current?.setUniforms(uniforms);\n }\n };\n\n updateUniforms();\n\n return () => {\n isStale = true;\n };\n }, [uniformsProp, isInitialized]);\n\n // Speed\n useEffect(() => {\n shaderMountRef.current?.setSpeed(speed);\n }, [speed, isInitialized]);\n\n // Max Pixel Count\n useEffect(() => {\n shaderMountRef.current?.setMaxPixelCount(maxPixelCount);\n }, [maxPixelCount, isInitialized]);\n\n // Min Pixel Ratio\n useEffect(() => {\n shaderMountRef.current?.setMinPixelRatio(minPixelRatio);\n }, [minPixelRatio, isInitialized]);\n\n // Frame\n useEffect(() => {\n shaderMountRef.current?.setFrame(frame);\n }, [frame, isInitialized]);\n\n const mergedRef = useMergeRefs([divRef, forwardedRef]) as unknown as React.RefObject<HTMLDivElement>;\n return (\n <div\n ref={mergedRef}\n style={width !== undefined || height !== undefined ? { width, height, ...style } : style}\n {...divProps}\n />\n );\n }\n);\n\nShaderMount.displayName = 'ShaderMount';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/shaders/heatmap.js
CHANGED
|
@@ -80,7 +80,7 @@ const Heatmap = memo(function HeatmapImpl({
|
|
|
80
80
|
if (suspendWhenProcessingImage && typeof window !== "undefined") {
|
|
81
81
|
processedImage = suspend(
|
|
82
82
|
() => toProcessedHeatmap(imageUrl).then((result) => URL.createObjectURL(result.blob)),
|
|
83
|
-
[imageUrl]
|
|
83
|
+
[imageUrl, "heatmap"]
|
|
84
84
|
);
|
|
85
85
|
} else {
|
|
86
86
|
processedImage = processedStateImage;
|
|
@@ -106,28 +106,51 @@ const Heatmap = memo(function HeatmapImpl({
|
|
|
106
106
|
URL.revokeObjectURL(url);
|
|
107
107
|
};
|
|
108
108
|
}, [imageUrl, suspendWhenProcessingImage]);
|
|
109
|
-
const uniforms =
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
109
|
+
const uniforms = useMemo(
|
|
110
|
+
() => ({
|
|
111
|
+
// Own uniforms
|
|
112
|
+
u_image: processedImage,
|
|
113
|
+
u_contour: contour,
|
|
114
|
+
u_angle: angle,
|
|
115
|
+
u_noise: noise,
|
|
116
|
+
u_innerGlow: innerGlow,
|
|
117
|
+
u_outerGlow: outerGlow,
|
|
118
|
+
u_colorBack: getShaderColorFromString(colorBack),
|
|
119
|
+
u_colors: colors.map(getShaderColorFromString),
|
|
120
|
+
u_colorsCount: colors.length,
|
|
121
|
+
// Sizing uniforms
|
|
122
|
+
u_fit: ShaderFitOptions[fit],
|
|
123
|
+
u_offsetX: offsetX,
|
|
124
|
+
u_offsetY: offsetY,
|
|
125
|
+
u_originX: originX,
|
|
126
|
+
u_originY: originY,
|
|
127
|
+
u_rotation: rotation,
|
|
128
|
+
u_scale: scale,
|
|
129
|
+
u_worldHeight: worldHeight,
|
|
130
|
+
u_worldWidth: worldWidth
|
|
131
|
+
}),
|
|
132
|
+
[
|
|
133
|
+
speed,
|
|
134
|
+
frame,
|
|
135
|
+
contour,
|
|
136
|
+
angle,
|
|
137
|
+
noise,
|
|
138
|
+
innerGlow,
|
|
139
|
+
outerGlow,
|
|
140
|
+
colors,
|
|
141
|
+
colorBack,
|
|
142
|
+
processedImage,
|
|
143
|
+
fit,
|
|
144
|
+
offsetX,
|
|
145
|
+
offsetY,
|
|
146
|
+
originX,
|
|
147
|
+
originY,
|
|
148
|
+
rotation,
|
|
149
|
+
scale,
|
|
150
|
+
worldHeight,
|
|
151
|
+
worldWidth
|
|
152
|
+
]
|
|
153
|
+
);
|
|
131
154
|
return /* @__PURE__ */ jsx(ShaderMount, { ...props, speed, frame, fragmentShader: heatmapFragmentShader, uniforms });
|
|
132
155
|
}, colorPropsAreEqual);
|
|
133
156
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/heatmap.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { memo, useLayoutEffect, useMemo, useState } from 'react';\nimport { ShaderMount, type ShaderComponentProps } from '../shader-mount.js';\nimport {\n getShaderColorFromString,\n heatmapFragmentShader,\n ShaderFitOptions,\n type HeatmapUniforms,\n type HeatmapParams,\n defaultObjectSizing,\n toProcessedHeatmap,\n type ImageShaderPreset,\n} from '@paper-design/shaders';\n\nimport { transparentPixel } from '../transparent-pixel.js';\nimport { suspend } from '../suspend.js';\nimport { colorPropsAreEqual } from '../color-props-are-equal.js';\n\nexport interface HeatmapProps extends ShaderComponentProps, HeatmapParams {\n /**\n * Suspends the component when the image is being processed.\n */\n suspendWhenProcessingImage?: boolean;\n}\n\nexport type HeatmapPreset = ImageShaderPreset<HeatmapParams>;\n\nexport const defaultPreset: HeatmapPreset = {\n name: 'Default',\n params: {\n ...defaultObjectSizing,\n scale: 0.75,\n speed: 1,\n frame: 0,\n contour: 0.5,\n angle: 0,\n noise: 0,\n innerGlow: 0.5,\n outerGlow: 0.5,\n colorBack: '#000000',\n colors: ['#11206a', '#1f3ba2', '#2f63e7', '#6bd7ff', '#ffe679', '#ff991e', '#ff4c00'],\n },\n} as const satisfies HeatmapPreset;\n\nexport const sepiaPreset: HeatmapPreset = {\n name: 'Sepia',\n params: {\n ...defaultObjectSizing,\n scale: 0.75,\n speed: 0.5,\n frame: 0,\n contour: 0.5,\n angle: 0,\n noise: 0.75,\n innerGlow: 0.5,\n outerGlow: 0.5,\n colorBack: '#000000',\n colors: ['#997F45', '#ffffff'],\n },\n} as const satisfies HeatmapPreset;\n\nexport const heatmapPresets: HeatmapPreset[] = [defaultPreset, sepiaPreset];\n\nexport const Heatmap: React.FC<HeatmapProps> = memo(function HeatmapImpl({\n // Own props\n speed = defaultPreset.params.speed,\n frame = defaultPreset.params.frame,\n image = '',\n contour = defaultPreset.params.contour,\n angle = defaultPreset.params.angle,\n noise = defaultPreset.params.noise,\n innerGlow = defaultPreset.params.innerGlow,\n outerGlow = defaultPreset.params.outerGlow,\n colorBack = defaultPreset.params.colorBack,\n colors = defaultPreset.params.colors,\n suspendWhenProcessingImage = false,\n\n // Sizing props\n fit = defaultPreset.params.fit,\n offsetX = defaultPreset.params.offsetX,\n offsetY = defaultPreset.params.offsetY,\n originX = defaultPreset.params.originX,\n originY = defaultPreset.params.originY,\n rotation = defaultPreset.params.rotation,\n scale = defaultPreset.params.scale,\n worldHeight = defaultPreset.params.worldHeight,\n worldWidth = defaultPreset.params.worldWidth,\n ...props\n}: HeatmapProps) {\n const imageUrl = typeof image === 'string' ? image : image.src;\n const [processedStateImage, setProcessedStateImage] = useState<string>(transparentPixel);\n\n let processedImage: string;\n\n // toProcessedHeatmap expects the document object to exist. This prevents SSR issues during builds.\n if (suspendWhenProcessingImage && typeof window !== 'undefined') {\n processedImage = suspend(\n (): Promise<string> => toProcessedHeatmap(imageUrl).then((result) => URL.createObjectURL(result.blob)),\n [imageUrl]\n );\n } else {\n processedImage = processedStateImage;\n }\n\n useLayoutEffect(() => {\n if (suspendWhenProcessingImage) {\n // Skip doing work in the effect as it's been handled by suspense.\n return;\n }\n\n if (!imageUrl) {\n setProcessedStateImage(transparentPixel);\n return;\n }\n\n let url: string;\n let current = true;\n\n toProcessedHeatmap(imageUrl).then((result) => {\n if (current) {\n url = URL.createObjectURL(result.blob);\n setProcessedStateImage(url);\n }\n });\n\n return () => {\n current = false;\n URL.revokeObjectURL(url);\n };\n }, [imageUrl, suspendWhenProcessingImage]);\n\n const uniforms = {\n
|
|
5
|
-
"mappings": ";;;;;AAAA,OAAO,SAAS,MAAM,iBAAiB,SAAS,gBAAgB;AAChE,SAAS,mBAA8C;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,0BAA0B;
|
|
4
|
+
"sourcesContent": ["import React, { memo, useLayoutEffect, useMemo, useState } from 'react';\nimport { ShaderMount, type ShaderComponentProps } from '../shader-mount.js';\nimport {\n getShaderColorFromString,\n heatmapFragmentShader,\n ShaderFitOptions,\n type HeatmapUniforms,\n type HeatmapParams,\n defaultObjectSizing,\n toProcessedHeatmap,\n type ImageShaderPreset,\n} from '@paper-design/shaders';\n\nimport { transparentPixel } from '../transparent-pixel.js';\nimport { suspend } from '../suspend.js';\nimport { colorPropsAreEqual } from '../color-props-are-equal.js';\n\nexport interface HeatmapProps extends ShaderComponentProps, HeatmapParams {\n /**\n * Suspends the component when the image is being processed.\n */\n suspendWhenProcessingImage?: boolean;\n}\n\nexport type HeatmapPreset = ImageShaderPreset<HeatmapParams>;\n\nexport const defaultPreset: HeatmapPreset = {\n name: 'Default',\n params: {\n ...defaultObjectSizing,\n scale: 0.75,\n speed: 1,\n frame: 0,\n contour: 0.5,\n angle: 0,\n noise: 0,\n innerGlow: 0.5,\n outerGlow: 0.5,\n colorBack: '#000000',\n colors: ['#11206a', '#1f3ba2', '#2f63e7', '#6bd7ff', '#ffe679', '#ff991e', '#ff4c00'],\n },\n} as const satisfies HeatmapPreset;\n\nexport const sepiaPreset: HeatmapPreset = {\n name: 'Sepia',\n params: {\n ...defaultObjectSizing,\n scale: 0.75,\n speed: 0.5,\n frame: 0,\n contour: 0.5,\n angle: 0,\n noise: 0.75,\n innerGlow: 0.5,\n outerGlow: 0.5,\n colorBack: '#000000',\n colors: ['#997F45', '#ffffff'],\n },\n} as const satisfies HeatmapPreset;\n\nexport const heatmapPresets: HeatmapPreset[] = [defaultPreset, sepiaPreset];\n\nexport const Heatmap: React.FC<HeatmapProps> = memo(function HeatmapImpl({\n // Own props\n speed = defaultPreset.params.speed,\n frame = defaultPreset.params.frame,\n image = '',\n contour = defaultPreset.params.contour,\n angle = defaultPreset.params.angle,\n noise = defaultPreset.params.noise,\n innerGlow = defaultPreset.params.innerGlow,\n outerGlow = defaultPreset.params.outerGlow,\n colorBack = defaultPreset.params.colorBack,\n colors = defaultPreset.params.colors,\n suspendWhenProcessingImage = false,\n\n // Sizing props\n fit = defaultPreset.params.fit,\n offsetX = defaultPreset.params.offsetX,\n offsetY = defaultPreset.params.offsetY,\n originX = defaultPreset.params.originX,\n originY = defaultPreset.params.originY,\n rotation = defaultPreset.params.rotation,\n scale = defaultPreset.params.scale,\n worldHeight = defaultPreset.params.worldHeight,\n worldWidth = defaultPreset.params.worldWidth,\n ...props\n}: HeatmapProps) {\n const imageUrl = typeof image === 'string' ? image : image.src;\n const [processedStateImage, setProcessedStateImage] = useState<string>(transparentPixel);\n\n let processedImage: string;\n\n // toProcessedHeatmap expects the document object to exist. This prevents SSR issues during builds.\n if (suspendWhenProcessingImage && typeof window !== 'undefined') {\n processedImage = suspend(\n (): Promise<string> => toProcessedHeatmap(imageUrl).then((result) => URL.createObjectURL(result.blob)),\n [imageUrl, 'heatmap']\n );\n } else {\n processedImage = processedStateImage;\n }\n\n useLayoutEffect(() => {\n if (suspendWhenProcessingImage) {\n // Skip doing work in the effect as it's been handled by suspense.\n return;\n }\n\n if (!imageUrl) {\n setProcessedStateImage(transparentPixel);\n return;\n }\n\n let url: string;\n let current = true;\n\n toProcessedHeatmap(imageUrl).then((result) => {\n if (current) {\n url = URL.createObjectURL(result.blob);\n setProcessedStateImage(url);\n }\n });\n\n return () => {\n current = false;\n URL.revokeObjectURL(url);\n };\n }, [imageUrl, suspendWhenProcessingImage]);\n\n const uniforms = useMemo(\n () => ({\n // Own uniforms\n u_image: processedImage,\n u_contour: contour,\n u_angle: angle,\n u_noise: noise,\n u_innerGlow: innerGlow,\n u_outerGlow: outerGlow,\n u_colorBack: getShaderColorFromString(colorBack),\n u_colors: colors.map(getShaderColorFromString),\n u_colorsCount: colors.length,\n\n // Sizing uniforms\n u_fit: ShaderFitOptions[fit],\n u_offsetX: offsetX,\n u_offsetY: offsetY,\n u_originX: originX,\n u_originY: originY,\n u_rotation: rotation,\n u_scale: scale,\n u_worldHeight: worldHeight,\n u_worldWidth: worldWidth,\n }),\n [\n speed,\n frame,\n contour,\n angle,\n noise,\n innerGlow,\n outerGlow,\n colors,\n colorBack,\n processedImage,\n fit,\n offsetX,\n offsetY,\n originX,\n originY,\n rotation,\n scale,\n worldHeight,\n worldWidth,\n ]\n ) satisfies HeatmapUniforms;\n\n return (\n <ShaderMount {...props} speed={speed} frame={frame} fragmentShader={heatmapFragmentShader} uniforms={uniforms} />\n );\n}, colorPropsAreEqual);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type ShaderComponentProps } from '../shader-mount.js';
|
|
2
|
-
import { type LiquidMetalParams, type
|
|
2
|
+
import { type LiquidMetalParams, type ImageShaderPreset } from '@paper-design/shaders';
|
|
3
3
|
export interface LiquidMetalProps extends ShaderComponentProps, LiquidMetalParams {
|
|
4
|
+
/**
|
|
5
|
+
* Suspends the component when the image is being processed.
|
|
6
|
+
*/
|
|
7
|
+
suspendWhenProcessingImage?: boolean;
|
|
4
8
|
}
|
|
5
|
-
type LiquidMetalPreset =
|
|
9
|
+
type LiquidMetalPreset = ImageShaderPreset<LiquidMetalParams>;
|
|
6
10
|
export declare const defaultPreset: LiquidMetalPreset;
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const containedPreset: LiquidMetalPreset;
|
|
9
|
-
export declare const fullScreenPreset: LiquidMetalPreset;
|
|
11
|
+
export declare const oldDefaultPreset: LiquidMetalPreset;
|
|
10
12
|
export declare const liquidMetalPresets: LiquidMetalPreset[];
|
|
11
13
|
export declare const LiquidMetal: React.FC<LiquidMetalProps>;
|
|
12
14
|
export {};
|
|
@@ -3,103 +3,71 @@
|
|
|
3
3
|
* https://github.com/paper-design/shaders *
|
|
4
4
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
5
|
|
|
6
|
-
import { memo } from "react";
|
|
6
|
+
import { memo, useLayoutEffect, useState } from "react";
|
|
7
7
|
import { ShaderMount } from "../shader-mount.js";
|
|
8
|
-
import { colorPropsAreEqual } from "../color-props-are-equal.js";
|
|
9
8
|
import {
|
|
10
9
|
liquidMetalFragmentShader,
|
|
11
10
|
ShaderFitOptions,
|
|
12
11
|
defaultObjectSizing,
|
|
12
|
+
toProcessedLiquidMetal,
|
|
13
13
|
getShaderColorFromString,
|
|
14
14
|
LiquidMetalShapes
|
|
15
15
|
} from "@paper-design/shaders";
|
|
16
|
+
import { transparentPixel } from "../transparent-pixel.js";
|
|
17
|
+
import { suspend } from "../suspend.js";
|
|
16
18
|
import { jsx } from "react/jsx-runtime";
|
|
17
19
|
const defaultPreset = {
|
|
18
20
|
name: "Default",
|
|
19
21
|
params: {
|
|
20
22
|
...defaultObjectSizing,
|
|
21
|
-
scale:
|
|
22
|
-
speed: 1,
|
|
23
|
-
frame: 8e3,
|
|
24
|
-
colorBack: "#000000",
|
|
25
|
-
colorTint: "#ffffff",
|
|
26
|
-
softness: 0.3,
|
|
27
|
-
repetition: 4,
|
|
28
|
-
shiftRed: 0.3,
|
|
29
|
-
shiftBlue: 0.3,
|
|
30
|
-
distortion: 0.1,
|
|
31
|
-
contour: 1,
|
|
32
|
-
shape: "circle"
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
const dropsPreset = {
|
|
36
|
-
name: "Drops",
|
|
37
|
-
params: {
|
|
38
|
-
...defaultObjectSizing,
|
|
23
|
+
scale: 1,
|
|
39
24
|
speed: 1,
|
|
40
25
|
frame: 0,
|
|
41
|
-
colorBack: "#
|
|
26
|
+
colorBack: "#00000000",
|
|
42
27
|
colorTint: "#ffffff",
|
|
43
|
-
|
|
44
|
-
repetition:
|
|
28
|
+
distortion: 0.07,
|
|
29
|
+
repetition: 2,
|
|
45
30
|
shiftRed: 0.3,
|
|
46
31
|
shiftBlue: 0.3,
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
contour: 0.4,
|
|
33
|
+
softness: 0.1,
|
|
49
34
|
shape: "metaballs"
|
|
50
35
|
}
|
|
51
36
|
};
|
|
52
|
-
const
|
|
53
|
-
name: "
|
|
37
|
+
const oldDefaultPreset = {
|
|
38
|
+
name: "Old default",
|
|
54
39
|
params: {
|
|
55
40
|
...defaultObjectSizing,
|
|
41
|
+
scale: 0.6,
|
|
56
42
|
speed: 1,
|
|
57
|
-
frame:
|
|
58
|
-
colorBack: "#
|
|
43
|
+
frame: 8e3,
|
|
44
|
+
colorBack: "#000000",
|
|
59
45
|
colorTint: "#ffffff",
|
|
60
46
|
softness: 0.3,
|
|
61
|
-
repetition:
|
|
47
|
+
repetition: 4,
|
|
62
48
|
shiftRed: 0.3,
|
|
63
49
|
shiftBlue: 0.3,
|
|
64
|
-
distortion: 0.07,
|
|
65
|
-
contour: 0,
|
|
66
|
-
shape: "none",
|
|
67
|
-
worldWidth: 0,
|
|
68
|
-
worldHeight: 0
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const fullScreenPreset = {
|
|
72
|
-
name: "Full Screen",
|
|
73
|
-
params: {
|
|
74
|
-
...defaultObjectSizing,
|
|
75
|
-
scale: 2.2,
|
|
76
|
-
speed: 1,
|
|
77
|
-
frame: 0,
|
|
78
|
-
colorBack: "#00042e",
|
|
79
|
-
colorTint: "#5b4dc7",
|
|
80
|
-
softness: 0.45,
|
|
81
|
-
repetition: 4,
|
|
82
|
-
shiftRed: -0.5,
|
|
83
|
-
shiftBlue: -1,
|
|
84
50
|
distortion: 0.1,
|
|
85
51
|
contour: 1,
|
|
86
|
-
shape: "
|
|
52
|
+
shape: "circle"
|
|
87
53
|
}
|
|
88
54
|
};
|
|
89
|
-
const liquidMetalPresets = [defaultPreset,
|
|
55
|
+
const liquidMetalPresets = [defaultPreset, oldDefaultPreset];
|
|
90
56
|
const LiquidMetal = memo(function LiquidMetalImpl({
|
|
91
57
|
// Own props
|
|
92
58
|
colorBack = defaultPreset.params.colorBack,
|
|
93
59
|
colorTint = defaultPreset.params.colorTint,
|
|
94
60
|
speed = defaultPreset.params.speed,
|
|
95
61
|
frame = defaultPreset.params.frame,
|
|
62
|
+
image = "",
|
|
63
|
+
contour = defaultPreset.params.contour,
|
|
64
|
+
distortion = defaultPreset.params.distortion,
|
|
96
65
|
softness = defaultPreset.params.softness,
|
|
97
66
|
repetition = defaultPreset.params.repetition,
|
|
98
67
|
shiftRed = defaultPreset.params.shiftRed,
|
|
99
68
|
shiftBlue = defaultPreset.params.shiftBlue,
|
|
100
|
-
distortion = defaultPreset.params.distortion,
|
|
101
|
-
contour = defaultPreset.params.contour,
|
|
102
69
|
shape = defaultPreset.params.shape,
|
|
70
|
+
suspendWhenProcessingImage = false,
|
|
103
71
|
// Sizing props
|
|
104
72
|
fit = defaultPreset.params.fit,
|
|
105
73
|
scale = defaultPreset.params.scale,
|
|
@@ -112,16 +80,50 @@ const LiquidMetal = memo(function LiquidMetalImpl({
|
|
|
112
80
|
worldHeight = defaultPreset.params.worldHeight,
|
|
113
81
|
...props
|
|
114
82
|
}) {
|
|
83
|
+
const imageUrl = typeof image === "string" ? image : image.src;
|
|
84
|
+
const [processedStateImage, setProcessedStateImage] = useState(transparentPixel);
|
|
85
|
+
let processedImage;
|
|
86
|
+
if (suspendWhenProcessingImage && typeof window !== "undefined" && imageUrl) {
|
|
87
|
+
processedImage = suspend(
|
|
88
|
+
() => toProcessedLiquidMetal(imageUrl).then((result) => URL.createObjectURL(result.pngBlob)),
|
|
89
|
+
[imageUrl, "liquid-metal"]
|
|
90
|
+
);
|
|
91
|
+
} else {
|
|
92
|
+
processedImage = processedStateImage;
|
|
93
|
+
}
|
|
94
|
+
useLayoutEffect(() => {
|
|
95
|
+
if (suspendWhenProcessingImage) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (!imageUrl) {
|
|
99
|
+
setProcessedStateImage(transparentPixel);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
let url;
|
|
103
|
+
let current = true;
|
|
104
|
+
toProcessedLiquidMetal(imageUrl).then((result) => {
|
|
105
|
+
if (current) {
|
|
106
|
+
url = URL.createObjectURL(result.pngBlob);
|
|
107
|
+
setProcessedStateImage(url);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return () => {
|
|
111
|
+
current = false;
|
|
112
|
+
URL.revokeObjectURL(url);
|
|
113
|
+
};
|
|
114
|
+
}, [imageUrl, suspendWhenProcessingImage]);
|
|
115
115
|
const uniforms = {
|
|
116
116
|
// Own uniforms
|
|
117
117
|
u_colorBack: getShaderColorFromString(colorBack),
|
|
118
118
|
u_colorTint: getShaderColorFromString(colorTint),
|
|
119
|
+
u_image: processedImage,
|
|
120
|
+
u_contour: contour,
|
|
121
|
+
u_distortion: distortion,
|
|
119
122
|
u_softness: softness,
|
|
120
123
|
u_repetition: repetition,
|
|
121
124
|
u_shiftRed: shiftRed,
|
|
122
125
|
u_shiftBlue: shiftBlue,
|
|
123
|
-
|
|
124
|
-
u_contour: contour,
|
|
126
|
+
u_isImage: Boolean(image),
|
|
125
127
|
u_shape: LiquidMetalShapes[shape],
|
|
126
128
|
// Sizing uniforms
|
|
127
129
|
u_fit: ShaderFitOptions[fit],
|
|
@@ -144,13 +146,11 @@ const LiquidMetal = memo(function LiquidMetalImpl({
|
|
|
144
146
|
uniforms
|
|
145
147
|
}
|
|
146
148
|
);
|
|
147
|
-
}
|
|
149
|
+
});
|
|
148
150
|
export {
|
|
149
151
|
LiquidMetal,
|
|
150
|
-
containedPreset,
|
|
151
152
|
defaultPreset,
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
liquidMetalPresets
|
|
153
|
+
liquidMetalPresets,
|
|
154
|
+
oldDefaultPreset
|
|
155
155
|
};
|
|
156
156
|
//# sourceMappingURL=liquid-metal.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/shaders/liquid-metal.tsx"],
|
|
4
|
-
"sourcesContent": ["import { memo } from 'react';\nimport { ShaderMount, type ShaderComponentProps } from '../shader-mount.js';\nimport {
|
|
5
|
-
"mappings": ";;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { memo, useLayoutEffect, useState } from 'react';\nimport { ShaderMount, type ShaderComponentProps } from '../shader-mount.js';\nimport {\n liquidMetalFragmentShader,\n ShaderFitOptions,\n defaultObjectSizing,\n type LiquidMetalUniforms,\n type LiquidMetalParams,\n toProcessedLiquidMetal,\n type ImageShaderPreset,\n getShaderColorFromString,\n LiquidMetalShapes,\n} from '@paper-design/shaders';\nimport { transparentPixel } from '../transparent-pixel.js';\nimport { suspend } from '../suspend.js';\n\nexport interface LiquidMetalProps extends ShaderComponentProps, LiquidMetalParams {\n /**\n * Suspends the component when the image is being processed.\n */\n suspendWhenProcessingImage?: boolean;\n}\n\ntype LiquidMetalPreset = ImageShaderPreset<LiquidMetalParams>;\n\nexport const defaultPreset: LiquidMetalPreset = {\n name: 'Default',\n params: {\n ...defaultObjectSizing,\n scale: 1,\n speed: 1,\n frame: 0,\n colorBack: '#00000000',\n colorTint: '#ffffff',\n distortion: 0.07,\n repetition: 2.0,\n shiftRed: 0.3,\n shiftBlue: 0.3,\n contour: 0.4,\n softness: 0.1,\n shape: 'metaballs',\n },\n};\n\nexport const oldDefaultPreset: LiquidMetalPreset = {\n name: 'Old default',\n params: {\n ...defaultObjectSizing,\n scale: 0.6,\n speed: 1,\n frame: 8000,\n colorBack: '#000000',\n colorTint: '#ffffff',\n softness: 0.3,\n repetition: 4,\n shiftRed: 0.3,\n shiftBlue: 0.3,\n distortion: 0.1,\n contour: 1,\n shape: 'circle',\n },\n};\n\nexport const liquidMetalPresets: LiquidMetalPreset[] = [defaultPreset, oldDefaultPreset];\n\nexport const LiquidMetal: React.FC<LiquidMetalProps> = memo(function LiquidMetalImpl({\n // Own props\n colorBack = defaultPreset.params.colorBack,\n colorTint = defaultPreset.params.colorTint,\n speed = defaultPreset.params.speed,\n frame = defaultPreset.params.frame,\n image = '',\n contour = defaultPreset.params.contour,\n distortion = defaultPreset.params.distortion,\n softness = defaultPreset.params.softness,\n repetition = defaultPreset.params.repetition,\n shiftRed = defaultPreset.params.shiftRed,\n shiftBlue = defaultPreset.params.shiftBlue,\n shape = defaultPreset.params.shape,\n suspendWhenProcessingImage = false,\n\n // Sizing props\n fit = defaultPreset.params.fit,\n scale = defaultPreset.params.scale,\n rotation = defaultPreset.params.rotation,\n originX = defaultPreset.params.originX,\n originY = defaultPreset.params.originY,\n offsetX = defaultPreset.params.offsetX,\n offsetY = defaultPreset.params.offsetY,\n worldWidth = defaultPreset.params.worldWidth,\n worldHeight = defaultPreset.params.worldHeight,\n ...props\n}: LiquidMetalProps) {\n const imageUrl = typeof image === 'string' ? image : image.src;\n const [processedStateImage, setProcessedStateImage] = useState<string>(transparentPixel);\n\n let processedImage: string;\n\n if (suspendWhenProcessingImage && typeof window !== 'undefined' && imageUrl) {\n processedImage = suspend(\n (): Promise<string> => toProcessedLiquidMetal(imageUrl).then((result) => URL.createObjectURL(result.pngBlob)),\n [imageUrl, 'liquid-metal']\n );\n } else {\n processedImage = processedStateImage;\n }\n\n useLayoutEffect(() => {\n if (suspendWhenProcessingImage) {\n // Skip doing work in the effect as it's been handled by suspense.\n return;\n }\n\n if (!imageUrl) {\n setProcessedStateImage(transparentPixel);\n return;\n }\n\n let url: string;\n let current = true;\n\n toProcessedLiquidMetal(imageUrl).then((result) => {\n if (current) {\n url = URL.createObjectURL(result.pngBlob);\n setProcessedStateImage(url);\n }\n });\n\n return () => {\n current = false;\n URL.revokeObjectURL(url);\n };\n }, [imageUrl, suspendWhenProcessingImage]);\n\n const uniforms = {\n // Own uniforms\n u_colorBack: getShaderColorFromString(colorBack),\n u_colorTint: getShaderColorFromString(colorTint),\n\n u_image: processedImage,\n u_contour: contour,\n u_distortion: distortion,\n u_softness: softness,\n u_repetition: repetition,\n u_shiftRed: shiftRed,\n u_shiftBlue: shiftBlue,\n u_isImage: Boolean(image),\n u_shape: LiquidMetalShapes[shape],\n\n // Sizing uniforms\n u_fit: ShaderFitOptions[fit],\n u_scale: scale,\n u_rotation: rotation,\n u_offsetX: offsetX,\n u_offsetY: offsetY,\n u_originX: originX,\n u_originY: originY,\n u_worldWidth: worldWidth,\n u_worldHeight: worldHeight,\n } satisfies LiquidMetalUniforms;\n\n return (\n <ShaderMount\n {...props}\n speed={speed}\n frame={frame}\n fragmentShader={liquidMetalFragmentShader}\n uniforms={uniforms}\n />\n );\n});\n"],
|
|
5
|
+
"mappings": ";;;;;AAAA,SAAS,MAAM,iBAAiB,gBAAgB;AAChD,SAAS,mBAA8C;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AACjC,SAAS,eAAe;AAoJpB;AAzIG,MAAM,gBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF;AAEO,MAAM,mBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAEO,MAAM,qBAA0C,CAAC,eAAe,gBAAgB;AAEhF,MAAM,cAA0C,KAAK,SAAS,gBAAgB;AAAA;AAAA,EAEnF,YAAY,cAAc,OAAO;AAAA,EACjC,YAAY,cAAc,OAAO;AAAA,EACjC,QAAQ,cAAc,OAAO;AAAA,EAC7B,QAAQ,cAAc,OAAO;AAAA,EAC7B,QAAQ;AAAA,EACR,UAAU,cAAc,OAAO;AAAA,EAC/B,aAAa,cAAc,OAAO;AAAA,EAClC,WAAW,cAAc,OAAO;AAAA,EAChC,aAAa,cAAc,OAAO;AAAA,EAClC,WAAW,cAAc,OAAO;AAAA,EAChC,YAAY,cAAc,OAAO;AAAA,EACjC,QAAQ,cAAc,OAAO;AAAA,EAC7B,6BAA6B;AAAA;AAAA,EAG7B,MAAM,cAAc,OAAO;AAAA,EAC3B,QAAQ,cAAc,OAAO;AAAA,EAC7B,WAAW,cAAc,OAAO;AAAA,EAChC,UAAU,cAAc,OAAO;AAAA,EAC/B,UAAU,cAAc,OAAO;AAAA,EAC/B,UAAU,cAAc,OAAO;AAAA,EAC/B,UAAU,cAAc,OAAO;AAAA,EAC/B,aAAa,cAAc,OAAO;AAAA,EAClC,cAAc,cAAc,OAAO;AAAA,EACnC,GAAG;AACL,GAAqB;AACnB,QAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,MAAM;AAC3D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAiB,gBAAgB;AAEvF,MAAI;AAEJ,MAAI,8BAA8B,OAAO,WAAW,eAAe,UAAU;AAC3E,qBAAiB;AAAA,MACf,MAAuB,uBAAuB,QAAQ,EAAE,KAAK,CAAC,WAAW,IAAI,gBAAgB,OAAO,OAAO,CAAC;AAAA,MAC5G,CAAC,UAAU,cAAc;AAAA,IAC3B;AAAA,EACF,OAAO;AACL,qBAAiB;AAAA,EACnB;AAEA,kBAAgB,MAAM;AACpB,QAAI,4BAA4B;AAE9B;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,6BAAuB,gBAAgB;AACvC;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,UAAU;AAEd,2BAAuB,QAAQ,EAAE,KAAK,CAAC,WAAW;AAChD,UAAI,SAAS;AACX,cAAM,IAAI,gBAAgB,OAAO,OAAO;AACxC,+BAAuB,GAAG;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,gBAAU;AACV,UAAI,gBAAgB,GAAG;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,UAAU,0BAA0B,CAAC;AAEzC,QAAM,WAAW;AAAA;AAAA,IAEf,aAAa,yBAAyB,SAAS;AAAA,IAC/C,aAAa,yBAAyB,SAAS;AAAA,IAE/C,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW,QAAQ,KAAK;AAAA,IACxB,SAAS,kBAAkB,KAAK;AAAA;AAAA,IAGhC,OAAO,iBAAiB,GAAG;AAAA,IAC3B,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paper-design/shaders-react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.58-next.1",
|
|
4
4
|
"license": "SEE LICENSE IN https://github.com/paper-design/shaders/blob/main/LICENSE",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"type-check": "tsc --project tsconfig.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@paper-design/shaders": "0.0.
|
|
27
|
+
"@paper-design/shaders": "0.0.58-next.1"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/react": "19.1.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function fastDeepEqual(a: any, b: any): boolean;
|
package/dist/fast-deep-equal.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
2
|
-
* Paper Shaders *
|
|
3
|
-
* https://github.com/paper-design/shaders *
|
|
4
|
-
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
|
-
|
|
6
|
-
function fastDeepEqual(a, b) {
|
|
7
|
-
if (a === b) return true;
|
|
8
|
-
if (a && b && typeof a == "object" && typeof b == "object") {
|
|
9
|
-
if (a.constructor !== b.constructor) return false;
|
|
10
|
-
var length, i, keys;
|
|
11
|
-
if (Array.isArray(a)) {
|
|
12
|
-
length = a.length;
|
|
13
|
-
if (length != b.length) return false;
|
|
14
|
-
for (i = length; i-- !== 0; ) if (!fastDeepEqual(a[i], b[i])) return false;
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
if (a.constructor !== Object) return false;
|
|
18
|
-
keys = Object.keys(a);
|
|
19
|
-
length = keys.length;
|
|
20
|
-
if (length !== Object.keys(b).length) return false;
|
|
21
|
-
for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
|
|
22
|
-
for (i = length; i-- !== 0; ) {
|
|
23
|
-
var key = keys[i];
|
|
24
|
-
if (!fastDeepEqual(a[key], b[key])) return false;
|
|
25
|
-
}
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
return a !== a && b !== b;
|
|
29
|
-
}
|
|
30
|
-
export {
|
|
31
|
-
fastDeepEqual
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=fast-deep-equal.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/fast-deep-equal.ts"],
|
|
4
|
-
"sourcesContent": ["// Adapted from https://github.com/epoberezkin/fast-deep-equal\n\nexport function fastDeepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!fastDeepEqual(a[i], b[i])) return false;\n return true;\n }\n\n // Our change: compare Arrays (done above) and anonymous Objects only,\n // other objects will be compared by reference equality.\n if (a.constructor !== Object) return false;\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i]!)) return false;\n\n for (i = length; i-- !== 0; ) {\n var key = keys[i];\n\n if (!fastDeepEqual(a[key!], b[key!])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAEO,SAAS,cAAc,GAAQ,GAAiB;AACrD,MAAI,MAAM,EAAG,QAAO;AAEpB,MAAI,KAAK,KAAK,OAAO,KAAK,YAAY,OAAO,KAAK,UAAU;AAC1D,QAAI,EAAE,gBAAgB,EAAE,YAAa,QAAO;AAE5C,QAAI,QAAQ,GAAG;AACf,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,eAAS,EAAE;AACX,UAAI,UAAU,EAAE,OAAQ,QAAO;AAC/B,WAAK,IAAI,QAAQ,QAAQ,IAAK,KAAI,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAG,QAAO;AACrE,aAAO;AAAA,IACT;AAIA,QAAI,EAAE,gBAAgB,OAAQ,QAAO;AAErC,WAAO,OAAO,KAAK,CAAC;AACpB,aAAS,KAAK;AACd,QAAI,WAAW,OAAO,KAAK,CAAC,EAAE,OAAQ,QAAO;AAE7C,SAAK,IAAI,QAAQ,QAAQ,IAAK,KAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,KAAK,CAAC,CAAE,EAAG,QAAO;AAE7F,SAAK,IAAI,QAAQ,QAAQ,KAAK;AAC5B,UAAI,MAAM,KAAK,CAAC;AAEhB,UAAI,CAAC,cAAc,EAAE,GAAI,GAAG,EAAE,GAAI,CAAC,EAAG,QAAO;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAGA,SAAO,MAAM,KAAK,MAAM;AAC1B;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|