git-hash-art 0.0.4 → 0.1.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/CHANGELOG.md CHANGED
@@ -4,11 +4,17 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [0.1.0](https://github.com/gfargo/git-hash-art/compare/0.0.4...0.1.0)
8
+
9
+ - update shape drawing for platonic solids [`c26decd`](https://github.com/gfargo/git-hash-art/commit/c26decd8df9d7d47615efce37da8fdf554cdfcc4)
10
+
7
11
  #### [0.0.4](https://github.com/gfargo/git-hash-art/compare/0.0.3...0.0.4)
8
12
 
13
+ > 29 October 2024
14
+
9
15
  - Add TypeScript support and update scripts [`8983ca6`](https://github.com/gfargo/git-hash-art/commit/8983ca69e7232b52fce17e94901c7c67c2f9b62e)
10
16
  - Convert shape modules to TypeScript [`103ee82`](https://github.com/gfargo/git-hash-art/commit/103ee82663fc4f940574467601fa5fb4a72856e8)
11
- - Simplify linting and testing scripts [`ea364ea`](https://github.com/gfargo/git-hash-art/commit/ea364ea8912b70818d5b38ee41353e7c43a4d2c8)
17
+ - chore: release v0.0.4 [`73ce0cf`](https://github.com/gfargo/git-hash-art/commit/73ce0cf1e41c6e8bfeb8447fcc930b49026e6390)
12
18
 
13
19
  #### [0.0.3](https://github.com/gfargo/git-hash-art/compare/0.0.2...0.0.3)
14
20
 
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- var $8zHUo$canvas = require("canvas");
1
+ var $8zHUo$napirscanvas = require("@napi-rs/canvas");
2
2
  var $8zHUo$fs = require("fs");
3
3
  var $8zHUo$path = require("path");
4
4
  var $8zHUo$colorscheme = require("color-scheme");
@@ -344,7 +344,9 @@ const $01645fc0a37fc26d$export$4721fcae39954914 = (ctx, size, config = {})=>{
344
344
  ...config
345
345
  };
346
346
  (0, $f015a48f80684faa$export$e46c5570db033611)(ctx, size, finalConfig);
347
- const { vertices: vertices } = $01645fc0a37fc26d$export$90cc629a1c6121c7.platonic[config.type];
347
+ const solidType = config.type;
348
+ const solidConfig = $01645fc0a37fc26d$export$90cc629a1c6121c7.platonic[solidType] ?? $01645fc0a37fc26d$export$90cc629a1c6121c7.platonic.icosahedron;
349
+ const { vertices: vertices } = solidConfig;
348
350
  const radius = size / 2;
349
351
  // Calculate vertices based on platonic solid type
350
352
  const points = (0, $f015a48f80684faa$export$5627764dc1e1d74a)(0, 0, radius, vertices);
@@ -983,7 +985,7 @@ function $7898cb8c4bee74e1$export$bb35a6995ddbf32d(ctx, shape, x, y, config) {
983
985
  const { width: width, height: height, gridSize: gridSize, layers: layers, minShapeSize: minShapeSize, maxShapeSize: maxShapeSize, baseOpacity: baseOpacity, opacityReduction: opacityReduction } = finalConfig;
984
986
  // Calculate shapes per layer based on grid size if not provided
985
987
  finalConfig.shapesPerLayer = finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);
986
- const canvas = (0, $8zHUo$canvas.createCanvas)(width, height);
988
+ const canvas = (0, $8zHUo$napirscanvas.createCanvas)(width, height);
987
989
  const ctx = canvas.getContext("2d");
988
990
  const colorScheme = new (0, $b053edef45a6cc05$export$ab958c550f521376)(gitHash);
989
991
  const colors = colorScheme.getColorPalette("chakra");
package/dist/main.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 \"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 {\n vertices,\n // faces\n } = ShapeConfigs.platonic[config.type as keyof typeof ShapeConfigs.platonic];\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":"main.js.map"}
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":"main.js.map"}
package/dist/module.js CHANGED
@@ -1,4 +1,4 @@
1
- import {createCanvas as $hgUW1$createCanvas} from "canvas";
1
+ import {createCanvas as $hgUW1$createCanvas} from "@napi-rs/canvas";
2
2
  import $hgUW1$fs from "fs";
3
3
  import $hgUW1$path from "path";
4
4
  import $hgUW1$colorscheme from "color-scheme";
@@ -333,7 +333,9 @@ const $f0f1a7293548e501$export$4721fcae39954914 = (ctx, size, config = {})=>{
333
333
  ...config
334
334
  };
335
335
  (0, $ce2c52df8af02e62$export$e46c5570db033611)(ctx, size, finalConfig);
336
- const { vertices: vertices } = $f0f1a7293548e501$export$90cc629a1c6121c7.platonic[config.type];
336
+ const solidType = config.type;
337
+ const solidConfig = $f0f1a7293548e501$export$90cc629a1c6121c7.platonic[solidType] ?? $f0f1a7293548e501$export$90cc629a1c6121c7.platonic.icosahedron;
338
+ const { vertices: vertices } = solidConfig;
337
339
  const radius = size / 2;
338
340
  // Calculate vertices based on platonic solid type
339
341
  const points = (0, $ce2c52df8af02e62$export$5627764dc1e1d74a)(0, 0, radius, vertices);
@@ -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 \"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 {\n vertices,\n // faces\n } = ShapeConfigs.platonic[config.type as keyof typeof ShapeConfigs.platonic];\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":"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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 +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 \"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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-hash-art",
3
- "version": "0.0.4",
3
+ "version": "0.1.0",
4
4
  "author": "gfargo <ghfargo@gmail.com>",
5
5
  "scripts": {
6
6
  "watch": "parcel watch",
@@ -19,7 +19,7 @@
19
19
  "types": "dist/types.d.ts",
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
- "canvas": "^2.11.2",
22
+ "@napi-rs/canvas": "^0.1.97",
23
23
  "color-scheme": "^1.0.1"
24
24
  },
25
25
  "devDependencies": {
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { createCanvas } from "canvas";
1
+ import { createCanvas } from "@napi-rs/canvas";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
  import { SacredColorScheme } from "./lib/canvas/colors";
@@ -54,10 +54,12 @@ export const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {
54
54
  const finalConfig = { ...defaultShapeConfig, ...config };
55
55
  applyTransforms(ctx, size, finalConfig);
56
56
 
57
+ const solidType = config.type as keyof typeof ShapeConfigs.platonic;
58
+ const solidConfig = ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;
57
59
  const {
58
60
  vertices,
59
61
  // faces
60
- } = ShapeConfigs.platonic[config.type as keyof typeof ShapeConfigs.platonic];
62
+ } = solidConfig;
61
63
  const radius = size / 2;
62
64
 
63
65
  // Calculate vertices based on platonic solid type