git-hash-art 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ALGORITHM.md +1 -1
- package/CHANGELOG.md +8 -0
- package/README.md +8 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/module.js +2 -2
- package/dist/module.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/canvas/colors.ts +2 -2
package/ALGORITHM.md
CHANGED
|
@@ -65,7 +65,7 @@ The hash deterministically selects both a **scheme type** and a **color variatio
|
|
|
65
65
|
| `hard` | High saturation, vivid |
|
|
66
66
|
| `pastel` | Light, airy |
|
|
67
67
|
| `light` | Bright, open |
|
|
68
|
-
| `
|
|
68
|
+
| `pale` | Washed out, ethereal |
|
|
69
69
|
| `default` | Balanced, neutral |
|
|
70
70
|
|
|
71
71
|
Scheme types also vary: `analogic`, `mono`, `contrast`, `triade`, `tetrade`. The complementary palette uses a contrasting variation (e.g., if base is `soft`, complementary uses `hard`) to create intentional color tension.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,9 +4,17 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
#### [0.4.1](https://github.com/gfargo/git-hash-art/compare/0.4.0...0.4.1)
|
|
8
|
+
|
|
9
|
+
- update README with new feature details [`1e3fcd7`](https://github.com/gfargo/git-hash-art/commit/1e3fcd771ea602b21c9c90cd3809d0d08ace5d3f)
|
|
10
|
+
- update color variations and complementary logic [`9c8f4ba`](https://github.com/gfargo/git-hash-art/commit/9c8f4ba51e1a5730e4c4ddd59218db23d4719129)
|
|
11
|
+
|
|
7
12
|
#### [0.4.0](https://github.com/gfargo/git-hash-art/compare/0.3.0...0.4.0)
|
|
8
13
|
|
|
14
|
+
> 19 March 2026
|
|
15
|
+
|
|
9
16
|
- feat: artistic enhancements for richer generative output [`#10`](https://github.com/gfargo/git-hash-art/pull/10)
|
|
17
|
+
- chore: release v0.4.0 [`42f955d`](https://github.com/gfargo/git-hash-art/commit/42f955d314230ebbff4fb0d097847a47d8d1554b)
|
|
10
18
|
|
|
11
19
|
#### [0.3.0](https://github.com/gfargo/git-hash-art/compare/0.2.0...0.3.0)
|
|
12
20
|
|
package/README.md
CHANGED
|
@@ -7,11 +7,18 @@ Works in both Node.js and browser environments.
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
9
|
- Deterministic output — same hash always produces the same image
|
|
10
|
-
- Hash-
|
|
10
|
+
- Hash-driven color palettes — 6 variation modes × 5 scheme types for dramatic palette diversity
|
|
11
|
+
- Per-layer blend modes — `screen`, `multiply`, `overlay`, `soft-light`, and more for painterly depth
|
|
12
|
+
- 6 shape render styles — fill+stroke, wireframe, dashed, double-stroke, watercolor bleed, fill-only
|
|
11
13
|
- 20+ shape types across three categories: basic, complex, and sacred geometry
|
|
12
14
|
- Layered composition with depth — early layers use simple shapes, later layers use intricate ones
|
|
15
|
+
- Atmospheric perspective — later layers desaturate for foreground/background separation
|
|
16
|
+
- Negative space — void zones and density-aware placement create intentional breathing room
|
|
13
17
|
- Watercolor-style transparency with semi-transparent fills and color blending
|
|
18
|
+
- Organic edges — ~15% of shapes get multi-pass watercolor bleed for hand-drawn quality
|
|
14
19
|
- Glow effects on sacred geometry shapes for an ethereal quality
|
|
20
|
+
- Layered backgrounds — faint shapes and concentric rings add texture before the main layers
|
|
21
|
+
- Tapered flow lines — brush-stroke curves with width and opacity tapering
|
|
15
22
|
- Radial gradient fills and organic color jitter for a hand-painted feel
|
|
16
23
|
- Organic bezier curves connecting nearby shapes
|
|
17
24
|
- Configurable canvas size, layers, shape sizes, and opacity
|
package/dist/browser.js
CHANGED
|
@@ -88,7 +88,7 @@ const $b5a262d09b87e373$var$COLOR_VARIATIONS = [
|
|
|
88
88
|
"hard",
|
|
89
89
|
"pastel",
|
|
90
90
|
"light",
|
|
91
|
-
"
|
|
91
|
+
"pale",
|
|
92
92
|
"default"
|
|
93
93
|
];
|
|
94
94
|
/**
|
|
@@ -127,7 +127,7 @@ class $b5a262d09b87e373$export$ab958c550f521376 {
|
|
|
127
127
|
generateComplementaryScheme() {
|
|
128
128
|
const complementaryHue = (this.seed + 180) % 360;
|
|
129
129
|
// Complementary uses a contrasting variation for tension
|
|
130
|
-
const compVariation = this.variation === "soft" ? "hard" : this.variation === "
|
|
130
|
+
const compVariation = this.variation === "soft" ? "hard" : this.variation === "pale" ? "light" : this.variation;
|
|
131
131
|
const scheme = new (0, $4wRzV$colorscheme)();
|
|
132
132
|
return scheme.from_hue(complementaryHue).scheme("mono").variation(compVariation).colors().map((hex)=>`#${hex}`);
|
|
133
133
|
}
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/browser.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/types.ts"],"sourcesContent":["/**\n * Browser entry point for git-hash-art.\n *\n * This module has zero Node.js dependencies — it works with a standard\n * HTMLCanvasElement or OffscreenCanvas and the native Canvas 2D API.\n */\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Render hash-derived art directly onto an HTMLCanvasElement.\n *\n * The canvas should already have the desired width/height set.\n * Config width/height will be inferred from the canvas if not provided.\n *\n * @param canvas - An HTMLCanvasElement (or OffscreenCanvas)\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n */\nfunction renderToCanvas(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from canvas\");\n }\n\n const finalConfig: Partial<GenerationConfig> = {\n width: canvas.width,\n height: canvas.height,\n ...config,\n };\n\n renderHashArt(ctx, gitHash, finalConfig);\n}\n\n/**\n * Render hash-derived art and return it as a Blob (browser-native).\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A Promise that resolves to a PNG Blob\n */\nasync function generateImageBlob(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Promise<Blob> {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from OffscreenCanvas\");\n }\n\n renderHashArt(\n ctx as unknown as CanvasRenderingContext2D,\n gitHash,\n finalConfig,\n );\n\n return canvas.convertToBlob({ type: \"image/png\" });\n}\n\n/**\n * Render hash-derived art and return it as a data URL string.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A data:image/png;base64,… string\n */\nfunction generateDataURL(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): string {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context\");\n }\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nexport { renderToCanvas, generateImageBlob, generateDataURL, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 1. Background — radial gradient from hash-derived dark palette\n * 1b. Layered background — large faint shapes / subtle pattern for depth\n * 2. Composition mode — hash selects: radial, flow-field, spiral, grid-subdivision, or clustered\n * 3. Focal points + void zones (negative space)\n * 4. Flow field seed values\n * 5. Shape layers — blend modes, render styles, weighted selection,\n * focal-point placement, atmospheric depth, organic edges\n * 5b. Recursive nesting\n * 6. Flow-line pass — tapered brush-stroke curves\n * 7. Noise texture overlay\n * 8. Organic connecting curves\n */\nimport {\n SacredColorScheme,\n hexWithAlpha,\n jitterColor,\n desaturate,\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n pickBlendMode,\n pickRenderStyle,\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport { createRng, seedFromHash } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\n\n// ── Shape categories for weighted selection ─────────────────────────\n\nconst BASIC_SHAPES = [\n \"circle\",\n \"square\",\n \"triangle\",\n \"hexagon\",\n \"diamond\",\n \"cube\",\n];\nconst COMPLEX_SHAPES = [\n \"star\",\n \"jacked-star\",\n \"heart\",\n \"platonicSolid\",\n \"fibonacciSpiral\",\n \"islamicPattern\",\n \"celticKnot\",\n \"merkaba\",\n \"fractal\",\n];\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\ntype CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\";\n\nconst COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n];\n\n// ── Helper: pick shape with layer-aware weighting ───────────────────\n\nfunction pickShape(\n rng: () => number,\n layerRatio: number,\n shapeNames: string[],\n): string {\n const basicW = 1 - layerRatio * 0.6;\n const complexW = 0.3 + layerRatio * 0.3;\n const sacredW = 0.1 + layerRatio * 0.4;\n const total = basicW + complexW + sacredW;\n const roll = rng() * total;\n\n let pool: string[];\n if (roll < basicW) pool = BASIC_SHAPES;\n else if (roll < basicW + complexW) pool = COMPLEX_SHAPES;\n else pool = SACRED_SHAPES;\n\n const available = pool.filter((s) => shapeNames.includes(s));\n if (available.length === 0) {\n return shapeNames[Math.floor(rng() * shapeNames.length)];\n }\n return available[Math.floor(rng() * available.length)];\n}\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n }\n}\n\n// ── Helper: positional color blending ───────────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n colors: string[],\n rng: () => number,\n): string {\n const nx = x / width;\n const ny = y / height;\n const posIndex = (nx * 0.6 + ny * 0.4) * (colors.length - 1);\n const baseIdx = Math.floor(posIndex) % colors.length;\n return jitterColor(colors[baseIdx], rng, 0.08);\n}\n\n// ── Helper: check if a position is inside a void zone (Feature E) ───\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Helper: density check for negative space (Feature E) ────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const {\n width,\n height,\n gridSize,\n layers,\n minShapeSize,\n maxShapeSize,\n baseOpacity,\n opacityReduction,\n } = finalConfig;\n\n finalConfig.shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColors();\n const [bgStart, bgEnd] = colorScheme.getBackgroundColors();\n\n const shapeNames = Object.keys(shapes);\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const rng = createRng(seedFromHash(gitHash));\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n const bgGrad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n bgGrad.addColorStop(0, bgStart);\n bgGrad.addColorStop(1, bgEnd);\n ctx.fillStyle = bgGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 1b. Layered background (Feature G) ─────────────────────────\n // Draw large, very faint shapes to give the background texture\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = colors[Math.floor(rng() * colors.length)];\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colors[0], 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 3. Focal points + void zones ───────────────────────────────\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n\n // Feature E: 1-2 void zones where shapes are sparse (negative space)\n const numVoids = Math.floor(rng() * 2) + 1;\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 4. Flow field seed values ──────────────────────────────────\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 0.5 + rng() * 2;\n\n function flowAngle(x: number, y: number): number {\n return (\n fieldAngleBase +\n Math.sin((x / width) * fieldFreq * Math.PI * 2) * Math.PI * 0.5 +\n Math.cos((y / height) * fieldFreq * Math.PI * 2) * Math.PI * 0.5\n );\n }\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const shapePositions: Array<{ x: number; y: number; size: number }> = [];\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const maxLocalDensity = Math.ceil(finalConfig.shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n finalConfig.shapesPerLayer +\n Math.floor(rng() * finalConfig.shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Feature B: per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Feature C: per-layer render style bias\n const layerRenderStyle = pickRenderStyle(rng);\n\n // Feature D: atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3; // 0 for first layer, up to 0.3 for last\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Feature E: skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n // 85% chance to skip — allows a few shapes to bleed in\n if (rng() < 0.85) continue;\n }\n if (localDensity(x, y, shapePositions, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue; // thin out dense areas\n }\n\n // Weighted shape selection\n const shape = pickShape(rng, layerRatio, shapeNames);\n\n // Power distribution for size\n const sizeT = Math.pow(rng(), 1.8);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale;\n\n // Flow-field rotation in flow-field mode, random otherwise\n const rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Positional color blending + jitter\n let fillBase = getPositionalColor(x, y, width, height, colors, rng);\n const strokeBase = colors[Math.floor(rng() * colors.length)];\n\n // Feature D: desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n const fillColor = jitterColor(fillBase, rng, 0.06);\n const strokeColor = jitterColor(strokeBase, rng, 0.05);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor;\n\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5);\n\n // Glow on sacred shapes more often\n const isSacred = SACRED_SHAPES.includes(shape);\n const glowChance = isSacred ? 0.45 : 0.2;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1)\n : undefined;\n\n // Feature C: per-shape render style (70% use layer style, 30% pick their own)\n const shapeRenderStyle =\n rng() < 0.7 ? layerRenderStyle : pickRenderStyle(rng);\n\n // Feature F: organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" : shapeRenderStyle;\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius,\n glowColor: hasGlow ? hexWithAlpha(fillColor, 0.6) : undefined,\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n });\n\n shapePositions.push({ x, y, size });\n\n // ── 5b. Recursive nesting ──────────────────────────────────\n if (size > adjustedMaxSize * 0.4 && rng() < 0.15) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n const innerShape = pickShape(\n rng,\n Math.min(1, layerRatio + 0.3),\n shapeNames,\n );\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n x + innerOffX,\n y + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: shapeRenderStyle,\n rng,\n },\n );\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 6. Flow-line pass (Feature H: tapered brush strokes) ───────\n const numFlowLines = 6 + Math.floor(rng() * 10);\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n const lineColor = hexWithAlpha(\n colors[Math.floor(rng() * colors.length)],\n 0.4,\n );\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Draw as individual segments with tapering width\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n // Taper: thick at start, thin at end\n const taper = 1 - (s / steps) * 0.8;\n ctx.globalAlpha = lineAlpha * taper;\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n\n // ── 8. Organic connecting curves ───────────────────────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n colors[Math.floor(rng() * colors.length)],\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"dark\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"dark\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme for gradient backgrounds.\n */\n getBackgroundColors(): [string, string] {\n return [\n this.darken(this.baseScheme[0], 0.65),\n this.darken(this.baseScheme[1], 0.55),\n ];\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Apply slight hue/saturation/lightness jitter to a hex color.\n * `rng` should return a float in [0,1). `amount` controls intensity (0-1, default 0.1).\n */\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\"; // multiple offset passes at low opacity\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Draw 3-4 slightly offset passes at low opacity for a bleed effect\n const passes = 3 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n ctx.globalAlpha = savedAlpha * (0.3 / passes * 2);\n for (let p = 0; p < passes; p++) {\n const jx = rng ? (rng() - 0.5) * size * 0.06 : 0;\n const jy = rng ? (rng() - 0.5) * size * 0.06 : 0;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n ctx.globalAlpha = savedAlpha;\n // Light stroke on top\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // Glow / shadow effect\n if (glowRadius > 0) {\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns aren't double-glowed\n if (glowRadius > 0) {\n ctx.shadowBlur = 0;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n"],"names":[],"version":3,"file":"browser.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["src/browser.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/types.ts"],"sourcesContent":["/**\n * Browser entry point for git-hash-art.\n *\n * This module has zero Node.js dependencies — it works with a standard\n * HTMLCanvasElement or OffscreenCanvas and the native Canvas 2D API.\n */\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Render hash-derived art directly onto an HTMLCanvasElement.\n *\n * The canvas should already have the desired width/height set.\n * Config width/height will be inferred from the canvas if not provided.\n *\n * @param canvas - An HTMLCanvasElement (or OffscreenCanvas)\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n */\nfunction renderToCanvas(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from canvas\");\n }\n\n const finalConfig: Partial<GenerationConfig> = {\n width: canvas.width,\n height: canvas.height,\n ...config,\n };\n\n renderHashArt(ctx, gitHash, finalConfig);\n}\n\n/**\n * Render hash-derived art and return it as a Blob (browser-native).\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A Promise that resolves to a PNG Blob\n */\nasync function generateImageBlob(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Promise<Blob> {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from OffscreenCanvas\");\n }\n\n renderHashArt(\n ctx as unknown as CanvasRenderingContext2D,\n gitHash,\n finalConfig,\n );\n\n return canvas.convertToBlob({ type: \"image/png\" });\n}\n\n/**\n * Render hash-derived art and return it as a data URL string.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A data:image/png;base64,… string\n */\nfunction generateDataURL(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): string {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context\");\n }\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nexport { renderToCanvas, generateImageBlob, generateDataURL, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 1. Background — radial gradient from hash-derived dark palette\n * 1b. Layered background — large faint shapes / subtle pattern for depth\n * 2. Composition mode — hash selects: radial, flow-field, spiral, grid-subdivision, or clustered\n * 3. Focal points + void zones (negative space)\n * 4. Flow field seed values\n * 5. Shape layers — blend modes, render styles, weighted selection,\n * focal-point placement, atmospheric depth, organic edges\n * 5b. Recursive nesting\n * 6. Flow-line pass — tapered brush-stroke curves\n * 7. Noise texture overlay\n * 8. Organic connecting curves\n */\nimport {\n SacredColorScheme,\n hexWithAlpha,\n jitterColor,\n desaturate,\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n pickBlendMode,\n pickRenderStyle,\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport { createRng, seedFromHash } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\n\n// ── Shape categories for weighted selection ─────────────────────────\n\nconst BASIC_SHAPES = [\n \"circle\",\n \"square\",\n \"triangle\",\n \"hexagon\",\n \"diamond\",\n \"cube\",\n];\nconst COMPLEX_SHAPES = [\n \"star\",\n \"jacked-star\",\n \"heart\",\n \"platonicSolid\",\n \"fibonacciSpiral\",\n \"islamicPattern\",\n \"celticKnot\",\n \"merkaba\",\n \"fractal\",\n];\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\ntype CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\";\n\nconst COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n];\n\n// ── Helper: pick shape with layer-aware weighting ───────────────────\n\nfunction pickShape(\n rng: () => number,\n layerRatio: number,\n shapeNames: string[],\n): string {\n const basicW = 1 - layerRatio * 0.6;\n const complexW = 0.3 + layerRatio * 0.3;\n const sacredW = 0.1 + layerRatio * 0.4;\n const total = basicW + complexW + sacredW;\n const roll = rng() * total;\n\n let pool: string[];\n if (roll < basicW) pool = BASIC_SHAPES;\n else if (roll < basicW + complexW) pool = COMPLEX_SHAPES;\n else pool = SACRED_SHAPES;\n\n const available = pool.filter((s) => shapeNames.includes(s));\n if (available.length === 0) {\n return shapeNames[Math.floor(rng() * shapeNames.length)];\n }\n return available[Math.floor(rng() * available.length)];\n}\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n }\n}\n\n// ── Helper: positional color blending ───────────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n colors: string[],\n rng: () => number,\n): string {\n const nx = x / width;\n const ny = y / height;\n const posIndex = (nx * 0.6 + ny * 0.4) * (colors.length - 1);\n const baseIdx = Math.floor(posIndex) % colors.length;\n return jitterColor(colors[baseIdx], rng, 0.08);\n}\n\n// ── Helper: check if a position is inside a void zone (Feature E) ───\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Helper: density check for negative space (Feature E) ────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const {\n width,\n height,\n gridSize,\n layers,\n minShapeSize,\n maxShapeSize,\n baseOpacity,\n opacityReduction,\n } = finalConfig;\n\n finalConfig.shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColors();\n const [bgStart, bgEnd] = colorScheme.getBackgroundColors();\n\n const shapeNames = Object.keys(shapes);\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const rng = createRng(seedFromHash(gitHash));\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n const bgGrad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n bgGrad.addColorStop(0, bgStart);\n bgGrad.addColorStop(1, bgEnd);\n ctx.fillStyle = bgGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 1b. Layered background (Feature G) ─────────────────────────\n // Draw large, very faint shapes to give the background texture\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = colors[Math.floor(rng() * colors.length)];\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colors[0], 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 3. Focal points + void zones ───────────────────────────────\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n\n // Feature E: 1-2 void zones where shapes are sparse (negative space)\n const numVoids = Math.floor(rng() * 2) + 1;\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 4. Flow field seed values ──────────────────────────────────\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 0.5 + rng() * 2;\n\n function flowAngle(x: number, y: number): number {\n return (\n fieldAngleBase +\n Math.sin((x / width) * fieldFreq * Math.PI * 2) * Math.PI * 0.5 +\n Math.cos((y / height) * fieldFreq * Math.PI * 2) * Math.PI * 0.5\n );\n }\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const shapePositions: Array<{ x: number; y: number; size: number }> = [];\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const maxLocalDensity = Math.ceil(finalConfig.shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n finalConfig.shapesPerLayer +\n Math.floor(rng() * finalConfig.shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Feature B: per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Feature C: per-layer render style bias\n const layerRenderStyle = pickRenderStyle(rng);\n\n // Feature D: atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3; // 0 for first layer, up to 0.3 for last\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Feature E: skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n // 85% chance to skip — allows a few shapes to bleed in\n if (rng() < 0.85) continue;\n }\n if (localDensity(x, y, shapePositions, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue; // thin out dense areas\n }\n\n // Weighted shape selection\n const shape = pickShape(rng, layerRatio, shapeNames);\n\n // Power distribution for size\n const sizeT = Math.pow(rng(), 1.8);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale;\n\n // Flow-field rotation in flow-field mode, random otherwise\n const rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Positional color blending + jitter\n let fillBase = getPositionalColor(x, y, width, height, colors, rng);\n const strokeBase = colors[Math.floor(rng() * colors.length)];\n\n // Feature D: desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n const fillColor = jitterColor(fillBase, rng, 0.06);\n const strokeColor = jitterColor(strokeBase, rng, 0.05);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor;\n\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5);\n\n // Glow on sacred shapes more often\n const isSacred = SACRED_SHAPES.includes(shape);\n const glowChance = isSacred ? 0.45 : 0.2;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1)\n : undefined;\n\n // Feature C: per-shape render style (70% use layer style, 30% pick their own)\n const shapeRenderStyle =\n rng() < 0.7 ? layerRenderStyle : pickRenderStyle(rng);\n\n // Feature F: organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" : shapeRenderStyle;\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius,\n glowColor: hasGlow ? hexWithAlpha(fillColor, 0.6) : undefined,\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n });\n\n shapePositions.push({ x, y, size });\n\n // ── 5b. Recursive nesting ──────────────────────────────────\n if (size > adjustedMaxSize * 0.4 && rng() < 0.15) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n const innerShape = pickShape(\n rng,\n Math.min(1, layerRatio + 0.3),\n shapeNames,\n );\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n x + innerOffX,\n y + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: shapeRenderStyle,\n rng,\n },\n );\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 6. Flow-line pass (Feature H: tapered brush strokes) ───────\n const numFlowLines = 6 + Math.floor(rng() * 10);\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n const lineColor = hexWithAlpha(\n colors[Math.floor(rng() * colors.length)],\n 0.4,\n );\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Draw as individual segments with tapering width\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n // Taper: thick at start, thin at end\n const taper = 1 - (s / steps) * 0.8;\n ctx.globalAlpha = lineAlpha * taper;\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n\n // ── 8. Organic connecting curves ───────────────────────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n colors[Math.floor(rng() * colors.length)],\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"pale\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"pale\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme for gradient backgrounds.\n */\n getBackgroundColors(): [string, string] {\n return [\n this.darken(this.baseScheme[0], 0.65),\n this.darken(this.baseScheme[1], 0.55),\n ];\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Apply slight hue/saturation/lightness jitter to a hex color.\n * `rng` should return a float in [0,1). `amount` controls intensity (0-1, default 0.1).\n */\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\"; // multiple offset passes at low opacity\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Draw 3-4 slightly offset passes at low opacity for a bleed effect\n const passes = 3 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n ctx.globalAlpha = savedAlpha * (0.3 / passes * 2);\n for (let p = 0; p < passes; p++) {\n const jx = rng ? (rng() - 0.5) * size * 0.06 : 0;\n const jy = rng ? (rng() - 0.5) * size * 0.06 : 0;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n ctx.globalAlpha = savedAlpha;\n // Light stroke on top\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // Glow / shadow effect\n if (glowRadius > 0) {\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns aren't double-glowed\n if (glowRadius > 0) {\n ctx.shadowBlur = 0;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n"],"names":[],"version":3,"file":"browser.js.map"}
|
package/dist/main.js
CHANGED
|
@@ -103,7 +103,7 @@ const $d016ad53434219a1$var$COLOR_VARIATIONS = [
|
|
|
103
103
|
"hard",
|
|
104
104
|
"pastel",
|
|
105
105
|
"light",
|
|
106
|
-
"
|
|
106
|
+
"pale",
|
|
107
107
|
"default"
|
|
108
108
|
];
|
|
109
109
|
/**
|
|
@@ -149,7 +149,7 @@ class $d016ad53434219a1$export$ab958c550f521376 {
|
|
|
149
149
|
generateComplementaryScheme() {
|
|
150
150
|
const complementaryHue = (this.seed + 180) % 360;
|
|
151
151
|
// Complementary uses a contrasting variation for tension
|
|
152
|
-
const compVariation = this.variation === "soft" ? "hard" : this.variation === "
|
|
152
|
+
const compVariation = this.variation === "soft" ? "hard" : this.variation === "pale" ? "light" : this.variation;
|
|
153
153
|
const scheme = new (0, ($parcel$interopDefault($dxT2C$colorscheme)))();
|
|
154
154
|
return scheme.from_hue(complementaryHue).scheme("mono").variation(compVariation).colors().map((hex)=>`#${hex}`);
|
|
155
155
|
}
|