git-hash-art 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.kiro/steering/product.md +16 -0
- package/.kiro/steering/structure.md +40 -0
- package/.kiro/steering/tech.md +24 -0
- package/ALGORITHM.md +198 -0
- package/CHANGELOG.md +19 -0
- package/README.md +165 -57
- package/dist/browser.js +1430 -0
- package/dist/browser.js.map +1 -0
- package/dist/main.js +672 -333
- package/dist/main.js.map +1 -1
- package/dist/module.js +665 -329
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +2 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +47 -3
- package/src/__tests__/compatibility.test.ts +42 -0
- package/src/__tests__/generation.test.ts +58 -0
- package/src/__tests__/render.test.ts +81 -0
- package/src/__tests__/shapes.test.ts +71 -0
- package/src/browser.ts +100 -0
- package/src/index.ts +38 -199
- package/src/lib/canvas/colors.ts +90 -66
- package/src/lib/canvas/draw.ts +38 -7
- package/src/lib/canvas/shapes/basic.ts +1 -1
- package/src/lib/canvas/shapes/complex.ts +2 -1
- package/src/lib/render.ts +483 -0
- package/src/lib/utils.ts +33 -6
- package/src/types.ts +35 -0
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.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/lib/canvas/draw.ts"],"sourcesContent":["import { createCanvas } from \"@napi-rs/canvas\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { SacredColorScheme } from \"./lib/canvas/colors\";\nimport { enhanceShapeGeneration } from \"./lib/canvas/draw\";\nimport { shapes } from \"./lib/canvas/shapes\";\nimport { getRandomFromHash } from \"./lib/utils\";\n\n/**\n * Generate an abstract art image from a git hash with custom configuration\n * @param {string} gitHash - The git hash to use as a seed\n * @param {ArtConfig} [config={}] - Configuration options\n * @returns {Buffer} PNG buffer of the generated image\n */\nfunction generateImageFromHash(gitHash: string, config = {}) {\n // Default configuration\n const defaultConfig = {\n width: 2048,\n height: 2048,\n gridSize: 12,\n layers: 2,\n minShapeSize: 20,\n maxShapeSize: 600,\n baseOpacity: 0.8,\n opacityReduction: 0.4,\n shapesPerLayer: 0,\n };\n\n // Merge provided config with defaults\n const finalConfig = { ...defaultConfig, ...config };\n const {\n width,\n height,\n gridSize,\n layers,\n minShapeSize,\n maxShapeSize,\n baseOpacity,\n opacityReduction,\n } = finalConfig;\n\n // Calculate shapes per layer based on grid size if not provided\n finalConfig.shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorPalette(\"chakra\");\n\n // Create a gradient background\n const gradient = ctx.createLinearGradient(0, 0, width, height);\n gradient.addColorStop(0, colorScheme.baseScheme[0]);\n gradient.addColorStop(1, colorScheme.baseScheme[1]);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n\n const shapeNames = Object.keys(shapes);\n\n const cellWidth = width / gridSize;\n const cellHeight = height / gridSize;\n\n // Scale shape sizes based on canvas dimensions\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n for (let layer = 0; layer < layers; layer++) {\n const numShapes =\n finalConfig.shapesPerLayer +\n Math.floor(\n getRandomFromHash(gitHash, layer, 0, finalConfig.shapesPerLayer / 2),\n );\n const layerOpacity = baseOpacity - layer * opacityReduction;\n\n for (let i = 0; i < numShapes; i++) {\n const gridX = Math.floor(i / gridSize);\n const gridY = i % gridSize;\n\n const cellOffsetX = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 2,\n 0,\n cellWidth,\n );\n const cellOffsetY = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 2 + 1,\n 0,\n cellHeight,\n );\n\n const x = gridX * cellWidth + cellOffsetX;\n const y = gridY * cellHeight + cellOffsetY;\n\n const shape =\n shapeNames[\n Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 3,\n 0,\n shapeNames.length,\n ),\n )\n ];\n const size =\n adjustedMinSize +\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 4,\n 0,\n adjustedMaxSize - adjustedMinSize,\n );\n const rotation = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 5,\n 0,\n 360,\n );\n\n const fillColorIndex = Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 6,\n 0,\n Object.keys(colors).length,\n ),\n );\n const strokeColorIndex = Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 7,\n 0,\n Object.keys(colors).length,\n ),\n );\n\n ctx.globalAlpha = layerOpacity;\n // drawShape(\n // ctx,\n // shape,\n // x,\n // y,\n // colors[fillColorIndex],\n // colors[strokeColorIndex],\n // 2 * scaleFactor,\n // size,\n // rotation\n // );\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: Object.values(colors)[fillColorIndex],\n strokeColor: Object.values(colors)[strokeColorIndex],\n strokeWidth: 1.5 * scaleFactor,\n size,\n rotation,\n // Optionally add pattern combinations\n // patterns:\n // Math.random() > 0.7 ? PatternPresets.cosmicTree(size) : [],\n proportionType: \"GOLDEN_RATIO\",\n });\n }\n\n // Add connecting lines scaled to canvas size\n ctx.globalAlpha = 0.2;\n ctx.strokeStyle = Object.values(colors)[Object.keys(colors).length - 1];\n ctx.lineWidth = 1 * scaleFactor;\n\n const numLines = Math.floor((15 * (width * height)) / (1024 * 1024));\n for (let i = 0; i < numLines; i++) {\n const x1 = getRandomFromHash(gitHash, i * 4, 0, width);\n const y1 = getRandomFromHash(gitHash, i * 4 + 1, 0, height);\n const x2 = getRandomFromHash(gitHash, i * 4 + 2, 0, width);\n const y2 = getRandomFromHash(gitHash, i * 4 + 3, 0, height);\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n }\n\n return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file\n * @param {Buffer} imageBuffer - The PNG buffer of the generated image\n * @param {string} outputDir - The directory to save the image\n * @param {string} gitHash - The git hash used to generate the image\n * @param {string} [label=''] - Label for the output file\n * @param {number} width - The width of the generated image\n * @param {number} height - The height of the generated image\n * @returns {string} Path to the saved image\n */\nfunction saveImageToFile(\n imageBuffer: string,\n outputDir: string,\n gitHash: string | any[],\n label = \"\",\n width: any,\n height: any,\n) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile };\n\n// Usage example:\n/*\nimport { generateImageFromHash, saveImageToFile } from 'git-hash-art';\n\nconst gitHash = '1234567890abcdef1234567890abcdef12345678';\nconst imageBuffer = generateImageFromHash(gitHash, { width: 1024, height: 1024 });\nconst savedImagePath = saveImageToFile(imageBuffer, './output', gitHash, 'example', 1024, 1024);\nconsole.log(`Image saved to: ${savedImagePath}`);\n*/\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed } from \"../utils\";\n\n/**\n * Generates a color scheme based on a given Git hash.\n *\n * @param {string} gitHash - The Git hash used to generate the color scheme.\n * @returns {string[]} An array of hex color codes representing the generated color scheme.\n */\nexport function generateColorScheme(gitHash: string): string[] {\n const seed = gitHashToSeed(gitHash);\n const scheme = new ColorScheme();\n scheme\n .from_hue(seed % 360)\n .scheme(\"analogic\")\n .variation(\"soft\");\n\n let colors = scheme.colors().map((hex: string) => `#${hex}`);\n\n const contrastingHue = (seed + 180) % 360;\n const contrastingScheme = new ColorScheme();\n contrastingScheme.from_hue(contrastingHue).scheme(\"mono\").variation(\"soft\");\n colors.push(`#${contrastingScheme.colors()[0]}`);\n\n return colors;\n}\n\ninterface MetallicColors {\n gold: string;\n silver: string;\n copper: string;\n bronze: string;\n}\n\ninterface SacredPalette {\n primary: string;\n secondary: string;\n accent: string;\n metallic: string;\n}\n\ninterface ElementalPalette {\n earth: string;\n water: string;\n air: string;\n fire: string;\n}\n\ninterface ChakraPalette {\n root: string;\n sacral: string;\n solar: string;\n heart: string;\n throat: string;\n third_eye: string;\n crown: string;\n}\n\ntype ColorPalette = SacredPalette | ElementalPalette | ChakraPalette | string[];\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private metallic: MetallicColors;\n\n constructor(gitHash: string) {\n this.seed = this.gitHashToSeed(gitHash);\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.metallic = this.generateMetallicColors();\n }\n\n private gitHashToSeed(hash: string): number {\n return parseInt(hash.slice(0, 8), 16);\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n scheme;\n return scheme\n .from_hue(this.seed % 360)\n .scheme(\"analogic\")\n .variation(\"soft\")\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(\"soft\")\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateMetallicColors(): MetallicColors {\n return {\n gold: \"#FFD700\",\n silver: \"#C0C0C0\",\n copper: \"#B87333\",\n bronze: \"#CD7F32\",\n };\n }\n\n getColorPalette(\n type: \"sacred\" | \"elemental\" | \"chakra\" | \"default\" = \"sacred\",\n ): ColorPalette {\n switch (type) {\n case \"sacred\":\n return {\n primary: this.baseScheme[0],\n secondary: this.baseScheme[1],\n accent: this.complementaryScheme[0],\n metallic: this.metallic.gold,\n };\n case \"elemental\":\n return {\n earth: this.baseScheme[0],\n water: this.baseScheme[1],\n air: this.baseScheme[2],\n fire: this.complementaryScheme[0],\n };\n case \"chakra\":\n return {\n root: \"#FF0000\",\n sacral: \"#FF7F00\",\n solar: \"#FFFF00\",\n heart: \"#00FF00\",\n throat: \"#0000FF\",\n third_eye: \"#4B0082\",\n crown: \"#8F00FF\",\n };\n default:\n return this.baseScheme;\n }\n }\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","import { shapes } from \"./canvas/shapes\";\n\nexport function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const hexPair = hash.substr((index * 2) % hash.length, 2);\n const decimal = parseInt(hexPair, 16);\n return min + (decimal / 255) * (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; // You might want to define a more specific type for config\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 { 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 / 8) * 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 = 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","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\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}\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 }\n\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n}\n\n// Integration with existing generation logic\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 } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // Draw base shape\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 }\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.fill();\n ctx.stroke();\n ctx.restore();\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":";;;;;;;;ACAA;;;;;;;;;;;;;;;;AEAA,CAWA,iCAAiC;;;ACX1B,SAAS,0CAAc,OAAe;IAC3C,OAAO,SAAS,QAAQ,KAAK,CAAC,GAAG,IAAI;AACvC;AAMO,SAAS,0CAAU,IAAY;IACpC,IAAI,IAAI,OAAO;IACf,OAAO;QACL,IAAI,AAAC,IAAI,aAAc;QACvB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,IAAK,IAAI;QACtC,IAAI,AAAC,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,GAAI,KAAK,KAAM;QAC7C,OAAO,AAAC,CAAA,AAAC,CAAA,IAAK,MAAM,EAAE,MAAO,CAAA,IAAK;IACpC;AACF;AAMO,SAAS,0CAAa,IAAY,EAAE,SAAS,CAAC;IACnD,IAAI,IAAI;IACR,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAC/B,IAAI,AAAC,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,UAAU,CAAC,KAAM;IAEhD,OAAO,AAAC,IAAI,SAAU;AACxB;AAMO,SAAS,0CACd,IAAY,EACZ,KAAa,EACb,GAAW,EACX,GAAW;IAEX,MAAM,MAAM,0CAAU,0CAAa,MAAM;IACzC,OAAO,MAAM,QAAS,CAAA,MAAM,GAAE;AAChC;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAkBO,MAAM;IACX,OAAO,oBAAoB,QAAgB,EAAE,UAAkB,EAAU;QACvE,OAAO,WAAW;IACpB;IAEA,OAAO,cACL,GAA6B,EAC7B,KAAa,EACb,MAAc,EACR;QACN,IAAI,SAAS,CAAC,QAAQ,GAAG,SAAS;IACpC;IAEA,4DAA4D;IAC5D,OAAO,cACL,GAA6B,EAC7B,QAAmB,EACnB,MAAmB,EACb;QACN,MAAM,YACJ,QAAQ,eACR,cAAc,uBACd,mBAAmB,qBACnB,iBAAiB,mBACjB,iBAAiB,gBAClB,GAAG;QAEJ,SAAS,OAAO,CAAC,CAAC,SAAS;YACzB,MAAM,OAAO,IAAI,CAAC,mBAAmB,CACnC,UACA,KAAK,GAAG,CAAC,yCAAW,CAAC,eAAe,EAAE;YAExC,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,cAAc,QAAQ;YACpD,MAAM,WAAW,iBAAiB;YAElC,IAAI,IAAI;YACR,IAAI,WAAW,GAAG;YAClB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;YAElC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,QAAQ,MAAM;YAC9C,IAAI,OAAO;QACb;IACF;AACF;;;AFzGO,SAAS,0CAAoB,OAAe;IACjD,MAAM,OAAO,CAAA,GAAA,yCAAY,EAAE;IAC3B,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;IAC7B,OACG,QAAQ,CAAC,OAAO,KAChB,MAAM,CAAC,YACP,SAAS,CAAC;IAEb,IAAI,SAAS,OAAO,MAAM,GAAG,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IAE3D,MAAM,iBAAiB,AAAC,CAAA,OAAO,GAAE,IAAK;IACtC,MAAM,oBAAoB,IAAI,CAAA,GAAA,kBAAU;IACxC,kBAAkB,QAAQ,CAAC,gBAAgB,MAAM,CAAC,QAAQ,SAAS,CAAC;IACpE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/C,OAAO;AACT;AAUO,MAAM;IACH,KAAa;IACd,WAAqB;IACpB,oBAA8B;IAC9B,cAAwB;IACxB,SAAyB;IAEjC,YAAY,OAAe,CAAE;QAC3B,IAAI,CAAC,IAAI,GAAG,CAAA,GAAA,yCAAY,EAAE;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB;QACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,2BAA2B;QAC3D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,qBAAqB;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB;IAC7C;IAEQ,qBAA+B;QACrC,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,KACrB,MAAM,CAAC,YACP,SAAS,CAAC,QACV,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,8BAAwC;QAC9C,MAAM,mBAAmB,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QAC7C,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,kBACT,MAAM,CAAC,QACP,SAAS,CAAC,QACV,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,wBAAkC;QACxC,MAAM,aAAa,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QACvC,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,YACT,MAAM,CAAC,UACP,SAAS,CAAC,QACV,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,yBAAyC;QAC/C,OAAO;YACL,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,QAAQ;QACV;IACF;IAEA;;;;GAIC,GACD,YAAsB;QACpB,wCAAwC;QACxC,MAAM,MAAM;eACP,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG;eACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG;eAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;SAChC;QACD,OAAO;eAAI,IAAI,IAAI;SAAK;IAC1B;IAEA;;;GAGC,GACD,sBAAwC;QACtC,OAAO;YACL,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;SACjC;IACH;IAEA;;GAEC,GACD,AAAQ,OAAO,GAAW,EAAE,MAAc,EAAU;QAClD,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;QAC3B,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,OAAO,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;IAClH;AACF;AAEA,uEAAuE;AAEvE,sDAAsD,GACtD,SAAS,+BAAS,GAAW;IAC3B,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;IAC3B,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;KAC7B;AACH;AAEA,sCAAsC,GACtC,SAAS,+BAAS,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,MAAM,QAAQ,CAAC,IAAc,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;AACvI;AAMO,SAAS,0CAAa,GAAW,EAAE,KAAa;IACrD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;AACnD;AAMO,SAAS,0CACd,GAAW,EACX,GAAiB,EACjB,SAAS,GAAG;IAEZ,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,MAAM,IAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI,SAAS;IAC/C,OAAO,+BAAS,IAAI,OAAO,IAAI,OAAO,IAAI;AAC5C;;CDxJC;;AMbM,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,KAAK,EAAE,GAAG;AACvC;AAEO,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,MAAM;AACvC;AAEO,MAAM,4CAA6B,CAAC,KAAK;IAC9C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,SAAS;AACf;AAEO,MAAM,4CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAE,KAAK,EAAE,GAAG,IAAK,IAAK;QACpC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,2CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,IAAI,AAAC,KAAK,EAAE,GAAG,IAAK,IAAI;QAChD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,AAAC,KAAK,EAAE,GAAG,KAAM,IAAI;QAClD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,gBAAgB,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,OAAO;IACpD,IAAI,gBAAgB,CAAC,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,OAAO;AACtD;AAEO,MAAM,2CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,OAAO,GAAG;IACrB,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG;IACtB,IAAI,SAAS;AACf;AAEO,MAAM,4CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO;IAC9B,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,SAAS;AACf;AAGO,MAAM,4CAA4C;IACvD,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;IACN,eAAe;IACf,OAAO;IACP,SAAS;IACT,MAAM;AACR;;;AE9FA,2CAA2C;AA2BpC,MAAM,2CAAmB;IAC9B,uCAAuC;IACvC,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;IACZ;IACA,yBAAyB;IACzB,QAAQ;QACN,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,WAAW;QACT,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,qBAAqB;IACrB,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,kBAAkB;QAChB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,eAAe;IACf,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,yBAAyB;IACzB,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,gBAAgB;IAClB;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,cAAc;IAChB;AACF;AAGO,MAAM,4CAAkC;IAC7C,aAAa;IACb,WAAW;IACX,WAAW;IACX,UAAU;IACV,YAAY;IACZ,SAAS;AACX;AAGO,MAAM,4CAAmB;IAC9B,OAAO;IACP,UAAU;IACV,UAAU;AACZ;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAGO,MAAM,4CAAiB;IAC5B,qBAAqB,CAAC,OAAiB;YACrC,8CAA8C;YAC9C;gBAAE,MAAM;gBAAW,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YAChD;gBAAE,MAAM;gBAAa,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACnD;IAED,qBAAqB,CAAC,OAAiB;YACrC;gBAAE,MAAM;gBAAiB,QAAQ;0BAAE;oBAAM,MAAM;gBAAc;YAAE;YAC/D;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAO;YAAE;YACpE;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAa;YAAE;SAC3E;IAED,YAAY,CAAC,OAAiB;YAC5B,4CAA4C;YAC5C;gBAAE,MAAM;gBAAmB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YACxD;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACvD;AACH;;;ACjJO,MAAM,4CAAW,CAAC,UAA4B,AAAC,UAAU,KAAK,EAAE,GAAI;AAEpE,MAAM,4CAAkB,CAC7B,KACA,MACA;IAEA,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,OAAO,QAAQ,EACjB,IAAI,MAAM,CAAC,0CAAS,OAAO,QAAQ;IAErC,IAAI,SAAS,GAAG,OAAO,SAAS;IAChC,IAAI,WAAW,GAAG,OAAO,WAAW;IACpC,IAAI,SAAS,GAAG,OAAO,SAAS;AAClC;AAEO,MAAM,4CAAiB,CAAC;IAC7B,IAAI,OAAO;AACb;AAGO,MAAM,4CAAwB,CAAC,OAAmC,CAAA;QACvE,SAAS;QACT,UAAU;QACV,QAAQ;cACR;IAEF,CAAA;AAEO,MAAM,4CAAqB,CAChC,IACA,IACA,QACA;IAEA,MAAM,SAAkB,EAAE;IAC1B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,QAAQ,AAAC,IAAI,WAAY,KAAK,EAAE,GAAG;QACzC,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;YAC1B,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;QAC5B;IACF;IACA,OAAO;AACT;;;AF9CO,MAAM,4CAAe;IAC1B,UAAU;QACR,aAAa;YAAE,UAAU;YAAG,OAAO;QAAE;QACrC,MAAM;YAAE,UAAU;YAAG,OAAO;QAAE;QAC9B,YAAY;YAAE,UAAU;YAAG,OAAO;QAAE;QACpC,cAAc;YAAE,UAAU;YAAI,OAAO;QAAG;QACxC,aAAa;YAAE,UAAU;YAAI,OAAO;QAAG;IACzC;IACA,WAAW;QACT,YAAY;QACZ,cAAc;IAChB;IACA,aAAa;QACX,YAAY;QACZ,OAAO;IACT;AACF;AAkBO,MAAM,4CAAkC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACpE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,YAAY,OAAO,IAAI;IAC7B,MAAM,cACJ,0CAAa,QAAQ,CAAC,UAAU,IAAI,0CAAa,QAAQ,CAAC,WAAW;IACvE,MAAM,YACJ,QAAQ,EAET,GAAG;IACJ,MAAM,SAAS,OAAO;IAEtB,kDAAkD;IAClD,MAAM,SAAS,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IAEhD,IAAI,SAAS;IACb,8BAA8B;IAC9B,OAAO,OAAO,CAAC,CAAC,IAAI;QAClB,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAoC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACtE,MAAM,cAAc;QAClB,GAAG,CAAA,GAAA,yCAAiB,CAAC;QACrB,GAAG,0CAAa,SAAS;QACzB,GAAG,MAAM;IACX;IACA,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,IAAI,UAAU;IACd,IAAI,WAAW;IACf,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC,YAAY,YAAY,EAAE,YAAY,UAAU;IAE5E,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,UAAU,EAAE,IAAK;QAC/C,MAAM,SAAS,QAAQ;QACvB,MAAM,UAAU,SAAS;QACzB,MAAM,UAAU,SAAS;QAEzB,IAAI,GAAG,CAAC,SAAS,SAAS,QAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG;QAErD,kCAAkC;QAClC,MAAM,OAAO,UAAU;QACvB,WAAW;QACX,UAAU;QAEV,+BAA+B;QAC/B,IAAI,SAAS,CAAC,QAAQ;QACtB,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACvB;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAmC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACrE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,IAAI,SAAS;IACb,mBAAmB;IACnB,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAC7B,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAAK;QAClC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAE/B,yCAAyC;QACzC,MAAM,SAAS,OAAO;QACtB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;YAC1B,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAK;YAC9B,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;IAGF,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA+B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACjE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,MAAM,kBAAkB,CAAC,GAAW,GAAW;QAC7C,IAAI,SAAS;QACb,OAAQ;YACN,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG;gBACd,IAAI,aAAa,CACf,IAAI,OAAO,GACX,GACA,IAAI,OAAO,GACX,IAAI,MACJ,IAAI,MACJ,IAAI;gBAEN;YACF,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG,IAAI;gBAClB,IAAI,aAAa,CAAC,IAAI,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,GAAG,GAAG,IAAI,MAAM;gBACrE;QACJ;QACA,IAAI,MAAM;IACZ;IAEA,sBAAsB;IACtB,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,gBAAgB,GAAG,GAAG,AAAC,CAAA,IAAI,CAAA,IAAK,MAAM,IAAI,SAAS;IACrD;IAGF,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,SAAS,OAAO;IAEtB,mCAAmC;IACnC,IAAI,SAAS;IACb,oBAAoB;IACpB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,+BAA+B;IAC/B,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACrB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa;IACnB,MAAM,YAAY;IAClB,MAAM,SAAS,OAAO;IAEtB,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,YAAY,IAAK;QACpC,MAAM,eAAe,AAAC,SAAS,aAAc;QAC7C,IAAI,MAAM,CAAC,cAAc;QACzB,IAAI,GAAG,CAAC,GAAG,GAAG,cAAc,GAAG,KAAK,EAAE,GAAG;QAEzC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAI,IAAK;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,IAAI,MAAM,CAAC,GAAG;YACd,IAAI,MAAM,CAAC,GAAG;QAChB;IACF;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;QAAE,YAAY;IAAE;IACtE,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa,CACjB,GACA,GACA,QACA,OACA;QAEA,IAAI,UAAU,GAAG;QAEjB,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QACnC,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QAEnC,IAAI,SAAS;QACb,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,MAAM;QACjB,IAAI,MAAM;QAEV,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;QAClE,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;IACpE;IAEA,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,UAAU;IACtE,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA8C;IACzD,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;AACX;;;;AGxRO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAU,SAAS;IAEzB,0CAA0C;IAC1C,MAAM,YAAqB;QACzB;YAAE,GAAG;YAAG,GAAG,CAAC,UAAU;QAAE;QACxB;YAAE,GAAG,CAAC;YAAS,GAAG,CAAC;QAAQ;QAC3B;YAAE,GAAG;YAAS,GAAG,CAAC;QAAQ;QAC1B;YAAE,GAAG,CAAC;YAAS,GAAG;QAAE;QACpB;YAAE,GAAG;YAAS,GAAG;QAAE;QACnB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,CAAC;YAAS,GAAG;QAAQ;QAC1B;YAAE,GAAG;YAAS,GAAG;QAAQ;QACzB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;QACvB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;KACxB;IAED,eAAe;IACf,IAAI,SAAS;IACb,UAAU,OAAO,CAAC,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C;IAEA,wBAAwB;IACxB,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzC,UAAU,OAAO,CAAC,CAAC,KAAK;QACtB,IAAI,IAAI,GACN,UAAU,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACjC;IAEJ;AACF;AAEO,MAAM,4CAAkC,CAAC,KAAK;IACnD,MAAM,SAAS,OAAO;IAEtB,kEAAkE;IAElE,sDAAsD;IAEtD,MAAM,WAAoB;QACxB;YAAE,GAAG;YAAG,GAAG;QAAE;WACV,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;WACjC,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,SAAS,KAAK;KAC3C;IAED,IAAI,SAAS;IACb,4BAA4B;IAC5B,SAAS,OAAO,CAAC,CAAC,IAAI;QACpB,SAAS,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IAEb,uBAAuB;IACvB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG;QAClC,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;IAEA,uBAAuB;IACvB,MAAM,cAAc,SAAS;IAC7B,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QAChD,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;AAC9C;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,MAAM,cAAc,OAAO;IAC3B,MAAM,cAAc,OAAO;IAC3B,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;QAC9B,MAAM,SAAS,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QACvC,kDAAkD;QAElD,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,OAAO,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YACrC,MAAM,OAAO,AAAE,CAAA,IAAI,CAAA,IAAK,QAAS,KAAK,EAAE,GAAG;YAE3C,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAE1D,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS;YAAG,GAAG;QAAE;QACtB;YAAE,GAAG;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACtC;YAAE,GAAG,CAAC;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACvC;YAAE,GAAG,CAAC,SAAS;YAAG,GAAG;QAAE;QACvB;YAAE,GAAG,CAAC;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;QACxC;YAAE,GAAG;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;KACxC;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA6C;IACxD,cAAc;IACd,YAAY;IACZ,eAAe;IACf,WAAW;IACX,YAAY;IACZ,cAAc;IACd,OAAO;IACP,WAAW;AACb;;;ALnMO,MAAM,4CAAuC;IAClD,GAAG,CAAA,GAAA,yCAAU,CAAC;IACd,GAAG,CAAA,GAAA,yCAAY,CAAC;IAChB,GAAG,CAAA,GAAA,yCAAW,CAAC;AACjB;;;ADSO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAAuB;IAEvB,MAAM,aAAE,SAAS,eAAE,WAAW,eAAE,WAAW,QAAE,IAAI,YAAE,QAAQ,EAAE,GAAG;IAChE,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAClC,IAAI,SAAS,GAAG;IAChB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK;QAClB,IAAI,IAAI;QACR,IAAI,MAAM;IACZ;IAEA,IAAI,OAAO;AACb;AAKO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAA0B;IAE1B,MAAM,aACJ,SAAS,eACT,WAAW,eACX,WAAW,QACX,IAAI,YACJ,QAAQ,YACR,WAAW,EAAE,kBACb,iBAAiB,6BACjB,cAAc,uBACd,mBAAmB,iBACnB,aAAa,cACb,SAAS,mBACT,eAAe,EAChB,GAAG;IAEJ,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAElC,uBAAuB;IACvB,IAAI,aAAa,GAAG;QAClB,IAAI,UAAU,GAAG;QACjB,IAAI,WAAW,GAAG,aAAa;QAC/B,IAAI,aAAa,GAAG;QACpB,IAAI,aAAa,GAAG;IACtB;IAEA,6BAA6B;IAC7B,IAAI,iBAAiB;QACnB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;QAC5D,KAAK,YAAY,CAAC,GAAG;QACrB,KAAK,YAAY,CAAC,GAAG;QACrB,IAAI,SAAS,GAAG;IAClB,OACE,IAAI,SAAS,GAAG;IAGlB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK;QAClB,IAAI,IAAI;QACR,IAAI,MAAM;IACZ;IAEA,gDAAgD;IAChD,IAAI,aAAa,GACf,IAAI,UAAU,GAAG;IAGnB,yCAAyC;IACzC,IAAI,SAAS,MAAM,GAAG,GACpB,CAAA,GAAA,yCAAc,EAAE,aAAa,CAAC,KAAK,UAAU;QAC3C,UAAU;qBACV;0BACA;wBACA;IACF;IAGF,IAAI,OAAO;AACb;;;;;AOzHA;;CAEC,GAsBM,MAAM,4CAAmC;IAC9C,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;IACd,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,gBAAgB;AAClB;;;AXZA,uEAAuE;AAEvE,MAAM,qCAAe;IACnB;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,uCAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,sCAAgB;IACpB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAWD,MAAM,0CAAuC;IAC3C;IACA;IACA;IACA;IACA;CACD;AAED,uEAAuE;AAEvE,SAAS,gCACP,GAAiB,EACjB,UAAkB,EAClB,UAAoB;IAEpB,MAAM,SAAS,IAAI,aAAa;IAChC,MAAM,WAAW,MAAM,aAAa;IACpC,MAAM,UAAU,MAAM,aAAa;IACnC,MAAM,QAAQ,SAAS,WAAW;IAClC,MAAM,OAAO,QAAQ;IAErB,IAAI;IACJ,IAAI,OAAO,QAAQ,OAAO;SACrB,IAAI,OAAO,SAAS,UAAU,OAAO;SACrC,OAAO;IAEZ,MAAM,YAAY,KAAK,MAAM,CAAC,CAAC,IAAM,WAAW,QAAQ,CAAC;IACzD,IAAI,UAAU,MAAM,KAAK,GACvB,OAAO,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,MAAM,EAAE;IAE1D,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,EAAE;AACxD;AAEA,uEAAuE;AAEvE,SAAS,iCACP,CAAS,EACT,CAAS,EACT,KAAa,EACb,GAAiB;IAEjB,iEAAiE;IACjE,MAAM,KAAK,IAAI;IACf,MAAM,KAAK,IAAI;IACf,OACE,AAAC,CAAA,KAAK,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,QAAQ,SAAS,MAC/C,KAAK,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,QAAQ,SAAS,MAChD,KAAK,GAAG,CAAC,KAAK,MAAM,KAAK,MAAM,QAAQ,SAAS,GAAE,IAClD,MACF;AAEJ;AAEA,uEAAuE;AAEvE,SAAS,6CACP,IAAqB,EACrB,GAAiB,EACjB,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,EAAU,EACV,EAAU;IAEV,OAAQ;QACN,KAAK;YAAU;gBACb,MAAM,QAAQ,QAAQ,KAAK,EAAE,GAAG;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,OAAO;gBACjC,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAU;gBACb,MAAM,IAAI,aAAa;gBACvB,MAAM,QAAQ,IAAI,QAAQ;gBAC1B,MAAM,QAAQ,IAAI,KAAK,EAAE,GAAG,IAAI;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,IAAI,OAAO,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;gBAC5C,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAoB;gBACvB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;gBACrC,MAAM,QAAQ,QAAQ;gBACtB,MAAM,QAAQ,SAAS;gBACvB,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,OAAO;oBACL,GAAG,KAAK,QAAQ,QAAQ;oBACxB,GAAG,KAAK,QAAQ,QAAQ;gBAC1B;YACF;QACA,KAAK;YAAa;gBAChB,0DAA0D;gBAC1D,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC3C,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,0CAA0C;gBAC1C,MAAM,aAAa,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,OAAO,KAAK;gBACtD,MAAM,MAAM,QAAS,CAAA,OAAO,eAAe,GAAE;gBAC7C,MAAM,MAAM,SAAU,CAAA,OAAO,eAAe,GAAE;gBAC9C,MAAM,SAAS,KAAK,GAAG,CAAC,OAAO,UAAU;gBACzC,OAAO;oBACL,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;oBAClC,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;gBACpC;YACF;QACA,KAAK;QACL;YACE,kEAAkE;YAClE,OAAO;gBAAE,GAAG,QAAQ;gBAAO,GAAG,QAAQ;YAAO;IAEjD;AACF;AAEA,uEAAuE;AAEvE,SAAS,yCACP,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,MAAgB,EAChB,GAAiB;IAEjB,iDAAiD;IACjD,MAAM,KAAK,IAAI;IACf,MAAM,KAAK,IAAI;IACf,qDAAqD;IACrD,MAAM,WAAW,AAAC,CAAA,KAAK,MAAM,KAAK,GAAE,IAAM,CAAA,OAAO,MAAM,GAAG,CAAA;IAC1D,MAAM,UAAU,KAAK,KAAK,CAAC,YAAY,OAAO,MAAM;IACpD,0BAA0B;IAC1B,OAAO,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK;AAC3C;AAIO,SAAS,0CACd,GAA6B,EAC7B,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IACrE,MAAM,SACJ,KAAK,UACL,MAAM,YACN,QAAQ,UACR,MAAM,gBACN,YAAY,gBACZ,YAAY,eACZ,WAAW,oBACX,gBAAgB,EACjB,GAAG;IAEJ,YAAY,cAAc,GACxB,YAAY,cAAc,IAAI,KAAK,KAAK,CAAC,WAAW,WAAW;IAEjE,MAAM,cAAc,IAAI,CAAA,GAAA,yCAAgB,EAAE;IAC1C,MAAM,SAAS,YAAY,SAAS;IACpC,MAAM,CAAC,SAAS,MAAM,GAAG,YAAY,mBAAmB;IAExD,MAAM,aAAa,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAK;IACpC,MAAM,cAAc,KAAK,GAAG,CAAC,OAAO,UAAU;IAC9C,MAAM,kBAAkB,eAAe;IACvC,MAAM,kBAAkB,eAAe;IAEvC,MAAM,MAAM,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE;IACnC,MAAM,KAAK,QAAQ;IACnB,MAAM,KAAK,SAAS;IAEpB,kEAAkE;IAClE,MAAM,WAAW,KAAK,KAAK,CAAC,IAAI;IAChC,MAAM,SAAS,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;IAC3D,OAAO,YAAY,CAAC,GAAG;IACvB,OAAO,YAAY,CAAC,GAAG;IACvB,IAAI,SAAS,GAAG;IAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;IAE1B,kEAAkE;IAClE,MAAM,kBACJ,uCAAiB,CAAC,KAAK,KAAK,CAAC,QAAQ,wCAAkB,MAAM,EAAE;IAEjE,kEAAkE;IAClE,MAAM,WAAW,IAAI,KAAK,KAAK,CAAC,QAAQ;IACxC,MAAM,cAAiE,EAAE;IACzE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,YAAY,IAAI,CAAC;QACf,GAAG,QAAS,CAAA,MAAM,QAAQ,GAAE;QAC5B,GAAG,SAAU,CAAA,MAAM,QAAQ,GAAE;QAC7B,UAAU,MAAM,QAAQ;IAC1B;IAGF,SAAS,eAAe,EAAU,EAAE,EAAU;QAC5C,IAAI,UAAU,WAAW,CAAC,EAAE;QAC5B,IAAI,UAAU;QACd,KAAK,MAAM,MAAM,YAAa;YAC5B,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;YACzC,IAAI,IAAI,SAAS;gBACf,UAAU;gBACV,UAAU;YACZ;QACF;QACA,MAAM,OAAO,QAAQ,QAAQ,GAAG,QAAQ;QACxC,OAAO;YAAC,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;YAAM,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;SAAK;IACrE;IAEA,mEAAmE;IACnE,MAAM,iBAAiB,QAAQ,KAAK,EAAE,GAAG;IACzC,MAAM,YAAY,MAAM,QAAQ;IAEhC,SAAS,UAAU,CAAS,EAAE,CAAS;QACrC,OACE,iBACA,KAAK,GAAG,CAAC,AAAC,IAAI,QAAS,YAAY,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,MAC5D,KAAK,GAAG,CAAC,AAAC,IAAI,SAAU,YAAY,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG;IAEjE;IAEA,kEAAkE;IAClE,MAAM,iBAAgE,EAAE;IAExE,IAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAS;QAC3C,MAAM,aAAa,SAAS,IAAI,QAAS,CAAA,SAAS,CAAA,IAAK;QACvD,MAAM,YACJ,YAAY,cAAc,GAC1B,KAAK,KAAK,CAAC,QAAQ,YAAY,cAAc,GAAG;QAClD,MAAM,eAAe,KAAK,GAAG,CAAC,MAAM,cAAc,QAAQ;QAC1D,MAAM,iBAAiB,IAAI,QAAQ;QAEnC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,kDAAkD;YAClD,MAAM,SAAS,6CACb,iBACA,KACA,OACA,QACA,GACA,WACA,IACA;YAEF,MAAM,CAAC,GAAG,EAAE,GAAG,eAAe,OAAO,CAAC,EAAE,OAAO,CAAC;YAEhD,2BAA2B;YAC3B,MAAM,QAAQ,gCAAU,KAAK,YAAY;YAEzC,8BAA8B;YAC9B,MAAM,QAAQ,KAAK,GAAG,CAAC,OAAO;YAC9B,MAAM,OACJ,AAAC,CAAA,kBAAkB,QAAS,CAAA,kBAAkB,eAAc,CAAC,IAC7D;YAEF,2DAA2D;YAC3D,MAAM,WACJ,oBAAoB,eAChB,AAAC,UAAU,GAAG,KAAK,MAAO,KAAK,EAAE,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,KACpD,QAAQ;YAEd,qCAAqC;YACrC,MAAM,WAAW,yCAAmB,GAAG,GAAG,OAAO,QAAQ,QAAQ;YACjE,MAAM,aAAa,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE;YAC5D,MAAM,YAAY,CAAA,GAAA,yCAAU,EAAE,UAAU,KAAK;YAC7C,MAAM,cAAc,CAAA,GAAA,yCAAU,EAAE,YAAY,KAAK;YAEjD,wBAAwB;YACxB,MAAM,YAAY,MAAM,QAAQ;YAChC,MAAM,kBAAkB,CAAA,GAAA,yCAAW,EAAE,WAAW;YAEhD,MAAM,cAAc,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK;YAE1C,IAAI,WAAW,GAAG,eAAgB,CAAA,MAAM,QAAQ,GAAE;YAElD,mCAAmC;YACnC,MAAM,WAAW,oCAAc,QAAQ,CAAC;YACxC,MAAM,aAAa,WAAW,OAAO;YACrC,MAAM,UAAU,QAAQ;YACxB,MAAM,aAAa,UAAU,AAAC,CAAA,IAAI,QAAQ,EAAC,IAAK,cAAc;YAE9D,wBAAwB;YACxB,MAAM,cAAc,QAAQ;YAC5B,MAAM,cAAc,cAChB,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,OAC5D;YAEJ,CAAA,GAAA,yCAAqB,EAAE,KAAK,OAAO,GAAG,GAAG;gBACvC,WAAW;6BACX;6BACA;sBACA;0BACA;gBACA,gBAAgB;4BAChB;gBACA,WAAW,UAAU,CAAA,GAAA,yCAAW,EAAE,WAAW,OAAO;gBACpD,iBAAiB;YACnB;YAEA,eAAe,IAAI,CAAC;mBAAE;mBAAG;sBAAG;YAAK;YAEjC,sEAAsE;YACtE,IAAI,OAAO,kBAAkB,OAAO,QAAQ,MAAM;gBAChD,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC1C,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;oBACnC,MAAM,aAAa,gCACjB,KACA,KAAK,GAAG,CAAC,GAAG,aAAa,MACzB;oBAEF,MAAM,YAAY,OAAQ,CAAA,OAAO,QAAQ,IAAG;oBAC5C,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,WAAW,QAAQ;oBACzB,MAAM,YAAY,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,MAC5D,MAAM,QAAQ;oBAGhB,IAAI,WAAW,GAAG,eAAe;oBACjC,CAAA,GAAA,yCAAqB,EACnB,KACA,YACA,IAAI,WACJ,IAAI,WACJ;wBACE,WAAW;wBACX,aAAa,CAAA,GAAA,yCAAW,EAAE,aAAa;wBACvC,aAAa,cAAc;wBAC3B,MAAM;wBACN,UAAU;wBACV,gBAAgB;oBAClB;gBAEJ;YACF;QACF;IACF;IAEA,kEAAkE;IAClE,gEAAgE;IAChE,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC5C,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,MAAM,QAAQ,KAAK,KAAK,KAAK,CAAC,QAAQ;QACtC,MAAM,UAAU,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;QAElC,IAAI,WAAW,GAAG,OAAO,QAAQ;QACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAC3B,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EACzC;QAEF,IAAI,SAAS,GAAG,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK;QAEtC,IAAI,SAAS;QACb,IAAI,MAAM,CAAC,IAAI;QAEf,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,QAAQ,UAAU,IAAI,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK;YAClD,MAAM,KAAK,GAAG,CAAC,SAAS;YACxB,MAAM,KAAK,GAAG,CAAC,SAAS;YAExB,iBAAiB;YACjB,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;YACnD,IAAI,MAAM,CAAC,IAAI;QACjB;QACA,IAAI,MAAM;IACZ;IAEA,kEAAkE;IAClE,sDAAsD;IACtD,MAAM,WAAW,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;IACjD,MAAM,eAAe,KAAK,KAAK,CAAC,AAAC,QAAQ,SAAU;IACnD,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,MAAM,KAAK,aAAa;QACxB,MAAM,KAAK,aAAa;QACxB,MAAM,aAAa,aAAa,MAAM,MAAM;QAC5C,MAAM,QAAQ,OAAO,aAAa;QAClC,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC;QACnE,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,aAAa,IAAI;IAC5C;IAEA,kEAAkE;IAClE,IAAI,eAAe,MAAM,GAAG,GAAG;QAC7B,MAAM,YAAY,KAAK,KAAK,CAAC,AAAC,IAAK,CAAA,QAAQ,MAAK,IAAO;QACvD,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM;YACrD,MAAM,SACJ,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,eAAe,MAAM,GAAG;YAC7D,MAAM,OAAO,AAAC,CAAA,OAAO,MAAK,IAAK,eAAe,MAAM;YAEpD,MAAM,IAAI,cAAc,CAAC,KAAK;YAC9B,MAAM,IAAI,cAAc,CAAC,KAAK;YAE9B,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI;YAC5B,MAAM,QAAQ,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;YAErC,MAAM,MAAM,KAAK,AAAC,CAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YACvC,MAAM,MAAM,KAAK,AAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YAEtC,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAC3B,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EACzC;YAGF,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnB,IAAI,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,MAAM;QACZ;IACF;IAEA,IAAI,WAAW,GAAG;AACpB;;;;;AD3dA;;;;;;;;;CASC,GACD,SAAS,0CACP,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IACrE,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,GAAG;IAE1B,MAAM,SAAS,CAAA,GAAA,mBAAW,EAAE,OAAO;IACnC,MAAM,MAAM,OAAO,UAAU,CAAC;IAE9B,CAAA,GAAA,yCAAY,EAAE,KAAK,SAAS;IAE5B,OAAO,OAAO,QAAQ,CAAC;AACzB;AAEA;;;;;;;;;;CAUC,GACD,SAAS,0CACP,WAAmB,EACnB,SAAiB,EACjB,OAAe,EACf,QAAQ,EAAE,EACV,KAAa,EACb,MAAc;IAEd,IAAI,CAAC,kBAAc,YACjB,iBAAa,WAAW;QAAE,WAAW;IAAK;IAG5C,MAAM,WAAW,QACb,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GACxD,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,aAAa,YAAU,WAAW;IACxC,qBAAiB,YAAY;IAC7B,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC;IAEtC,OAAO;AACT","sources":["src/index.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":["import { createCanvas } from \"@napi-rs/canvas\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Generate an abstract art PNG buffer from a git hash (Node.js only).\n *\n * Uses @napi-rs/canvas under the hood to create an off-screen canvas,\n * renders the hash-derived art, and returns the result as a PNG Buffer.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns PNG buffer of the generated image\n */\nfunction generateImageFromHash(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Buffer {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file (Node.js only).\n *\n * @param imageBuffer - The PNG buffer of the generated image\n * @param outputDir - The directory to save the image\n * @param gitHash - The git hash used to generate the image\n * @param label - Optional label for the output filename\n * @param width - The width of the generated image\n * @param height - The height of the generated image\n * @returns Path to the saved image\n */\nfunction saveImageToFile(\n imageBuffer: Buffer,\n outputDir: string,\n gitHash: string,\n label = \"\",\n width: number,\n height: number,\n): string {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile, 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 * 2. Composition mode — hash selects: radial, flow-field, spiral, grid-subdivision, or clustered\n * 3. Color field — smooth positional color blending across the canvas\n * 4. Shape layers — weighted selection, focal-point placement, transparency, glow, gradients, jitter\n * 5. Recursive nesting — some shapes contain smaller shapes inside\n * 6. Flow-line pass — bezier curves following a hash-derived vector field\n * 7. Noise texture overlay — subtle grain for organic feel\n * 8. Organic connecting curves — beziers between nearby shapes\n */\nimport { SacredColorScheme, hexWithAlpha, jitterColor } from \"./canvas/colors\";\nimport { enhanceShapeGeneration } 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: simple 2D value noise (hash-seeded) ─────────────────────\n\nfunction valueNoise(\n x: number,\n y: number,\n scale: number,\n rng: () => number,\n): number {\n // Cheap pseudo-noise: combine sin waves at different frequencies\n const nx = x / scale;\n const ny = y / scale;\n return (\n (Math.sin(nx * 1.7 + ny * 2.3 + rng() * 0.001) * 0.5 +\n Math.sin(nx * 3.1 - ny * 1.9 + rng() * 0.001) * 0.3 +\n Math.sin(nx * 5.3 + ny * 4.7 + rng() * 0.001) * 0.2) *\n 0.5 +\n 0.5\n );\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 // Pick one of 3-5 cluster centers, then scatter around it\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n // Deterministic cluster center from index\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 // Random position, will be adjusted by flow field direction later\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 // Blend between palette colors based on position\n const nx = x / width;\n const ny = y / height;\n // Use position to bias which palette color is chosen\n const posIndex = (nx * 0.6 + ny * 0.4) * (colors.length - 1);\n const baseIdx = Math.floor(posIndex) % colors.length;\n // Then jitter it slightly\n return jitterColor(colors[baseIdx], rng, 0.08);\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 // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 3. Focal points ────────────────────────────────────────────\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 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 (for flow-field mode & line pass) ─\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\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 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 // 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 const fillBase = getPositionalColor(x, y, width, height, colors, rng);\n const strokeBase = colors[Math.floor(rng() * colors.length)];\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 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 });\n\n shapePositions.push({ x, y, size });\n\n // ── 5b. Recursive nesting: ~15% of larger shapes get inner shapes ──\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 },\n );\n }\n }\n }\n }\n\n // ── 6. Flow-line pass ──────────────────────────────────────────\n // Draw flowing curves that follow the hash-derived vector field\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\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n colors[Math.floor(rng() * colors.length)],\n 0.4,\n );\n ctx.lineWidth = (0.5 + rng() * 1.5) * scaleFactor;\n\n ctx.beginPath();\n ctx.moveTo(fx, fy);\n\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 // Stay in bounds\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n ctx.lineTo(fx, fy);\n }\n ctx.stroke();\n }\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n // Subtle grain rendered as tiny semi-transparent dots\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 } from \"../utils\";\n\n/**\n * Generates a color scheme based on a given Git hash.\n */\nexport function generateColorScheme(gitHash: string): string[] {\n const seed = gitHashToSeed(gitHash);\n const scheme = new ColorScheme();\n scheme\n .from_hue(seed % 360)\n .scheme(\"analogic\")\n .variation(\"soft\");\n\n let colors = scheme.colors().map((hex: string) => `#${hex}`);\n\n const contrastingHue = (seed + 180) % 360;\n const contrastingScheme = new ColorScheme();\n contrastingScheme.from_hue(contrastingHue).scheme(\"mono\").variation(\"soft\");\n colors.push(`#${contrastingScheme.colors()[0]}`);\n\n return colors;\n}\n\ninterface MetallicColors {\n gold: string;\n silver: string;\n copper: string;\n bronze: string;\n}\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n private metallic: MetallicColors;\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n this.metallic = this.generateMetallicColors();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(\"analogic\")\n .variation(\"soft\")\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(\"soft\")\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(\"soft\")\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateMetallicColors(): MetallicColors {\n return {\n gold: \"#FFD700\",\n silver: \"#C0C0C0\",\n copper: \"#B87333\",\n bronze: \"#CD7F32\",\n };\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","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\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}\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 * Enhanced shape drawing with glow, gradient fills, 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 } = 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 ctx.fill();\n ctx.stroke();\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":"module.js.map","sourceRoot":"../"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generate an abstract art image from a git hash with custom configuration
|
|
3
3
|
* @param {string} gitHash - The git hash to use as a seed
|
|
4
|
-
* @param {
|
|
4
|
+
* @param {object} [config={}] - Configuration options
|
|
5
5
|
* @returns {Buffer} PNG buffer of the generated image
|
|
6
6
|
*/
|
|
7
7
|
export function generateImageFromHash(gitHash: string, config?: {}): Buffer;
|
|
8
8
|
/**
|
|
9
9
|
* Save the generated image to a file
|
|
10
|
-
* @param {Buffer} imageBuffer - The PNG buffer of the generated image
|
|
11
|
-
* @param {string} outputDir - The directory to save the image
|
|
12
|
-
* @param {string} gitHash - The git hash used to generate the image
|
|
13
|
-
* @param {string} [label=''] - Label for the output file
|
|
14
|
-
* @param {number} width - The width of the generated image
|
|
15
|
-
* @param {number} height - The height of the generated image
|
|
16
|
-
* @returns {string} Path to the saved image
|
|
17
10
|
*/
|
|
18
|
-
export function saveImageToFile(imageBuffer: string, outputDir: string, gitHash: string | any[], label: string | undefined, width: any, height: any):
|
|
11
|
+
export function saveImageToFile(imageBuffer: string, outputDir: string, gitHash: string | any[], label: string | undefined, width: any, height: any): any;
|
|
19
12
|
|
|
20
13
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"ASQA;;;;;GAKG;AACH,sCAA+B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,UA2K1D;AAED;;;;;;;;;GASG;AACH,gCACE,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,GAAG,EAAE,EACvB,KAAK,oBAAK,EACV,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,GAAG,UAeZ","sources":["src/src/lib/canvas/shapes/basic.ts","src/src/lib/constants.ts","src/src/lib/canvas/shapes/utils.ts","src/src/lib/canvas/shapes/complex.ts","src/src/lib/canvas/shapes/sacred.ts","src/src/lib/canvas/shapes/index.ts","src/src/lib/utils.ts","src/src/lib/canvas/colors.ts","src/src/lib/canvas/draw.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"import { createCanvas } from \"@napi-rs/canvas\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { SacredColorScheme } from \"./lib/canvas/colors\";\nimport { enhanceShapeGeneration } from \"./lib/canvas/draw\";\nimport { shapes } from \"./lib/canvas/shapes\";\nimport { getRandomFromHash } from \"./lib/utils\";\n\n/**\n * Generate an abstract art image from a git hash with custom configuration\n * @param {string} gitHash - The git hash to use as a seed\n * @param {ArtConfig} [config={}] - Configuration options\n * @returns {Buffer} PNG buffer of the generated image\n */\nfunction generateImageFromHash(gitHash: string, config = {}) {\n // Default configuration\n const defaultConfig = {\n width: 2048,\n height: 2048,\n gridSize: 12,\n layers: 2,\n minShapeSize: 20,\n maxShapeSize: 600,\n baseOpacity: 0.8,\n opacityReduction: 0.4,\n shapesPerLayer: 0,\n };\n\n // Merge provided config with defaults\n const finalConfig = { ...defaultConfig, ...config };\n const {\n width,\n height,\n gridSize,\n layers,\n minShapeSize,\n maxShapeSize,\n baseOpacity,\n opacityReduction,\n } = finalConfig;\n\n // Calculate shapes per layer based on grid size if not provided\n finalConfig.shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorPalette(\"chakra\");\n\n // Create a gradient background\n const gradient = ctx.createLinearGradient(0, 0, width, height);\n gradient.addColorStop(0, colorScheme.baseScheme[0]);\n gradient.addColorStop(1, colorScheme.baseScheme[1]);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n\n const shapeNames = Object.keys(shapes);\n\n const cellWidth = width / gridSize;\n const cellHeight = height / gridSize;\n\n // Scale shape sizes based on canvas dimensions\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n for (let layer = 0; layer < layers; layer++) {\n const numShapes =\n finalConfig.shapesPerLayer +\n Math.floor(\n getRandomFromHash(gitHash, layer, 0, finalConfig.shapesPerLayer / 2),\n );\n const layerOpacity = baseOpacity - layer * opacityReduction;\n\n for (let i = 0; i < numShapes; i++) {\n const gridX = Math.floor(i / gridSize);\n const gridY = i % gridSize;\n\n const cellOffsetX = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 2,\n 0,\n cellWidth,\n );\n const cellOffsetY = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 2 + 1,\n 0,\n cellHeight,\n );\n\n const x = gridX * cellWidth + cellOffsetX;\n const y = gridY * cellHeight + cellOffsetY;\n\n const shape =\n shapeNames[\n Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 3,\n 0,\n shapeNames.length,\n ),\n )\n ];\n const size =\n adjustedMinSize +\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 4,\n 0,\n adjustedMaxSize - adjustedMinSize,\n );\n const rotation = getRandomFromHash(\n gitHash,\n layer * numShapes + i * 5,\n 0,\n 360,\n );\n\n const fillColorIndex = Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 6,\n 0,\n Object.keys(colors).length,\n ),\n );\n const strokeColorIndex = Math.floor(\n getRandomFromHash(\n gitHash,\n layer * numShapes + i * 7,\n 0,\n Object.keys(colors).length,\n ),\n );\n\n ctx.globalAlpha = layerOpacity;\n // drawShape(\n // ctx,\n // shape,\n // x,\n // y,\n // colors[fillColorIndex],\n // colors[strokeColorIndex],\n // 2 * scaleFactor,\n // size,\n // rotation\n // );\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: Object.values(colors)[fillColorIndex],\n strokeColor: Object.values(colors)[strokeColorIndex],\n strokeWidth: 1.5 * scaleFactor,\n size,\n rotation,\n // Optionally add pattern combinations\n // patterns:\n // Math.random() > 0.7 ? PatternPresets.cosmicTree(size) : [],\n proportionType: \"GOLDEN_RATIO\",\n });\n }\n\n // Add connecting lines scaled to canvas size\n ctx.globalAlpha = 0.2;\n ctx.strokeStyle = Object.values(colors)[Object.keys(colors).length - 1];\n ctx.lineWidth = 1 * scaleFactor;\n\n const numLines = Math.floor((15 * (width * height)) / (1024 * 1024));\n for (let i = 0; i < numLines; i++) {\n const x1 = getRandomFromHash(gitHash, i * 4, 0, width);\n const y1 = getRandomFromHash(gitHash, i * 4 + 1, 0, height);\n const x2 = getRandomFromHash(gitHash, i * 4 + 2, 0, width);\n const y2 = getRandomFromHash(gitHash, i * 4 + 3, 0, height);\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n }\n\n return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file\n * @param {Buffer} imageBuffer - The PNG buffer of the generated image\n * @param {string} outputDir - The directory to save the image\n * @param {string} gitHash - The git hash used to generate the image\n * @param {string} [label=''] - Label for the output file\n * @param {number} width - The width of the generated image\n * @param {number} height - The height of the generated image\n * @returns {string} Path to the saved image\n */\nfunction saveImageToFile(\n imageBuffer: string,\n outputDir: string,\n gitHash: string | any[],\n label = \"\",\n width: any,\n height: any,\n) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile };\n\n// Usage example:\n/*\nimport { generateImageFromHash, saveImageToFile } from 'git-hash-art';\n\nconst gitHash = '1234567890abcdef1234567890abcdef12345678';\nconst imageBuffer = generateImageFromHash(gitHash, { width: 1024, height: 1024 });\nconst savedImagePath = saveImageToFile(imageBuffer, './output', gitHash, 'example', 1024, 1024);\nconsole.log(`Image saved to: ${savedImagePath}`);\n*/\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
|
1
|
+
{"mappings":"AS2EA;;;;;GAKG;AACH,sCAA+B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,UAoM1D;AAED;;GAEG;AACH,gCACE,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,GAAG,EAAE,EACvB,KAAK,oBAAK,EACV,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,GAAG,OAeZ","sources":["src/src/lib/utils.ts","src/src/lib/canvas/colors.ts","src/src/lib/canvas/shapes/basic.ts","src/src/lib/constants.ts","src/src/lib/canvas/shapes/utils.ts","src/src/lib/canvas/shapes/complex.ts","src/src/lib/canvas/shapes/sacred.ts","src/src/lib/canvas/shapes/index.ts","src/src/lib/canvas/draw.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"import { createCanvas } from \"@napi-rs/canvas\";\nimport {\n SacredColorScheme,\n hexWithAlpha,\n jitterColor,\n} from \"./lib/canvas/colors\";\nimport { enhanceShapeGeneration } from \"./lib/canvas/draw\";\nimport { shapes } from \"./lib/canvas/shapes\";\nimport { createRng, seedFromHash } from \"./lib/utils\";\n\n// Shape categories for weighted selection per layer\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/**\n * Pick a shape name using layer-weighted selection.\n * Early layers favor basic shapes; later layers favor complex/sacred.\n */\nfunction pickShape(\n rng: () => number,\n layerRatio: number,\n shapeNames: string[],\n): string {\n // layerRatio: 0 = first layer, 1 = last layer\n const basicWeight = 1 - layerRatio * 0.6;\n const complexWeight = 0.3 + layerRatio * 0.3;\n const sacredWeight = 0.1 + layerRatio * 0.4;\n const total = basicWeight + complexWeight + sacredWeight;\n\n const roll = rng() * total;\n let pool: string[];\n if (roll < basicWeight) {\n pool = BASIC_SHAPES;\n } else if (roll < basicWeight + complexWeight) {\n pool = COMPLEX_SHAPES;\n } else {\n pool = SACRED_SHAPES;\n }\n\n // Filter to shapes that actually exist in the registry\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/**\n * Generate an abstract art image from a git hash with custom configuration\n * @param {string} gitHash - The git hash to use as a seed\n * @param {object} [config={}] - Configuration options\n * @returns {Buffer} PNG buffer of the generated image\n */\nfunction generateImageFromHash(gitHash: string, config = {}) {\n const defaultConfig = {\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\n const finalConfig = { ...defaultConfig, ...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 canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n // --- Color scheme derived from hash ---\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColors();\n const [bgStart, bgEnd] = colorScheme.getBackgroundColors();\n\n // --- Radial gradient background for depth ---\n const cx = width / 2;\n const cy = height / 2;\n const bgRadius = Math.hypot(cx, cy);\n const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n gradient.addColorStop(0, bgStart);\n gradient.addColorStop(1, bgEnd);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\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 // One master RNG seeded from the full hash\n const rng = createRng(seedFromHash(gitHash));\n\n // --- Focal points: 1-3 hash-derived attractors that bias shape placement ---\n const numFocal = 1 + Math.floor(rng() * 2); // 1-2 focal points\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), // keep away from edges\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n\n /**\n * Bias a position toward the nearest focal point.\n * Returns a blended position between the random point and the focal point.\n */\n function applyFocalBias(rx: number, ry: number): [number, number] {\n // Find nearest focal point\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 // Blend toward focal point based on strength and a random factor\n const pull = nearest.strength * rng() * 0.5;\n return [\n rx + (nearest.x - rx) * pull,\n ry + (nearest.y - ry) * pull,\n ];\n }\n\n const shapePositions: Array<{ x: number; y: number }> = [];\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\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n for (let i = 0; i < numShapes; i++) {\n // Random position biased toward focal points\n const rawX = rng() * width;\n const rawY = rng() * height;\n const [x, y] = applyFocalBias(rawX, rawY);\n\n // Weighted shape selection: basic early, complex/sacred later\n const shape = pickShape(rng, layerRatio, shapeNames);\n\n const sizeT = Math.pow(rng(), 1.8);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale;\n\n const rotation = rng() * 360;\n\n // Color jitter: slight variation on each pick for organic feel\n const baseFill = colors[Math.floor(rng() * colors.length)];\n const baseStroke = colors[Math.floor(rng() * colors.length)];\n const fillColor = jitterColor(baseFill, rng, 0.08);\n const strokeColor = jitterColor(baseStroke, rng, 0.06);\n\n // Semi-transparent fill for watercolor layering effect\n const fillAlpha = 0.25 + 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: ~25% of shapes get a soft glow, more likely on sacred shapes\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: ~30% of shapes get a radial gradient\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 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 });\n\n shapePositions.push({ x, y });\n }\n }\n\n // --- Organic connecting curves between nearby shapes ---\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.08 + rng() * 0.12;\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 return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file\n */\nfunction saveImageToFile(\n imageBuffer: string,\n outputDir: string,\n gitHash: string | any[],\n label = \"\",\n width: any,\n height: any,\n) {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile };\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-hash-art",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"author": "gfargo <ghfargo@gmail.com>",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"watch": "parcel watch",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,css,md}'",
|
|
11
11
|
"format:check": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json,css,md}'",
|
|
12
12
|
"release": "release-it",
|
|
13
|
+
"test": "vitest --run",
|
|
13
14
|
"test:publish": "npm publish --dry-run",
|
|
14
15
|
"prepublishOnly": "yarn build"
|
|
15
16
|
},
|
|
@@ -17,18 +18,61 @@
|
|
|
17
18
|
"main": "dist/main.js",
|
|
18
19
|
"module": "dist/module.js",
|
|
19
20
|
"types": "dist/types.d.ts",
|
|
21
|
+
"browser": "dist/browser.js",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"node": {
|
|
25
|
+
"require": "./dist/main.js",
|
|
26
|
+
"import": "./dist/module.js",
|
|
27
|
+
"types": "./dist/types.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"browser": {
|
|
30
|
+
"import": "./dist/browser.js",
|
|
31
|
+
"types": "./dist/browser-types.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"default": "./dist/module.js"
|
|
34
|
+
},
|
|
35
|
+
"./browser": {
|
|
36
|
+
"import": "./dist/browser.js",
|
|
37
|
+
"types": "./dist/browser-types.d.ts"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"targets": {
|
|
41
|
+
"main": {
|
|
42
|
+
"context": "node",
|
|
43
|
+
"source": "src/index.ts"
|
|
44
|
+
},
|
|
45
|
+
"module": {
|
|
46
|
+
"context": "node",
|
|
47
|
+
"source": "src/index.ts"
|
|
48
|
+
},
|
|
49
|
+
"browser": {
|
|
50
|
+
"context": "browser",
|
|
51
|
+
"source": "src/browser.ts",
|
|
52
|
+
"outputFormat": "esmodule"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
20
55
|
"license": "MIT",
|
|
21
56
|
"dependencies": {
|
|
22
|
-
"@napi-rs/canvas": "^0.1.97",
|
|
23
57
|
"color-scheme": "^1.0.1"
|
|
24
58
|
},
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"@napi-rs/canvas": ">=0.1.97"
|
|
61
|
+
},
|
|
62
|
+
"peerDependenciesMeta": {
|
|
63
|
+
"@napi-rs/canvas": {
|
|
64
|
+
"optional": true
|
|
65
|
+
}
|
|
66
|
+
},
|
|
25
67
|
"devDependencies": {
|
|
68
|
+
"@napi-rs/canvas": "^0.1.97",
|
|
26
69
|
"@parcel/packager-ts": "^2.12.0",
|
|
27
70
|
"@parcel/transformer-typescript-types": "^2.12.0",
|
|
28
71
|
"@types/node": "^22.8.2",
|
|
29
72
|
"parcel": "^2.12.0",
|
|
30
73
|
"prettier": "^3.3.3",
|
|
31
74
|
"release-it": "^17.10.0",
|
|
32
|
-
"typescript": "^5.6.3"
|
|
75
|
+
"typescript": "^5.6.3",
|
|
76
|
+
"vitest": "^2"
|
|
33
77
|
}
|
|
34
78
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { createCanvas } from "@napi-rs/canvas";
|
|
3
|
+
|
|
4
|
+
const TEST_HASH = "46192e59d42f741c761cbea79462a8b3815dd905";
|
|
5
|
+
|
|
6
|
+
describe("@napi-rs/canvas compatibility", () => {
|
|
7
|
+
it("createCanvas produces a valid canvas with 2d context", () => {
|
|
8
|
+
const canvas = createCanvas(256, 256);
|
|
9
|
+
const ctx = canvas.getContext("2d");
|
|
10
|
+
expect(ctx).toBeDefined();
|
|
11
|
+
expect(typeof ctx.fillRect).toBe("function");
|
|
12
|
+
expect(typeof ctx.beginPath).toBe("function");
|
|
13
|
+
expect(typeof ctx.arc).toBe("function");
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("canvas.toBuffer produces a valid PNG buffer", () => {
|
|
17
|
+
const canvas = createCanvas(64, 64);
|
|
18
|
+
const ctx = canvas.getContext("2d");
|
|
19
|
+
ctx.fillStyle = "#ff0000";
|
|
20
|
+
ctx.fillRect(0, 0, 64, 64);
|
|
21
|
+
const buf = canvas.toBuffer("image/png");
|
|
22
|
+
expect(Buffer.isBuffer(buf)).toBe(true);
|
|
23
|
+
expect(buf.length).toBeGreaterThan(0);
|
|
24
|
+
// PNG magic bytes
|
|
25
|
+
expect(buf[0]).toBe(0x89);
|
|
26
|
+
expect(buf[1]).toBe(0x50); // P
|
|
27
|
+
expect(buf[2]).toBe(0x4e); // N
|
|
28
|
+
expect(buf[3]).toBe(0x47); // G
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("gradient API works", () => {
|
|
32
|
+
const canvas = createCanvas(128, 128);
|
|
33
|
+
const ctx = canvas.getContext("2d");
|
|
34
|
+
const gradient = ctx.createLinearGradient(0, 0, 128, 128);
|
|
35
|
+
gradient.addColorStop(0, "#000000");
|
|
36
|
+
gradient.addColorStop(1, "#ffffff");
|
|
37
|
+
ctx.fillStyle = gradient;
|
|
38
|
+
ctx.fillRect(0, 0, 128, 128);
|
|
39
|
+
const buf = canvas.toBuffer("image/png");
|
|
40
|
+
expect(buf.length).toBeGreaterThan(0);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateImageFromHash } from "../index";
|
|
3
|
+
|
|
4
|
+
const TEST_HASH = "46192e59d42f741c761cbea79462a8b3815dd905";
|
|
5
|
+
|
|
6
|
+
describe("generateImageFromHash", () => {
|
|
7
|
+
it("produces a valid PNG buffer with default config", () => {
|
|
8
|
+
const buf = generateImageFromHash(TEST_HASH, { width: 128, height: 128 });
|
|
9
|
+
expect(Buffer.isBuffer(buf)).toBe(true);
|
|
10
|
+
expect(buf[0]).toBe(0x89);
|
|
11
|
+
expect(buf[1]).toBe(0x50);
|
|
12
|
+
expect(buf[2]).toBe(0x4e);
|
|
13
|
+
expect(buf[3]).toBe(0x47);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("is deterministic — same hash produces identical output", () => {
|
|
17
|
+
const config = { width: 128, height: 128, gridSize: 4 };
|
|
18
|
+
const buf1 = generateImageFromHash(TEST_HASH, config);
|
|
19
|
+
const buf2 = generateImageFromHash(TEST_HASH, config);
|
|
20
|
+
expect(buf1.equals(buf2)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("different hashes produce different images", () => {
|
|
24
|
+
const config = { width: 128, height: 128, gridSize: 4 };
|
|
25
|
+
const buf1 = generateImageFromHash(TEST_HASH, config);
|
|
26
|
+
const buf2 = generateImageFromHash(
|
|
27
|
+
"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
|
|
28
|
+
config,
|
|
29
|
+
);
|
|
30
|
+
expect(buf1.equals(buf2)).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("respects custom dimensions", () => {
|
|
34
|
+
const buf = generateImageFromHash(TEST_HASH, { width: 64, height: 32 });
|
|
35
|
+
expect(buf.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("handles non-square aspect ratios", () => {
|
|
39
|
+
expect(() =>
|
|
40
|
+
generateImageFromHash(TEST_HASH, {
|
|
41
|
+
width: 1920,
|
|
42
|
+
height: 480,
|
|
43
|
+
gridSize: 8,
|
|
44
|
+
}),
|
|
45
|
+
).not.toThrow();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("handles high layer count without crashing", () => {
|
|
49
|
+
expect(() =>
|
|
50
|
+
generateImageFromHash(TEST_HASH, {
|
|
51
|
+
width: 128,
|
|
52
|
+
height: 128,
|
|
53
|
+
layers: 5,
|
|
54
|
+
gridSize: 4,
|
|
55
|
+
}),
|
|
56
|
+
).not.toThrow();
|
|
57
|
+
});
|
|
58
|
+
});
|