@gradient-ui/gradient-engine 0.5.0 → 0.6.0
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/README.md +22 -2
- package/dist/animation.cjs +1 -1
- package/dist/animation.mjs +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.mjs +12 -9
- package/dist/{css-YuAJQW13.cjs → css-BVHXLMRl.cjs} +1 -1
- package/dist/{css-CaOuUhfh.js → css-DVaTTIqS.js} +1 -1
- package/dist/design-tokens.cjs +1 -0
- package/dist/design-tokens.mjs +8 -0
- package/dist/designTokens-BnzZfRES.js +116 -0
- package/dist/designTokens-C1WdzS3v.cjs +1 -0
- package/dist/effects.cjs +137 -32
- package/dist/effects.mjs +221 -104
- package/dist/formatters.cjs +1 -1
- package/dist/formatters.mjs +3 -3
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +61 -41
- package/dist/material.cjs +9 -1
- package/dist/material.mjs +236 -4
- package/dist/presets-BBLdqUE4.cjs +316 -0
- package/dist/presets-DYXLx_nN.js +4025 -0
- package/dist/{svg-BVcl24Cf.cjs → svg-dGtLYnIJ.cjs} +1 -1
- package/dist/{svg-CZThYPKf.js → svg-hZus3ztj.js} +2 -2
- package/dist/types/color.d.ts +1 -0
- package/dist/types/colorSeeds.d.ts +22 -0
- package/dist/types/colorSystem.d.ts +20 -0
- package/dist/types/designTokens.d.ts +24 -0
- package/dist/types/effects/index.d.ts +1 -1
- package/dist/types/effects/morph.d.ts +4 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/material.d.ts +1 -1
- package/dist/types/palette.d.ts +7 -0
- package/dist/types/scheme.d.ts +3 -0
- package/dist/types/tokens.d.ts +9 -1
- package/dist/types/types.d.ts +10 -0
- package/dist/types-BFr1fN-7.js +22 -0
- package/dist/types-BMLEvdee.cjs +1 -0
- package/dist/utils-BzSNCfat.js +76 -0
- package/dist/utils-D83DMCMa.cjs +1 -0
- package/package.json +9 -1
- package/dist/presets-55krt4L_.js +0 -354
- package/dist/presets-UIJJyagu.cjs +0 -1
- package/dist/tokens-DMGI7_df.cjs +0 -9
- package/dist/tokens-OfSofVKl.js +0 -204
- package/dist/utils-6iJ6IpZZ.cjs +0 -1
- package/dist/utils-B_VQDGMy.js +0 -67
package/README.md
CHANGED
|
@@ -41,6 +41,10 @@ const material = createGradientMaterial('#704aff', {
|
|
|
41
41
|
`createGradientMaterial` returns a richer object for components: CSS variables,
|
|
42
42
|
CSS text, optional keyframes, effects and the underlying gradient model.
|
|
43
43
|
|
|
44
|
+
Material output is memoized by seed and material options. Repeated calls with
|
|
45
|
+
the same input reuse the same pure result instead of recalculating palettes,
|
|
46
|
+
stops, shadows, morph blobs and keyframes.
|
|
47
|
+
|
|
44
48
|
## API Layers
|
|
45
49
|
|
|
46
50
|
The package is split into small subpath exports:
|
|
@@ -130,6 +134,21 @@ This lets a Vue, React or vanilla adapter decide how to apply the result:
|
|
|
130
134
|
inline styles, a generated stylesheet, CSS variables, SSR-injected CSS or a
|
|
131
135
|
client runtime registry.
|
|
132
136
|
|
|
137
|
+
The material cache is intentionally small and bounded. Use the cache helpers
|
|
138
|
+
when a long-running tool needs explicit control:
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import {
|
|
142
|
+
clearGradientMaterialCache,
|
|
143
|
+
getGradientMaterialCacheStats,
|
|
144
|
+
setGradientMaterialCacheLimit
|
|
145
|
+
} from '@gradient-ui/gradient-engine/material';
|
|
146
|
+
|
|
147
|
+
setGradientMaterialCacheLimit(256);
|
|
148
|
+
console.log(getGradientMaterialCacheStats());
|
|
149
|
+
clearGradientMaterialCache();
|
|
150
|
+
```
|
|
151
|
+
|
|
133
152
|
## SVG
|
|
134
153
|
|
|
135
154
|
```ts
|
|
@@ -200,8 +219,9 @@ morph SVG filters.
|
|
|
200
219
|
|
|
201
220
|
## Version
|
|
202
221
|
|
|
203
|
-
`0.5.0`
|
|
204
|
-
Gradient UI.
|
|
222
|
+
`0.5.0` was the first standalone release line for the engine extracted from
|
|
223
|
+
Gradient UI. `0.6.0` adds the public morph blend-mode API used by the
|
|
224
|
+
`0.5.0` core release line.
|
|
205
225
|
|
|
206
226
|
## License
|
|
207
227
|
|
package/dist/animation.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./utils-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./utils-D83DMCMa.cjs"),c=t=>`@keyframes ${t} {
|
|
2
2
|
0% {
|
|
3
3
|
background-position: 0% 50%;
|
|
4
4
|
}
|
package/dist/animation.mjs
CHANGED
package/dist/core.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./presets-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./presets-BBLdqUE4.cjs"),d=require("./css-BVHXLMRl.cjs"),i=require("./types-BMLEvdee.cjs"),a=(t,r={})=>d.toCssGradient(e.createGradientModel(t,r)),n=(t,r={})=>a(e.createPalette(t),r);exports.createGradientModel=e.createGradientModel;exports.createGradientModelFromColor=e.createGradientModelFromColor;exports.createRecipeStops=e.createRecipeStops;exports.defineGradientPreset=e.defineGradientPreset;exports.defineGradientPresetRegistry=e.defineGradientPresetRegistry;exports.getGradientPreset=e.getGradientPreset;exports.gradientPresets=e.gradientPresets;exports.gradientRecipes=e.gradientRecipes;exports.DEFAULT_GRADIENT_MORPH_BLEND_MODE=i.DEFAULT_GRADIENT_MORPH_BLEND_MODE;exports.GRADIENT_MORPH_BLEND_MODES=i.GRADIENT_MORPH_BLEND_MODES;exports.createGradient=a;exports.createGradientFromColor=n;
|
package/dist/core.mjs
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { c as
|
|
2
|
-
import { a as m,
|
|
3
|
-
import { t as s } from "./css-
|
|
4
|
-
|
|
1
|
+
import { c as t, d as a } from "./presets-DYXLx_nN.js";
|
|
2
|
+
import { a as m, f as p, g as D, h as f, i as E, j as P, k as R } from "./presets-DYXLx_nN.js";
|
|
3
|
+
import { t as s } from "./css-DVaTTIqS.js";
|
|
4
|
+
import { D as M, G as g } from "./types-BFr1fN-7.js";
|
|
5
|
+
const o = (e, r = {}) => s(t(e, r)), n = (e, r = {}) => o(a(e), r);
|
|
5
6
|
export {
|
|
7
|
+
M as DEFAULT_GRADIENT_MORPH_BLEND_MODE,
|
|
8
|
+
g as GRADIENT_MORPH_BLEND_MODES,
|
|
6
9
|
o as createGradient,
|
|
7
10
|
n as createGradientFromColor,
|
|
8
|
-
|
|
11
|
+
t as createGradientModel,
|
|
9
12
|
m as createGradientModelFromColor,
|
|
10
13
|
p as createRecipeStops,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
D as defineGradientPreset,
|
|
15
|
+
f as defineGradientPresetRegistry,
|
|
16
|
+
E as getGradientPreset,
|
|
14
17
|
P as gradientPresets,
|
|
15
|
-
|
|
18
|
+
R as gradientRecipes
|
|
16
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const i=require("./utils-
|
|
1
|
+
"use strict";const i=require("./utils-D83DMCMa.cjs"),a=(t,n=i.DEFAULT_GRADIENT_DIRECTION)=>`linear-gradient(${i.normalizeDirection(n)}, ${t.join(", ")})`,e=t=>{const n=t.stops.map(i.formatStop).join(", ");if(t.type==="radial"){const o=t.shape??"ellipse",s=t.size??i.DEFAULT_GRADIENT_SIZE,r=t.position??i.DEFAULT_GRADIENT_POSITION;return`radial-gradient(${o} ${s} at ${r}, ${n})`}if(t.type==="conic"){const o=i.normalizeDirection(t.direction),s=t.position??i.DEFAULT_GRADIENT_POSITION,r=i.getConicStops(t.stops).map(i.formatStop).join(", ");return`conic-gradient(from ${o} at ${s}, ${r})`}return a(t.stops.map(i.formatStop),t.direction)};exports.createLinearGradient=a;exports.toCssGradient=e;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as p, n as c, f as a, d as e, e as r,
|
|
1
|
+
import { D as p, n as c, f as a, d as e, e as r, h as D } from "./utils-BzSNCfat.js";
|
|
2
2
|
const $ = (t, i = p) => `linear-gradient(${c(i)}, ${t.join(", ")})`, I = (t) => {
|
|
3
3
|
const i = t.stops.map(a).join(", ");
|
|
4
4
|
if (t.type === "radial") {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./utils-D83DMCMa.cjs");const e=require("./designTokens-C1WdzS3v.cjs");require("./material.cjs");exports.DEFAULT_SEED=e.DEFAULT_SEED;exports.createDesignTokens=e.createDesignTokens;exports.normalizeDesignTokenSeed=e.normalizeDesignTokenSeed;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { p as f, r as u, g as h, c as F } from "./utils-BzSNCfat.js";
|
|
2
|
+
import { createGradient as c, createGradientFromColor as S } from "./core.mjs";
|
|
3
|
+
import { e as m, C as T, t as $, l as k, m as y } from "./presets-DYXLx_nN.js";
|
|
4
|
+
import { createGradientTokens as E } from "./material.mjs";
|
|
5
|
+
const p = {
|
|
6
|
+
red: "#F44336",
|
|
7
|
+
pink: "#E91E63",
|
|
8
|
+
purple: "#9C27B0",
|
|
9
|
+
deepPurple: "#673AB7",
|
|
10
|
+
indigo: "#3F51B5",
|
|
11
|
+
blue: "#2196F3",
|
|
12
|
+
lightBlue: "#03A9F4",
|
|
13
|
+
cyan: "#00BCD4",
|
|
14
|
+
teal: "#009688",
|
|
15
|
+
green: "#4CAF50",
|
|
16
|
+
lightGreen: "#8BC34A",
|
|
17
|
+
lime: "#CDDC39",
|
|
18
|
+
yellow: "#FFEB3B",
|
|
19
|
+
amber: "#FFC107",
|
|
20
|
+
orange: "#FF9800",
|
|
21
|
+
deepOrange: "#FF5722",
|
|
22
|
+
brown: "#795548",
|
|
23
|
+
grey: "#9E9E9E",
|
|
24
|
+
blueGrey: "#607D8B"
|
|
25
|
+
}, l = (e) => {
|
|
26
|
+
const n = f(e);
|
|
27
|
+
if (!n)
|
|
28
|
+
throw new Error(`Unsupported generated color: ${String(e)}`);
|
|
29
|
+
return u(n);
|
|
30
|
+
}, D = (e) => `${e.charAt(0).toUpperCase()}${e.slice(1)}`, i = (e) => `on${D(e)}`, O = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), w = (e) => e.replace(
|
|
31
|
+
/-([a-z0-9])/g,
|
|
32
|
+
(n, o) => o.toUpperCase()
|
|
33
|
+
), b = (e, n, o, r) => {
|
|
34
|
+
const { colors: t, onColors: a } = r;
|
|
35
|
+
for (const s of T) {
|
|
36
|
+
const C = t[s];
|
|
37
|
+
e[`${o}${s}`] = l(C), e[`${i(o)}${s}`] = l(a[s]), n[`${o}${s}`] = c(t, { shade: s });
|
|
38
|
+
}
|
|
39
|
+
e[o] = e[`${o}500`], e[i(o)] = e[`${i(o)}500`], n[o] = n[`${o}500`];
|
|
40
|
+
}, P = (e) => typeof e == "object" && e !== null && "color" in e, A = (e) => P(e) ? e : { color: e }, B = (e, n, o, r) => {
|
|
41
|
+
e[o] = l(r.color), e[i(o)] = l(
|
|
42
|
+
r.onColor ?? h(r.color)
|
|
43
|
+
), r.gradient !== !1 && (n[o] = r.gradient ?? S(r.color));
|
|
44
|
+
}, j = (e, n, o, r, t) => {
|
|
45
|
+
const a = w(O(r)), s = A(t);
|
|
46
|
+
if (s.palette === !1) {
|
|
47
|
+
B(e, n, a, s);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const C = m(s.color);
|
|
51
|
+
o[a] = C, b(e, n, a, C), s.onColor && (e[i(a)] = l(s.onColor)), s.gradient && (n[a] = s.gradient);
|
|
52
|
+
}, z = (e, n = {}) => {
|
|
53
|
+
const o = {}, r = {}, t = {
|
|
54
|
+
source: m(e)
|
|
55
|
+
};
|
|
56
|
+
for (const [a, s] of Object.entries(p))
|
|
57
|
+
t[a] = m(s);
|
|
58
|
+
for (const [a, s] of Object.entries(t))
|
|
59
|
+
b(o, r, a, s);
|
|
60
|
+
for (const [a, s] of Object.entries(n.colors ?? {}))
|
|
61
|
+
j(o, r, t, a, s);
|
|
62
|
+
return r.main = c(t.source.colors), r.error = c(t.red.colors, { shade: 600 }), r.warning = c(t.amber.colors, { shade: 600 }), r.success = c(t.green.colors, { shade: 600 }), {
|
|
63
|
+
colors: o,
|
|
64
|
+
gradients: r,
|
|
65
|
+
palettes: t
|
|
66
|
+
};
|
|
67
|
+
}, G = (e) => {
|
|
68
|
+
const n = f(e);
|
|
69
|
+
if (!n)
|
|
70
|
+
throw new Error(`Unsupported generated color: ${String(e)}`);
|
|
71
|
+
return u(n);
|
|
72
|
+
}, g = (e, n) => {
|
|
73
|
+
const o = $(k(e)).schemes[n].toJSON();
|
|
74
|
+
return Object.fromEntries(
|
|
75
|
+
Object.entries(o).map(([r, t]) => [
|
|
76
|
+
r,
|
|
77
|
+
G(y(t))
|
|
78
|
+
])
|
|
79
|
+
);
|
|
80
|
+
}, U = (e, n) => {
|
|
81
|
+
const o = g(e, n), r = g(p.amber, n), t = g(p.green, n);
|
|
82
|
+
return {
|
|
83
|
+
...o,
|
|
84
|
+
warning: r.primary,
|
|
85
|
+
onWarning: r.onPrimary,
|
|
86
|
+
warningContainer: r.primaryContainer,
|
|
87
|
+
onWarningContainer: r.onPrimaryContainer,
|
|
88
|
+
success: t.primary,
|
|
89
|
+
onSuccess: t.onPrimary,
|
|
90
|
+
successContainer: t.primaryContainer,
|
|
91
|
+
onSuccessContainer: t.onPrimaryContainer
|
|
92
|
+
};
|
|
93
|
+
}, d = "#4e51ff", x = (e = d) => F(e, d), R = (e = {}) => {
|
|
94
|
+
const n = e.mode ?? "light", o = x(e.seed), r = z(o, {
|
|
95
|
+
colors: e.colors
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
colorSystem: r,
|
|
99
|
+
gradientTokens: E(o, e.gradientTokens),
|
|
100
|
+
mode: n,
|
|
101
|
+
seed: o,
|
|
102
|
+
tokens: {
|
|
103
|
+
theme: U(o, n),
|
|
104
|
+
colors: r.colors,
|
|
105
|
+
gradients: r.gradients
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
export {
|
|
110
|
+
p as C,
|
|
111
|
+
d as D,
|
|
112
|
+
R as a,
|
|
113
|
+
U as b,
|
|
114
|
+
z as c,
|
|
115
|
+
x as n
|
|
116
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const l=require("./utils-D83DMCMa.cjs"),i=require("./core.cjs"),c=require("./presets-BBLdqUE4.cjs"),E=require("./material.cjs"),m={red:"#F44336",pink:"#E91E63",purple:"#9C27B0",deepPurple:"#673AB7",indigo:"#3F51B5",blue:"#2196F3",lightBlue:"#03A9F4",cyan:"#00BCD4",teal:"#009688",green:"#4CAF50",lightGreen:"#8BC34A",lime:"#CDDC39",yellow:"#FFEB3B",amber:"#FFC107",orange:"#FF9800",deepOrange:"#FF5722",brown:"#795548",grey:"#9E9E9E",blueGrey:"#607D8B"},g=e=>{const n=l.parseColor(e);if(!n)throw new Error(`Unsupported generated color: ${String(e)}`);return l.rgbToChannels(n)},F=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,C=e=>`on${F(e)}`,f=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),k=e=>e.replace(/-([a-z0-9])/g,(n,r)=>r.toUpperCase()),S=(e,n,r,o)=>{const{colors:t,onColors:a}=o;for(const s of c.COLOR_SHADES){const d=t[s];e[`${r}${s}`]=g(d),e[`${C(r)}${s}`]=g(a[s]),n[`${r}${s}`]=i.createGradient(t,{shade:s})}e[r]=e[`${r}500`],e[C(r)]=e[`${C(r)}500`],n[r]=n[`${r}500`]},D=e=>typeof e=="object"&&e!==null&&"color"in e,$=e=>D(e)?e:{color:e},y=(e,n,r,o)=>{e[r]=g(o.color),e[C(r)]=g(o.onColor??l.getContrastingColor(o.color)),o.gradient!==!1&&(n[r]=o.gradient??i.createGradientFromColor(o.color))},O=(e,n,r,o,t)=>{const a=k(f(o)),s=$(t);if(s.palette===!1){y(e,n,a,s);return}const d=c.createPalettePair(s.color);r[a]=d,S(e,n,a,d),s.onColor&&(e[C(a)]=g(s.onColor)),s.gradient&&(n[a]=s.gradient)},T=(e,n={})=>{const r={},o={},t={source:c.createPalettePair(e)};for(const[a,s]of Object.entries(m))t[a]=c.createPalettePair(s);for(const[a,s]of Object.entries(t))S(r,o,a,s);for(const[a,s]of Object.entries(n.colors??{}))O(r,o,t,a,s);return o.main=i.createGradient(t.source.colors),o.error=i.createGradient(t.red.colors,{shade:600}),o.warning=i.createGradient(t.amber.colors,{shade:600}),o.success=i.createGradient(t.green.colors,{shade:600}),{colors:r,gradients:o,palettes:t}},P=e=>{const n=l.parseColor(e);if(!n)throw new Error(`Unsupported generated color: ${String(e)}`);return l.rgbToChannels(n)},p=(e,n)=>{const r=c.themeFromSourceColor(c.argbFromHex(e)).schemes[n].toJSON();return Object.fromEntries(Object.entries(r).map(([o,t])=>[o,P(c.hexFromArgb(t))]))},b=(e,n)=>{const r=p(e,n),o=p(m.amber,n),t=p(m.green,n);return{...r,warning:o.primary,onWarning:o.onPrimary,warningContainer:o.primaryContainer,onWarningContainer:o.onPrimaryContainer,success:t.primary,onSuccess:t.onPrimary,successContainer:t.primaryContainer,onSuccessContainer:t.onPrimaryContainer}},u="#4e51ff",h=(e=u)=>l.colorToHex(e,u),w=(e={})=>{const n=e.mode??"light",r=h(e.seed),o=T(r,{colors:e.colors});return{colorSystem:o,gradientTokens:E.createGradientTokens(r,e.gradientTokens),mode:n,seed:r,tokens:{theme:b(r,n),colors:o.colors,gradients:o.gradients}}};exports.COLOR_SEEDS=m;exports.DEFAULT_SEED=u;exports.createColorSystem=T;exports.createDesignTokens=w;exports.createSemanticTokens=b;exports.normalizeDesignTokenSeed=h;
|
package/dist/effects.cjs
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./utils-
|
|
2
|
-
<feColorMatrix in="g-gradient-morph-blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ${
|
|
3
|
-
<feBlend in="SourceGraphic" in2="g-gradient-morph-goo" />`;return`<svg xmlns="${
|
|
4
|
-
<filter id="${
|
|
5
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="${
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./utils-D83DMCMa.cjs"),D=require("./css-BVHXLMRl.cjs"),S=require("./types-BMLEvdee.cjs"),_="http://www.w3.org/2000/svg",k="http://www.w3.org/1999/xhtml",O=r=>r.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">"),X={soft:{blobCount:5,blur:40,contrast:18,duration:12e3,opacity:.76,scale:1.05},liquid:{blobCount:6,blur:46,contrast:22,duration:9200,opacity:.82,scale:1.18},ripple:{blobCount:7,blur:34,contrast:20,duration:7200,opacity:.78,scale:.94}},Y=new Set(S.GRADIENT_MORPH_BLEND_MODES),G=r=>Y.has(r),N=r=>r&&G(r)?r:S.DEFAULT_GRADIENT_MORPH_BLEND_MODE,y=(r={})=>{const a=X[r.preset??"soft"];return{blobCount:Math.max(2,Math.round(r.blobCount??a.blobCount)),blendMode:N(r.blendMode),blobOpacity:c.clamp(r.blobOpacity??1,0,1.6),blur:c.clamp(r.blur??a.blur,0,80),contrast:c.clamp(r.contrast??a.contrast,0,36),duration:r.duration??a.duration,id:r.id??"g-gradient-morph",opacity:c.clamp(r.opacity??a.opacity),scale:c.clamp(r.scale??a.scale,.4,2)}},L=(r,a)=>{var t,i;return((t=r.stops[a%r.stops.length])==null?void 0:t.color)??((i=r.stops[0])==null?void 0:i.color)??"currentColor"},E=r=>{if(typeof r=="number")return r;const a=Number.parseFloat(r);return Number.isFinite(a)?a:9e3},A=(r,a)=>{const t=Math.sin((r+1)*12.9898+a*78.233)*43758.5453;return t-Math.floor(t)},l=(r,a,t,i)=>t+A(r,a)*(i-t),h=r=>Number(r.toFixed(3)),w=[{animationName:"g-gradient-morph-drift",dx:20,dx2:8,dy:-8,dy2:16,originX:"50%",originY:"50%",scaleMid:1.16,scaleTo:1.04,x:6,y:58},{animationName:"g-gradient-morph-orbit",dx:-18,dx2:10,dy:18,dy2:-10,originX:"24%",originY:"68%",scaleMid:.96,scaleTo:1.12,x:44,y:20},{animationName:"g-gradient-morph-float",dx:-16,dx2:-8,dy:-12,dy2:18,originX:"50%",originY:"50%",scaleMid:1.2,scaleTo:1.08,x:74,y:58},{animationName:"g-gradient-morph-orbit",dx:12,dx2:-20,dy:14,dy2:6,originX:"70%",originY:"30%",scaleMid:1.04,scaleTo:1.18,x:88,y:25},{animationName:"g-gradient-morph-drift",dx:24,dx2:-12,dy:-16,dy2:-8,originX:"50%",originY:"50%",scaleMid:1.12,scaleTo:.98,x:30,y:78},{animationName:"g-gradient-morph-float",dx:-22,dx2:14,dy:10,dy2:-18,originX:"50%",originY:"50%",scaleMid:.94,scaleTo:1.1,x:104,y:82},{animationName:"g-gradient-morph-orbit",dx:14,dx2:-16,dy:-22,dy2:10,originX:"35%",originY:"35%",scaleMid:1.18,scaleTo:1.02,x:55,y:64},{animationName:"g-gradient-morph-drift",dx:-18,dx2:18,dy:-14,dy2:14,originX:"50%",originY:"50%",scaleMid:1.08,scaleTo:.96,x:18,y:24}],v=(r,a={})=>{const{blobCount:t,blobOpacity:i,duration:g,scale:d}=y(a),e=E(g);return Array.from({length:t},(m,n)=>{const s=w[n%w.length],p=l(n,1,.88,1.16),o=l(n,2,.86,1.24),$=c.clamp(l(n,3,.72,1)*i),f=l(n,4,0,4),x=(34+n%4*9)*d*p;return{animationName:s.animationName,blur:h(f),color:L(r,n),delay:Math.round(n*-.19*e-l(n,5,0,900)),dx:h(s.dx*l(n,6,.84,1.18)),dx2:h(s.dx2*l(n,7,.82,1.22)),dy:h(s.dy*l(n,8,.84,1.18)),dy2:h(s.dy2*l(n,9,.82,1.22)),duration:Math.round(e*(1+n%3*.11)*o),opacity:h($),originX:s.originX,originY:s.originY,rotateMid:Math.round(l(n,10,95,165)),rotateTo:Math.round(l(n,11,220,310)),scaleMid:s.scaleMid,scaleTo:s.scaleTo,size:h(x),x:s.x,y:s.y}})},M=(r={})=>`url(#${y(r).id}) blur(${y(r).blur}px)`,B=(r={})=>{const{blur:a,contrast:t,id:i}=y(r),g=Math.max(2,Math.round(a*.25)),d=-(t*.45),e=t<=0?"":`
|
|
2
|
+
<feColorMatrix in="g-gradient-morph-blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ${t} ${d}" result="g-gradient-morph-goo" />
|
|
3
|
+
<feBlend in="SourceGraphic" in2="g-gradient-morph-goo" />`;return`<svg xmlns="${_}" width="0" height="0" aria-hidden="true" focusable="false" style="position:absolute;overflow:hidden;inline-size:0;block-size:0;">
|
|
4
|
+
<filter id="${i}" x="-30%" y="-30%" width="160%" height="160%" color-interpolation-filters="sRGB">
|
|
5
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="${g}" result="g-gradient-morph-blur" />${e}
|
|
6
6
|
</filter>
|
|
7
|
-
</svg>`},
|
|
7
|
+
</svg>`},P=(r,a={})=>{const t=a.selector??".g-gradient-morph",{blendMode:i,opacity:g}=y(a),d=v(r,a);return`${t} {
|
|
8
8
|
position: relative;
|
|
9
9
|
overflow: hidden;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
${
|
|
12
|
+
${t}__blobs {
|
|
13
13
|
position: absolute;
|
|
14
14
|
inset: -18%;
|
|
15
|
-
opacity: ${
|
|
16
|
-
filter: ${
|
|
17
|
-
mix-blend-mode:
|
|
15
|
+
opacity: ${g};
|
|
16
|
+
filter: ${M(a)};
|
|
17
|
+
mix-blend-mode: ${i};
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
${
|
|
20
|
+
${t}__blob {
|
|
21
21
|
position: absolute;
|
|
22
22
|
transform: translate(-50%, -50%);
|
|
23
23
|
transform-origin: var(--g-gradient-morph-origin-x) var(--g-gradient-morph-origin-y);
|
|
@@ -28,27 +28,28 @@ ${o}__blob {
|
|
|
28
28
|
animation: var(--g-gradient-morph-animation) var(--g-gradient-morph-duration, 9000ms) ease-in-out infinite alternate;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
${d.map((
|
|
32
|
-
top: ${
|
|
33
|
-
left: ${
|
|
34
|
-
width: ${
|
|
31
|
+
${d.map((e,m)=>`${t}__blob:nth-child(${m+1}) {
|
|
32
|
+
top: ${e.y}%;
|
|
33
|
+
left: ${e.x}%;
|
|
34
|
+
width: ${e.size}%;
|
|
35
35
|
aspect-ratio: 1;
|
|
36
|
-
--g-gradient-morph-blob-color: ${
|
|
37
|
-
--g-gradient-morph-x: ${
|
|
38
|
-
--g-gradient-morph-x2: ${
|
|
39
|
-
--g-gradient-morph-y: ${
|
|
40
|
-
--g-gradient-morph-y2: ${
|
|
41
|
-
--g-gradient-morph-origin-x: ${
|
|
42
|
-
--g-gradient-morph-origin-y: ${
|
|
43
|
-
--g-gradient-morph-animation: ${
|
|
44
|
-
--g-gradient-morph-blur: ${
|
|
45
|
-
--g-gradient-morph-opacity: ${
|
|
46
|
-
--g-gradient-morph-rotate-mid: ${
|
|
47
|
-
--g-gradient-morph-rotate-to: ${
|
|
48
|
-
--g-gradient-morph-scale-mid: ${
|
|
49
|
-
--g-gradient-morph-scale: ${
|
|
50
|
-
|
|
51
|
-
animation-
|
|
36
|
+
--g-gradient-morph-blob-color: ${e.color};
|
|
37
|
+
--g-gradient-morph-x: ${e.dx}%;
|
|
38
|
+
--g-gradient-morph-x2: ${e.dx2}%;
|
|
39
|
+
--g-gradient-morph-y: ${e.dy}%;
|
|
40
|
+
--g-gradient-morph-y2: ${e.dy2}%;
|
|
41
|
+
--g-gradient-morph-origin-x: ${e.originX};
|
|
42
|
+
--g-gradient-morph-origin-y: ${e.originY};
|
|
43
|
+
--g-gradient-morph-animation: ${e.animationName};
|
|
44
|
+
--g-gradient-morph-blur: ${e.blur}px;
|
|
45
|
+
--g-gradient-morph-opacity: ${e.opacity};
|
|
46
|
+
--g-gradient-morph-rotate-mid: ${e.rotateMid}deg;
|
|
47
|
+
--g-gradient-morph-rotate-to: ${e.rotateTo}deg;
|
|
48
|
+
--g-gradient-morph-scale-mid: ${e.scaleMid};
|
|
49
|
+
--g-gradient-morph-scale: ${e.scaleTo};
|
|
50
|
+
--g-gradient-morph-delay: ${e.delay}ms;
|
|
51
|
+
animation-delay: var(--g-gradient-morph-delay);
|
|
52
|
+
animation-duration: ${c.toCssDuration(e.duration)};
|
|
52
53
|
}`).join(`
|
|
53
54
|
|
|
54
55
|
`)}
|
|
@@ -93,4 +94,108 @@ ${d.map((a,s)=>`${o}__blob:nth-child(${s+1}) {
|
|
|
93
94
|
100% {
|
|
94
95
|
transform: translate(calc(-50% + var(--g-gradient-morph-x2)), calc(-50% + var(--g-gradient-morph-y2))) rotate(var(--g-gradient-morph-rotate-to)) scale(var(--g-gradient-morph-scale));
|
|
95
96
|
}
|
|
96
|
-
}`},
|
|
97
|
+
}`},z=(r,a={})=>{const t=a.id??"g-gradient-morph",i=a.width??360,g=a.height??240,d=a.rx??24,e=`${t}-filter`,m=M({...a,id:e}),n=v(r,a),{blendMode:s,opacity:p}=y(a);return`<svg xmlns="${_}" viewBox="0 0 ${i} ${g}" width="${i}" height="${g}" role="img">
|
|
98
|
+
<defs>
|
|
99
|
+
<clipPath id="${t}-clip">
|
|
100
|
+
<rect width="${i}" height="${g}" rx="${d}" />
|
|
101
|
+
</clipPath>
|
|
102
|
+
</defs>
|
|
103
|
+
<foreignObject width="${i}" height="${g}" clip-path="url(#${t}-clip)">
|
|
104
|
+
<div xmlns="${k}" class="g-gradient-material">
|
|
105
|
+
${B({...a,id:`${t}-filter`})}
|
|
106
|
+
<style>
|
|
107
|
+
.g-gradient-material {
|
|
108
|
+
position: relative;
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
display: flex;
|
|
111
|
+
width: ${i}px;
|
|
112
|
+
height: ${g}px;
|
|
113
|
+
border-radius: ${d}px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.g-gradient-material__surface {
|
|
117
|
+
position: relative;
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
display: flex;
|
|
120
|
+
width: 100%;
|
|
121
|
+
height: 100%;
|
|
122
|
+
border-radius: ${d}px;
|
|
123
|
+
background: ${O(D.toCssGradient(r))};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.g-gradient-material__morph {
|
|
127
|
+
--g-gradient-material-morph-bleed: 18%;
|
|
128
|
+
position: absolute;
|
|
129
|
+
z-index: 1;
|
|
130
|
+
inset: calc(-1 * var(--g-gradient-material-morph-bleed));
|
|
131
|
+
width: calc(100% + 2 * var(--g-gradient-material-morph-bleed));
|
|
132
|
+
height: calc(100% + 2 * var(--g-gradient-material-morph-bleed));
|
|
133
|
+
opacity: ${p};
|
|
134
|
+
filter: ${m};
|
|
135
|
+
mix-blend-mode: ${s};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.g-gradient-material__morph-blob {
|
|
139
|
+
position: absolute;
|
|
140
|
+
transform-origin: var(--g-gradient-morph-origin-x) var(--g-gradient-morph-origin-y);
|
|
141
|
+
transform: translate(-50%, -50%);
|
|
142
|
+
aspect-ratio: 1;
|
|
143
|
+
border-radius: 999px;
|
|
144
|
+
opacity: var(--g-gradient-morph-opacity);
|
|
145
|
+
background: radial-gradient(circle, var(--g-gradient-morph-blob-color) 0%, transparent 72%);
|
|
146
|
+
filter: blur(var(--g-gradient-morph-blur));
|
|
147
|
+
animation: var(--g-gradient-morph-animation) var(--g-gradient-morph-duration, 9000ms) ease-in-out infinite alternate;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
${n.map((o,$)=>`.g-gradient-material__morph-blob:nth-child(${$+1}) {
|
|
151
|
+
left: ${o.x}%;
|
|
152
|
+
top: ${o.y}%;
|
|
153
|
+
width: ${o.size}%;
|
|
154
|
+
--g-gradient-morph-blob-color: ${o.color};
|
|
155
|
+
--g-gradient-morph-x: ${o.dx}%;
|
|
156
|
+
--g-gradient-morph-x2: ${o.dx2}%;
|
|
157
|
+
--g-gradient-morph-y: ${o.dy}%;
|
|
158
|
+
--g-gradient-morph-y2: ${o.dy2}%;
|
|
159
|
+
--g-gradient-morph-origin-x: ${o.originX};
|
|
160
|
+
--g-gradient-morph-origin-y: ${o.originY};
|
|
161
|
+
--g-gradient-morph-animation: ${o.animationName};
|
|
162
|
+
--g-gradient-morph-blur: ${o.blur}px;
|
|
163
|
+
--g-gradient-morph-opacity: ${o.opacity};
|
|
164
|
+
--g-gradient-morph-rotate-mid: ${o.rotateMid}deg;
|
|
165
|
+
--g-gradient-morph-rotate-to: ${o.rotateTo}deg;
|
|
166
|
+
--g-gradient-morph-scale-mid: ${o.scaleMid};
|
|
167
|
+
--g-gradient-morph-scale: ${o.scaleTo};
|
|
168
|
+
--g-gradient-morph-delay: ${o.delay}ms;
|
|
169
|
+
animation-delay: var(--g-gradient-morph-delay);
|
|
170
|
+
animation-duration: ${c.toCssDuration(o.duration)};
|
|
171
|
+
}`).join(`
|
|
172
|
+
|
|
173
|
+
`)}
|
|
174
|
+
|
|
175
|
+
@keyframes g-gradient-morph-drift {
|
|
176
|
+
0% { transform: translate(-50%, -50%) scale(0.92); }
|
|
177
|
+
42% { transform: translate(calc(-50% + var(--g-gradient-morph-x)), calc(-50% + var(--g-gradient-morph-y))) scale(var(--g-gradient-morph-scale)); }
|
|
178
|
+
100% { transform: translate(calc(-50% + var(--g-gradient-morph-x2)), calc(-50% + var(--g-gradient-morph-y2))) scale(var(--g-gradient-morph-scale-mid)); }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
@keyframes g-gradient-morph-float {
|
|
182
|
+
0% { transform: translate(-50%, -50%) scale(1); }
|
|
183
|
+
50% { transform: translate(calc(-50% + var(--g-gradient-morph-x)), calc(-50% + var(--g-gradient-morph-y))) scale(var(--g-gradient-morph-scale-mid)); }
|
|
184
|
+
100% { transform: translate(calc(-50% + var(--g-gradient-morph-x2)), calc(-50% + var(--g-gradient-morph-y2))) scale(var(--g-gradient-morph-scale)); }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@keyframes g-gradient-morph-orbit {
|
|
188
|
+
0% { transform: translate(-50%, -50%) rotate(0deg) scale(0.96); }
|
|
189
|
+
50% { transform: translate(calc(-50% + var(--g-gradient-morph-x)), calc(-50% + var(--g-gradient-morph-y))) rotate(var(--g-gradient-morph-rotate-mid)) scale(var(--g-gradient-morph-scale-mid)); }
|
|
190
|
+
100% { transform: translate(calc(-50% + var(--g-gradient-morph-x2)), calc(-50% + var(--g-gradient-morph-y2))) rotate(var(--g-gradient-morph-rotate-to)) scale(var(--g-gradient-morph-scale)); }
|
|
191
|
+
}
|
|
192
|
+
</style>
|
|
193
|
+
<span class="g-gradient-material__surface">
|
|
194
|
+
<span class="g-gradient-material__morph">
|
|
195
|
+
${n.map(()=>'<span class="g-gradient-material__morph-blob"></span>').join(`
|
|
196
|
+
`)}
|
|
197
|
+
</span>
|
|
198
|
+
</span>
|
|
199
|
+
</div>
|
|
200
|
+
</foreignObject>
|
|
201
|
+
</svg>`},T=(r,a)=>{const t=r.stops.filter(d=>d.position>=25&&d.position<=85),i=r.stops.filter(d=>!t.includes(d));return[...t,...i].sort((d,e)=>Math.abs(d.position-50)-Math.abs(e.position-50)).slice(0,a)},F=(r,a)=>r*([1,.54,.3,.18][a]??.12),u=(r,a)=>{const t=String(r).match(/^(-?\d*\.?\d+)(.*)$/);return t?`${Math.round(Number(t[1])*a*1e3)/1e3}${t[2]||"px"}`:null},C=(r,a,t)=>u(r,1/a)??(t===0?c.toCssLength(r):"0px"),j=(r,a)=>u(r,1/Math.sqrt(a))??c.toCssLength(r),q=(r,a={})=>{var b;const t=a.x??0,i=a.y??6,g=a.blur??14,d=a.spread??-3,e=a.opacity??.24,m=Math.max(1,Math.round(a.layers??2)),n=((b=T(r,1)[0])==null?void 0:b.color)??"#000000",s=`${c.toCssLength(t)} ${c.toCssLength(i)} ${c.toCssLength(g)} ${c.toCssLength(d)} ${c.toCssColor(n,e)}`;if(m===1)return s;const p=u(t,.35)??"0px",o=u(i,.35)??"2px",$=u(g,.3)??"4px",f=u(d,.5)??"-2px",x=Math.min(.18,e*.65);return`${`${p} ${o} ${$} ${f} ${c.toCssColor("#000000",x)}`}, ${s}`},R=(r,a={})=>{const t=a.x??0,i=a.y??6,g=a.blur??14,d=a.opacity??.42,e=Math.max(1,Math.round(a.layers??2)),m=j(g,e);return T(r,e).map((n,s)=>{const p=C(t,e,s),o=C(i,e,s);return`drop-shadow(${p} ${o} ${m} ${c.toCssColor(n.color,F(d,s))})`}).join(" ")};exports.createGradientMorphBlobs=v;exports.isGradientMorphBlendMode=G;exports.resolveGradientMorphBlendMode=N;exports.toGradientBoxShadow=q;exports.toGradientDropShadow=R;exports.toGradientMorphCSS=P;exports.toGradientMorphFilter=M;exports.toGradientMorphFilterMarkup=B;exports.toGradientMorphMarkup=z;
|