ANTIMOLL commited on
Commit
91c097c
·
verified ·
1 Parent(s): e99d0d3

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +6 -4
  2. index.html +1400 -19
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Dert
3
- emoji: 👁
4
  colorFrom: blue
5
- colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: dert
3
+ emoji: 🐳
4
  colorFrom: blue
5
+ colorTo: yellow
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1400 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Bove AI Image Generator</title>
7
+ <link rel="icon" type="image/x-icon" href="https://user-uploads.perchance.org/file/dbd60a6a6c167cb9bdb7b9da1c030655.png">
8
+ <link href="https://fonts.googleapis.com/css2?family=Oxanium:wght@200..800&display=swap" rel="stylesheet">
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
+ <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
11
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
12
+ <script src="https://cdn.tailwindcss.com"></script>
13
+ <style>
14
+ :root {
15
+ --primary-color: #794bc4;
16
+ --secondary-color: #5e3aa8;
17
+ --accent-color: #9c7ae6;
18
+ }
19
+
20
+ body {
21
+ font-family: 'Oxanium', sans-serif;
22
+ background-color: #0f0e17;
23
+ color: #ffffff;
24
+ }
25
+
26
+ .header-image {
27
+ position: relative;
28
+ overflow: hidden;
29
+ }
30
+
31
+ .galaxy-menu {
32
+ position: absolute;
33
+ top: 100%;
34
+ left: 0;
35
+ width: 100%;
36
+ background: rgba(15, 14, 23, 0.95);
37
+ backdrop-filter: blur(10px);
38
+ padding: 1rem;
39
+ display: none;
40
+ flex-direction: column;
41
+ gap: 0.5rem;
42
+ z-index: 100;
43
+ border-radius: 0 0 0.6rem 0.6rem;
44
+ }
45
+
46
+ .galaxy-menu.active {
47
+ display: flex;
48
+ }
49
+
50
+ .menu-item a {
51
+ display: block;
52
+ padding: 0.5rem 1rem;
53
+ color: white;
54
+ text-decoration: none;
55
+ transition: all 0.3s ease;
56
+ border-radius: 0.25rem;
57
+ }
58
+
59
+ .menu-item a:hover {
60
+ background-color: var(--primary-color);
61
+ }
62
+
63
+ .menu-toggle {
64
+ position: absolute;
65
+ top: 1rem;
66
+ left: 1rem;
67
+ background-color: rgba(0, 0, 0, 0.5);
68
+ border-radius: 50%;
69
+ width: 40px;
70
+ height: 40px;
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ cursor: pointer;
75
+ z-index: 101;
76
+ transition: all 0.3s ease;
77
+ }
78
+
79
+ .menu-toggle.active {
80
+ background-color: var(--primary-color);
81
+ }
82
+
83
+ .menu-toggle i {
84
+ font-size: 1.25rem;
85
+ color: white;
86
+ }
87
+
88
+ .control-panel {
89
+ background-color: #1a1830;
90
+ border-radius: 0.6rem;
91
+ padding: 1.5rem;
92
+ margin: 1rem auto;
93
+ max-width: 1000px;
94
+ }
95
+
96
+ .input-group {
97
+ margin-bottom: 1rem;
98
+ }
99
+
100
+ .input-group label {
101
+ display: block;
102
+ margin-bottom: 0.5rem;
103
+ font-weight: 500;
104
+ }
105
+
106
+ .input-row {
107
+ display: flex;
108
+ gap: 1rem;
109
+ flex-wrap: wrap;
110
+ }
111
+
112
+ .input-row .input-group {
113
+ flex: 1;
114
+ min-width: 200px;
115
+ }
116
+
117
+ textarea, input, select {
118
+ width: 100%;
119
+ padding: 0.75rem;
120
+ border-radius: 0.5rem;
121
+ border: 1px solid #2d2b4a;
122
+ background-color: #2d2b4a;
123
+ color: white;
124
+ font-family: inherit;
125
+ resize: none;
126
+ }
127
+
128
+ textarea:focus, input:focus, select:focus {
129
+ outline: none;
130
+ border-color: var(--accent-color);
131
+ box-shadow: 0 0 0 2px rgba(156, 122, 230, 0.3);
132
+ }
133
+
134
+ .prompt-container {
135
+ position: relative;
136
+ }
137
+
138
+ .enhance-button {
139
+ position: absolute;
140
+ right: 0.5rem;
141
+ bottom: 0.5rem;
142
+ background-color: var(--primary-color);
143
+ color: white;
144
+ border: none;
145
+ border-radius: 0.25rem;
146
+ width: 36px;
147
+ height: 36px;
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ cursor: pointer;
152
+ transition: all 0.3s ease;
153
+ }
154
+
155
+ .enhance-button:hover {
156
+ background-color: var(--secondary-color);
157
+ }
158
+
159
+ .generate-button {
160
+ width: 100%;
161
+ padding: 1rem;
162
+ background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
163
+ color: white;
164
+ border: none;
165
+ border-radius: 0.5rem;
166
+ font-weight: 600;
167
+ font-size: 1.1rem;
168
+ cursor: pointer;
169
+ transition: all 0.3s ease;
170
+ margin-top: 1rem;
171
+ }
172
+
173
+ .generate-button:hover {
174
+ transform: translateY(-2px);
175
+ box-shadow: 0 4px 12px rgba(121, 75, 196, 0.3);
176
+ }
177
+
178
+ .star-icon {
179
+ display: inline-block;
180
+ margin: 0 0.25rem;
181
+ }
182
+
183
+ .style-images-container {
184
+ display: grid;
185
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
186
+ gap: 1rem;
187
+ margin-bottom: 1rem;
188
+ }
189
+
190
+ .style-image-item {
191
+ cursor: pointer;
192
+ text-align: center;
193
+ transition: all 0.3s ease;
194
+ border-radius: 0.5rem;
195
+ padding: 0.5rem;
196
+ background-color: #2d2b4a;
197
+ }
198
+
199
+ .style-image-item:hover {
200
+ transform: translateY(-2px);
201
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
202
+ }
203
+
204
+ .style-image-item.selected {
205
+ background-color: var(--primary-color);
206
+ box-shadow: 0 0 0 2px var(--accent-color);
207
+ }
208
+
209
+ .style-image {
210
+ width: 100%;
211
+ aspect-ratio: 1/1;
212
+ border-radius: 0.25rem;
213
+ overflow: hidden;
214
+ margin-bottom: 0.5rem;
215
+ }
216
+
217
+ .style-image img {
218
+ width: 100%;
219
+ height: 100%;
220
+ object-fit: cover;
221
+ }
222
+
223
+ .no-style-style {
224
+ background: linear-gradient(135deg, #2d2b4a, #1a1830);
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: center;
228
+ color: var(--accent-color);
229
+ font-weight: bold;
230
+ }
231
+
232
+ .selected-styles-container {
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ gap: 0.5rem;
236
+ margin-bottom: 1rem;
237
+ }
238
+
239
+ .style-tag {
240
+ background-color: var(--primary-color);
241
+ padding: 0.25rem 0.5rem;
242
+ border-radius: 0.25rem;
243
+ font-size: 0.85rem;
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 0.25rem;
247
+ }
248
+
249
+ .remove-icon {
250
+ cursor: pointer;
251
+ font-size: 0.75rem;
252
+ margin-left: 0.25rem;
253
+ }
254
+
255
+ .results-container {
256
+ max-width: 1000px;
257
+ margin: 1rem auto;
258
+ display: grid;
259
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
260
+ gap: 1rem;
261
+ }
262
+
263
+ .image-card {
264
+ position: relative;
265
+ background-color: #1a1830;
266
+ border-radius: 0.5rem;
267
+ overflow: hidden;
268
+ transition: all 0.3s ease;
269
+ }
270
+
271
+ .image-card:hover {
272
+ transform: translateY(-2px);
273
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
274
+ }
275
+
276
+ .image-card img {
277
+ width: 100%;
278
+ height: 100%;
279
+ object-fit: cover;
280
+ display: block;
281
+ }
282
+
283
+ .image-loading-indicator {
284
+ position: absolute;
285
+ top: 0;
286
+ left: 0;
287
+ width: 100%;
288
+ height: 100%;
289
+ display: flex;
290
+ flex-direction: column;
291
+ align-items: center;
292
+ justify-content: center;
293
+ background-color: rgba(15, 14, 23, 0.8);
294
+ color: white;
295
+ }
296
+
297
+ .image-spinner {
298
+ width: 40px;
299
+ height: 40px;
300
+ border: 4px solid rgba(255, 255, 255, 0.3);
301
+ border-radius: 50%;
302
+ border-top-color: var(--accent-color);
303
+ animation: spin 1s ease-in-out infinite;
304
+ }
305
+
306
+ @keyframes spin {
307
+ to { transform: rotate(360deg); }
308
+ }
309
+
310
+ .placeholder-text {
311
+ text-align: center;
312
+ grid-column: 1 / -1;
313
+ padding: 2rem;
314
+ color: #6b6a7a;
315
+ font-style: italic;
316
+ }
317
+
318
+ .download-all-container {
319
+ max-width: 1000px;
320
+ margin: 1rem auto;
321
+ display: flex;
322
+ justify-content: center;
323
+ }
324
+
325
+ .download-all-button {
326
+ padding: 0.75rem 1.5rem;
327
+ background-color: var(--primary-color);
328
+ color: white;
329
+ border: none;
330
+ border-radius: 0.5rem;
331
+ font-weight: 500;
332
+ cursor: pointer;
333
+ transition: all 0.3s ease;
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 0.5rem;
337
+ }
338
+
339
+ .download-all-button:hover {
340
+ background-color: var(--secondary-color);
341
+ }
342
+
343
+ .enhance-popup {
344
+ position: fixed;
345
+ top: 0;
346
+ left: 0;
347
+ width: 100%;
348
+ height: 100%;
349
+ background-color: rgba(0, 0, 0, 0.7);
350
+ display: flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ z-index: 1000;
354
+ }
355
+
356
+ .enhance-popup-content {
357
+ background-color: #1a1830;
358
+ border-radius: 0.5rem;
359
+ padding: 1.5rem;
360
+ width: 90%;
361
+ max-width: 500px;
362
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
363
+ }
364
+
365
+ .enhance-popup h3 {
366
+ margin-top: 0;
367
+ margin-bottom: 1rem;
368
+ color: var(--accent-color);
369
+ }
370
+
371
+ .enhance-popup p {
372
+ margin-bottom: 1rem;
373
+ color: #b8b7c5;
374
+ }
375
+
376
+ .enhance-popup textarea {
377
+ width: 100%;
378
+ min-height: 150px;
379
+ margin-bottom: 1rem;
380
+ }
381
+
382
+ .enhance-popup-buttons {
383
+ display: flex;
384
+ justify-content: flex-end;
385
+ gap: 0.5rem;
386
+ }
387
+
388
+ .enhance-popup-buttons button {
389
+ padding: 0.5rem 1rem;
390
+ border-radius: 0.25rem;
391
+ border: none;
392
+ cursor: pointer;
393
+ font-weight: 500;
394
+ }
395
+
396
+ #cancelEnhanceBtn {
397
+ background-color: #2d2b4a;
398
+ color: white;
399
+ }
400
+
401
+ #submitEnhanceBtn {
402
+ background-color: var(--primary-color);
403
+ color: white;
404
+ }
405
+
406
+ .enhance-loading {
407
+ display: flex;
408
+ flex-direction: column;
409
+ align-items: center;
410
+ justify-content: center;
411
+ padding: 1rem;
412
+ }
413
+
414
+ .enhance-spinner {
415
+ width: 40px;
416
+ height: 40px;
417
+ border: 4px solid rgba(255, 255, 255, 0.3);
418
+ border-radius: 50%;
419
+ border-top-color: var(--accent-color);
420
+ animation: spin 1s ease-in-out infinite;
421
+ margin-bottom: 1rem;
422
+ }
423
+
424
+ .fullscreen-overlay {
425
+ position: fixed;
426
+ top: 0;
427
+ left: 0;
428
+ width: 100%;
429
+ height: 100%;
430
+ background-color: rgba(0, 0, 0, 0.9);
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ z-index: 2000;
435
+ }
436
+
437
+ .fullscreen-container {
438
+ position: relative;
439
+ max-width: 90%;
440
+ max-height: 90%;
441
+ display: flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ }
445
+
446
+ .fullscreen-container img {
447
+ max-width: 100%;
448
+ max-height: 80vh;
449
+ object-fit: contain;
450
+ }
451
+
452
+ .prev-btn, .next-btn {
453
+ position: absolute;
454
+ top: 50%;
455
+ transform: translateY(-50%);
456
+ background-color: rgba(0, 0, 0, 0.5);
457
+ border: none;
458
+ color: white;
459
+ width: 50px;
460
+ height: 50px;
461
+ border-radius: 50%;
462
+ font-size: 1.25rem;
463
+ cursor: pointer;
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: center;
467
+ }
468
+
469
+ .prev-btn {
470
+ left: -25px;
471
+ }
472
+
473
+ .next-btn {
474
+ right: -25px;
475
+ }
476
+
477
+ .prev-btn:disabled, .next-btn:disabled {
478
+ opacity: 0.3;
479
+ cursor: not-allowed;
480
+ }
481
+
482
+ .fullscreen-controls {
483
+ position: absolute;
484
+ bottom: -60px;
485
+ left: 50%;
486
+ transform: translateX(-50%);
487
+ display: flex;
488
+ gap: 1rem;
489
+ }
490
+
491
+ .fullscreen-controls button {
492
+ padding: 0.5rem 1rem;
493
+ background-color: var(--primary-color);
494
+ color: white;
495
+ border: none;
496
+ border-radius: 0.25rem;
497
+ cursor: pointer;
498
+ }
499
+
500
+ .zip-loading-indicator {
501
+ position: absolute;
502
+ top: 0;
503
+ left: 0;
504
+ width: 100%;
505
+ height: 100%;
506
+ background-color: rgba(15, 14, 23, 0.8);
507
+ display: flex;
508
+ flex-direction: column;
509
+ align-items: center;
510
+ justify-content: center;
511
+ z-index: 10;
512
+ }
513
+
514
+ .zip-spinner {
515
+ width: 40px;
516
+ height: 40px;
517
+ border: 4px solid rgba(255, 255, 255, 0.3);
518
+ border-radius: 50%;
519
+ border-top-color: var(--accent-color);
520
+ animation: spin 1s ease-in-out infinite;
521
+ margin-bottom: 1rem;
522
+ }
523
+
524
+ .collapsible-header {
525
+ display: flex;
526
+ justify-content: space-between;
527
+ align-items: center;
528
+ cursor: pointer;
529
+ padding: 0.5rem 0;
530
+ }
531
+
532
+ .toggle-icon {
533
+ transition: transform 0.3s ease;
534
+ }
535
+
536
+ .toggle-icon.expanded {
537
+ transform: rotate(180deg);
538
+ }
539
+
540
+ .export-button {
541
+ padding: 0.5rem 1rem;
542
+ background-color: var(--primary-color);
543
+ color: white;
544
+ border: none;
545
+ border-radius: 0.25rem;
546
+ cursor: pointer;
547
+ margin-top: 0.5rem;
548
+ display: flex;
549
+ align-items: center;
550
+ gap: 0.5rem;
551
+ }
552
+
553
+ .link-vaporwave {
554
+ color: var(--accent-color);
555
+ text-decoration: none;
556
+ font-weight: bold;
557
+ }
558
+
559
+ /* Aspect ratio specific styles */
560
+ .image-card[data-aspect-ratio="1:1"] { aspect-ratio: 1/1; }
561
+ .image-card[data-aspect-ratio="4:3"] { aspect-ratio: 4/3; }
562
+ .image-card[data-aspect-ratio="16:9"] { aspect-ratio: 16/9; }
563
+ .image-card[data-aspect-ratio="21:9"] { aspect-ratio: 21/9; }
564
+ .image-card[data-aspect-ratio="3:2"] { aspect-ratio: 3/2; }
565
+ .image-card[data-aspect-ratio="5:4"] { aspect-ratio: 5/4; }
566
+ .image-card[data-aspect-ratio="2:1"] { aspect-ratio: 2/1; }
567
+ .image-card[data-aspect-ratio="16:10"] { aspect-ratio: 16/10; }
568
+ .image-card[data-aspect-ratio="32:9"] { aspect-ratio: 32/9; }
569
+ .image-card[data-aspect-ratio="4:1"] { aspect-ratio: 4/1; }
570
+ .image-card[data-aspect-ratio="17:10"] { aspect-ratio: 17/10; }
571
+ .image-card[data-aspect-ratio="3:4"] { aspect-ratio: 3/4; }
572
+ .image-card[data-aspect-ratio="9:16"] { aspect-ratio: 9/16; }
573
+ .image-card[data-aspect-ratio="9:21"] { aspect-ratio: 9/21; }
574
+ .image-card[data-aspect-ratio="2:3"] { aspect-ratio: 2/3; }
575
+ .image-card[data-aspect-ratio="4:5"] { aspect-ratio: 4/5; }
576
+ .image-card[data-aspect-ratio="1:2"] { aspect-ratio: 1/2; }
577
+ .image-card[data-aspect-ratio="10:16"] { aspect-ratio: 10/16; }
578
+ .image-card[data-aspect-ratio="9:32"] { aspect-ratio: 9/32; }
579
+ .image-card[data-aspect-ratio="1:4"] { aspect-ratio: 1/4; }
580
+ .image-card[data-aspect-ratio="10:17"] { aspect-ratio: 10/17; }
581
+
582
+ /* Adjust loading indicators for super panoramic ratios */
583
+ .image-card[data-aspect-ratio="1:4"] .image-spinner {
584
+ width: 25px;
585
+ height: 25px;
586
+ border-width: 2px;
587
+ }
588
+
589
+ .image-card[data-aspect-ratio="1:4"] .image-loading-indicator p {
590
+ font-size: 0.8rem;
591
+ margin-top: 5px;
592
+ }
593
+
594
+ .image-card[data-aspect-ratio="4:1"] .image-loading-indicator {
595
+ flex-direction: row;
596
+ gap: 10px;
597
+ }
598
+
599
+ .image-card[data-aspect-ratio="4:1"] .image-spinner {
600
+ width: 25px;
601
+ height: 25px;
602
+ border-width: 2px;
603
+ }
604
+
605
+ .image-card[data-aspect-ratio="4:1"] .image-loading-indicator p {
606
+ font-size: 0.8rem;
607
+ margin-top: 0;
608
+ }
609
+ </style>
610
+ </head>
611
+ <body>
612
+ <div class="container">
613
+ <header>
614
+ <div class="header-image" style="background: url(https://user-uploads.perchance.org/file/2a919818dc1782895c9d30bdecbe2765.jpg) no-repeat left center; background-size: cover; height: 200px; display: flex; align-items: center; justify-content: center; text-align: center; color: white; font-size: 1.55em; font-weight: 500; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; margin: auto; border-radius: 0.6rem; text-align: center; max-width: 1000px; width:100%; position: relative;">
615
+ <!-- Galaxy themed menu button -->
616
+ <div class="menu-toggle" id="menuToggleBtn">
617
+ <i class="fas fa-bars"></i>
618
+ </div>
619
+
620
+ <!-- Galaxy themed expanding menu -->
621
+ <div class="galaxy-menu" id="galaxyMenuCtn">
622
+ <div class="menu-item"><a href="https://perchance.org/bove-ai" target="_blank">Bove AI</a></div>
623
+ <div class="menu-item"><a href="https://perchance.org/c0d3-story-forge" target="_blank">Story Forge</a></div>
624
+ <div class="menu-item"><a href="https://perchance.org/ai-chat" target="_blank">AI Chat</a></div>
625
+ <div class="menu-item"><a href="https://imgupscaler.com" target="_blank">Image Upscaler</a></div>
626
+ <div class="menu-item"><a href="https://perchance.org/bove-flux-prompt-extractor" target="_blank">Prompt Extractor</a></div>
627
+ <div class="menu-item"><a href="https://discord.gg/GJ3fFStWF7" target="_blank">Discord</a></div>
628
+ </div>
629
+ </div>
630
+ </header>
631
+
632
+ <div class="control-panel">
633
+ <div class="input-group">
634
+ <div class="collapsible-header" id="scratchpadHeader">
635
+ <label for="scratchpadInput">Scratchpad</label>
636
+ <span class="toggle-icon">▼</span>
637
+ </div>
638
+ <div class="collapsible-content" id="scratchpadContent" hidden>
639
+ <textarea id="scratchpadInput" placeholder="Use this area for notes, ideas or draft prompts..."></textarea>
640
+ <button id="exportScratchpadBtn" class="export-button">
641
+ <span>📝 Export to Text File</span>
642
+ </button>
643
+ </div>
644
+ </div>
645
+
646
+ <div class="input-group">
647
+ <label for="promptInput">Image Prompt</label>
648
+ <div class="prompt-container">
649
+ <textarea id="promptInput" placeholder="Describe what you want to see..."></textarea>
650
+ <button id="enhancePromptBtn" class="enhance-button" title="Enhance prompt with AI">
651
+ <i class="fas fa-magic"></i>
652
+ </button>
653
+ </div>
654
+ </div>
655
+
656
+ <div class="input-row">
657
+ <div class="input-group">
658
+ <label for="countInput">Number of Images</label>
659
+ <select id="countInput">
660
+ <option value="1">1</option>
661
+ <option value="2">2</option>
662
+ <option value="3">3</option>
663
+ <option value="4" selected>4</option>
664
+ <option value="5">5</option>
665
+ <option value="6">6</option>
666
+ <option value="7">7</option>
667
+ <option value="8">8</option>
668
+ <option value="9">9</option>
669
+ <option value="10">10</option>
670
+ </select>
671
+ </div>
672
+
673
+ <div class="input-group">
674
+ <label for="aspectRatioSelect">Aspect Ratio</label>
675
+ <select id="aspectRatioSelect">
676
+ <optgroup label="Square">
677
+ <option value="1:1">1:1 (Square)</option>
678
+ </optgroup>
679
+ <optgroup label="Landscape">
680
+ <option value="4:3">4:3 (Standard)</option>
681
+ <option value="16:9">16:9 (Widescreen)</option>
682
+ <option value="21:9">21:9 (Ultrawide)</option>
683
+ <option value="3:2">3:2 (Photography)</option>
684
+ <option value="5:4">5:4 (Classic Monitor)</option>
685
+ <option value="2:1">2:1 (Cinematic)</option>
686
+ <option value="16:10">16:10 (Widescreen Monitor)</option>
687
+ <option value="32:9">32:9 (Super Ultrawide)</option>
688
+ <option value="4:1">4:1 (Super Panoramic)</option>
689
+ <option value="17:10">17:10 (Microsoft Surface)</option>
690
+ </optgroup>
691
+ <optgroup label="Portrait">
692
+ <option value="3:4">3:4 (Standard)</option>
693
+ <option value="9:16">9:16 (Widescreen)</option>
694
+ <option value="9:21">9:21 (Ultrawide)</option>
695
+ <option value="2:3">2:3 (Photography)</option>
696
+ <option value="4:5">4:5 (Classic Monitor)</option>
697
+ <option value="1:2">1:2 (Cinematic)</option>
698
+ <option value="10:16">10:16 (Widescreen Monitor)</option>
699
+ <option value="9:32">9:32 (Super Ultrawide)</option>
700
+ <option value="1:4">1:4 (Super Panoramic)</option>
701
+ <option value="10:17">10:17 (Microsoft Surface)</option>
702
+ </optgroup>
703
+ </select>
704
+ </div>
705
+
706
+ <div class="input-group">
707
+ <label for="seedInput">Seed</label>
708
+ <input type="text" id="seedInput" placeholder="Leave empty for random" style="padding:11px;">
709
+ </div>
710
+ </div>
711
+
712
+ <div class="input-group">
713
+ <div style="display: flex; justify-content: left; align-items: center; margin-bottom: 10px;">
714
+ <label style="position:relative; top:4px;">Our Styles</label>&nbsp;&nbsp;&nbsp;
715
+ <select id="categoryFilter" style="max-width: 120px; padding: 8px; border-radius: 8px; background: rgba(0, 0, 0, 0.1); color: white; border: 1px solid; border-top-color: #cd30c6; border-right-color: #ae308d; border-bottom-color: #6430cd; border-left-color: #ae308d; font-size:80%;">
716
+ <option value="All">All Categories</option>
717
+ </select>
718
+ </div>
719
+ <div class="style-images-container">
720
+ <div class="style-image-item selected" data-value="" data-cat="All, Animation, Dreamscape, Anthro, Artistic, Realistic, Semi-Realistic">
721
+ <div class="style-image no-style-style">No Style</div>
722
+ <span>No Style</span>
723
+ </div>
724
+ <div class="style-image-item" data-value="Anime Action style" data-cat="All, Animation">
725
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/2460688e472b17a1a8cd5e8dc082e99a.jpg"></div>
726
+ <span>Anime Action</span>
727
+ </div>
728
+ <div class="style-image-item" data-value="Anime City at Night style" data-cat="All, Animation">
729
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/fcefd0d2fcb0c2aabf1ad8714faef132.jpg"></div>
730
+ <span>Anime City at Night</span>
731
+ </div>
732
+ <div class="style-image-item" data-value="Anime Portrait style" data-cat="All, Animation">
733
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/6ca8fcb9cce0308cf3333d6bca8499b2.jpg"></div>
734
+ <span>Anime Portrait</span>
735
+ </div>
736
+ <div class="style-image-item" data-value="Animorphic Allure style" data-cat="All, Anthro, Semi-Realistic">
737
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/02c3ddaa6e99bb6089be3ea244c1c132.jpg"></div>
738
+ <span>Animorphic Allure</span>
739
+ </div>
740
+ <div class="style-image-item" data-value="Anthromorph Portrait style" data-cat="All, Anthro, Semi-Realistic">
741
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/31fd10f35a8eda214c821c4b037a7597.jpg"></div>
742
+ <span>Anthromorph Portrait</span>
743
+ </div>
744
+ <div class="style-image-item" data-value="Anthromorph style" data-cat="All, Anthro, Semi-Realistic">
745
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/88ea23045944915c1555251f654e83f5.jpg"></div>
746
+ <span>Anthromorph</span>
747
+ </div>
748
+ <div class="style-image-item" data-value="Arcane Grit style" data-cat="All, Realistic, Dreamscape">
749
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/35e45558fe6cc6ceaa99a52cb7285a01.jpg"></div>
750
+ <span>Arcane Grit</span>
751
+ </div>
752
+ <div class="style-image-item" data-value="Aurora Mountains style" data-cat="All, Realistic">
753
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/bef5c041a28d15825b34f3006d55f518.jpg"></div>
754
+ <span>Aurora Mountains</span>
755
+ </div>
756
+ <div class="style-image-item" data-value="Artistic Anthro style" data-cat="All, Artistic, Anthro">
757
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/581ad3e82643394dcf58e722bb56b42d.jpg"></div>
758
+ <span>Artistic Anthro</span>
759
+ </div>
760
+ <div class="style-image-item" data-value="Beyond Ink style" data-cat="All, Animation, Semi-Realistic">
761
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/58b023a021ba0518cd2aedafa7602942.jpg"></div>
762
+ <span>Beyond Ink</span>
763
+ </div>
764
+ <div class="style-image-item" data-value="Canopy Cascade style" data-cat="All, Realistic">
765
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/046e0080919d27944f063c5aae853e0a.jpg"></div>
766
+ <span>Canopy Cascade</span>
767
+ </div>
768
+ <div class="style-image-item" data-value="Chara Uniform POP style" data-cat="All, Animation">
769
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/7d5ad035e3fe06d82433b9eab3269136.jpg"></div>
770
+ <span>Chara Uniform POP</span>
771
+ </div>
772
+ <div class="style-image-item" data-value="Charcoal Medium style" data-cat="All, Artistic">
773
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/5d78b377ecfa0ed716449a584f77245b.jpg"></div>
774
+ <span>Charcoal Medium</span>
775
+ </div>
776
+ <div class="style-image-item" data-value="Chibi style" data-cat="All, Animation">
777
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/f0a09cb2c7cc291302029ec9fcbf9f7f.jpg"></div>
778
+ <span>Chibi</span>
779
+ </div>
780
+ <div class="style-image-item" data-value="Chromaflux Anime style" data-cat="All, Dreamscape, Animation">
781
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/1df78dc408a8e9e4f62b25db4da95660.jpg"></div>
782
+ <span>Chromaflux Anime</span>
783
+ </div>
784
+ <div class="style-image-item" data-value="Chromaflux Realism style" data-cat="All, Dreamscape, Realistic">
785
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/cd47a0638f8ba87336e3117a872ecca0.jpg"></div>
786
+ <span>Chromaflux Realism</span>
787
+ </div>
788
+ <div class="style-image-item" data-value="Cinematic style" data-cat="All, Realistic">
789
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/8d140ccf6a74d8a3e22fbddecfc3e016.jpg"></div>
790
+ <span>Cinematic</span>
791
+ </div>
792
+ <div class="style-image-item" data-value="Claymation 3D style" data-cat="All, Animation, Artistic">
793
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/d336745211e0ea7eb8baf877824c3106.jpg"></div>
794
+ <span>Claymation 3D</span>
795
+ </div>
796
+ <div class="style-image-item" data-value="Coloring Book Lineart style" data-cat="All, Artistic">
797
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/99bd59141db05bf7ebde5723359e46c4.jpg"></div>
798
+ <span>Coloring Book Lineart</span>
799
+ </div>
800
+ <div class="style-image-item" data-value="Cyberfinned style" data-cat="All, Dreamscape, Semi-Realistic">
801
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/a21efdc657ed6b2fbd0bac7abaf88f6f.jpg"></div>
802
+ <span>Cyberfinned</span>
803
+ </div>
804
+ <div class="style-image-item" data-value="Disney 2D style" data-cat="All, Animation">
805
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/76b0df2c88bdf30eb90f4da839495ae0.jpg"></div>
806
+ <span>Disney 2D</span>
807
+ </div>
808
+ <div class="style-image-item" data-value="EGL Fashionista Figurina style" data-cat="All, Animation, Semi-Realistic">
809
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/1c6971df56912d1813ab8b8fc7afb0b5.jpg"></div>
810
+ <span>EGL Fashionista Figurina</span>
811
+ </div>
812
+ <div class="style-image-item" data-value="Egyptian Papyrus style" data-cat="All, Artistic">
813
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/a2305619171e6ae1a602e19dfc3a5442.jpg"></div>
814
+ <span>Egyptian Papyrus</span>
815
+ </div>
816
+ <div class="style-image-item" data-value="Epic Scene style" data-cat="All, Animation">
817
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/f3d59eaf4822861b0a2b63f3c326adb0.jpg"></div>
818
+ <span>Epic Scene</span>
819
+ </div>
820
+ <div class="style-image-item" data-value="Ethereal Realism style" data-cat="All, Realistic, Dreamscape">
821
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/024a6e9b6b391d9553e087810c99b212.jpg"></div>
822
+ <span>Ethereal Realism</span>
823
+ </div>
824
+ <div class="style-image-item" data-value="Faevored style" data-cat="All, Dreamscape, Semi-Realistic">
825
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/63edd2b5c84a8dd9bb4054ddc0bf9208.jpg"></div>
826
+ <span>Faevored</span>
827
+ </div>
828
+ <div class="style-image-item" data-value="Fantasy World Map style" data-cat="All, Dreamscape, Artistic">
829
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/8bb0d785951c6f21bb719a30db410285.jpg"></div>
830
+ <span>Fantasy World Map</span>
831
+ </div>
832
+ <div class="style-image-item" data-value="Flat Anthro style" data-cat="All, Animation, Anthro">
833
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/140bf7f3b5020d9e0f5dc517b4742cf4.jpg"></div>
834
+ <span>Flat Anthro</span>
835
+ </div>
836
+ <div class="style-image-item" data-value="Flat Toon style" data-cat="All, Animation">
837
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/1734e41b9bffeeedc769891d8438300e.jpg"></div>
838
+ <span>Flat Toon</span>
839
+ </div>
840
+ <div class="style-image-item" data-value="Fractured Soul style" data-cat="All, Realistic, Dreamscape">
841
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/c32947a598e90f98295a5b068f16c675.jpg"></div>
842
+ <span>Fractured Soul</span>
843
+ </div>
844
+ <div class="style-image-item" data-value="Gothic Romance style" data-cat="All, Dreamscape">
845
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/8971ae9dbc599f14115fc1ec0c349bc6.jpg"></div>
846
+ <span>Gothic Romance</span>
847
+ </div>
848
+ <div class="style-image-item" data-value="Greyscale Banksy style" data-cat="All, Artistic">
849
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/c63b3c584073b3e86984fcda3ac1dbd7.jpg"></div>
850
+ <span>Greyscale Banksy</span>
851
+ </div>
852
+ <div class="style-image-item" data-value="Grim Seduction style" data-cat="All, Realistic, Dreamscape">
853
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/760404de5691bddf27fe615bc2c5dd01.jpg"></div>
854
+ <span>Grim Seduction</span>
855
+ </div>
856
+ <div class="style-image-item" data-value="Historical Wendigo style" data-cat="All, Animation, Dreamscape">
857
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/5c5cf7f6d0e8ff2f8e7c08fddf661a83.jpg"></div>
858
+ <span>Historical Wendigo</span>
859
+ </div>
860
+ <div class="style-image-item" data-value="Hue POP Double style" data-cat="All, Artistic">
861
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/08ecec16af7f68d0962e8101163fa539.jpg"></div>
862
+ <span>Hue POP Double</span>
863
+ </div>
864
+ <div class="style-image-item" data-value="Hue POP Single style" data-cat="All, Artistic">
865
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/5e87ad284617e5c62b9afa03a1f0720a.jpg"></div>
866
+ <span>Hue POP Single</span>
867
+ </div>
868
+ <div class="style-image-item" data-value="Impending Demise style" data-cat="All, Dreamscape, Realistic">
869
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/6067695baa19ad4ccea9f38d0fc4099f.jpg"></div>
870
+ <span>Impending Demise</span>
871
+ </div>
872
+ <div class="style-image-item" data-value="Inkblot style" data-cat="All, Artistic">
873
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/4e9996f22885a198a2b193425afa963d.jpg"></div>
874
+ <span>Inkblot</span>
875
+ </div>
876
+ <div class="style-image-item" data-value="Isometric Diorama style" data-cat="All, Artistic">
877
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/56ea6b3e84b1e6ecb7157ab0a246c531.jpg"></div>
878
+ <span>Isometric Diorama</span>
879
+ </div>
880
+ <div class="style-image-item" data-value="Lineart: Heavy Negatives style" data-cat="All, Artistic">
881
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/9dc05f20e4713dfc1ba11c581129ed0a.jpg"></div>
882
+ <span>Lineart: Heavy Negatives</span>
883
+ </div>
884
+ <div class="style-image-item" data-value="Lucid Dreams style" data-cat="All, Dreamscape">
885
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/7ceb02e2016c0e59d020ed44de9f9c08.jpg"></div>
886
+ <span>Lucid Dreams</span>
887
+ </div>
888
+ <div class="style-image-item" data-value="Luminous Forest style" data-cat="All, Dreamscape, Realistic">
889
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/275a06acec0af0e84168cbb10d03fee5.jpg"></div>
890
+ <span>Luminous Forest</span>
891
+ </div>
892
+ <div class="style-image-item" data-value="Morbid Opulence style" data-cat="All, Dreamscape">
893
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/4400e9c7409a317918e511841fd18525.jpg"></div>
894
+ <span>Morbid Opulence</span>
895
+ </div>
896
+ <div class="style-image-item" data-value="Mosaic Radiance style" data-cat="All, Artistic, Dreamscape">
897
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/2f6a4c609921a72ba1828e1511c3d55c.jpg"></div>
898
+ <span>Mosaic Radiance</span>
899
+ </div>
900
+ <div class="style-image-item" data-value="Muted POP Realistic style" data-cat="All, Realistic">
901
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/a0489dba334f1a7ad4fdb6a046feb4b2.jpg"></div>
902
+ <span>Muted POP Realistic</span>
903
+ </div>
904
+ <div class="style-image-item" data-value="Muted POP Semi-Realistic style" data-cat="All, Animation, Semi-Realistic">
905
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/eba46559ec00154ccb32eaff8d035226.jpg"></div>
906
+ <span>Muted POP Semi-Realistic</span>
907
+ </div>
908
+ <div class="style-image-item" data-value="Muted POP style" data-cat="All, Animation">
909
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/f7695157403d3bdd8bed76e48b1f078e.jpg"></div>
910
+ <span>Muted POP</span>
911
+ </div>
912
+ <div class="style-image-item" data-value="Mythic Furism style" data-cat="All, Anthro, Dreamscape">
913
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/1c4b9db2bb09cc6eb6fd8ba9e9cfa264.jpg"></div>
914
+ <span>Mythic Furism</span>
915
+ </div>
916
+ <div class="style-image-item" data-value="NecroSynth Fusion style" data-cat="All, Dreamscape, Semi-Realistic">
917
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/5bda80f5e0348bab2e42c9bd6d51883d.jpg"></div>
918
+ <span>NecroSynth Fusion</span>
919
+ </div>
920
+ <div class="style-image-item" data-value="Neon Rave style" data-cat="All, Dreamscape">
921
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/870bc9e51dec89fc99eef24af8505175.jpg"></div>
922
+ <span>Neon Rave</span>
923
+ </div>
924
+ <div class="style-image-item" data-value="Noir Film style" data-cat="All, Realistic, Artistic">
925
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/81d791657cdd0f3efef65f60950c8788.jpg"></div>
926
+ <span>Noir Film</span>
927
+ </div>
928
+ <div class="style-image-item" data-value="Novel Illustration style" data-cat="All, Artistic">
929
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/fdbeb6aae89090bb90a57ba239af426b.jpg"></div>
930
+ <span>Novel Illustration</span>
931
+ </div>
932
+ <div class="style-image-item" data-value="Oil Paint Portrait style" data-cat="All, Artistic">
933
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/eb22bb6a1b515db4de5155e1e679eee7.jpg"></div>
934
+ <span>Oil Paint Portrait</span>
935
+ </div>
936
+ <div class="style-image-item" data-value="Oil Paint Colorism style" data-cat="All, Artistic">
937
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/f64bcec84260e4376c7a27ad5cc9569b.jpg"></div>
938
+ <span>Oil Paint Colorism</span>
939
+ </div>
940
+ <div class="style-image-item" data-value="Painted Vector style" data-cat="All, Artistic">
941
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/aadf78418e2cd653362afc54ad49c13c.jpg"></div>
942
+ <span>Painted Vector</span>
943
+ </div>
944
+ <div class="style-image-item" data-value="Pretty Pixels style" data-cat="All, Artistic">
945
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/43a9146e4d8cfe1c70a0d13194daa982.jpg"></div>
946
+ <span>Pretty Pixels</span>
947
+ </div>
948
+ <div class="style-image-item" data-value="Prisma style" data-cat="All, Dreamscape, Realistic">
949
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/556b68a667ae1e7fbf5e635a5e0e8ea5.jpg"></div>
950
+ <span>Prisma</span>
951
+ </div>
952
+ <div class="style-image-item" data-value="Royal Flush style" data-cat="All, Animation">
953
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/b427004dfc4141a30ee0932345a7c025.jpg"></div>
954
+ <span>Royal Flush</span>
955
+ </div>
956
+ <div class="style-image-item" data-value="Scribble Doodle style" data-cat="All, Artistic">
957
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/56fa1cb7995109fbe5466d1743cf8c1d.jpg"></div>
958
+ <span>Scribble Doodle</span>
959
+ </div>
960
+ <div class="style-image-item" data-value="Slime Time style" data-cat="All, Artistic, Dreamscape">
961
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/41a594109156fa606e1fcca2d547a6d4.jpg"></div>
962
+ <span>Slime Time</span>
963
+ </div>
964
+ <div class="style-image-item" data-value="Slugbox Imitation style" data-cat="All, Artistic, Animation">
965
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/babef7b3bf431fafc302a5638711f176.jpg"></div>
966
+ <span>Slugbox Imitation</span>
967
+ </div>
968
+ <div class="style-image-item" data-value="Splintered Visions style" data-cat="All, Dreamscape, Realistic">
969
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/1f94b3185727e325e53ecfb06e5b17d2.jpg"></div>
970
+ <span>Splintered Visions</span>
971
+ </div>
972
+ <div class="style-image-item" data-value="Streetwild Anthro style" data-cat="All, Anthro, Artistic">
973
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/d628cdf7afd10c3abc3cb9726c840e39.jpg"></div>
974
+ <span>Streetwild Anthro</span>
975
+ </div>
976
+ <div class="style-image-item" data-value="Streetwild style" data-cat="All, Artistic">
977
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/245ca4b2f48b9df6aaf30c469233a265.jpg"></div>
978
+ <span>Streetwild</span>
979
+ </div>
980
+ <div class="style-image-item" data-value="Stylized Anthro style" data-cat="All, Anthro, Artistic">
981
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/b9fe88034748b62b96fca26fbb945c40.jpg"></div>
982
+ <span>Stylized Anthro</span>
983
+ </div>
984
+ <div class="style-image-item" data-value="Suffering Souls style" data-cat="All, Dreamscape, Animation">
985
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/a646219694345e5c55da901600aadc67.jpg"></div>
986
+ <span>Suffering Souls</span>
987
+ </div>
988
+ <div class="style-image-item" data-value="TechnoBlossom Anime style" data-cat="All, Dreamscape, Animation">
989
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/413bed57f177b06bee21510ac8c5c7d7.jpg"></div>
990
+ <span>TechnoBlossom Anime</span>
991
+ </div>
992
+ <div class="style-image-item" data-value="TechnoBlossom style" data-cat="All, Dreamscape, Realistic">
993
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/cc06751e2921de278c323672c4c48b69.jpg"></div>
994
+ <span>TechnoBlossom</span>
995
+ </div>
996
+ <div class="style-image-item" data-value="Temple Ambience style" data-cat="All, Semi-Realistic">
997
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/76b7fb24b2c1b82a80962805b5dbc14a.jpg"></div>
998
+ <span>Temple Ambience</span>
999
+ </div>
1000
+ <div class="style-image-item" data-value="Traditional Asian style" data-cat="All, Artistic">
1001
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/a5e56c4f5afafa11a0f20e1d3f475fe9.jpg"></div>
1002
+ <span>Traditional Asian</span>
1003
+ </div>
1004
+ <div class="style-image-item" data-value="Veil of Shadows style" data-cat="All, Dreamscape">
1005
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/ff3e0547cbcb23ef216fe9e6f60f2d30.jpg"></div>
1006
+ <span>Veil of Shadows</span>
1007
+ </div>
1008
+ <div class="style-image-item" data-value="Watercolor style" data-cat="All, Artistic">
1009
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/b7a27c314eb1c16e1c36f9acfa680c7b.jpg"></div>
1010
+ <span>Watercolor</span>
1011
+ </div>
1012
+ <div class="style-image-item" data-value="Whimsy style" data-cat="All, Artistic, Dreamscape">
1013
+ <div class="style-image"><img src="https://user-uploads.perchance.org/file/086aae9b4eef9c8dbc0f289315a85b72.jpg"></div>
1014
+ <span>Whimsy</span>
1015
+ </div>
1016
+ </div>
1017
+ <div class="selected-styles-container">
1018
+ <!-- Selected styles tags will appear here -->
1019
+ </div>
1020
+ </div>
1021
+
1022
+ <button id="generateBtn" class="generate-button">
1023
+ <span class="star-icon">✨</span> CREATE <span class="star-icon">✨</span>
1024
+ </button>
1025
+ </div>
1026
+
1027
+ <div id="resultsContainer" class="results-container">
1028
+ <!-- Generated images will appear here -->
1029
+ <div class="placeholder-text">Your cosmic creations will appear here.</div>
1030
+ </div>
1031
+
1032
+ <div id="generateMoreContainer" class="download-all-container" hidden>
1033
+ <button id="generateMoreBtn" class="download-all-button">
1034
+ <i class="fas fa-plus"></i> Generate More Images
1035
+ </button>
1036
+ </div>
1037
+
1038
+ <div id="downloadAllContainer" class="download-all-container" hidden>
1039
+ <button id="downloadAllBtn" class="download-all-button">
1040
+ <i class="fas fa-download"></i> Download All Images as ZIP
1041
+ </button>
1042
+ </div>
1043
+
1044
+ <div id="backToTopContainer" class="download-all-container" hidden>
1045
+ <button id="backToTopBtn" class="download-all-button">
1046
+ <i class="fas fa-arrow-up"></i> Back to Top
1047
+ </button>
1048
+ </div>
1049
+ </div>
1050
+
1051
+ <div style="width:100%; max-width: 1000px; margin:auto; text-align:center; padding:10px;"><span id="userGens"></span><p style="font-size: 70%;">[fun]</p></div>
1052
+
1053
+ <script>
1054
+ // Initialize counter from localStorage
1055
+ let counter = parseInt(localStorage.getItem("counter")) || 0;
1056
+ localStorage.setItem('counter', counter);
1057
+ document.getElementById('userGens').innerHTML = `You have personally generated <strong class="link-vaporwave">${counter}</strong> images on this device.`;
1058
+
1059
+ function refreshCount() {
1060
+ let counter = parseInt(localStorage.getItem("counter"));
1061
+ counter++;
1062
+ localStorage.setItem('counter', counter);
1063
+ document.getElementById('userGens').innerHTML = `You have generated <strong class="link-vaporwave">${counter}</strong> images on this device. Like Bove? Consider donating to help make it better!`;
1064
+ }
1065
+
1066
+ // Array to store the order of selected styles
1067
+ let selectedStylesOrder = ["No Style"];
1068
+
1069
+ // Function to auto-resize a textarea based on its content
1070
+ function autoResizeTextarea(textarea) {
1071
+ // Reset height to auto so we can correctly calculate the new height
1072
+ textarea.style.height = 'auto';
1073
+ // Set the height to match the scroll height (the height of the content)
1074
+ textarea.style.height = textarea.scrollHeight + 10 + 'px';
1075
+ }
1076
+
1077
+ // Function to save form values to local storage
1078
+ function saveFormToLocalStorage() {
1079
+ // Save scratchpad content
1080
+ localStorage.scratchpadContent = document.getElementById('scratchpadInput').value;
1081
+
1082
+ // Save image prompt
1083
+ localStorage.imagePrompt = document.getElementById('promptInput').value;
1084
+
1085
+ // Save number of images
1086
+ localStorage.imageCount = document.getElementById('countInput').value;
1087
+
1088
+ // Save aspect ratio
1089
+ localStorage.aspectRatio = document.getElementById('aspectRatioSelect').value;
1090
+
1091
+ // Save seed
1092
+ localStorage.imageSeed = document.getElementById('seedInput').value;
1093
+
1094
+ // Save selected styles and their order
1095
+ localStorage.selectedStylesOrder = JSON.stringify(selectedStylesOrder);
1096
+ }
1097
+
1098
+ // Function to load form values from local storage
1099
+ function loadFormFromLocalStorage() {
1100
+ // Load scratchpad content if it exists
1101
+ if (localStorage.scratchpadContent) {
1102
+ document.getElementById('scratchpadInput').value = localStorage.scratchpadContent;
1103
+ }
1104
+
1105
+ // Load image prompt if it exists
1106
+ if (localStorage.imagePrompt) {
1107
+ document.getElementById('promptInput').value = localStorage.imagePrompt;
1108
+ }
1109
+
1110
+ // Load number of images if it exists
1111
+ if (localStorage.imageCount) {
1112
+ document.getElementById('countInput').value = localStorage.imageCount;
1113
+ }
1114
+
1115
+ // Load aspect ratio if it exists
1116
+ if (localStorage.aspectRatio) {
1117
+ document.getElementById('aspectRatioSelect').value = localStorage.aspectRatio;
1118
+ }
1119
+
1120
+ // Load seed if it exists
1121
+ if (localStorage.imageSeed) {
1122
+ document.getElementById('seedInput').value = localStorage.imageSeed;
1123
+ }
1124
+
1125
+ // Load selected styles order if it exists
1126
+ if (localStorage.selectedStylesOrder) {
1127
+ try {
1128
+ selectedStylesOrder = JSON.parse(localStorage.selectedStylesOrder);
1129
+
1130
+ // If the loaded array is empty, default to "No Style"
1131
+ if (selectedStylesOrder.length === 0) {
1132
+ selectedStylesOrder = ["No Style"];
1133
+ }
1134
+
1135
+ // Update the UI based on loaded styles
1136
+ updateStyleSelection();
1137
+
1138
+ // Update the selected styles tags
1139
+ renderSelectedStyleTags();
1140
+ } catch (error) {
1141
+ console.error('Error loading saved styles order:', error);
1142
+ selectedStylesOrder = ["No Style"];
1143
+ updateStyleSelection();
1144
+ }
1145
+ }
1146
+
1147
+ // Auto-resize textareas after loading their content
1148
+ autoResizeTextarea(document.getElementById('scratchpadInput'));
1149
+ autoResizeTextarea(document.getElementById('promptInput'));
1150
+ }
1151
+
1152
+ // Function to update the UI based on selectedStylesOrder
1153
+ function updateStyleSelection() {
1154
+ // First, remove the 'selected' class from all style items
1155
+ document.querySelectorAll('.style-image-item').forEach(item => {
1156
+ item.classList.remove('selected');
1157
+ });
1158
+
1159
+ // Then, add the 'selected' class to items in the selectedStylesOrder
1160
+ selectedStylesOrder.forEach(styleName => {
1161
+ // Find the style item with matching span text
1162
+ const styleItems = document.querySelectorAll('.style-image-item');
1163
+ for (let item of styleItems) {
1164
+ const spanText = item.querySelector('span').textContent;
1165
+ if (spanText === styleName) {
1166
+ item.classList.add('selected');
1167
+ break;
1168
+ }
1169
+ }
1170
+ });
1171
+ }
1172
+
1173
+ // Setup collapsible scratchpad
1174
+ const scratchpadHeader = document.getElementById('scratchpadHeader');
1175
+ const scratchpadContent = document.getElementById('scratchpadContent');
1176
+ const toggleIcon = scratchpadHeader.querySelector('.toggle-icon');
1177
+
1178
+ scratchpadHeader.addEventListener('click', function() {
1179
+ scratchpadContent.hidden = !scratchpadContent.hidden;
1180
+ toggleIcon.classList.toggle('expanded');
1181
+
1182
+ // Auto-resize scratchpad textarea when revealing it
1183
+ if (!scratchpadContent.hidden) {
1184
+ autoResizeTextarea(document.getElementById('scratchpadInput'));
1185
+ }
1186
+ });
1187
+
1188
+ // Add event listeners for auto-resizing textareas
1189
+ document.getElementById('scratchpadInput').addEventListener('focus', () => autoResizeTextarea(document.getElementById('scratchpadInput')));
1190
+ document.getElementById('scratchpadInput').addEventListener('input', () => autoResizeTextarea(document.getElementById('scratchpadInput')));
1191
+ document.getElementById('scratchpadInput').addEventListener('change', () => autoResizeTextarea(document.getElementById('scratchpadInput')));
1192
+
1193
+ document.getElementById('promptInput').addEventListener('focus', () => autoResizeTextarea(document.getElementById('promptInput')));
1194
+ document.getElementById('promptInput').addEventListener('input', () => autoResizeTextarea(document.getElementById('promptInput')));
1195
+ document.getElementById('promptInput').addEventListener('change', () => autoResizeTextarea(document.getElementById('promptInput')));
1196
+
1197
+ // Aspect ratio to maximum dimensions lookup table
1198
+ // Optimized dimensions that maintain aspect ratio and use less than 1,638,401 pixels
1199
+ const aspectRatioDimensions = {
1200
+ "1:1": { width: 1280, height: 1280 },
1201
+ "16:9": { width: 1707, height: 960 },
1202
+ "9:16": { width: 960, height: 1707 },
1203
+ "4:3": { width: 1479, height: 1109 },
1204
+ "3:4": { width: 1109, height: 1479 },
1205
+ "3:2": { width: 1568, height: 1045 },
1206
+ "2:3": { width: 1045, height: 1568 },
1207
+ "21:9": { width: 1957, height: 839 },
1208
+ "9:21": { width: 839, height: 1957 },
1209
+ "5:4": { width: 1431, height: 1145 },
1210
+ "4:5": { width: 1145, height: 1431 },
1211
+ "16:10": { width: 1620, height: 1013 },
1212
+ "10:16": { width: 1013, height: 1620 },
1213
+ "6:7": { width: 1184, height: 1382 },
1214
+ "7:6": { width: 1382, height: 1184 },
1215
+ "18:9": { width: 1707, height: 853 },
1216
+ "9:18": { width: 853, height: 1707 },
1217
+ "2:1": { width: 1810, height: 905 },
1218
+ "1:2": { width: 905, height: 1810 },
1219
+ "4:1": { width: 2560, height: 640 },
1220
+ "1:4": { width: 640, height: 2560 }
1221
+ };
1222
+
1223
+ // Add input and change event listeners to save form values
1224
+ document.getElementById('scratchpadInput').addEventListener('input', saveFormToLocalStorage);
1225
+ document.getElementById('promptInput').addEventListener('input', saveFormToLocalStorage);
1226
+ document.getElementById('countInput').addEventListener('change', saveFormToLocalStorage);
1227
+ document.getElementById('aspectRatioSelect').addEventListener('change', saveFormToLocalStorage);
1228
+ document.getElementById('seedInput').addEventListener('input', saveFormToLocalStorage);
1229
+
1230
+ // Setup style image selection
1231
+ document.querySelectorAll('.style-image-item').forEach(item => {
1232
+ item.addEventListener('click', function() {
1233
+ const styleSpan = this.querySelector('span');
1234
+ const styleName = styleSpan.textContent;
1235
+ const isNoStyle = styleName === "No Style";
1236
+
1237
+ if (isNoStyle) {
1238
+ // If clicking on "No Style", clear all other styles
1239
+ selectedStylesOrder = ["No Style"];
1240
+ } else {
1241
+ // If clicking on a style that's not "No Style"
1242
+
1243
+ // Remove "No Style" from the array if it exists
1244
+ const noStyleIndex = selectedStylesOrder.indexOf("No Style");
1245
+ if (noStyleIndex > -1) {
1246
+ selectedStylesOrder.splice(noStyleIndex, 1);
1247
+ }
1248
+
1249
+ // Check if the style is already selected
1250
+ const index = selectedStylesOrder.indexOf(styleName);
1251
+ if (index > -1) {
1252
+ // If already selected, remove it
1253
+ selectedStylesOrder.splice(index, 1);
1254
+ } else {
1255
+ // If not selected, add it to the end of the array
1256
+ selectedStylesOrder.push(styleName);
1257
+ }
1258
+
1259
+ // If no styles are selected, revert to "No Style"
1260
+ if (selectedStylesOrder.length === 0) {
1261
+ selectedStylesOrder = ["No Style"];
1262
+ }
1263
+ }
1264
+
1265
+ // Update the UI to reflect the new selection state
1266
+ updateStyleSelection();
1267
+
1268
+ // Update the selected styles tags
1269
+ renderSelectedStyleTags();
1270
+
1271
+ // Save to local storage after changing styles
1272
+ saveFormToLocalStorage();
1273
+ });
1274
+ });
1275
+
1276
+ // Function to render the selected style tags
1277
+ function renderSelectedStyleTags() {
1278
+ const selectedStylesContainer = document.querySelector('.selected-styles-container');
1279
+ selectedStylesContainer.innerHTML = '';
1280
+
1281
+ // Filter out "No Style" before rendering tags
1282
+ selectedStylesOrder.filter(style => style !== "No Style").forEach(style => {
1283
+ const tag = document.createElement('div');
1284
+ tag.className = 'style-tag';
1285
+ tag.innerHTML = `${style} <span class="remove-icon">✕</span>`;
1286
+
1287
+ tag.addEventListener('click', () => {
1288
+ // Remove this style from the order array
1289
+ const index = selectedStylesOrder.indexOf(style);
1290
+ if (index > -1) {
1291
+ selectedStylesOrder.splice(index, 1);
1292
+ }
1293
+
1294
+ // If no styles are left, revert to "No Style"
1295
+ if (selectedStylesOrder.length === 0) {
1296
+ selectedStylesOrder = ["No Style"];
1297
+ }
1298
+
1299
+ // Update the UI
1300
+ updateStyleSelection();
1301
+
1302
+ // Update tags
1303
+ renderSelectedStyleTags();
1304
+
1305
+ // Save to local storage after removing a style
1306
+ saveFormToLocalStorage();
1307
+ });
1308
+
1309
+ selectedStylesContainer.appendChild(tag);
1310
+ });
1311
+ }
1312
+
1313
+ // Function to get all selected styles
1314
+ function getSelectedStyles() {
1315
+ return [...selectedStylesOrder]; // Return a copy to prevent unintended modifications
1316
+ }
1317
+
1318
+ // Load saved values from local storage when page loads
1319
+ window.addEventListener('load', function() {
1320
+ loadFormFromLocalStorage();
1321
+
1322
+ // Auto-resize textareas on page load
1323
+ autoResizeTextarea(document.getElementById('scratchpadInput'));
1324
+ autoResizeTextarea(document.getElementById('promptInput'));
1325
+
1326
+ // Populate the category dropdown
1327
+ populateCategoryDropdown();
1328
+ });
1329
+
1330
+ // Initial render of selected style tags
1331
+ renderSelectedStyleTags();
1332
+
1333
+ // Export scratchpad content to text file
1334
+ document.getElementById('exportScratchpadBtn').addEventListener('click', function() {
1335
+ const scratchpadContent = document.getElementById('scratchpadInput').value;
1336
+ if (!scratchpadContent.trim()) {
1337
+ alert('Scratchpad is empty. Please add some content before exporting.');
1338
+ return;
1339
+ }
1340
+
1341
+ // Create a blob with the text content
1342
+ const blob = new Blob([scratchpadContent], { type: 'text/plain' });
1343
+
1344
+ // Create a temporary link element
1345
+ const a = document.createElement('a');
1346
+ a.href = URL.createObjectURL(blob);
1347
+ a.download = `scratchpad-${new Date().toISOString().slice(0, 10)}.txt`;
1348
+
1349
+ // Append to the document, click it, and remove it
1350
+ document.body.appendChild(a);
1351
+ a.click();
1352
+ document.body.removeChild(a);
1353
+
1354
+ // Clean up the URL
1355
+ URL.revokeObjectURL(a.href);
1356
+ });
1357
+
1358
+ // Add click event to generate button
1359
+ document.getElementById('generateBtn').addEventListener('click', () => generateImages(true));
1360
+
1361
+ // Add click event to generate more button
1362
+ document.getElementById('generateMoreBtn').addEventListener('click', () => generateImages(false));
1363
+
1364
+ // Add click event for back to top button
1365
+ document.getElementById('backToTopBtn').addEventListener('click', () => {
1366
+ window.scrollTo({
1367
+ top: 0,
1368
+ behavior: 'smooth'
1369
+ });
1370
+ });
1371
+
1372
+ // Extract unique categories from style items and populate dropdown
1373
+ function populateCategoryDropdown() {
1374
+ const categorySet = new Set();
1375
+ const styleItems = document.querySelectorAll('.style-image-item');
1376
+
1377
+ // Extract all categories from data-cat attributes
1378
+ styleItems.forEach(item => {
1379
+ const categories = item.dataset.cat.split(',').map(cat => cat.trim());
1380
+ categories.forEach(cat => categorySet.add(cat));
1381
+ });
1382
+
1383
+ // Sort categories alphabetically
1384
+ const sortedCategories = Array.from(categorySet).sort();
1385
+
1386
+ // Add categories to dropdown
1387
+ const categoryFilter = document.getElementById('categoryFilter');
1388
+ sortedCategories.forEach(category => {
1389
+ // Skip "All" as it's already added
1390
+ if (category !== "All") {
1391
+ const option = document.createElement('option');
1392
+ option.value = category;
1393
+ option.textContent = category;
1394
+ categoryFilter.appendChild(option);
1395
+ }
1396
+ });
1397
+
1398
+ // Add event listener to filter styles
1399
+ categoryFilter.addEventListener('
1400
+ </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ сделай сайт рабочим