@paper-design/shaders-react 0.0.28 → 0.0.30

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 (67) hide show
  1. package/dist/color-props-are-equal.d.ts +6 -0
  2. package/dist/color-props-are-equal.js +34 -0
  3. package/dist/color-props-are-equal.js.map +7 -0
  4. package/dist/index.d.ts +46 -41
  5. package/dist/index.js +90 -2
  6. package/dist/index.js.map +4 -4
  7. package/dist/shader-mount.d.ts +15 -13
  8. package/dist/shader-mount.js +120 -0
  9. package/dist/shader-mount.js.map +7 -0
  10. package/dist/shaders/dithering.d.ts +15 -0
  11. package/dist/shaders/dithering.js +179 -0
  12. package/dist/shaders/dithering.js.map +7 -0
  13. package/dist/shaders/dot-grid.d.ts +6 -20
  14. package/dist/shaders/dot-grid.js +230 -0
  15. package/dist/shaders/dot-grid.js.map +7 -0
  16. package/dist/shaders/dot-orbit.d.ts +6 -18
  17. package/dist/shaders/dot-orbit.js +77 -0
  18. package/dist/shaders/dot-orbit.js.map +7 -0
  19. package/dist/shaders/god-rays.d.ts +6 -22
  20. package/dist/shaders/god-rays.js +160 -0
  21. package/dist/shaders/god-rays.js.map +7 -0
  22. package/dist/shaders/grain-gradient.d.ts +16 -0
  23. package/dist/shaders/grain-gradient.js +197 -0
  24. package/dist/shaders/grain-gradient.js.map +7 -0
  25. package/dist/shaders/liquid-metal.d.ts +9 -0
  26. package/dist/shaders/liquid-metal.js +87 -0
  27. package/dist/shaders/liquid-metal.js.map +7 -0
  28. package/dist/shaders/mesh-gradient.d.ts +7 -15
  29. package/dist/shaders/mesh-gradient.js +104 -0
  30. package/dist/shaders/mesh-gradient.js.map +7 -0
  31. package/dist/shaders/metaballs.d.ts +6 -16
  32. package/dist/shaders/metaballs.js +72 -0
  33. package/dist/shaders/metaballs.js.map +7 -0
  34. package/dist/shaders/neuro-noise.d.ts +6 -14
  35. package/dist/shaders/neuro-noise.js +82 -0
  36. package/dist/shaders/neuro-noise.js.map +7 -0
  37. package/dist/shaders/perlin-noise.d.ts +6 -17
  38. package/dist/shaders/perlin-noise.js +183 -0
  39. package/dist/shaders/perlin-noise.js.map +7 -0
  40. package/dist/shaders/pulsing-border.d.ts +11 -0
  41. package/dist/shaders/pulsing-border.js +153 -0
  42. package/dist/shaders/pulsing-border.js.map +7 -0
  43. package/dist/shaders/simplex-noise.d.ts +9 -0
  44. package/dist/shaders/simplex-noise.js +80 -0
  45. package/dist/shaders/simplex-noise.js.map +7 -0
  46. package/dist/shaders/smoke-ring.d.ts +8 -18
  47. package/dist/shaders/smoke-ring.js +134 -0
  48. package/dist/shaders/smoke-ring.js.map +7 -0
  49. package/dist/shaders/spiral.d.ts +6 -23
  50. package/dist/shaders/spiral.js +218 -0
  51. package/dist/shaders/spiral.js.map +7 -0
  52. package/dist/shaders/swirl.d.ts +12 -0
  53. package/dist/shaders/swirl.js +137 -0
  54. package/dist/shaders/swirl.js.map +7 -0
  55. package/dist/shaders/voronoi.d.ts +7 -28
  56. package/dist/shaders/voronoi.js +102 -0
  57. package/dist/shaders/voronoi.js.map +7 -0
  58. package/dist/shaders/warp.d.ts +6 -23
  59. package/dist/shaders/warp.js +290 -0
  60. package/dist/shaders/warp.js.map +7 -0
  61. package/dist/shaders/waves.d.ts +6 -19
  62. package/dist/shaders/waves.js +178 -0
  63. package/dist/shaders/waves.js.map +7 -0
  64. package/dist/use-merge-refs.js +48 -0
  65. package/dist/use-merge-refs.js.map +7 -0
  66. package/package.json +13 -4
  67. package/dist/shaders/stepped-simplex-noise.d.ts +0 -20
