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