git-hash-art 0.0.2 → 0.0.3
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 +6 -0
- package/dist/main.js +136 -126
- package/dist/main.js.map +1 -1
- package/dist/module.js +974 -0
- package/dist/module.js.map +1 -0
- package/package.json +3 -4
package/dist/module.js
ADDED
|
@@ -0,0 +1,974 @@
|
|
|
1
|
+
import {createCanvas as $5OpyM$createCanvas} from "canvas";
|
|
2
|
+
import $5OpyM$fs from "fs";
|
|
3
|
+
import $5OpyM$path from "path";
|
|
4
|
+
import $5OpyM$colorscheme from "color-scheme";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const $e982bdf2d46bd221$export$8daab6f91f7ff730 = (ctx, size)=>{
|
|
11
|
+
ctx.beginPath();
|
|
12
|
+
ctx.arc(0, 0, size / 2, 0, Math.PI * 2);
|
|
13
|
+
};
|
|
14
|
+
const $e982bdf2d46bd221$export$9340b6a85ea854b9 = (ctx, size)=>{
|
|
15
|
+
ctx.beginPath();
|
|
16
|
+
ctx.rect(-size / 2, -size / 2, size, size);
|
|
17
|
+
};
|
|
18
|
+
const $e982bdf2d46bd221$export$e6b70c7883316010 = (ctx, size)=>{
|
|
19
|
+
ctx.beginPath();
|
|
20
|
+
ctx.moveTo(0, -size / 2);
|
|
21
|
+
ctx.lineTo(-size / 2, size / 2);
|
|
22
|
+
ctx.lineTo(size / 2, size / 2);
|
|
23
|
+
ctx.closePath();
|
|
24
|
+
};
|
|
25
|
+
const $e982bdf2d46bd221$export$252d2895fb67397b = (ctx, size)=>{
|
|
26
|
+
ctx.beginPath();
|
|
27
|
+
for(let i = 0; i < 6; i++){
|
|
28
|
+
const angle = Math.PI / 8 * i;
|
|
29
|
+
const x = size / 2 * Math.cos(angle);
|
|
30
|
+
const y = size / 2 * Math.sin(angle);
|
|
31
|
+
if (i === 0) ctx.moveTo(x, y);
|
|
32
|
+
else ctx.lineTo(x, y);
|
|
33
|
+
}
|
|
34
|
+
ctx.closePath();
|
|
35
|
+
};
|
|
36
|
+
const $e982bdf2d46bd221$export$ca57b923902a3c0 = (ctx, size)=>{
|
|
37
|
+
ctx.beginPath();
|
|
38
|
+
for(let i = 0; i < 10; i++){
|
|
39
|
+
const angle = Math.PI / 5 + Math.PI / 5 * i * 3;
|
|
40
|
+
const radius = i % 2 === 0 ? size / 2 : size / 4;
|
|
41
|
+
const x = radius * Math.cos(angle);
|
|
42
|
+
const y = radius * Math.sin(angle);
|
|
43
|
+
if (i === 0) ctx.moveTo(x, y);
|
|
44
|
+
else ctx.lineTo(x, y);
|
|
45
|
+
}
|
|
46
|
+
ctx.closePath();
|
|
47
|
+
};
|
|
48
|
+
const $e982bdf2d46bd221$export$cf8f2f05ac4f561f = (ctx, size)=>{
|
|
49
|
+
ctx.beginPath();
|
|
50
|
+
for(let i = 0; i < 10; i++){
|
|
51
|
+
const angle = Math.PI / 30 + Math.PI / 30 * i * 8;
|
|
52
|
+
const radius = i % 2 === 0 ? size / 2 : size / 8;
|
|
53
|
+
const x = radius * Math.cos(angle);
|
|
54
|
+
const y = radius * Math.sin(angle);
|
|
55
|
+
if (i === 0) ctx.moveTo(x, y);
|
|
56
|
+
else ctx.lineTo(x, y);
|
|
57
|
+
}
|
|
58
|
+
ctx.closePath();
|
|
59
|
+
};
|
|
60
|
+
const $e982bdf2d46bd221$export$1ed0c0bc398b6246 = (ctx, size)=>{
|
|
61
|
+
ctx.beginPath();
|
|
62
|
+
ctx.moveTo(0, size / 4);
|
|
63
|
+
ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);
|
|
64
|
+
ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);
|
|
65
|
+
};
|
|
66
|
+
const $e982bdf2d46bd221$export$57ec12daf141ce6 = (ctx, size)=>{
|
|
67
|
+
ctx.beginPath();
|
|
68
|
+
ctx.moveTo(0, -size / 2);
|
|
69
|
+
ctx.lineTo(size / 2, 0);
|
|
70
|
+
ctx.lineTo(0, size / 2);
|
|
71
|
+
ctx.lineTo(-size / 2, 0);
|
|
72
|
+
ctx.closePath();
|
|
73
|
+
};
|
|
74
|
+
const $e982bdf2d46bd221$export$39f25a4fc5491539 = (ctx, size)=>{
|
|
75
|
+
ctx.beginPath();
|
|
76
|
+
ctx.moveTo(-size / 2, -size / 2);
|
|
77
|
+
ctx.lineTo(size / 2, -size / 2);
|
|
78
|
+
ctx.lineTo(size / 2, size / 2);
|
|
79
|
+
ctx.lineTo(-size / 2, size / 2);
|
|
80
|
+
ctx.closePath();
|
|
81
|
+
};
|
|
82
|
+
const $e982bdf2d46bd221$export$492753207a5258e1 = {
|
|
83
|
+
circle: $e982bdf2d46bd221$export$8daab6f91f7ff730,
|
|
84
|
+
square: $e982bdf2d46bd221$export$9340b6a85ea854b9,
|
|
85
|
+
triangle: $e982bdf2d46bd221$export$e6b70c7883316010,
|
|
86
|
+
hexagon: $e982bdf2d46bd221$export$252d2895fb67397b,
|
|
87
|
+
star: $e982bdf2d46bd221$export$ca57b923902a3c0,
|
|
88
|
+
"jacked-star": $e982bdf2d46bd221$export$cf8f2f05ac4f561f,
|
|
89
|
+
heart: $e982bdf2d46bd221$export$1ed0c0bc398b6246,
|
|
90
|
+
diamond: $e982bdf2d46bd221$export$57ec12daf141ce6,
|
|
91
|
+
cube: $e982bdf2d46bd221$export$39f25a4fc5491539
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
const $81d7f9c14b75c186$export$9265403940be6b4 = {
|
|
96
|
+
// Standard sizes with different hashes
|
|
97
|
+
react: {
|
|
98
|
+
hash: "46192e59d42f741c761cbea79462a8b3815dd905",
|
|
99
|
+
width: 1024,
|
|
100
|
+
height: 1024
|
|
101
|
+
},
|
|
102
|
+
angular: {
|
|
103
|
+
hash: "f31a6c3e94420f43c0cd323a5a6a99376ee59ff8",
|
|
104
|
+
width: 1024,
|
|
105
|
+
height: 1024,
|
|
106
|
+
gridSize: 6
|
|
107
|
+
},
|
|
108
|
+
// Wide format variations
|
|
109
|
+
banner: {
|
|
110
|
+
hash: "d847ffd4269b22c54d6e85ad3c1892a298e961fb",
|
|
111
|
+
width: 1920,
|
|
112
|
+
height: 480,
|
|
113
|
+
gridSize: 8,
|
|
114
|
+
shapesPerLayer: 40
|
|
115
|
+
},
|
|
116
|
+
ultrawide: {
|
|
117
|
+
hash: "a3e126e537ed2cd11ddf3a96c37066e97c7afee6",
|
|
118
|
+
width: 3440,
|
|
119
|
+
height: 1440,
|
|
120
|
+
gridSize: 12,
|
|
121
|
+
shapesPerLayer: 60
|
|
122
|
+
},
|
|
123
|
+
// Social media sizes
|
|
124
|
+
"instagram-square": {
|
|
125
|
+
hash: "ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0",
|
|
126
|
+
width: 1080,
|
|
127
|
+
height: 1080
|
|
128
|
+
},
|
|
129
|
+
"instagram-story": {
|
|
130
|
+
hash: "abc123def456abc123def456abc123def456abc1",
|
|
131
|
+
width: 1080,
|
|
132
|
+
height: 1920,
|
|
133
|
+
gridSize: 6,
|
|
134
|
+
layers: 6
|
|
135
|
+
},
|
|
136
|
+
"twitter-header": {
|
|
137
|
+
hash: "7777777777777777777777777777777777777777",
|
|
138
|
+
width: 1500,
|
|
139
|
+
height: 500,
|
|
140
|
+
gridSize: 8,
|
|
141
|
+
shapesPerLayer: 35
|
|
142
|
+
},
|
|
143
|
+
"linkedin-banner": {
|
|
144
|
+
hash: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
145
|
+
width: 1584,
|
|
146
|
+
height: 396,
|
|
147
|
+
gridSize: 8,
|
|
148
|
+
shapesPerLayer: 35
|
|
149
|
+
},
|
|
150
|
+
// Mobile sizes
|
|
151
|
+
"phone-wallpaper": {
|
|
152
|
+
hash: "ffffffffffffffffffffffffffffffffaaaaaaaa",
|
|
153
|
+
width: 1170,
|
|
154
|
+
height: 2532,
|
|
155
|
+
gridSize: 5,
|
|
156
|
+
layers: 6
|
|
157
|
+
},
|
|
158
|
+
"tablet-wallpaper": {
|
|
159
|
+
hash: "123456789abcdef0123456789abcdef012345678",
|
|
160
|
+
width: 2048,
|
|
161
|
+
height: 2732,
|
|
162
|
+
gridSize: 7,
|
|
163
|
+
layers: 6
|
|
164
|
+
},
|
|
165
|
+
// Special configurations
|
|
166
|
+
minimal: {
|
|
167
|
+
hash: "000000000000000000000000000000000fffffff",
|
|
168
|
+
width: 1024,
|
|
169
|
+
height: 1024,
|
|
170
|
+
layers: 3,
|
|
171
|
+
baseOpacity: 0.8,
|
|
172
|
+
shapesPerLayer: 15
|
|
173
|
+
},
|
|
174
|
+
complex: {
|
|
175
|
+
hash: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
|
|
176
|
+
width: 2048,
|
|
177
|
+
height: 2048,
|
|
178
|
+
gridSize: 8,
|
|
179
|
+
layers: 7,
|
|
180
|
+
shapesPerLayer: 50,
|
|
181
|
+
minShapeSize: 30,
|
|
182
|
+
maxShapeSize: 250
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
const $81d7f9c14b75c186$export$3572305709b6b48c = {
|
|
186
|
+
strokeStyle: "#000000",
|
|
187
|
+
fillStyle: "transparent",
|
|
188
|
+
lineWidth: 1,
|
|
189
|
+
rotation: 0,
|
|
190
|
+
iterations: 1,
|
|
191
|
+
animate: false
|
|
192
|
+
};
|
|
193
|
+
const $81d7f9c14b75c186$export$a4ca1369b6d2c19e = {
|
|
194
|
+
BASIC: "basic",
|
|
195
|
+
DETAILED: "detailed",
|
|
196
|
+
ANIMATED: "animated"
|
|
197
|
+
};
|
|
198
|
+
const $81d7f9c14b75c186$export$bb9e4790bc99ae59 = {
|
|
199
|
+
GOLDEN_RATIO: 1.618034,
|
|
200
|
+
SQUARE_ROOT_2: Math.sqrt(2),
|
|
201
|
+
SQUARE_ROOT_3: Math.sqrt(3),
|
|
202
|
+
SQUARE_ROOT_5: Math.sqrt(5),
|
|
203
|
+
PI: Math.PI,
|
|
204
|
+
PHI: (1 + Math.sqrt(5)) / 2
|
|
205
|
+
};
|
|
206
|
+
const $81d7f9c14b75c186$export$c36defeab44ba3b3 = {
|
|
207
|
+
flowerOfLifeMandala: (size)=>[
|
|
208
|
+
// { type: "flowerOfLife", config: { size } },
|
|
209
|
+
{
|
|
210
|
+
type: "merkaba",
|
|
211
|
+
config: {
|
|
212
|
+
size: size * 0.8
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
type: "sriYantra",
|
|
217
|
+
config: {
|
|
218
|
+
size: size * 0.5
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
platonicProgression: (size)=>[
|
|
223
|
+
{
|
|
224
|
+
type: "platonicSolid",
|
|
225
|
+
config: {
|
|
226
|
+
size: size,
|
|
227
|
+
type: "tetrahedron"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
type: "platonicSolid",
|
|
232
|
+
config: {
|
|
233
|
+
size: size * 0.8,
|
|
234
|
+
type: "cube"
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: "platonicSolid",
|
|
239
|
+
config: {
|
|
240
|
+
size: size * 0.6,
|
|
241
|
+
type: "octahedron"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
],
|
|
245
|
+
cosmicTree: (size)=>[
|
|
246
|
+
// { type: "treeOfLife", config: { size } },
|
|
247
|
+
{
|
|
248
|
+
type: "fibonacciSpiral",
|
|
249
|
+
config: {
|
|
250
|
+
size: size * 0.9
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: "metatronsCube",
|
|
255
|
+
config: {
|
|
256
|
+
size: size * 0.7
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
const $3607eda4304ea847$export$e6bfdeff8bfc94f9 = (degrees)=>degrees * Math.PI / 180;
|
|
264
|
+
const $3607eda4304ea847$export$e46c5570db033611 = (ctx, size, config)=>{
|
|
265
|
+
ctx.save();
|
|
266
|
+
ctx.translate(0, 0);
|
|
267
|
+
if (config.rotation) ctx.rotate($3607eda4304ea847$export$e6bfdeff8bfc94f9(config.rotation));
|
|
268
|
+
ctx.lineWidth = config.lineWidth;
|
|
269
|
+
ctx.strokeStyle = config.strokeStyle;
|
|
270
|
+
ctx.fillStyle = config.fillStyle;
|
|
271
|
+
};
|
|
272
|
+
const $3607eda4304ea847$export$68ae68d395d27fd1 = (ctx)=>{
|
|
273
|
+
ctx.restore();
|
|
274
|
+
};
|
|
275
|
+
const $3607eda4304ea847$export$70ba51ca253810ef = (type)=>({
|
|
276
|
+
enabled: false,
|
|
277
|
+
duration: 1000,
|
|
278
|
+
easing: "linear",
|
|
279
|
+
type: type
|
|
280
|
+
});
|
|
281
|
+
const $3607eda4304ea847$export$5627764dc1e1d74a = (cx, cy, radius, segments)=>{
|
|
282
|
+
const points = [];
|
|
283
|
+
for(let i = 0; i < segments; i++){
|
|
284
|
+
const angle = i / segments * Math.PI * 2;
|
|
285
|
+
points.push({
|
|
286
|
+
x: cx + Math.cos(angle) * radius,
|
|
287
|
+
y: cy + Math.sin(angle) * radius
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
return points;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
const $6768203c11c08d59$export$90cc629a1c6121c7 = {
|
|
295
|
+
platonic: {
|
|
296
|
+
tetrahedron: {
|
|
297
|
+
vertices: 4,
|
|
298
|
+
faces: 4
|
|
299
|
+
},
|
|
300
|
+
cube: {
|
|
301
|
+
vertices: 8,
|
|
302
|
+
faces: 6
|
|
303
|
+
},
|
|
304
|
+
octahedron: {
|
|
305
|
+
vertices: 6,
|
|
306
|
+
faces: 8
|
|
307
|
+
},
|
|
308
|
+
dodecahedron: {
|
|
309
|
+
vertices: 20,
|
|
310
|
+
faces: 12
|
|
311
|
+
},
|
|
312
|
+
icosahedron: {
|
|
313
|
+
vertices: 12,
|
|
314
|
+
faces: 20
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
fibonacci: {
|
|
318
|
+
iterations: 13,
|
|
319
|
+
growthFactor: 1.618034
|
|
320
|
+
},
|
|
321
|
+
goldenRatio: {
|
|
322
|
+
iterations: 8,
|
|
323
|
+
ratio: 1.618034
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
const $6768203c11c08d59$export$4721fcae39954914 = (ctx, size, type, config = {})=>{
|
|
327
|
+
const finalConfig = {
|
|
328
|
+
...(0, $81d7f9c14b75c186$export$3572305709b6b48c),
|
|
329
|
+
...config
|
|
330
|
+
};
|
|
331
|
+
(0, $3607eda4304ea847$export$e46c5570db033611)(ctx, size, finalConfig);
|
|
332
|
+
const { vertices: vertices } = $6768203c11c08d59$export$90cc629a1c6121c7.platonic[type];
|
|
333
|
+
const radius = size / 2;
|
|
334
|
+
// Calculate vertices based on platonic solid type
|
|
335
|
+
const points = (0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius, vertices);
|
|
336
|
+
ctx.beginPath();
|
|
337
|
+
// Draw edges between vertices
|
|
338
|
+
points.forEach((p1, i)=>{
|
|
339
|
+
points.slice(i + 1).forEach((p2)=>{
|
|
340
|
+
ctx.moveTo(p1.x, p1.y);
|
|
341
|
+
ctx.lineTo(p2.x, p2.y);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
if (finalConfig.fillStyle !== "transparent") ctx.fill();
|
|
345
|
+
ctx.stroke();
|
|
346
|
+
(0, $3607eda4304ea847$export$68ae68d395d27fd1)(ctx);
|
|
347
|
+
};
|
|
348
|
+
const $6768203c11c08d59$export$4091fa94ab006097 = (ctx, size, config = {})=>{
|
|
349
|
+
const finalConfig = {
|
|
350
|
+
...(0, $81d7f9c14b75c186$export$3572305709b6b48c),
|
|
351
|
+
...$6768203c11c08d59$export$90cc629a1c6121c7.fibonacci,
|
|
352
|
+
...config
|
|
353
|
+
};
|
|
354
|
+
(0, $3607eda4304ea847$export$e46c5570db033611)(ctx, size, finalConfig);
|
|
355
|
+
let current = 1;
|
|
356
|
+
let previous = 1;
|
|
357
|
+
let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);
|
|
358
|
+
ctx.beginPath();
|
|
359
|
+
for(let i = 0; i < finalConfig.iterations; i++){
|
|
360
|
+
const radius = scale * current;
|
|
361
|
+
const centerX = radius / 2;
|
|
362
|
+
const centerY = radius / 2;
|
|
363
|
+
ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);
|
|
364
|
+
// Calculate next Fibonacci number
|
|
365
|
+
const next = current + previous;
|
|
366
|
+
previous = current;
|
|
367
|
+
current = next;
|
|
368
|
+
// Transform for next iteration
|
|
369
|
+
ctx.translate(radius, 0);
|
|
370
|
+
ctx.rotate(Math.PI / 2);
|
|
371
|
+
}
|
|
372
|
+
ctx.stroke();
|
|
373
|
+
(0, $3607eda4304ea847$export$68ae68d395d27fd1)(ctx);
|
|
374
|
+
};
|
|
375
|
+
const $6768203c11c08d59$export$c9043b89bcb14ed9 = (ctx, size, config = {})=>{
|
|
376
|
+
const finalConfig = {
|
|
377
|
+
...(0, $81d7f9c14b75c186$export$3572305709b6b48c),
|
|
378
|
+
...config
|
|
379
|
+
};
|
|
380
|
+
(0, $3607eda4304ea847$export$e46c5570db033611)(ctx, size, finalConfig);
|
|
381
|
+
const gridSize = 8;
|
|
382
|
+
const unit = size / gridSize;
|
|
383
|
+
ctx.beginPath();
|
|
384
|
+
// Create base grid
|
|
385
|
+
for(let i = 0; i <= gridSize; i++)for(let j = 0; j <= gridSize; j++){
|
|
386
|
+
const x = (i - gridSize / 2) * unit;
|
|
387
|
+
const y = (j - gridSize / 2) * unit;
|
|
388
|
+
// Draw star pattern at each intersection
|
|
389
|
+
const radius = unit / 2;
|
|
390
|
+
for(let k = 0; k < 8; k++){
|
|
391
|
+
const angle = k / 8 * Math.PI * 2;
|
|
392
|
+
const x1 = x + Math.cos(angle) * radius;
|
|
393
|
+
const y1 = y + Math.sin(angle) * radius;
|
|
394
|
+
if (k === 0) ctx.moveTo(x1, y1);
|
|
395
|
+
else ctx.lineTo(x1, y1);
|
|
396
|
+
}
|
|
397
|
+
ctx.closePath();
|
|
398
|
+
}
|
|
399
|
+
if (finalConfig.fillStyle !== "transparent") ctx.fill();
|
|
400
|
+
ctx.stroke();
|
|
401
|
+
(0, $3607eda4304ea847$export$68ae68d395d27fd1)(ctx);
|
|
402
|
+
};
|
|
403
|
+
const $6768203c11c08d59$export$16ea6f9310920305 = (ctx, size, config = {})=>{
|
|
404
|
+
const finalConfig = {
|
|
405
|
+
...(0, $81d7f9c14b75c186$export$3572305709b6b48c),
|
|
406
|
+
...config
|
|
407
|
+
};
|
|
408
|
+
(0, $3607eda4304ea847$export$e46c5570db033611)(ctx, size, finalConfig);
|
|
409
|
+
const gridSize = 4;
|
|
410
|
+
const unit = size / gridSize;
|
|
411
|
+
const drawKnotSegment = (x, y, type)=>{
|
|
412
|
+
ctx.beginPath();
|
|
413
|
+
switch(type){
|
|
414
|
+
case "over":
|
|
415
|
+
ctx.moveTo(x, y);
|
|
416
|
+
ctx.bezierCurveTo(x + unit / 2, y, x + unit / 2, y + unit, x + unit, y + unit);
|
|
417
|
+
break;
|
|
418
|
+
case "under":
|
|
419
|
+
ctx.moveTo(x, y + unit);
|
|
420
|
+
ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
ctx.stroke();
|
|
424
|
+
};
|
|
425
|
+
// Create knot pattern
|
|
426
|
+
for(let i = 0; i < gridSize; i++)for(let j = 0; j < gridSize; j++){
|
|
427
|
+
const x = (i - gridSize / 2) * unit;
|
|
428
|
+
const y = (j - gridSize / 2) * unit;
|
|
429
|
+
drawKnotSegment(x, y, (i + j) % 2 === 0 ? "over" : "under");
|
|
430
|
+
}
|
|
431
|
+
(0, $3607eda4304ea847$export$68ae68d395d27fd1)(ctx);
|
|
432
|
+
};
|
|
433
|
+
const $6768203c11c08d59$export$661ad3ddfb8912ed = (ctx, size, config = {})=>{
|
|
434
|
+
const finalConfig = {
|
|
435
|
+
...(0, $81d7f9c14b75c186$export$3572305709b6b48c),
|
|
436
|
+
...config
|
|
437
|
+
};
|
|
438
|
+
(0, $3607eda4304ea847$export$e46c5570db033611)(ctx, size, finalConfig);
|
|
439
|
+
const radius = size / 2;
|
|
440
|
+
// Draw two intersecting tetrahedra
|
|
441
|
+
ctx.beginPath();
|
|
442
|
+
// First tetrahedron
|
|
443
|
+
const points1 = (0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius, 3);
|
|
444
|
+
points1.forEach((p1, i)=>{
|
|
445
|
+
points1.slice(i + 1).forEach((p2)=>{
|
|
446
|
+
ctx.moveTo(p1.x, p1.y);
|
|
447
|
+
ctx.lineTo(p2.x, p2.y);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
// Second tetrahedron (rotated)
|
|
451
|
+
ctx.rotate(Math.PI / 6);
|
|
452
|
+
const points2 = (0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius, 3);
|
|
453
|
+
points2.forEach((p1, i)=>{
|
|
454
|
+
points2.slice(i + 1).forEach((p2)=>{
|
|
455
|
+
ctx.moveTo(p1.x, p1.y);
|
|
456
|
+
ctx.lineTo(p2.x, p2.y);
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
if (finalConfig.fillStyle !== "transparent") ctx.fill();
|
|
460
|
+
ctx.stroke();
|
|
461
|
+
(0, $3607eda4304ea847$export$68ae68d395d27fd1)(ctx);
|
|
462
|
+
};
|
|
463
|
+
const $6768203c11c08d59$export$dbe318a13ce51887 = {
|
|
464
|
+
platonicSolid: (ctx, size, type = "tetrahedron", config)=>$6768203c11c08d59$export$4721fcae39954914(ctx, size, type, config),
|
|
465
|
+
fibonacciSpiral: (ctx, size, config)=>$6768203c11c08d59$export$4091fa94ab006097(ctx, size, config),
|
|
466
|
+
islamicPattern: (ctx, size, config)=>$6768203c11c08d59$export$c9043b89bcb14ed9(ctx, size, config),
|
|
467
|
+
celticKnot: (ctx, size, config)=>$6768203c11c08d59$export$16ea6f9310920305(ctx, size, config),
|
|
468
|
+
merkaba: (ctx, size, config)=>$6768203c11c08d59$export$661ad3ddfb8912ed(ctx, size, config)
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
const $4191f40726a1f4db$export$3bac12a72d9de58c = (ctx, size)=>{
|
|
474
|
+
const radius = size / 6;
|
|
475
|
+
const centers = [
|
|
476
|
+
{
|
|
477
|
+
x: 0,
|
|
478
|
+
y: 0
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
x: radius * Math.sqrt(3),
|
|
482
|
+
y: 0
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
x: radius * Math.sqrt(3) / 2,
|
|
486
|
+
y: 1.5 * radius
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
x: -radius * Math.sqrt(3) / 2,
|
|
490
|
+
y: 1.5 * radius
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
x: -radius * Math.sqrt(3),
|
|
494
|
+
y: 0
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
x: -radius * Math.sqrt(3) / 2,
|
|
498
|
+
y: -1.5 * radius
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
x: radius * Math.sqrt(3) / 2,
|
|
502
|
+
y: -1.5 * radius
|
|
503
|
+
}
|
|
504
|
+
];
|
|
505
|
+
ctx.beginPath();
|
|
506
|
+
centers.forEach((center)=>{
|
|
507
|
+
ctx.moveTo(center.x + radius, center.y);
|
|
508
|
+
ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);
|
|
509
|
+
});
|
|
510
|
+
};
|
|
511
|
+
const $4191f40726a1f4db$export$639bf214428ceec2 = (ctx, size)=>{
|
|
512
|
+
const radius = size / 12;
|
|
513
|
+
const spacing = radius * 2.5;
|
|
514
|
+
// Sephirot positions (traditional layout)
|
|
515
|
+
const positions = [
|
|
516
|
+
{
|
|
517
|
+
x: 0,
|
|
518
|
+
y: -spacing * 2
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
x: -spacing,
|
|
522
|
+
y: -spacing
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
x: spacing,
|
|
526
|
+
y: -spacing
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
x: -spacing,
|
|
530
|
+
y: 0
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
x: spacing,
|
|
534
|
+
y: 0
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
x: 0,
|
|
538
|
+
y: 0
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
x: -spacing,
|
|
542
|
+
y: spacing
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
x: spacing,
|
|
546
|
+
y: spacing
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
x: 0,
|
|
550
|
+
y: spacing * 2
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
x: 0,
|
|
554
|
+
y: spacing * 3
|
|
555
|
+
} // Malkuth
|
|
556
|
+
];
|
|
557
|
+
// Draw circles
|
|
558
|
+
ctx.beginPath();
|
|
559
|
+
positions.forEach((pos)=>{
|
|
560
|
+
ctx.moveTo(pos.x + radius, pos.y);
|
|
561
|
+
ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);
|
|
562
|
+
});
|
|
563
|
+
// Draw connecting lines
|
|
564
|
+
ctx.moveTo(positions[0].x, positions[0].y);
|
|
565
|
+
positions.forEach((pos, i)=>{
|
|
566
|
+
if (i > 0) positions.slice(i + 1).forEach((nextPos)=>{
|
|
567
|
+
ctx.moveTo(pos.x, pos.y);
|
|
568
|
+
ctx.lineTo(nextPos.x, nextPos.y);
|
|
569
|
+
});
|
|
570
|
+
});
|
|
571
|
+
};
|
|
572
|
+
const $4191f40726a1f4db$export$de26673ceb3e04eb = (ctx, size)=>{
|
|
573
|
+
const radius = size / 3;
|
|
574
|
+
// Create 13 points - one center and 12 vertices of an icosahedron
|
|
575
|
+
// const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio
|
|
576
|
+
const vertices = [
|
|
577
|
+
{
|
|
578
|
+
x: 0,
|
|
579
|
+
y: 0
|
|
580
|
+
},
|
|
581
|
+
...(0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius, 6),
|
|
582
|
+
...(0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius * 1.5, 6) // Outer hexagon
|
|
583
|
+
];
|
|
584
|
+
ctx.beginPath();
|
|
585
|
+
// Draw all connecting lines
|
|
586
|
+
vertices.forEach((v1, i)=>{
|
|
587
|
+
vertices.slice(i + 1).forEach((v2)=>{
|
|
588
|
+
ctx.moveTo(v1.x, v1.y);
|
|
589
|
+
ctx.lineTo(v2.x, v2.y);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
};
|
|
593
|
+
const $4191f40726a1f4db$export$f743702d1590aefb = (ctx, size)=>{
|
|
594
|
+
const radius = size / 2;
|
|
595
|
+
ctx.beginPath();
|
|
596
|
+
// Draw outer triangles
|
|
597
|
+
for(let i = 0; i < 9; i++){
|
|
598
|
+
const angle = i / 9 * Math.PI * 2;
|
|
599
|
+
const x1 = Math.cos(angle) * radius;
|
|
600
|
+
const y1 = Math.sin(angle) * radius;
|
|
601
|
+
const x2 = Math.cos(angle + Math.PI / 9) * radius;
|
|
602
|
+
const y2 = Math.sin(angle + Math.PI / 9) * radius;
|
|
603
|
+
ctx.moveTo(0, 0);
|
|
604
|
+
ctx.lineTo(x1, y1);
|
|
605
|
+
ctx.lineTo(x2, y2);
|
|
606
|
+
ctx.lineTo(0, 0);
|
|
607
|
+
}
|
|
608
|
+
// Draw inner triangles
|
|
609
|
+
const innerRadius = radius * 0.6;
|
|
610
|
+
for(let i = 0; i < 9; i++){
|
|
611
|
+
const angle = i / 9 * Math.PI * 2 + Math.PI / 18;
|
|
612
|
+
const x1 = Math.cos(angle) * innerRadius;
|
|
613
|
+
const y1 = Math.sin(angle) * innerRadius;
|
|
614
|
+
const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;
|
|
615
|
+
const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;
|
|
616
|
+
ctx.moveTo(0, 0);
|
|
617
|
+
ctx.lineTo(x1, y1);
|
|
618
|
+
ctx.lineTo(x2, y2);
|
|
619
|
+
ctx.lineTo(0, 0);
|
|
620
|
+
}
|
|
621
|
+
};
|
|
622
|
+
const $4191f40726a1f4db$export$980631444e370ab0 = (ctx, size)=>{
|
|
623
|
+
const radius = size / 4;
|
|
624
|
+
const centers = [
|
|
625
|
+
{
|
|
626
|
+
x: 0,
|
|
627
|
+
y: 0
|
|
628
|
+
},
|
|
629
|
+
...(0, $3607eda4304ea847$export$5627764dc1e1d74a)(0, 0, radius * 2, 6)
|
|
630
|
+
];
|
|
631
|
+
ctx.beginPath();
|
|
632
|
+
centers.forEach((center)=>{
|
|
633
|
+
ctx.moveTo(center.x + radius, center.y);
|
|
634
|
+
ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);
|
|
635
|
+
});
|
|
636
|
+
};
|
|
637
|
+
const $4191f40726a1f4db$export$eeae7765f05012e2 = (ctx, size)=>{
|
|
638
|
+
const radius = size / 3;
|
|
639
|
+
ctx.beginPath();
|
|
640
|
+
// Draw two overlapping circles
|
|
641
|
+
ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);
|
|
642
|
+
ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);
|
|
643
|
+
};
|
|
644
|
+
const $4191f40726a1f4db$export$3355220a8108efc3 = (ctx, size)=>{
|
|
645
|
+
const outerRadius = size / 2;
|
|
646
|
+
const innerRadius = size / 4;
|
|
647
|
+
const steps = 36;
|
|
648
|
+
ctx.beginPath();
|
|
649
|
+
for(let i = 0; i < steps; i++){
|
|
650
|
+
const angle1 = i / steps * Math.PI * 2;
|
|
651
|
+
// const angle2 = ((i + 1) / steps) * Math.PI * 2;
|
|
652
|
+
for(let j = 0; j < steps; j++){
|
|
653
|
+
const phi1 = j / steps * Math.PI * 2;
|
|
654
|
+
const phi2 = (j + 1) / steps * Math.PI * 2;
|
|
655
|
+
const x1 = (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);
|
|
656
|
+
const y1 = (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);
|
|
657
|
+
const x2 = (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);
|
|
658
|
+
const y2 = (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);
|
|
659
|
+
ctx.moveTo(x1, y1);
|
|
660
|
+
ctx.lineTo(x2, y2);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
const $4191f40726a1f4db$export$c2fc138f94dd4b2a = {
|
|
665
|
+
// flowerOfLife: drawFlowerOfLife,
|
|
666
|
+
// treeOfLife: drawTreeOfLife,
|
|
667
|
+
metatronsCube: $4191f40726a1f4db$export$de26673ceb3e04eb,
|
|
668
|
+
sriYantra: $4191f40726a1f4db$export$f743702d1590aefb,
|
|
669
|
+
seedOfLife: $4191f40726a1f4db$export$980631444e370ab0,
|
|
670
|
+
vesicaPiscis: $4191f40726a1f4db$export$eeae7765f05012e2,
|
|
671
|
+
torus: $4191f40726a1f4db$export$3355220a8108efc3
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
const $0ced3eed8c5c8e0b$export$4ff7fc6f1af248b5 = {
|
|
676
|
+
...(0, $e982bdf2d46bd221$export$492753207a5258e1),
|
|
677
|
+
...(0, $6768203c11c08d59$export$dbe318a13ce51887),
|
|
678
|
+
...(0, $4191f40726a1f4db$export$c2fc138f94dd4b2a)
|
|
679
|
+
};
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
function $7f8638f37c57b389$export$39a95c82b20fdf81(gitHash) {
|
|
683
|
+
return parseInt(gitHash.slice(0, 8), 16);
|
|
684
|
+
}
|
|
685
|
+
function $7f8638f37c57b389$export$6b193cae730c547a(hash, index, min, max) {
|
|
686
|
+
const hexPair = hash.substr(index * 2 % hash.length, 2);
|
|
687
|
+
const decimal = parseInt(hexPair, 16);
|
|
688
|
+
return min + decimal / 255 * (max - min);
|
|
689
|
+
}
|
|
690
|
+
const $7f8638f37c57b389$export$bb9e4790bc99ae59 = {
|
|
691
|
+
GOLDEN_RATIO: 1.618034,
|
|
692
|
+
SQUARE_ROOT_2: Math.sqrt(2),
|
|
693
|
+
SQUARE_ROOT_3: Math.sqrt(3),
|
|
694
|
+
SQUARE_ROOT_5: Math.sqrt(5),
|
|
695
|
+
PI: Math.PI,
|
|
696
|
+
PHI: (1 + Math.sqrt(5)) / 2
|
|
697
|
+
};
|
|
698
|
+
class $7f8638f37c57b389$export$da2372f11bc66b3f {
|
|
699
|
+
static getProportionalSize(baseSize, proportion) {
|
|
700
|
+
return baseSize * proportion;
|
|
701
|
+
}
|
|
702
|
+
static centerPattern(ctx, width, height) {
|
|
703
|
+
ctx.translate(width / 2, height / 2);
|
|
704
|
+
}
|
|
705
|
+
// Combines sacred geometry patterns with proper proportions
|
|
706
|
+
static layerPatterns(ctx, patterns, config) {
|
|
707
|
+
const { baseSize: baseSize, baseOpacity: baseOpacity = 0.6, opacityReduction: opacityReduction = 0.1, rotationOffset: rotationOffset = 0, proportionType: proportionType = "GOLDEN_RATIO" } = config;
|
|
708
|
+
patterns.forEach((pattern, index)=>{
|
|
709
|
+
const size = this.getProportionalSize(baseSize, Math.pow($7f8638f37c57b389$export$bb9e4790bc99ae59[proportionType], index));
|
|
710
|
+
const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);
|
|
711
|
+
const rotation = rotationOffset * index;
|
|
712
|
+
ctx.save();
|
|
713
|
+
ctx.globalAlpha = opacity;
|
|
714
|
+
ctx.rotate(rotation * Math.PI / 180);
|
|
715
|
+
(0, $0ced3eed8c5c8e0b$export$4ff7fc6f1af248b5)[pattern.type](ctx, size, pattern.config);
|
|
716
|
+
ctx.restore();
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
function $8f4da37788745c0d$export$f116a24fd288e742(gitHash) {
|
|
723
|
+
const seed = (0, $7f8638f37c57b389$export$39a95c82b20fdf81)(gitHash);
|
|
724
|
+
const scheme = new (0, $5OpyM$colorscheme)();
|
|
725
|
+
scheme.from_hue(seed % 360).scheme("analogic").variation("soft");
|
|
726
|
+
let colors = scheme.colors().map((hex)=>`#${hex}`);
|
|
727
|
+
const contrastingHue = (seed + 180) % 360;
|
|
728
|
+
const contrastingScheme = new (0, $5OpyM$colorscheme)();
|
|
729
|
+
contrastingScheme.from_hue(contrastingHue).scheme("mono").variation("soft");
|
|
730
|
+
colors.push(`#${contrastingScheme.colors()[0]}`);
|
|
731
|
+
return colors;
|
|
732
|
+
}
|
|
733
|
+
class $8f4da37788745c0d$export$ab958c550f521376 {
|
|
734
|
+
constructor(gitHash){
|
|
735
|
+
this.seed = this.gitHashToSeed(gitHash);
|
|
736
|
+
this.baseScheme = this.generateBaseScheme();
|
|
737
|
+
this.complementaryScheme = this.generateComplementaryScheme();
|
|
738
|
+
this.metallic = this.generateMetallicColors();
|
|
739
|
+
}
|
|
740
|
+
gitHashToSeed(hash) {
|
|
741
|
+
return parseInt(hash.slice(0, 8), 16);
|
|
742
|
+
}
|
|
743
|
+
generateBaseScheme() {
|
|
744
|
+
const scheme = new (0, $5OpyM$colorscheme)();
|
|
745
|
+
return scheme.from_hue(this.seed % 360).scheme("analogic").variation("soft").colors().map((hex)=>`#${hex}`);
|
|
746
|
+
}
|
|
747
|
+
generateComplementaryScheme() {
|
|
748
|
+
const complementaryHue = (this.seed + 180) % 360;
|
|
749
|
+
const scheme = new (0, $5OpyM$colorscheme)();
|
|
750
|
+
return scheme.from_hue(complementaryHue).scheme("mono").variation("soft").colors().map((hex)=>`#${hex}`);
|
|
751
|
+
}
|
|
752
|
+
generateMetallicColors() {
|
|
753
|
+
return {
|
|
754
|
+
gold: "#FFD700",
|
|
755
|
+
silver: "#C0C0C0",
|
|
756
|
+
copper: "#B87333",
|
|
757
|
+
bronze: "#CD7F32"
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
getColorPalette(type = "sacred") {
|
|
761
|
+
switch(type){
|
|
762
|
+
case "sacred":
|
|
763
|
+
return {
|
|
764
|
+
primary: this.baseScheme[0],
|
|
765
|
+
secondary: this.baseScheme[1],
|
|
766
|
+
accent: this.complementaryScheme[0],
|
|
767
|
+
metallic: this.metallic.gold
|
|
768
|
+
};
|
|
769
|
+
case "elemental":
|
|
770
|
+
return {
|
|
771
|
+
earth: this.baseScheme[0],
|
|
772
|
+
water: this.baseScheme[1],
|
|
773
|
+
air: this.baseScheme[2],
|
|
774
|
+
fire: this.complementaryScheme[0]
|
|
775
|
+
};
|
|
776
|
+
case "chakra":
|
|
777
|
+
return {
|
|
778
|
+
root: "#FF0000",
|
|
779
|
+
sacral: "#FF7F00",
|
|
780
|
+
solar: "#FFFF00",
|
|
781
|
+
heart: "#00FF00",
|
|
782
|
+
throat: "#0000FF",
|
|
783
|
+
third_eye: "#4B0082",
|
|
784
|
+
crown: "#8F00FF"
|
|
785
|
+
};
|
|
786
|
+
default:
|
|
787
|
+
return this.baseScheme;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
function $367ed528f09d76bf$export$71b514a25c47df50(ctx, shape, x, y, fillColor, strokeColor, strokeWidth, size, rotation) {
|
|
796
|
+
ctx.save();
|
|
797
|
+
ctx.translate(x, y);
|
|
798
|
+
ctx.rotate(rotation * Math.PI / 180);
|
|
799
|
+
ctx.fillStyle = fillColor;
|
|
800
|
+
ctx.strokeStyle = strokeColor;
|
|
801
|
+
ctx.lineWidth = strokeWidth;
|
|
802
|
+
const drawFunction = (0, $0ced3eed8c5c8e0b$export$4ff7fc6f1af248b5)[shape];
|
|
803
|
+
if (drawFunction) drawFunction(ctx, size);
|
|
804
|
+
ctx.fill();
|
|
805
|
+
ctx.stroke();
|
|
806
|
+
ctx.restore();
|
|
807
|
+
}
|
|
808
|
+
function $367ed528f09d76bf$export$bb35a6995ddbf32d(ctx, shape, x, y, config) {
|
|
809
|
+
const { fillColor: fillColor, strokeColor: strokeColor, strokeWidth: strokeWidth, size: size, rotation: rotation, patterns: patterns = [], proportionType: proportionType = "GOLDEN_RATIO", baseOpacity: baseOpacity = 0.6, opacityReduction: opacityReduction = 0.1 } = config;
|
|
810
|
+
ctx.save();
|
|
811
|
+
ctx.translate(x, y);
|
|
812
|
+
ctx.rotate(rotation * Math.PI / 180);
|
|
813
|
+
// Draw base shape
|
|
814
|
+
ctx.fillStyle = fillColor;
|
|
815
|
+
ctx.strokeStyle = strokeColor;
|
|
816
|
+
ctx.lineWidth = strokeWidth;
|
|
817
|
+
const drawFunction = (0, $0ced3eed8c5c8e0b$export$4ff7fc6f1af248b5)[shape];
|
|
818
|
+
if (drawFunction) drawFunction(ctx, size);
|
|
819
|
+
// Layer additional patterns if specified
|
|
820
|
+
if (patterns.length > 0) (0, $7f8638f37c57b389$export$da2372f11bc66b3f).layerPatterns(ctx, patterns, {
|
|
821
|
+
baseSize: size,
|
|
822
|
+
baseOpacity: baseOpacity,
|
|
823
|
+
opacityReduction: opacityReduction,
|
|
824
|
+
proportionType: proportionType
|
|
825
|
+
});
|
|
826
|
+
ctx.fill();
|
|
827
|
+
ctx.stroke();
|
|
828
|
+
ctx.restore();
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* @typedef {Object} ArtConfig
|
|
836
|
+
* @property {number} width - Canvas width in pixels
|
|
837
|
+
* @property {number} height - Canvas height in pixels
|
|
838
|
+
* @property {number} [gridSize=4] - Number of grid cells (gridSize x gridSize)
|
|
839
|
+
* @property {number} [layers=5] - Number of layers to generate
|
|
840
|
+
* @property {number} [shapesPerLayer] - Base number of shapes per layer (defaults to grid cells * 1.5)
|
|
841
|
+
* @property {number} [minShapeSize=20] - Minimum shape size
|
|
842
|
+
* @property {number} [maxShapeSize=180] - Maximum shape size
|
|
843
|
+
* @property {number} [baseOpacity=0.6] - Starting opacity for first layer
|
|
844
|
+
* @property {number} [opacityReduction=0.1] - How much to reduce opacity per layer
|
|
845
|
+
*/ /**
|
|
846
|
+
* Generate an abstract art image from a git hash with custom configuration
|
|
847
|
+
* @param {string} gitHash - The git hash to use as a seed
|
|
848
|
+
* @param {ArtConfig} [config={}] - Configuration options
|
|
849
|
+
* @returns {Buffer} PNG buffer of the generated image
|
|
850
|
+
*/ function $cf838c15c8b009ba$export$491525bf12232411(gitHash, config = {}) {
|
|
851
|
+
// Default configuration
|
|
852
|
+
const defaultConfig = {
|
|
853
|
+
width: 2048,
|
|
854
|
+
height: 2048,
|
|
855
|
+
gridSize: 12,
|
|
856
|
+
layers: 2,
|
|
857
|
+
minShapeSize: 20,
|
|
858
|
+
maxShapeSize: 600,
|
|
859
|
+
baseOpacity: 0.8,
|
|
860
|
+
opacityReduction: 0.4
|
|
861
|
+
};
|
|
862
|
+
// Merge provided config with defaults
|
|
863
|
+
const finalConfig = {
|
|
864
|
+
...defaultConfig,
|
|
865
|
+
...config
|
|
866
|
+
};
|
|
867
|
+
const { width: width, height: height, gridSize: gridSize, layers: layers, minShapeSize: minShapeSize, maxShapeSize: maxShapeSize, baseOpacity: baseOpacity, opacityReduction: opacityReduction } = finalConfig;
|
|
868
|
+
// Calculate shapes per layer based on grid size if not provided
|
|
869
|
+
finalConfig.shapesPerLayer = finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);
|
|
870
|
+
const canvas = (0, $5OpyM$createCanvas)(width, height);
|
|
871
|
+
const ctx = canvas.getContext("2d");
|
|
872
|
+
const colorScheme = new (0, $8f4da37788745c0d$export$ab958c550f521376)(gitHash);
|
|
873
|
+
const colors = colorScheme.getColorPalette("chakra");
|
|
874
|
+
// Create a gradient background
|
|
875
|
+
const gradient = ctx.createLinearGradient(0, 0, width, height);
|
|
876
|
+
gradient.addColorStop(0, colorScheme.baseScheme[0]);
|
|
877
|
+
gradient.addColorStop(1, colorScheme.baseScheme[1]);
|
|
878
|
+
ctx.fillStyle = gradient;
|
|
879
|
+
ctx.fillRect(0, 0, width, height);
|
|
880
|
+
const shapeNames = Object.keys((0, $0ced3eed8c5c8e0b$export$4ff7fc6f1af248b5));
|
|
881
|
+
const cellWidth = width / gridSize;
|
|
882
|
+
const cellHeight = height / gridSize;
|
|
883
|
+
// Scale shape sizes based on canvas dimensions
|
|
884
|
+
const scaleFactor = Math.min(width, height) / 1024;
|
|
885
|
+
const adjustedMinSize = minShapeSize * scaleFactor;
|
|
886
|
+
const adjustedMaxSize = maxShapeSize * scaleFactor;
|
|
887
|
+
for(let layer = 0; layer < layers; layer++){
|
|
888
|
+
const numShapes = finalConfig.shapesPerLayer + Math.floor((0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer, 0, finalConfig.shapesPerLayer / 2));
|
|
889
|
+
const layerOpacity = baseOpacity - layer * opacityReduction;
|
|
890
|
+
for(let i = 0; i < numShapes; i++){
|
|
891
|
+
const gridX = Math.floor(i / gridSize);
|
|
892
|
+
const gridY = i % gridSize;
|
|
893
|
+
const cellOffsetX = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 2, 0, cellWidth);
|
|
894
|
+
const cellOffsetY = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 2 + 1, 0, cellHeight);
|
|
895
|
+
const x = gridX * cellWidth + cellOffsetX;
|
|
896
|
+
const y = gridY * cellHeight + cellOffsetY;
|
|
897
|
+
const shape = shapeNames[Math.floor((0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 3, 0, shapeNames.length))];
|
|
898
|
+
const size = adjustedMinSize + (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 4, 0, adjustedMaxSize - adjustedMinSize);
|
|
899
|
+
const rotation = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 5, 0, 360);
|
|
900
|
+
const fillColorIndex = Math.floor((0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 6, 0, colors.length));
|
|
901
|
+
const strokeColorIndex = Math.floor((0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, layer * numShapes + i * 7, 0, colors.length));
|
|
902
|
+
ctx.globalAlpha = layerOpacity;
|
|
903
|
+
// drawShape(
|
|
904
|
+
// ctx,
|
|
905
|
+
// shape,
|
|
906
|
+
// x,
|
|
907
|
+
// y,
|
|
908
|
+
// colors[fillColorIndex],
|
|
909
|
+
// colors[strokeColorIndex],
|
|
910
|
+
// 2 * scaleFactor,
|
|
911
|
+
// size,
|
|
912
|
+
// rotation
|
|
913
|
+
// );
|
|
914
|
+
(0, $367ed528f09d76bf$export$bb35a6995ddbf32d)(ctx, shape, x, y, {
|
|
915
|
+
fillColor: colors[fillColorIndex],
|
|
916
|
+
strokeColor: colors[strokeColorIndex],
|
|
917
|
+
strokeWidth: 1.5 * scaleFactor,
|
|
918
|
+
size: size,
|
|
919
|
+
rotation: rotation,
|
|
920
|
+
// Optionally add pattern combinations
|
|
921
|
+
// patterns:
|
|
922
|
+
// Math.random() > 0.7 ? PatternPresets.cosmicTree(size) : [],
|
|
923
|
+
proportionType: "GOLDEN_RATIO"
|
|
924
|
+
});
|
|
925
|
+
}
|
|
926
|
+
// Add connecting lines scaled to canvas size
|
|
927
|
+
ctx.globalAlpha = 0.2;
|
|
928
|
+
ctx.strokeStyle = colors[colors.length - 1];
|
|
929
|
+
ctx.lineWidth = 1 * scaleFactor;
|
|
930
|
+
const numLines = Math.floor(15 * (width * height) / 1048576);
|
|
931
|
+
for(let i = 0; i < numLines; i++){
|
|
932
|
+
const x1 = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, i * 4, 0, width);
|
|
933
|
+
const y1 = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, i * 4 + 1, 0, height);
|
|
934
|
+
const x2 = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, i * 4 + 2, 0, width);
|
|
935
|
+
const y2 = (0, $7f8638f37c57b389$export$6b193cae730c547a)(gitHash, i * 4 + 3, 0, height);
|
|
936
|
+
ctx.beginPath();
|
|
937
|
+
ctx.moveTo(x1, y1);
|
|
938
|
+
ctx.lineTo(x2, y2);
|
|
939
|
+
ctx.stroke();
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
return canvas.toBuffer("image/png");
|
|
943
|
+
}
|
|
944
|
+
/**
|
|
945
|
+
* Save the generated image to a file
|
|
946
|
+
* @param {Buffer} imageBuffer - The PNG buffer of the generated image
|
|
947
|
+
* @param {string} outputDir - The directory to save the image
|
|
948
|
+
* @param {string} gitHash - The git hash used to generate the image
|
|
949
|
+
* @param {string} [label=''] - Label for the output file
|
|
950
|
+
* @param {number} width - The width of the generated image
|
|
951
|
+
* @param {number} height - The height of the generated image
|
|
952
|
+
* @returns {string} Path to the saved image
|
|
953
|
+
*/ function $cf838c15c8b009ba$export$ea0bbc160a51089a(imageBuffer, outputDir, gitHash, label = "", width, height) {
|
|
954
|
+
if (!(0, $5OpyM$fs).existsSync(outputDir)) (0, $5OpyM$fs).mkdirSync(outputDir, {
|
|
955
|
+
recursive: true
|
|
956
|
+
});
|
|
957
|
+
const filename = label ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png` : `${gitHash.slice(0, 8)}-${width}x${height}.png`;
|
|
958
|
+
const outputPath = (0, $5OpyM$path).join(outputDir, filename);
|
|
959
|
+
(0, $5OpyM$fs).writeFileSync(outputPath, imageBuffer);
|
|
960
|
+
console.log(`Generated: ${outputPath}`);
|
|
961
|
+
return outputPath;
|
|
962
|
+
}
|
|
963
|
+
// Usage example:
|
|
964
|
+
/*
|
|
965
|
+
import { generateImageFromHash, saveImageToFile } from 'git-hash-art';
|
|
966
|
+
|
|
967
|
+
const gitHash = '1234567890abcdef1234567890abcdef12345678';
|
|
968
|
+
const imageBuffer = generateImageFromHash(gitHash, { width: 1024, height: 1024 });
|
|
969
|
+
const savedImagePath = saveImageToFile(imageBuffer, './output', gitHash, 'example', 1024, 1024);
|
|
970
|
+
console.log(`Image saved to: ${savedImagePath}`);
|
|
971
|
+
*/
|
|
972
|
+
|
|
973
|
+
export {$cf838c15c8b009ba$export$491525bf12232411 as generateImageFromHash, $cf838c15c8b009ba$export$ea0bbc160a51089a as saveImageToFile};
|
|
974
|
+
//# sourceMappingURL=module.js.map
|