@@ -1,21 +1,23 @@
1
- import React from 'react';
2
- import { ShaderMount as ShaderMountVanilla, type ShaderMountUniforms } from '@paper-design/shaders';
3
- /** The React ShaderMount can also accept strings as uniform values, which will assumed to be URLs and loaded as images */
4
- export type ShaderMountUniformsReact = {
5
- [key: string]: ShaderMountUniforms[keyof ShaderMountUniforms] | string;
6
- };
7
- export interface ShaderMountProps extends React.ComponentProps<'div'> {
8
- shaderMountRef?: React.RefObject<ShaderMountVanilla | null>;
1
+ import { type ShaderMotionParams } from '@paper-design/shaders';
2
+ /** React Shader Mount can also accept strings as uniform values, which will assumed to be URLs and loaded as images */
3
+ interface ShaderMountUniformsReact {
4
+ [key: string]: string | boolean | number | number[] | number[][] | HTMLImageElement;
5
+ }
6
+ export interface ShaderMountProps extends Omit<React.ComponentProps<'div'>, 'color'>, ShaderMotionParams {
9
7
  fragmentShader: string;
10
- uniforms?: ShaderMountUniformsReact;
8
+ uniforms: ShaderMountUniformsReact;
9
+ minPixelRatio?: number;
10
+ maxPixelCount?: number;
11
+ webGlContextAttributes?: WebGLContextAttributes;
12
+ }
13
+ export interface ShaderComponentProps extends Omit<React.ComponentProps<'div'>, 'color'> {
14
+ minPixelRatio?: number;
15
+ maxPixelCount?: number;
11
16
  webGlContextAttributes?: WebGLContextAttributes;
12
- speed?: number;
13
- frame?: number;
14
17
  }
15
- /** Params that every shader can set as part of their controls */
16
- export type GlobalParams = Pick<ShaderMountProps, 'speed' | 'frame'>;
17
18
  /**
18
19
  * A React component that mounts a shader and updates its uniforms as the component's props change
19
20
  * 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
20
21
  */
21
22
  export declare const ShaderMount: React.FC<ShaderMountProps>;
23
+ export {};
@@ -0,0 +1,120 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ "use client";
7
+ import { useEffect, useRef, forwardRef, useState } from "react";
8
+ import {
9
+ ShaderMount as ShaderMountVanilla
10
+ } from "@paper-design/shaders";
11
+ import { useMergeRefs } from "./use-merge-refs";
12
+ import { jsx } from "react/jsx-runtime";
13
+ async function processUniforms(uniformsProp) {
14
+ const processedUniforms = {};
15
+ const imageLoadPromises = [];
16
+ const isValidUrl = (url) => {
17
+ try {
18
+ if (url.startsWith("/")) return true;
19
+ new URL(url);
20
+ return true;
21
+ } catch {
22
+ return false;
23
+ }
24
+ };
25
+ const isExternalUrl = (url) => {
26
+ try {
27
+ if (url.startsWith("/")) return false;
28
+ const urlObject = new URL(url, window.location.origin);
29
+ return urlObject.origin !== window.location.origin;
30
+ } catch {
31
+ return false;
32
+ }
33
+ };
34
+ Object.entries(uniformsProp).forEach(([key, value]) => {
35
+ if (typeof value === "string") {
36
+ if (!isValidUrl(value)) {
37
+ console.warn(`Uniform "${key}" has invalid URL "${value}". Skipping image loading.`);
38
+ return;
39
+ }
40
+ const imagePromise = new Promise((resolve, reject) => {
41
+ const img = new Image();
42
+ if (isExternalUrl(value)) {
43
+ img.crossOrigin = "anonymous";
44
+ }
45
+ img.onload = () => {
46
+ processedUniforms[key] = img;
47
+ resolve();
48
+ };
49
+ img.onerror = () => {
50
+ console.error(`Could not set uniforms. Failed to load image at ${value}`);
51
+ reject();
52
+ };
53
+ img.src = value;
54
+ });
55
+ imageLoadPromises.push(imagePromise);
56
+ } else {
57
+ processedUniforms[key] = value;
58
+ }
59
+ });
60
+ await Promise.all(imageLoadPromises);
61
+ return processedUniforms;
62
+ }
63
+ const ShaderMount = forwardRef(
64
+ function ShaderMountImpl({
65
+ fragmentShader,
66
+ uniforms: uniformsProp,
67
+ webGlContextAttributes,
68
+ speed = 0,
69
+ frame = 0,
70
+ minPixelRatio,
71
+ maxPixelCount,
72
+ ...divProps
73
+ }, forwardedRef) {
74
+ const [isInitialized, setIsInitialized] = useState(false);
75
+ const divRef = useRef(null);
76
+ const shaderMountRef = useRef(null);
77
+ useEffect(() => {
78
+ const initShader = async () => {
79
+ const uniforms = await processUniforms(uniformsProp);
80
+ if (divRef.current && !shaderMountRef.current) {
81
+ shaderMountRef.current = new ShaderMountVanilla(
82
+ divRef.current,
83
+ fragmentShader,
84
+ uniforms,
85
+ webGlContextAttributes,
86
+ speed,
87
+ frame,
88
+ minPixelRatio,
89
+ maxPixelCount
90
+ );
91
+ setIsInitialized(true);
92
+ }
93
+ };
94
+ initShader();
95
+ return () => {
96
+ shaderMountRef.current?.dispose();
97
+ shaderMountRef.current = null;
98
+ };
99
+ }, [fragmentShader, webGlContextAttributes]);
100
+ useEffect(() => {
101
+ const updateUniforms = async () => {
102
+ const uniforms = await processUniforms(uniformsProp);
103
+ shaderMountRef.current?.setUniforms(uniforms);
104
+ };
105
+ updateUniforms();
106
+ }, [uniformsProp, isInitialized]);
107
+ useEffect(() => {
108
+ shaderMountRef.current?.setSpeed(speed);
109
+ }, [speed, isInitialized]);
110
+ useEffect(() => {
111
+ shaderMountRef.current?.setFrame(frame);
112
+ }, [frame, isInitialized]);
113
+ return /* @__PURE__ */ jsx("div", { ref: useMergeRefs([divRef, forwardedRef]), ...divProps });
114
+ }
115
+ );
116
+ ShaderMount.displayName = "ShaderMount";
117
+ export {
118
+ ShaderMount
119
+ };
120
+ //# sourceMappingURL=shader-mount.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/shader-mount.tsx"],
4
+ "sourcesContent": ["'use client';\n\nimport { useEffect, useRef, forwardRef, useState } from 'react';\nimport {\n ShaderMount as ShaderMountVanilla,\n type ShaderMotionParams,\n type ShaderMountUniforms,\n} from '@paper-design/shaders';\nimport { useMergeRefs } from './use-merge-refs';\n\n/** React Shader Mount can also accept strings as uniform values, which will assumed to be URLs and loaded as images */\ninterface ShaderMountUniformsReact {\n [key: string]: string | boolean | number | number[] | number[][] | HTMLImageElement;\n}\n\nexport interface ShaderMountProps extends Omit<React.ComponentProps<'div'>, 'color'>, ShaderMotionParams {\n fragmentShader: string;\n uniforms: ShaderMountUniformsReact;\n minPixelRatio?: number;\n maxPixelCount?: number;\n webGlContextAttributes?: WebGLContextAttributes;\n}\n\nexport interface ShaderComponentProps extends Omit<React.ComponentProps<'div'>, 'color'> {\n minPixelRatio?: number;\n maxPixelCount?: number;\n webGlContextAttributes?: WebGLContextAttributes;\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 // 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<HTMLDivElement, ShaderMountProps>(\n function ShaderMountImpl(\n {\n fragmentShader,\n uniforms: uniformsProp,\n webGlContextAttributes,\n speed = 0,\n frame = 0,\n minPixelRatio,\n maxPixelCount,\n ...divProps\n },\n forwardedRef\n ) {\n const [isInitialized, setIsInitialized] = useState(false);\n const divRef = useRef<HTMLDivElement>(null);\n const shaderMountRef: React.RefObject<ShaderMountVanilla | null> = useRef<ShaderMountVanilla>(null);\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 webGlContextAttributes,\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, webGlContextAttributes]);\n\n // Uniforms\n useEffect(() => {\n const updateUniforms = async () => {\n const uniforms = await processUniforms(uniformsProp);\n shaderMountRef.current?.setUniforms(uniforms);\n };\n\n updateUniforms();\n }, [uniformsProp, isInitialized]);\n\n // Speed\n useEffect(() => {\n shaderMountRef.current?.setSpeed(speed);\n }, [speed, isInitialized]);\n\n // Frame\n useEffect(() => {\n shaderMountRef.current?.setFrame(frame);\n }, [frame, isInitialized]);\n\n return <div ref={useMergeRefs([divRef, forwardedRef])} {...divProps} />;\n }\n);\n\nShaderMount.displayName = 'ShaderMount';\n"],
5
+ "mappings": ";;;;;;AAEA,SAAS,WAAW,QAAQ,YAAY,gBAAgB;AACxD;AAAA,EACE,eAAe;AAAA,OAGV;AACP,SAAS,oBAAoB;AAwJlB;AAlIX,eAAe,gBAAgB,cAAsE;AACnG,QAAM,oBAAoB,CAAC;AAC3B,QAAM,oBAAqC,CAAC;AAE5C,QAAM,aAAa,CAAC,QAAyB;AAC3C,QAAI;AAEF,UAAI,IAAI,WAAW,GAAG,EAAG,QAAO;AAEhC,UAAI,IAAI,GAAG;AACX,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,QAAyB;AAC9C,QAAI;AACF,UAAI,IAAI,WAAW,GAAG,EAAG,QAAO;AAChC,YAAM,YAAY,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AACrD,aAAO,UAAU,WAAW,OAAO,SAAS;AAAA,IAC9C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,QAAI,OAAO,UAAU,UAAU;AAE7B,UAAI,CAAC,WAAW,KAAK,GAAG;AACtB,gBAAQ,KAAK,YAAY,GAAG,sBAAsB,KAAK,4BAA4B;AACnF;AAAA,MACF;AAEA,YAAM,eAAe,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1D,cAAM,MAAM,IAAI,MAAM;AACtB,YAAI,cAAc,KAAK,GAAG;AACxB,cAAI,cAAc;AAAA,QACpB;AACA,YAAI,SAAS,MAAM;AACjB,4BAAkB,GAAG,IAAI;AACzB,kBAAQ;AAAA,QACV;AACA,YAAI,UAAU,MAAM;AAClB,kBAAQ,MAAM,mDAAmD,KAAK,EAAE;AACxE,iBAAO;AAAA,QACT;AACA,YAAI,MAAM;AAAA,MACZ,CAAC;AACD,wBAAkB,KAAK,YAAY;AAAA,IACrC,OAAO;AACL,wBAAkB,GAAG,IAAI;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,iBAAiB;AACnC,SAAO;AACT;AAMO,MAAM,cAA0C;AAAA,EACrD,SAAS,gBACP;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,cACA;AACA,UAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,UAAM,SAAS,OAAuB,IAAI;AAC1C,UAAM,iBAA6D,OAA2B,IAAI;AAGlG,cAAU,MAAM;AACd,YAAM,aAAa,YAAY;AAC7B,cAAM,WAAW,MAAM,gBAAgB,YAAY;AAEnD,YAAI,OAAO,WAAW,CAAC,eAAe,SAAS;AAC7C,yBAAe,UAAU,IAAI;AAAA,YAC3B,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,2BAAiB,IAAI;AAAA,QACvB;AAAA,MACF;AAEA,iBAAW;AAEX,aAAO,MAAM;AACX,uBAAe,SAAS,QAAQ;AAChC,uBAAe,UAAU;AAAA,MAC3B;AAAA,IACF,GAAG,CAAC,gBAAgB,sBAAsB,CAAC;AAG3C,cAAU,MAAM;AACd,YAAM,iBAAiB,YAAY;AACjC,cAAM,WAAW,MAAM,gBAAgB,YAAY;AACnD,uBAAe,SAAS,YAAY,QAAQ;AAAA,MAC9C;AAEA,qBAAe;AAAA,IACjB,GAAG,CAAC,cAAc,aAAa,CAAC;AAGhC,cAAU,MAAM;AACd,qBAAe,SAAS,SAAS,KAAK;AAAA,IACxC,GAAG,CAAC,OAAO,aAAa,CAAC;AAGzB,cAAU,MAAM;AACd,qBAAe,SAAS,SAAS,KAAK;AAAA,IACxC,GAAG,CAAC,OAAO,aAAa,CAAC;AAEzB,WAAO,oBAAC,SAAI,KAAK,aAAa,CAAC,QAAQ,YAAY,CAAC,GAAI,GAAG,UAAU;AAAA,EACvE;AACF;AAEA,YAAY,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ import { type ShaderComponentProps } from '../shader-mount';
2
+ import { type DitheringParams, type ShaderPreset } from '@paper-design/shaders';
3
+ export interface DitheringProps extends ShaderComponentProps, DitheringParams {
4
+ }
5
+ type DitheringPreset = ShaderPreset<DitheringParams>;
6
+ export declare const defaultPreset: DitheringPreset;
7
+ export declare const warpPreset: DitheringPreset;
8
+ export declare const sinePreset: DitheringPreset;
9
+ export declare const bugsPreset: DitheringPreset;
10
+ export declare const ripplePreset: DitheringPreset;
11
+ export declare const swirlPreset: DitheringPreset;
12
+ export declare const spherePreset: DitheringPreset;
13
+ export declare const ditheringPresets: DitheringPreset[];
14
+ export declare const Dithering: React.FC<DitheringProps>;
15
+ export {};
@@ -0,0 +1,179 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { memo } from "react";
7
+ import { ShaderMount } from "../shader-mount";
8
+ import {
9
+ getShaderColorFromString,
10
+ ditheringFragmentShader,
11
+ ShaderFitOptions,
12
+ defaultPatternSizing,
13
+ defaultObjectSizing
14
+ } from "@paper-design/shaders";
15
+ import { jsx } from "react/jsx-runtime";
16
+ const defaultPreset = {
17
+ name: "Default",
18
+ params: {
19
+ ...defaultPatternSizing,
20
+ speed: 1,
21
+ frame: 0,
22
+ color1: "hsla(240, 14%, 17%, 1)",
23
+ color2: "hsla(34, 26%, 61%, 1)",
24
+ shape: 1,
25
+ type: 3,
26
+ pxSize: 2,
27
+ pxRounded: true
28
+ }
29
+ };
30
+ const warpPreset = {
31
+ name: "Warp",
32
+ params: {
33
+ ...defaultPatternSizing,
34
+ speed: 1,
35
+ frame: 0,
36
+ color1: "hsla(195, 47%, 35%, 1)",
37
+ color2: "hsla(171, 26%, 89%, 1)",
38
+ shape: 2,
39
+ type: 3,
40
+ pxSize: 2,
41
+ pxRounded: true
42
+ }
43
+ };
44
+ const sinePreset = {
45
+ name: "Sine Wave",
46
+ params: {
47
+ ...defaultPatternSizing,
48
+ speed: 1,
49
+ frame: 0,
50
+ color1: "hsla(318, 80%, 25%, 1)",
51
+ color2: "hsla(184, 100%, 40%, 1)",
52
+ shape: 4,
53
+ type: 4,
54
+ pxSize: 11,
55
+ pxRounded: true
56
+ }
57
+ };
58
+ const bugsPreset = {
59
+ name: "Bugs",
60
+ params: {
61
+ ...defaultPatternSizing,
62
+ speed: 1,
63
+ frame: 0,
64
+ color1: "hsla(0, 0%, 0%, 1)",
65
+ color2: "hsla(120, 100%, 25%, 1)",
66
+ shape: 3,
67
+ type: 1,
68
+ pxSize: 9,
69
+ pxRounded: true
70
+ }
71
+ };
72
+ const ripplePreset = {
73
+ name: "Ripple",
74
+ params: {
75
+ ...defaultObjectSizing,
76
+ speed: 1,
77
+ frame: 0,
78
+ color1: "hsla(20, 50%, 25%, 1)",
79
+ color2: "hsla(20, 50%, 55%, 1)",
80
+ shape: 5,
81
+ type: 2,
82
+ pxSize: 3,
83
+ pxRounded: false
84
+ }
85
+ };
86
+ const swirlPreset = {
87
+ name: "Swirl",
88
+ params: {
89
+ ...defaultObjectSizing,
90
+ speed: 1,
91
+ frame: 0,
92
+ color1: "hsla(0, 0%, 0%, 1)",
93
+ color2: "hsla(200, 26%, 20%, 1)",
94
+ shape: 6,
95
+ type: 4,
96
+ pxSize: 2,
97
+ pxRounded: false
98
+ }
99
+ };
100
+ const spherePreset = {
101
+ name: "Sphere",
102
+ params: {
103
+ ...defaultObjectSizing,
104
+ offsetX: -0.5,
105
+ offsetY: 0.23,
106
+ speed: 1,
107
+ frame: 0,
108
+ color1: "hsla(320, 26%, 15%, 1)",
109
+ color2: "hsla(135, 30%, 30%, 1)",
110
+ shape: 7,
111
+ type: 3,
112
+ pxSize: 2.5,
113
+ pxRounded: true
114
+ }
115
+ };
116
+ const ditheringPresets = [
117
+ defaultPreset,
118
+ spherePreset,
119
+ sinePreset,
120
+ warpPreset,
121
+ ripplePreset,
122
+ bugsPreset,
123
+ swirlPreset
124
+ ];
125
+ const Dithering = memo(function DitheringImpl({
126
+ // Own props
127
+ speed = defaultPreset.params.speed,
128
+ frame = defaultPreset.params.frame,
129
+ color1 = defaultPreset.params.color1,
130
+ color2 = defaultPreset.params.color2,
131
+ shape = defaultPreset.params.shape,
132
+ type = defaultPreset.params.type,
133
+ pxSize = defaultPreset.params.pxSize,
134
+ pxRounded = defaultPreset.params.pxRounded,
135
+ // Sizing props
136
+ fit = defaultPreset.params.fit,
137
+ scale = defaultPreset.params.scale,
138
+ rotation = defaultPreset.params.rotation,
139
+ originX = defaultPreset.params.originX,
140
+ originY = defaultPreset.params.originY,
141
+ offsetX = defaultPreset.params.offsetX,
142
+ offsetY = defaultPreset.params.offsetY,
143
+ worldWidth = defaultPreset.params.worldWidth,
144
+ worldHeight = defaultPreset.params.worldHeight,
145
+ ...props
146
+ }) {
147
+ const uniforms = {
148
+ // Own uniforms
149
+ u_color1: getShaderColorFromString(color1),
150
+ u_color2: getShaderColorFromString(color2),
151
+ u_shape: shape,
152
+ u_type: type,
153
+ u_pxSize: pxSize,
154
+ u_pxRounded: pxRounded,
155
+ // Sizing uniforms
156
+ u_fit: ShaderFitOptions[fit],
157
+ u_scale: scale,
158
+ u_rotation: rotation,
159
+ u_offsetX: offsetX,
160
+ u_offsetY: offsetY,
161
+ u_originX: originX,
162
+ u_originY: originY,
163
+ u_worldWidth: worldWidth,
164
+ u_worldHeight: worldHeight
165
+ };
166
+ return /* @__PURE__ */ jsx(ShaderMount, { ...props, speed, frame, fragmentShader: ditheringFragmentShader, uniforms });
167
+ });
168
+ export {
169
+ Dithering,
170
+ bugsPreset,
171
+ defaultPreset,
172
+ ditheringPresets,
173
+ ripplePreset,
174
+ sinePreset,
175
+ spherePreset,
176
+ swirlPreset,
177
+ warpPreset
178
+ };
179
+ //# sourceMappingURL=dithering.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shaders/dithering.tsx"],
4
+ "sourcesContent": ["import { memo } from 'react';\nimport { ShaderMount, type ShaderComponentProps } from '../shader-mount';\nimport {\n getShaderColorFromString,\n ditheringFragmentShader,\n ShaderFitOptions,\n type DitheringUniforms,\n type DitheringParams,\n type ShaderPreset,\n defaultPatternSizing,\n defaultObjectSizing,\n} from '@paper-design/shaders';\n\nexport interface DitheringProps extends ShaderComponentProps, DitheringParams {}\n\ntype DitheringPreset = ShaderPreset<DitheringParams>;\n\n// Due to Leva controls limitation:\n// 1) keep default colors in HSLA format to keep alpha channel\n// 2) don't use decimal values on HSL values (to avoid button highlight bug)\n\nexport const defaultPreset: DitheringPreset = {\n name: 'Default',\n params: {\n ...defaultPatternSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(240, 14%, 17%, 1)',\n color2: 'hsla(34, 26%, 61%, 1)',\n shape: 1,\n type: 3,\n pxSize: 2,\n pxRounded: true,\n },\n};\n\nexport const warpPreset: DitheringPreset = {\n name: 'Warp',\n params: {\n ...defaultPatternSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(195, 47%, 35%, 1)',\n color2: 'hsla(171, 26%, 89%, 1)',\n shape: 2,\n type: 3,\n pxSize: 2,\n pxRounded: true,\n },\n} as const;\n\nexport const sinePreset: DitheringPreset = {\n name: 'Sine Wave',\n params: {\n ...defaultPatternSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(318, 80%, 25%, 1)',\n color2: 'hsla(184, 100%, 40%, 1)',\n shape: 4,\n type: 4,\n pxSize: 11,\n pxRounded: true,\n },\n} as const;\n\nexport const bugsPreset: DitheringPreset = {\n name: 'Bugs',\n params: {\n ...defaultPatternSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(0, 0%, 0%, 1)',\n color2: 'hsla(120, 100%, 25%, 1)',\n shape: 3,\n type: 1,\n pxSize: 9,\n pxRounded: true,\n },\n} as const;\n\nexport const ripplePreset: DitheringPreset = {\n name: 'Ripple',\n params: {\n ...defaultObjectSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(20, 50%, 25%, 1)',\n color2: 'hsla(20, 50%, 55%, 1)',\n shape: 5,\n type: 2,\n pxSize: 3,\n pxRounded: false,\n },\n} as const;\n\nexport const swirlPreset: DitheringPreset = {\n name: 'Swirl',\n params: {\n ...defaultObjectSizing,\n speed: 1,\n frame: 0,\n color1: 'hsla(0, 0%, 0%, 1)',\n color2: 'hsla(200, 26%, 20%, 1)',\n shape: 6,\n type: 4,\n pxSize: 2,\n pxRounded: false,\n },\n} as const;\n\nexport const spherePreset: DitheringPreset = {\n name: 'Sphere',\n params: {\n ...defaultObjectSizing,\n offsetX: -0.5,\n offsetY: 0.23,\n speed: 1,\n frame: 0,\n color1: 'hsla(320, 26%, 15%, 1)',\n color2: 'hsla(135, 30%, 30%, 1)',\n shape: 7,\n type: 3,\n pxSize: 2.5,\n pxRounded: true,\n },\n} as const;\n\nexport const ditheringPresets: DitheringPreset[] = [\n defaultPreset,\n spherePreset,\n sinePreset,\n warpPreset,\n ripplePreset,\n bugsPreset,\n swirlPreset,\n];\n\nexport const Dithering: React.FC<DitheringProps> = memo(function DitheringImpl({\n // Own props\n speed = defaultPreset.params.speed,\n frame = defaultPreset.params.frame,\n color1 = defaultPreset.params.color1,\n color2 = defaultPreset.params.color2,\n shape = defaultPreset.params.shape,\n type = defaultPreset.params.type,\n pxSize = defaultPreset.params.pxSize,\n pxRounded = defaultPreset.params.pxRounded,\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}) {\n const uniforms = {\n // Own uniforms\n u_color1: getShaderColorFromString(color1),\n u_color2: getShaderColorFromString(color2),\n u_shape: shape,\n u_type: type,\n u_pxSize: pxSize,\n u_pxRounded: pxRounded,\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 DitheringUniforms;\n\n return (\n <ShaderMount {...props} speed={speed} frame={frame} fragmentShader={ditheringFragmentShader} uniforms={uniforms} />\n );\n});\n"],
5
+ "mappings": ";;;;;AAAA,SAAS,YAAY;AACrB,SAAS,mBAA8C;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,OACK;AA4KH;AAlKG,MAAM,gBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,aAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,aAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,aAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,eAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,cAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,eAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAEO,MAAM,mBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,YAAsC,KAAK,SAAS,cAAc;AAAA;AAAA,EAE7E,QAAQ,cAAc,OAAO;AAAA,EAC7B,QAAQ,cAAc,OAAO;AAAA,EAC7B,SAAS,cAAc,OAAO;AAAA,EAC9B,SAAS,cAAc,OAAO;AAAA,EAC9B,QAAQ,cAAc,OAAO;AAAA,EAC7B,OAAO,cAAc,OAAO;AAAA,EAC5B,SAAS,cAAc,OAAO;AAAA,EAC9B,YAAY,cAAc,OAAO;AAAA;AAAA,EAGjC,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,GAAG;AACD,QAAM,WAAW;AAAA;AAAA,IAEf,UAAU,yBAAyB,MAAM;AAAA,IACzC,UAAU,yBAAyB,MAAM;AAAA,IACzC,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA;AAAA,IAGb,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,oBAAC,eAAa,GAAG,OAAO,OAAc,OAAc,gBAAgB,yBAAyB,UAAoB;AAErH,CAAC;",
6
+ "names": []
7
+ }
@@ -1,24 +1,10 @@
1
- import { type ShaderMountProps } from '../shader-mount';
2
- import { type DotGridShape } from '@paper-design/shaders';
3
- export type DotGridParams = {
4
- colorFill?: string;
5
- colorStroke?: string;
6
- dotSize?: number;
7
- gridSpacingX?: number;
8
- gridSpacingY?: number;
9
- strokeWidth?: number;
10
- sizeRange?: number;
11
- opacityRange?: number;
12
- shape?: DotGridShape;
13
- };
14
- export type DotGridProps = Omit<ShaderMountProps, 'fragmentShader'> & DotGridParams;
15
- type DotGridPreset = {
16
- name: string;
17
- params: Required<DotGridParams>;
18
- style?: React.CSSProperties;
19
- };
1
+ import { type ShaderComponentProps } from '../shader-mount';
2
+ import { type DotGridParams, type ShaderPreset } from '@paper-design/shaders';
3
+ export interface DotGridProps extends ShaderComponentProps, DotGridParams {
4
+ }
5
+ type DotGridPreset = ShaderPreset<DotGridParams>;
20
6
  export declare const defaultPreset: DotGridPreset;
