@dooph-software/fluid-gradients 1.0.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/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dooph LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,200 @@
1
+ # @dooph-software/fluid-gradients
2
+
3
+ <p align="center">
4
+ <img src="./fluid-gradients-cover-art.png" width="400" alt="fluid-gradients-cover-art">
5
+ </p>
6
+
7
+ Deterministic, seeded fluid-gradient images plus a curated set of <!-- docs:begin:palette-count -->71<!-- docs:end:palette-count --> color palettes. The same seed, palette, size and look always render the same image.
8
+
9
+ ```bash
10
+ npm install @dooph-software/fluid-gradients
11
+ ```
12
+
13
+ generate on demand
14
+
15
+ ```bash
16
+ npm run gradient -- --palette jewel-peacock --seed gradient --width 700 --height 500
17
+ ```
18
+
19
+ ### Agent skills
20
+
21
+ To help your coding agent use this package correctly (what to store per image, server vs. client imports, how size affects the composition), copy the bundled skills into your project:
22
+
23
+ ```bash
24
+ npx fluid-gradients-init-skills
25
+ ```
26
+
27
+ It asks which agent directories to install to (`.agents/`, `.claude/`, `.agent/`) and changes nothing else.
28
+
29
+ ## Featured Examples
30
+
31
+ <!-- docs:begin:featured -->
32
+ <table>
33
+ <tr>
34
+ <td align="center"><img src="./examples/featured/purple-rain-kanye.webp" width="240" alt="purple-rain"><br><code>purple-rain</code> · seed <code>kanye</code><br><sub>dreamscape</sub></td>
35
+ <td align="center"><img src="./examples/featured/onyx-gold-the-weeknd.webp" width="240" alt="onyx-gold"><br><code>onyx-gold</code> · seed <code>the-weeknd</code><br><sub>gravity</sub></td>
36
+ <td align="center"><img src="./examples/featured/cobalt-ice-aspect.webp" width="240" alt="cobalt-ice"><br><code>cobalt-ice</code> · seed <code>aspect</code><br><sub>cirrus</sub></td>
37
+ <td align="center"><img src="./examples/featured/burgundy-velvet-burgundy-velvet.webp" width="240" alt="burgundy-velvet"><br><code>burgundy-velvet</code> · seed <code>burgundy-velvet</code><br><sub>silk</sub></td>
38
+ </tr>
39
+ </table>
40
+ <!-- docs:end:featured -->
41
+
42
+ ## Palettes
43
+
44
+ See every palette in the [examples gallery](./examples/README.md). Regenerate it with `npm run examples`.
45
+
46
+ Import from `/palettes` when you only need colors, for example in a browser or edge bundle. That entry has no dependencies.
47
+
48
+ ```ts
49
+ import {
50
+ colorPalettes,
51
+ findPalette,
52
+ pickPalette,
53
+ paletteAccent,
54
+ paletteComplement,
55
+ complementColor,
56
+ } from "@dooph-software/fluid-gradients/palettes";
57
+
58
+ findPalette("mint-sea"); // { name: 'mint-sea', colors: [...] }. Throws on unknown names
59
+ pickPalette("autocad-0.3.0"); // deterministic pick from any seed string
60
+ paletteAccent(findPalette("jewel-peacock")); // '#1f7a99'. The ramp's mid-tone, for UI accents
61
+ paletteComplement(findPalette("jewel-peacock")); // '#fc6d00'. Opposite hue, vivid, for chips
62
+ complementColor("#2f4fd8"); // '#eab500'. Same, for any hex
63
+ ```
64
+
65
+ `PaletteName` is a union of the built-in names, so you get autocomplete in editors.
66
+
67
+ The **complement** is built to stand out on the palette's images, for chips and geometry. Its hue is exactly opposite the accent's (180° in OKLCH, a perceptual color space); if the accent is near-gray, the hue is taken from the whole ramp's tint instead. It uses the most saturated color that hue can have within a readable lightness range, so muted palettes still get a vivid complement: `battleship-steel`'s is pink. Palettes with no hue at all (`onyx-snow`) get a gray at the opposite lightness. Render results include both `accent` and `complement`.
68
+
69
+ A palette has a unique `name` and **3–5** `#rrggbb` colors, ordered light to dark. The `Palette` type enforces the count and the `#`, so an inline palette with 2 or 6 colors fails typechecking. The factory (see "Custom palettes" below) and the render functions also call `validatePalette` at runtime, which catches palettes built from JSON, casts or CLI input.
70
+
71
+ `pickPalette` uses rendezvous hashing. Each palette gets a score from `seed + name`, and the highest score wins. As a result:
72
+
73
+ - List order doesn't affect the result.
74
+ - Adding a palette only moves the seeds it wins, about 1 in N.
75
+ - Removing a palette only moves the seeds that had picked it.
76
+ - Renaming a palette counts as removing it and adding a new one.
77
+
78
+ ## Custom palettes
79
+
80
+ To use your own palettes, create a generator bound to your set. Put it in a module in your project and export it:
81
+
82
+ ```ts
83
+ // lib/gradients.ts
84
+ import {
85
+ colorPalettes,
86
+ createMeshGradients,
87
+ } from "@dooph-software/fluid-gradients";
88
+
89
+ export const gradients = createMeshGradients({
90
+ palettes: [
91
+ ...colorPalettes,
92
+ { name: "brand", colors: ["#f4f4f5", "#8fa579", "#1f2c44"] },
93
+ ],
94
+ width: 1920, // optional default output size for this generator (1200 × 1500 if omitted)
95
+ height: 1080,
96
+ });
97
+
98
+ // elsewhere
99
+ await gradients.generate({ seed: "hero", palette: "brand" }); // 1920 × 1080, names typed from your set
100
+ await gradients.generate({ seed: "og", width: 1200, height: 630 }); // per-call size wins
101
+ gradients.pickPalette("hero"); // picks only from your set
102
+ ```
103
+
104
+ `createMeshGradients` validates the whole set as soon as it's called: color counts, hex format, unique names and the default size. A bad palette fails when the module loads, not on the first render. The top-level `generateMeshGradient` and `renderMeshGradient` functions are this same generator with the built-in palettes.
105
+
106
+ For a one-off, you can also pass a palette object directly: `generateMeshGradient({ seed, palette: { name: 'x', colors: [...] } })`.
107
+
108
+ ## Rendering images (Node)
109
+
110
+ Rendering runs in Node and uses `@napi-rs/canvas` (compositing, PNG) and `sharp` (WebP), which install automatically as prebuilt native binaries.
111
+
112
+ ```ts
113
+ import { writeFileSync } from "node:fs";
114
+ import { generateMeshGradient } from "@dooph-software/fluid-gradients";
115
+
116
+ const { buffer, palette, accent } = await generateMeshGradient({
117
+ seed: "autocad-0.3.0",
118
+ palette: "jewel-peacock", // optional. Omit to pick from the seed
119
+ width: 1200, // default 1200
120
+ height: 1500, // default 1500
121
+ format: "webp", // 'webp' (default, quality 82) | 'png'
122
+ });
123
+ writeFileSync("gradient.webp", buffer);
124
+ ```
125
+
126
+ Use `renderMeshGradient(options)` to get the raw `@napi-rs/canvas` canvas if you want to draw on top of it before encoding.
127
+
128
+ `look` overrides the rendering knobs. The defaults are exported as `defaultLook`:
129
+
130
+ <!-- docs:begin:look-knobs -->
131
+
132
+ | Knob | Default | Effect |
133
+ | ------------------------- | ------- | ------------------------------------------------ |
134
+ | `baseNoiseFrequency` | `0.3` | Lower values give broader, softer color regions. |
135
+ | `domainWarpStrength` | `1` | How much the color field swirls. |
136
+ | `fractalOctaveCount` | `2` | More octaves add finer detail. |
137
+ | `colorTransitionContrast` | `1.75` | Sharpness of the edges between colors. |
138
+ | `grainOpacity` | `0.09` | Strength of the film-grain overlay. |
139
+
140
+ <!-- docs:end:look-knobs -->
141
+
142
+ ## CLI
143
+
144
+ Every flag is optional. With none, it writes one WebP to `output/` with a random seed and the palette that seed picks. Both are printed with the result, so passing them back reproduces the image exactly.
145
+
146
+ ```bash
147
+ npm run gradient # in this repo (builds first, then runs the CLI)
148
+ npx fluid-gradient # anywhere the package is installed
149
+ npm run gradient -- --seed hero --palette purple-rain --width 1920 --height 1080
150
+ npx fluid-gradient --seed autocad-0.3.0 --out assets/0.3.0.webp
151
+ npx fluid-gradient --list-palettes
152
+ ```
153
+
154
+ <!-- docs:begin:cli-help -->
155
+
156
+ ```text
157
+ Usage: fluid-gradient [options]
158
+
159
+ Every flag is optional. With none, writes one WebP with a random seed and a
160
+ palette picked from that seed.
161
+
162
+ Options:
163
+ --seed <string> Seed string. Same seed → same image. Default: random.
164
+ --palette <name> Built-in palette name. Default: a deterministic pick from the seed.
165
+ --width <px> Output width. Default 1200.
166
+ --height <px> Output height. Default 1500.
167
+ --quality <1-100> WebP quality. Default 82.
168
+ --base-noise-frequency <n> Lower values give broader, softer color regions. Default 0.3.
169
+ --domain-warp-strength <n> How much the color field swirls. Default 1.
170
+ --fractal-octave-count <n> More octaves add finer detail. Default 2.
171
+ --color-transition-contrast <n> Sharpness of the edges between colors. Default 1.75.
172
+ --grain-opacity <0-1> Strength of the film-grain overlay. Default 0.09.
173
+
174
+ Output & info:
175
+ --out <path> Output file, .webp or .png. Default: output/<palette>-<seed>.webp
176
+ --json Print result metadata as JSON.
177
+ --list-palettes Print built-in palette names and exit.
178
+ --help Show this help (-h).
179
+ ```
180
+
181
+ <!-- docs:end:cli-help -->
182
+
183
+ Flags are defined once in [src/flags.ts](src/flags.ts) and the CLI builds its parser, help text and options from that table. The table is typed as "one entry per render option", so adding an option to the API fails the typecheck until it has a flag — the CLI and the TS API can't drift. `--out`, `--json`, `--list-palettes` and `--help` are CLI-only, since they're file output and terminal display.
184
+
185
+ ## Development
186
+
187
+ ```bash
188
+ npm install
189
+ npm test # builds, then runs node:test
190
+ npm run lint # tsc --noEmit
191
+ ```
192
+
193
+ Docs that describe the code are generated from it:
194
+
195
+ - `npm run docs` fills the marked sections of this README (palette count, the look-knob table, the CLI help) from the built package. Prose outside the markers is never touched.
196
+ - `npm test` runs `sync-docs --check`, which fails if those sections are stale, and typechecks every ```ts block in this README against `src/`, so a sample that no longer matches the API fails the build.
197
+
198
+ One test renders seed `aspect` with `jewel-peacock` and checks the result byte-for-byte against `test/fixtures/jewel-peacock-aspect.webp`, which is Aspect's shipped 0.3.0 artwork. If that test fails after you upgrade `sharp`, check whether the pixels differ or only the encoded bytes do.
199
+
200
+ Releases work like the design system: run `npm run prep-release:<patch|minor|major>`, then publish a GitHub release. That triggers `.github/workflows/release-package.yml`.
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bin/init-skills.mjs — copy the bundled agent skills into a consuming project.
4
+ * npm bin: fluid-gradients-init-skills
5
+ *
6
+ * From a project that has installed the package:
7
+ * npx fluid-gradients-init-skills
8
+ *
9
+ * Mirrors @dooph-software/design-system's init-skills. The bin name is prefixed
10
+ * because both packages would otherwise claim node_modules/.bin/init-skills in a
11
+ * project that installs both, and only one would win.
12
+ *
13
+ * Copies skills/ into the agent directories the user picks. Modifies nothing else.
14
+ */
15
+
16
+ import { existsSync, mkdirSync, readdirSync } from 'node:fs';
17
+ import { cp } from 'node:fs/promises';
18
+ import { dirname, resolve } from 'node:path';
19
+ import { createInterface } from 'node:readline';
20
+ import { fileURLToPath } from 'node:url';
21
+
22
+ const PKG_SKILLS = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'skills');
23
+ const CWD = process.cwd();
24
+
25
+ const NO_COLOR = !process.stdout.isTTY || process.env.NO_COLOR;
26
+ const paint = (code) => (s) => (NO_COLOR ? s : `\x1b[${code}m${s}\x1b[0m`);
27
+ const bold = paint(1);
28
+ const dim = paint(2);
29
+ const green = paint(32);
30
+ const cyan = paint(36);
31
+ const yellow = paint(33);
32
+
33
+ /** Where each agent framework looks for skills inside a project. Append to support another. */
34
+ const TARGETS = [
35
+ { dir: '.agents/skills', label: '.agents/ — Cursor Agent Skills' },
36
+ { dir: '.claude/skills', label: '.claude/ — Claude Code' },
37
+ { dir: '.agent/skills', label: '.agent/ — other agent frameworks' },
38
+ ];
39
+
40
+ // Read answers through the async iterator rather than rl.question(): it buffers
41
+ // lines, so piped answers (`printf 'y\nn\n' | npx ...`) aren't dropped when they
42
+ // arrive before the prompt. End of input counts as Enter, i.e. the default yes.
43
+ const rl = createInterface({ input: process.stdin });
44
+ const lines = rl[Symbol.asyncIterator]();
45
+ const ask = async (question) => {
46
+ process.stdout.write(question);
47
+ const { value, done } = await lines.next();
48
+ if (!process.stdin.isTTY) process.stdout.write('\n');
49
+ return done ? '' : value.trim();
50
+ };
51
+
52
+ async function main() {
53
+ console.log(`\n${bold('@dooph-software/fluid-gradients')}${dim(' · init-skills')}\n`);
54
+
55
+ if (!existsSync(PKG_SKILLS)) {
56
+ console.error(' ✗ skills/ not found in the installed package. Try reinstalling it.');
57
+ process.exit(1);
58
+ }
59
+
60
+ const skills = readdirSync(PKG_SKILLS);
61
+ console.log(` ${skills.length} skill(s): ${dim(skills.join(', '))}\n`);
62
+ console.log(` Install to which directories? ${dim('Enter or y to install, n to skip.')}\n`);
63
+
64
+ const selected = [];
65
+ for (const target of TARGETS) {
66
+ const note = existsSync(resolve(CWD, target.dir)) ? yellow(' (exists — will merge)') : '';
67
+ const answer = await ask(` ${target.label}${note}\n ${dim('[Y/n]:')} `);
68
+ if (answer.toLowerCase() !== 'n') selected.push(target);
69
+ }
70
+
71
+ if (selected.length === 0) {
72
+ console.log(dim('\n Nothing selected. No files changed.\n'));
73
+ return;
74
+ }
75
+
76
+ console.log();
77
+ for (const target of selected) {
78
+ const dest = resolve(CWD, target.dir);
79
+ mkdirSync(dest, { recursive: true });
80
+ await cp(PKG_SKILLS, dest, { recursive: true, force: true });
81
+ console.log(` ${green('✓')} ${cyan(target.dir)}`);
82
+ }
83
+ console.log();
84
+ }
85
+
86
+ main()
87
+ .catch((err) => {
88
+ console.error(`\n ✗ ${err.message ?? err}`);
89
+ process.exitCode = 1;
90
+ })
91
+ .finally(() => rl.close());
@@ -0,0 +1,260 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/color.ts
2
+ var ACHROMATIC_CHROMA = 0.01;
3
+ var HUE_TRUST_CHROMA = 0.03;
4
+ var VIVID_L_MIN = 50;
5
+ var VIVID_L_MAX = 80;
6
+ var VIVID_MAX_CHROMA = 0.2;
7
+ var CHROMA_SEARCH_MAX = 0.4;
8
+ var GAMUT_STEPS = 24;
9
+ var toLinear = (c) => c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
10
+ var toGamma = (c) => c <= 31308e-7 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
11
+ function hexToRgb(hex) {
12
+ return [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16) / 255);
13
+ }
14
+ function rgbToHex(rgb) {
15
+ return "#" + rgb.map((c) => Math.round(Math.min(1, Math.max(0, c)) * 255).toString(16).padStart(2, "0")).join("");
16
+ }
17
+ function hexToOklab(hex) {
18
+ const [r, g, b] = hexToRgb(hex).map(toLinear);
19
+ const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
20
+ const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
21
+ const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
22
+ return [
23
+ 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
24
+ 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
25
+ 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s
26
+ ];
27
+ }
28
+ function oklabToSrgb([L, a, b]) {
29
+ const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;
30
+ const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;
31
+ const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;
32
+ return [
33
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
34
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
35
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
36
+ ].map(toGamma);
37
+ }
38
+ var inGamut = (rgb) => rgb.every((c) => c >= 0 && c <= 1);
39
+ var atLch = (L, C, hue) => oklabToSrgb([L, C * Math.cos(hue), C * Math.sin(hue)]);
40
+ function maxChroma(L, hue) {
41
+ let low = 0;
42
+ let high = CHROMA_SEARCH_MAX;
43
+ for (let step = 0; step < GAMUT_STEPS; step++) {
44
+ const mid = (low + high) / 2;
45
+ if (inGamut(atLch(L, mid, hue))) low = mid;
46
+ else high = mid;
47
+ }
48
+ return low;
49
+ }
50
+ function vividOpposite(a, b) {
51
+ const hue = Math.atan2(b, a) + Math.PI;
52
+ let bestL = VIVID_L_MIN / 100;
53
+ let bestC = -1;
54
+ for (let l = VIVID_L_MIN; l <= VIVID_L_MAX; l++) {
55
+ const chroma = maxChroma(l / 100, hue);
56
+ if (chroma > bestC) {
57
+ bestC = chroma;
58
+ bestL = l / 100;
59
+ }
60
+ }
61
+ return rgbToHex(atLch(bestL, Math.min(bestC, VIVID_MAX_CHROMA), hue));
62
+ }
63
+ function oppositeGray(L) {
64
+ return rgbToHex(atLch(L > 0.5 ? 0.25 : 0.85, 0, 0));
65
+ }
66
+ function complementColor(hex) {
67
+ const [L, a, b] = hexToOklab(hex);
68
+ return Math.hypot(a, b) < ACHROMATIC_CHROMA ? oppositeGray(L) : vividOpposite(a, b);
69
+ }
70
+ function paletteComplementColor(accent, ramp) {
71
+ const [L, a, b] = hexToOklab(accent);
72
+ if (Math.hypot(a, b) >= HUE_TRUST_CHROMA) return vividOpposite(a, b);
73
+ let sumA = 0;
74
+ let sumB = 0;
75
+ for (const color of ramp) {
76
+ const [, ca, cb] = hexToOklab(color);
77
+ sumA += ca;
78
+ sumB += cb;
79
+ }
80
+ const meanA = sumA / ramp.length;
81
+ const meanB = sumB / ramp.length;
82
+ return Math.hypot(meanA, meanB) < ACHROMATIC_CHROMA / 2 ? oppositeGray(L) : vividOpposite(meanA, meanB);
83
+ }
84
+
85
+ // src/random.ts
86
+ function hashStringToInt(seed) {
87
+ let hash = 2166136261 >>> 0;
88
+ for (let i = 0; i < seed.length; i++) {
89
+ hash ^= seed.charCodeAt(i);
90
+ hash = Math.imul(hash, 16777619);
91
+ }
92
+ return hash >>> 0;
93
+ }
94
+ function createSeededRandom(seedInt) {
95
+ let state = seedInt;
96
+ return function nextRandom() {
97
+ state |= 0;
98
+ state = state + 1831565813 | 0;
99
+ let mixed = Math.imul(state ^ state >>> 15, 1 | state);
100
+ mixed = mixed + Math.imul(mixed ^ mixed >>> 7, 61 | mixed) ^ mixed;
101
+ return ((mixed ^ mixed >>> 14) >>> 0) / 4294967296;
102
+ };
103
+ }
104
+
105
+ // src/palettes.ts
106
+ var MIN_PALETTE_COLORS = 3;
107
+ var MAX_PALETTE_COLORS = 5;
108
+ var colorPalettes = [
109
+ // ── Warm: amber / cream / clay / terracotta (analogous) ──
110
+ { name: "amber-latte", colors: ["#faf4ea", "#f2d29b", "#e0a45c", "#b9722f"] },
111
+ { name: "terracotta-sand", colors: ["#f6ede1", "#e8c9a0", "#cf8f63", "#9c4e33"] },
112
+ { name: "peach-blush", colors: ["#fdf1ec", "#f8cbb6", "#ef9a8a", "#d76e73"] },
113
+ { name: "coral-cream", colors: ["#fbe9df", "#f5b79a", "#e8735a", "#c33f36"] },
114
+ { name: "honey-espresso", colors: ["#f7ecd9", "#e5b877", "#b9793f", "#5f3418"] },
115
+ { name: "apricot-plum", colors: ["#fdf0e6", "#f6c79a", "#e58b6f", "#7d4a6b"] },
116
+ { name: "golden-hour", colors: ["#fdf3e1", "#f7cf8a", "#e89a5a", "#9a4a3a"] },
117
+ { name: "vermilion-blush", colors: ["#fbe8e2", "#f7c6a8", "#e4562f", "#a82a1c"] },
118
+ { name: "ivory-gilt", colors: ["#fffdf7", "#f7ecd0", "#e0c47e", "#b08c3a"] },
119
+ { name: "rose-gold", colors: ["#fceee8", "#f2cdbd", "#dba18c", "#b3705c"] },
120
+ { name: "peony-glow", colors: ["#fdeef3", "#f9b3c8", "#f78a5c", "#f2a93f"] },
121
+ // ── Pink / violet / mauve ──
122
+ { name: "lavender-rose", colors: ["#f4eefb", "#d9c2ef", "#c98fb8", "#8a5fd0"] },
123
+ { name: "violet-mist", colors: ["#f1eefb", "#c9b8ef", "#8f7fe0", "#4a3d9c"] },
124
+ { name: "mauve-plum", colors: ["#f6f0f2", "#d8b8c6", "#a5738c", "#5f3a55"] },
125
+ { name: "periwinkle-blush", colors: ["#f0f0fb", "#c3c6f0", "#cf9fc6", "#6a5fd0"] },
126
+ { name: "orchid-frost", colors: ["#f6eff6", "#e0c2e0", "#b98fc4", "#7a5aa6", "#3f2f5c"] },
127
+ { name: "quartz-rose", colors: ["#faf1f1", "#ecc9cc", "#c99aa3", "#8a5f6a"] },
128
+ { name: "wisteria-sky", colors: ["#f2f0fb", "#cfc6ef", "#9fb2e6", "#4f6aa6"] },
129
+ { name: "zephyr-dawn", colors: ["#fdf3f5", "#f2d6e2", "#c6d6f2", "#7f9fd8"] },
130
+ { name: "candy-sky", colors: ["#f6e8ff", "#f7a3e8", "#9aa8f5", "#3fa0f5"] },
131
+ // ── Cool: blue / slate / sky (analogous) ──
132
+ { name: "sky-slate", colors: ["#eef4fb", "#bcd2ef", "#6f8fc4", "#2f3f66"] },
133
+ { name: "teal-fog", colors: ["#eef7f6", "#b6dcd8", "#5fa39c", "#234a49"] },
134
+ { name: "arctic-ink", colors: ["#f2f6f8", "#cddbe2", "#7f96a3", "#1c2630"] },
135
+ { name: "cloud-navy", colors: ["#f0f3f7", "#c6d1de", "#7488a3", "#1f2c44"] },
136
+ { name: "denim-clay", colors: ["#eef2f6", "#aebfd0", "#5f7794", "#b06a4e"] },
137
+ { name: "cobalt-ice", colors: ["#e8eeff", "#b9cdfb", "#2f4fd8", "#1836b8"] },
138
+ // ── Green: sage / moss / mint / olive (analogous) ──
139
+ { name: "sage-mist", colors: ["#f2f5ee", "#cdd8bd", "#8fa579", "#4a5c3a"] },
140
+ { name: "mint-sea", colors: ["#eef8f4", "#b6e2d2", "#5fb39c", "#1f5c4d"] },
141
+ { name: "olive-cream", colors: ["#f6f3e6", "#dbd09b", "#a39a5c", "#5f5a2f"] },
142
+ { name: "eucalyptus-fog", colors: ["#eff4f1", "#cbdcd2", "#94b3a6", "#4f6b60"] },
143
+ { name: "kelp-forest", colors: ["#eef3ea", "#a9c49a", "#4f7a5a", "#1f3a2f"] },
144
+ { name: "yuzu-mint", colors: ["#fbfbe6", "#eef29a", "#b3d98a", "#3f8f7a"] },
145
+ { name: "lime-lagoon", colors: ["#f8ffe8", "#c8f56a", "#6fe3d8", "#2fc6d8"] },
146
+ { name: "bliss-meadow", colors: ["#f4fbff", "#8ed0f2", "#6cb03a", "#2d6b22"] },
147
+ // ── Analogous + a single contrasting splash ──
148
+ { name: "periwinkle-gold", colors: ["#dfe6ff", "#a9b6f0", "#5b6bd6", "#e6c25a"] },
149
+ { name: "lilac-lemon", colors: ["#f3eefb", "#d3c2ef", "#9f8fd0", "#e6d25a"] },
150
+ { name: "blush-teal", colors: ["#fbeee9", "#f2c2b0", "#d78a8f", "#3f9c94"] },
151
+ { name: "sage-coral", colors: ["#f2f5ee", "#cdd8bd", "#8fa579", "#e0755a"] },
152
+ { name: "slate-amber", colors: ["#eef2f6", "#bcc9d8", "#5f7794", "#e0a24e"] },
153
+ { name: "ultramarine-sand", colors: ["#dfe8ff", "#e6c27a", "#4757dd", "#232a9c"] },
154
+ { name: "amber-tide", colors: ["#eef4f8", "#a9c8ef", "#f2b96b", "#df8a33"] },
155
+ // ── Colorful / multi-hue (rich & saturated, jewel tones) ──
156
+ { name: "sunset-rose", colors: ["#fce9d6", "#f6a95c", "#e8617a", "#8a3d7a"] },
157
+ { name: "berry-bloom", colors: ["#fbe9f2", "#e88fb8", "#c94f8f", "#7a2f6a"] },
158
+ { name: "jewel-peacock", colors: ["#e6f5f0", "#4fb3a6", "#1f7a99", "#243f8a"] },
159
+ { name: "iris-meadow", colors: ["#eaf5ec", "#7cc48f", "#3f8fb3", "#5f4fb0"] },
160
+ { name: "autumn-spice", colors: ["#f7ecd6", "#dba24f", "#b5522f", "#6e2f4a"] },
161
+ { name: "ultraviolet-sea", colors: ["#e9f0fb", "#6f9fe0", "#4a5fc4", "#6a3da6"] },
162
+ { name: "purple-rain", colors: ["#f1ebf7", "#b69ad6", "#6f3fa8", "#2a1740"] },
163
+ { name: "nectarine-fizz", colors: ["#fff1e6", "#ffc59a", "#ff8a5c", "#d9485f"] },
164
+ { name: "raspberry-cream", colors: ["#fdeef1", "#f4a9bd", "#d9537a", "#8a1f45"] },
165
+ { name: "pastel-confetti", colors: ["#ffffff", "#f9f3cf", "#cbbcf2", "#e8798f"] },
166
+ { name: "burgundy-velvet", colors: ["#f2dfe0", "#c98a91", "#8a2740", "#4a0f22"] },
167
+ { name: "indigo-beam", colors: ["#ffffff", "#a9b6f7", "#4a3fe0", "#2a1fb0"] },
168
+ { name: "crimson-ice", colors: ["#f2f7fc", "#f8d7e0", "#e0517f", "#a81050"] },
169
+ // ── Muted / dusty / earthy ──
170
+ { name: "fog-plum", colors: ["#f2f0f3", "#cfc6d2", "#9a8a9c", "#5f4a5c"] },
171
+ { name: "sand-sky", colors: ["#f4efe4", "#e0d3b8", "#a9bcc4", "#5f7f8c"] },
172
+ { name: "xanadu-sage", colors: ["#f1f4f1", "#c8d3c8", "#738678", "#36443a"] },
173
+ { name: "walnut-grain", colors: ["#e8d5b7", "#c49a6c", "#8a5a34", "#4a2c17"] },
174
+ // ── Dark-focused: ramps that start mid-tone instead of near-white, so the
175
+ // image reads dark overall with the lighter stop as a glow ──
176
+ { name: "onyx-gold", colors: ["#e8c877", "#b8862f", "#3a2f14", "#0b0b0d"] },
177
+ { name: "onyx-silver", colors: ["#d7dade", "#8b9199", "#3a3f45", "#0c0d0f"] },
178
+ { name: "graphite-royal", colors: ["#9fb0e8", "#3f56c4", "#2a2e38", "#101218"] },
179
+ { name: "onyx-ultraviolet", colors: ["#c9a6ff", "#7b3ff2", "#2a1450", "#08070d"] },
180
+ { name: "onyx-snow", colors: ["#ffffff", "#b0b0b0", "#4a4a4a", "#000000"] },
181
+ { name: "midnight-ember", colors: ["#f0a468", "#c23f1f", "#2a1410", "#0a0a0c"] },
182
+ { name: "slate-harbor", colors: ["#aeb7bd", "#6f7b84", "#3c454c", "#1a1f24"] },
183
+ // ── Neutral / mono ──
184
+ { name: "ivory-ink", colors: ["#f7f4ef", "#d8d2c8", "#8a8378", "#20201d"] },
185
+ { name: "paper-graphite", colors: ["#f4f4f5", "#cfcfd4", "#83838f", "#1c1c22"] },
186
+ { name: "bone-coffee", colors: ["#f5efe6", "#d9c9b3", "#9c8468", "#3a2c1e"] },
187
+ { name: "porcelain-greige", colors: ["#f6f3ef", "#ddd4c9", "#b0a596", "#6a5f52"] },
188
+ { name: "battleship-steel", colors: ["#e6e9e8", "#b9c0be", "#7d8683", "#3f4745"] },
189
+ { name: "gunmetal-fog", colors: ["#eceef1", "#c2c7cd", "#7b838d", "#343a42"] }
190
+ ];
191
+ function paletteAccent(palette) {
192
+ const colors = palette.colors;
193
+ return colors[Math.floor(colors.length / 2)];
194
+ }
195
+ function paletteComplement(palette) {
196
+ return paletteComplementColor(paletteAccent(palette), palette.colors);
197
+ }
198
+ var HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
199
+ function validatePalette(palette) {
200
+ const label = `Palette "${_optionalChain([palette, 'optionalAccess', _ => _.name])}"`;
201
+ if (typeof _optionalChain([palette, 'optionalAccess', _2 => _2.name]) !== "string" || palette.name.length === 0) {
202
+ throw new Error("Palette needs a non-empty name.");
203
+ }
204
+ const { colors } = palette;
205
+ if (!Array.isArray(colors) || colors.length < MIN_PALETTE_COLORS || colors.length > MAX_PALETTE_COLORS) {
206
+ throw new Error(
207
+ `${label} needs ${MIN_PALETTE_COLORS}\u2013${MAX_PALETTE_COLORS} colors. Got ${Array.isArray(colors) ? colors.length : typeof colors}.`
208
+ );
209
+ }
210
+ for (const color of colors) {
211
+ if (typeof color !== "string" || !HEX_COLOR.test(color)) {
212
+ throw new Error(`${label} has an invalid color "${color}". Use #rrggbb.`);
213
+ }
214
+ }
215
+ }
216
+ function validatePalettes(palettes) {
217
+ if (palettes.length === 0) throw new Error("At least one palette is required.");
218
+ const seen = /* @__PURE__ */ new Set();
219
+ for (const palette of palettes) {
220
+ validatePalette(palette);
221
+ if (seen.has(palette.name)) throw new Error(`Duplicate palette name "${palette.name}".`);
222
+ seen.add(palette.name);
223
+ }
224
+ }
225
+ function findPalette(name, palettes = colorPalettes) {
226
+ const palette = palettes.find((p) => p.name === name);
227
+ if (!palette) {
228
+ throw new Error(`Unknown palette "${name}". Valid: ${palettes.map((p) => p.name).join(", ")}`);
229
+ }
230
+ return palette;
231
+ }
232
+ function pickPalette(seed, palettes = colorPalettes) {
233
+ let best;
234
+ let bestScore = -1;
235
+ for (const palette of palettes) {
236
+ const score = createSeededRandom(hashStringToInt(`${seed}::palette::${palette.name}`))();
237
+ if (score > bestScore || score === bestScore && palette.name < best.name) {
238
+ best = palette;
239
+ bestScore = score;
240
+ }
241
+ }
242
+ if (!best) throw new Error("At least one palette is required.");
243
+ return best;
244
+ }
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ exports.complementColor = complementColor; exports.hashStringToInt = hashStringToInt; exports.createSeededRandom = createSeededRandom; exports.MIN_PALETTE_COLORS = MIN_PALETTE_COLORS; exports.MAX_PALETTE_COLORS = MAX_PALETTE_COLORS; exports.colorPalettes = colorPalettes; exports.paletteAccent = paletteAccent; exports.paletteComplement = paletteComplement; exports.validatePalette = validatePalette; exports.validatePalettes = validatePalettes; exports.findPalette = findPalette; exports.pickPalette = pickPalette;
260
+ //# sourceMappingURL=chunk-CRRF2Q64.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\stick\\Github\\dooph\\mesh-gradients\\dist\\chunk-CRRF2Q64.cjs"],"names":[],"mappings":"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","file":"C:\\Users\\stick\\Github\\dooph\\mesh-gradients\\dist\\chunk-CRRF2Q64.cjs","sourcesContent":[null]}