21
7
  export declare const macrodataPreset: DotGridPreset;
22
8
  export declare const dotGridPresets: DotGridPreset[];
23
- export declare const DotGrid: ({ colorFill, colorStroke, dotSize, gridSpacingX, gridSpacingY, strokeWidth, sizeRange, opacityRange, shape, ...props }: DotGridProps) => React.ReactElement;
9
+ export declare const DotGrid: React.FC<DotGridProps>;
24
10
  export {};
@@ -0,0 +1,230 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
+ * Paper Shaders *
3
+ * https://github.com/paper-design/shaders *
4
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * */
5
+
6
+ import { memo } from "react";
7
+ import { ShaderMount } from "../shader-mount";
8
+ import { colorPropsAreEqual } from "../color-props-are-equal";
9
+ import {
10
+ getShaderColorFromString,
11
+ dotGridFragmentShader,
12
+ DotGridShapes,
13
+ ShaderFitOptions,
14
+ defaultPatternSizing
15
+ } from "@paper-design/shaders";
16
+ import { jsx } from "react/jsx-runtime";
17
+ const defaultPreset = {
18
+ name: "Default",
19
+ params: {
20
+ ...defaultPatternSizing,
21
+ colorBack: "hsla(0, 0%, 0%, 1)",
22
+ colorFill: "hsla(0, 0%, 100%, 1)",
23
+ colorStroke: "hsla(40, 100%, 50%, 1)",
24
+ dotSize: 2,
25
+ gridSpacingX: 50,
26
+ gridSpacingY: 50,
27
+ strokeWidth: 0,
28
+ sizeRange: 0,
29
+ opacityRange: 0,
30
+ shape: "circle"
31
+ }
32
+ };
33
+ const macrodataPreset = {
34
+ name: "Macrodata",
35
+ params: {
36
+ ...defaultPatternSizing,
37
+ colorBack: "hsla(211, 37%, 13%, 1)",
38
+ colorFill: "hsla(218, 100%, 67%, 1)",
39
+ colorStroke: "hsla(0, 0%, 0%, 1)",
40
+ dotSize: 3,
41
+ gridSpacingX: 25,
42
+ gridSpacingY: 25,
43
+ strokeWidth: 0,
44
+ sizeRange: 0.25,
45
+ opacityRange: 0.9,
46
+ shape: "circle"
47
+ }
48
+ };
49
+ const trianglesPreset = {
50
+ name: "Triangles",
51
+ params: {
52
+ ...defaultPatternSizing,
53
+ colorBack: "hsla(0, 0%, 100%, 1)",
54
+ colorFill: "hsla(0, 0%, 100%, 1)",
55
+ colorStroke: "hsla(0, 0%, 0%, .5)",
56
+ dotSize: 5,
57
+ gridSpacingX: 32,
58
+ gridSpacingY: 32,
59
+ strokeWidth: 1,
60
+ sizeRange: 0,
61
+ opacityRange: 0,
62
+ shape: "triangle"
63
+ }
64
+ };
65
+ const bubblesPreset = {
66
+ name: "Bubbles",
67
+ params: {
68
+ ...defaultPatternSizing,
69
+ colorBack: "hsla(234, 100%, 31%, .5)",
70
+ colorFill: "hsla(100, 30%, 100%, 1)",
71
+ colorStroke: "hsla(0, 100%, 0%, 1)",
72
+ dotSize: 28,
73
+ gridSpacingX: 60,
74
+ gridSpacingY: 60,
75
+ strokeWidth: 12,
76
+ sizeRange: 0.7,
77
+ opacityRange: 1.3,
78
+ shape: "circle"
79
+ }
80
+ };
81
+ const treeLinePreset = {
82
+ name: "Tree line",
83
+ params: {
84
+ ...defaultPatternSizing,
85
+ colorBack: "hsla(100, 100%, 36%, .05)",
86
+ colorFill: "hsla(150, 80%, 10%, 1)",
87
+ colorStroke: "hsla(0, 0%, 0%, 1)",
88
+ dotSize: 8,
89
+ gridSpacingX: 20,
90
+ gridSpacingY: 90,
91
+ strokeWidth: 0,
92
+ sizeRange: 1,
93
+ opacityRange: 0.6,
94
+ shape: "circle"
95
+ }
96
+ };
97
+ const diamondsPreset = {
98
+ name: "Diamonds",
99
+ params: {
100
+ ...defaultPatternSizing,
101
+ colorBack: "hsla(0, 0%, 0%, 0)",
102
+ colorFill: "hsla(0, 100%, 50%, 1)",
103
+ colorStroke: "hsla(0, 0%, 0%, 1)",
104
+ dotSize: 15,
105
+ gridSpacingX: 30,
106
+ gridSpacingY: 30,
107
+ strokeWidth: 0,
108
+ sizeRange: 0,
109
+ opacityRange: 2,
110
+ shape: "diamond"
111
+ }
112
+ };
113
+ const wallpaperPreset = {
114
+ name: "Wallpaper",
115
+ params: {
116
+ ...defaultPatternSizing,
117
+ colorBack: "hsla(154, 33%, 19%, 1)",
118
+ colorFill: "hsla(0, 0%, 0%, 0)",
119
+ colorStroke: "hsla(36, 48%, 58%, 1)",
120
+ dotSize: 9,
121
+ gridSpacingX: 32,
122
+ gridSpacingY: 32,
123
+ strokeWidth: 1,
124
+ sizeRange: 0,
125
+ opacityRange: 0,
126
+ shape: "diamond"
127
+ }
128
+ };
129
+ const matrixPreset = {
130
+ name: "Enter the Matrix",
131
+ params: {
132
+ ...defaultPatternSizing,
133
+ colorBack: "hsla(0, 100%, 0%, 1)",
134
+ colorFill: "hsla(182, 100%, 64%, 1)",
135
+ colorStroke: "hsla(0, 100%, 100%, 0)",
136
+ dotSize: 2,
137
+ gridSpacingX: 10,
138
+ gridSpacingY: 10,
139
+ strokeWidth: 0.5,
140
+ sizeRange: 0.25,
141
+ opacityRange: 1,
142
+ shape: "triangle"
143
+ }
144
+ };
145
+ const waveformPreset = {
146
+ name: "Waveform",
147
+ params: {
148
+ ...defaultPatternSizing,
149
+ colorBack: "hsla(0, 100%, 100%, 1)",
150
+ colorFill: "hsla(227, 93%, 38%, 1)",
151
+ colorStroke: "hsla(0, 0%, 0%, 0)",
152
+ dotSize: 100,
153
+ gridSpacingX: 2,
154
+ gridSpacingY: 215,
155
+ strokeWidth: 0,
156
+ sizeRange: 1,
157
+ opacityRange: 0,
158
+ shape: "square"
159
+ }
160
+ };
161
+ const dotGridPresets = [
162
+ defaultPreset,
163
+ macrodataPreset,
164
+ trianglesPreset,
165
+ bubblesPreset,
166
+ treeLinePreset,
167
+ diamondsPreset,
168
+ wallpaperPreset,
169
+ matrixPreset,
170
+ waveformPreset
171
+ ];
172
+ const DotGrid = memo(function DotGridImpl({
173
+ // Own props
174
+ colorBack = defaultPreset.params.colorBack,
175
+ colorFill = defaultPreset.params.colorFill,
176
+ colorStroke = defaultPreset.params.colorStroke,
177
+ dotSize = defaultPreset.params.dotSize,
178
+ gridSpacingX = defaultPreset.params.gridSpacingX,
179
+ gridSpacingY = defaultPreset.params.gridSpacingY,
180
+ strokeWidth = defaultPreset.params.strokeWidth,
181
+ sizeRange = defaultPreset.params.sizeRange,
182
+ opacityRange = defaultPreset.params.opacityRange,
183
+ shape = defaultPreset.params.shape,
184
+ // Sizing props
185
+ fit = defaultPreset.params.fit,
186
+ scale = defaultPreset.params.scale,
187
+ rotation = defaultPreset.params.rotation,
188
+ originX = defaultPreset.params.originX,
189
+ originY = defaultPreset.params.originY,
190
+ offsetX = defaultPreset.params.offsetX,
191
+ offsetY = defaultPreset.params.offsetY,
192
+ worldWidth = defaultPreset.params.worldWidth,
193
+ worldHeight = defaultPreset.params.worldHeight,
194
+ // Other props
195
+ maxPixelCount = 6016 * 3384,
196
+ // Higher max resolution for this shader
197
+ ...props
198
+ }) {
199
+ const uniforms = {
200
+ // Own uniforms
201
+ u_colorBack: getShaderColorFromString(colorBack),
202
+ u_colorFill: getShaderColorFromString(colorFill),
203
+ u_colorStroke: getShaderColorFromString(colorStroke),
204
+ u_dotSize: dotSize,
205
+ u_gridSpacingX: gridSpacingX,
206
+ u_gridSpacingY: gridSpacingY,
207
+ u_strokeWidth: strokeWidth,
208
+ u_sizeRange: sizeRange,
209
+ u_opacityRange: opacityRange,
210
+ u_shape: DotGridShapes[shape],
211
+ // Sizing uniforms
212
+ u_fit: ShaderFitOptions[fit],
213
+ u_scale: scale,
214
+ u_rotation: rotation,
215
+ u_offsetX: offsetX,
216
+ u_offsetY: offsetY,
217
+ u_originX: originX,
218
+ u_originY: originY,
219
+ u_worldWidth: worldWidth,
220
+ u_worldHeight: worldHeight
221
+ };
222
+ return /* @__PURE__ */ jsx(ShaderMount, { ...props, maxPixelCount, fragmentShader: dotGridFragmentShader, uniforms });
223
+ }, colorPropsAreEqual);
224
+ export {
225
+ DotGrid,
226
+ defaultPreset,
227
+ dotGridPresets,
228
+ macrodataPreset
229
+ };
230
+ //# sourceMappingURL=dot-grid.js.map