allknowingroger commited on
Commit
54ba9fd
1 Parent(s): f80c3c7

Upload 18 files

Browse files
1PT5G752aPFlS0Uiy.html ADDED
@@ -0,0 +1,1338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://treegen.ai"><title>Promptimg - AI Image Prompt Generator</title>
2
+ <style>
3
+ body {
4
+ font-family: Arial, sans-serif;
5
+ margin: 0;
6
+ padding: 0;
7
+ background-color: #0f1628;
8
+ color: #ffffff;
9
+ display: flex;
10
+ flex-direction: column;
11
+ min-height: 100vh;
12
+ }
13
+ .container {
14
+ max-width: 100%;
15
+ margin: 0 auto;
16
+ padding: 20px;
17
+ flex: 1;
18
+ }
19
+ h1 {
20
+ color: #ffffff;
21
+ text-align: center;
22
+ font-size: 2rem;
23
+ }
24
+ #config {
25
+ display: flex;
26
+ flex-wrap: wrap;
27
+ justify-content: center;
28
+ align-items: center;
29
+ margin-bottom: 20px;
30
+ background-color: #1e293b;
31
+ padding: 15px;
32
+ border-radius: 8px;
33
+ }
34
+ #config label {
35
+ margin-right: 15px;
36
+ font-size: 14px;
37
+ margin-bottom: 5px;
38
+ }
39
+ #config input[type="number"] {
40
+ width: 60px;
41
+ padding: 5px;
42
+ background-color: #2d3748;
43
+ border: 1px solid #4a5568;
44
+ color: #ffffff;
45
+ border-radius: 4px;
46
+ margin-bottom: 5px;
47
+ }
48
+ #config input[type="range"] {
49
+ width: 150px;
50
+ margin: 0 10px 5px 10px;
51
+ }
52
+ #prompt-container {
53
+ display: flex;
54
+ flex-direction: column;
55
+ align-items: center;
56
+ gap: 20px;
57
+ overflow-x: auto;
58
+ }
59
+ .prompt-layer {
60
+ display: flex;
61
+ flex-wrap: wrap;
62
+ justify-content: center;
63
+ gap: 20px;
64
+ padding: 10px;
65
+ position: relative;
66
+ width: 100%;
67
+ }
68
+ .prompt-group {
69
+ background-color: rgba(59, 130, 246, 0.1);
70
+ border: 1px solid rgba(59, 130, 246, 0.3);
71
+ border-radius: 10px;
72
+ padding: 15px;
73
+ margin-top: 30px;
74
+ position: relative;
75
+ display: flex;
76
+ flex-direction: row;
77
+ align-items: center;
78
+ flex-wrap: wrap;
79
+ justify-content: center;
80
+ width: 100%;
81
+ max-width: 600px;
82
+ }
83
+ .prompt-group::before {
84
+ content: '';
85
+ position: absolute;
86
+ top: -20px;
87
+ left: 50%;
88
+ width: 2px;
89
+ height: 20px;
90
+ background-color: rgba(59, 130, 246, 0.5);
91
+ }
92
+ .prompt-group-title {
93
+ position: absolute;
94
+ top: -25px;
95
+ left: 50%;
96
+ transform: translateX(-50%);
97
+ background-color: #0f1628;
98
+ padding: 0 10px;
99
+ font-size: 12px;
100
+ white-space: nowrap;
101
+ overflow: hidden;
102
+ text-overflow: ellipsis;
103
+ max-width: 90%;
104
+ }
105
+ .prompt-group-title-hidden {
106
+ display: none;
107
+ }
108
+ .prompt-group-user-input {
109
+ position: absolute;
110
+ top: -25px;
111
+ left: 50%;
112
+ transform: translateX(-50%);
113
+ background-color: #0f1628;
114
+ padding: 0 10px;
115
+ font-size: 12px;
116
+ white-space: nowrap;
117
+ overflow: hidden;
118
+ text-overflow: ellipsis;
119
+ max-width: 90%;
120
+ }
121
+ .prompt-card {
122
+ position: relative;
123
+ cursor: pointer;
124
+ flex-shrink: 0;
125
+ margin: 5px;
126
+ width: 100px;
127
+ height: 100px;
128
+ }
129
+ .prompt-card img {
130
+ width: 100%;
131
+ height: 100%;
132
+ object-fit: cover;
133
+ border-radius: 50%;
134
+ transition: all 0.3s ease;
135
+ }
136
+ .prompt-card:hover img {
137
+ filter: brightness(70%);
138
+ }
139
+ .prompt-card p {
140
+ display: none;
141
+ }
142
+ #prompt-input {
143
+ width: 100%;
144
+ padding: 10px;
145
+ margin-bottom: 20px;
146
+ border: 1px solid #3b4b66;
147
+ border-radius: 4px;
148
+ background-color: #1e293b;
149
+ color: #ffffff;
150
+ box-sizing: border-box;
151
+ }
152
+ #generate-btn {
153
+ display: block;
154
+ width: 100%;
155
+ max-width: 250px;
156
+ margin: 0 auto 20px;
157
+ padding: 10px;
158
+ background-color: #3b82f6;
159
+ color: white;
160
+ border: none;
161
+ border-radius: 4px;
162
+ cursor: pointer;
163
+ font-size: 16px;
164
+ }
165
+ #generate-btn:hover {
166
+ background-color: #2563eb;
167
+ }
168
+ .modal {
169
+ display: none;
170
+ position: fixed;
171
+ z-index: 1000;
172
+ left: 0;
173
+ top: 0;
174
+ width: 100%;
175
+ height: 100%;
176
+ overflow: auto;
177
+ background-color: rgba(0,0,0,0.8);
178
+ }
179
+ .modal-content {
180
+ background-color: #1e293b;
181
+ margin: 5% auto;
182
+ padding: 20px;
183
+ border: 1px solid #3b4b66;
184
+ width: 90%;
185
+ max-width: 800px;
186
+ border-radius: 10px;
187
+ color: #ffffff;
188
+ display: flex;
189
+ flex-direction: column;
190
+ align-items: center;
191
+ position: relative;
192
+ }
193
+ .close {
194
+ color: #aaa;
195
+ position: absolute;
196
+ top: 10px;
197
+ right: 20px;
198
+ font-size: 28px;
199
+ font-weight: bold;
200
+ cursor: pointer;
201
+ }
202
+ .modal-content img {
203
+ max-width: 100%;
204
+ max-height: 60vh;
205
+ object-fit: contain;
206
+ margin-bottom: 20px;
207
+ }
208
+ .action-buttons {
209
+ display: none;
210
+ position: absolute;
211
+ bottom: -30px;
212
+ left: 50%;
213
+ transform: translateX(-50%);
214
+ background-color: rgba(59, 130, 246, 0.8);
215
+ border-radius: 20px;
216
+ padding: 5px 10px;
217
+ z-index: 10;
218
+ }
219
+ .action-button {
220
+ background: none;
221
+ border: none;
222
+ color: white;
223
+ cursor: pointer;
224
+ font-size: 16px;
225
+ padding: 5px;
226
+ margin: 0 5px;
227
+ }
228
+ .action-button:hover {
229
+ color: #f0f0f0;
230
+ }
231
+ #download-btn {
232
+ position: absolute;
233
+ top: 10px;
234
+ right: 60px;
235
+ background-color: #3b82f6;
236
+ color: white;
237
+ border: none;
238
+ border-radius: 4px;
239
+ padding: 5px 10px;
240
+ cursor: pointer;
241
+ font-size: 14px;
242
+ }
243
+ #download-btn:hover {
244
+ background-color: #2563eb;
245
+ }
246
+ footer {
247
+ background-color: #1e293b;
248
+ color: #ffffff;
249
+ text-align: center;
250
+ padding: 10px;
251
+ font-size: 14px;
252
+ }
253
+ .nav-arrow {
254
+ position: absolute;
255
+ top: 50%;
256
+ transform: translateY(-50%);
257
+ font-size: 2rem;
258
+ color: #ffffff;
259
+ background-color: rgba(59, 130, 246, 0.5);
260
+ border: none;
261
+ border-radius: 50%;
262
+ width: 50px;
263
+ height: 50px;
264
+ display: flex;
265
+ justify-content: center;
266
+ align-items: center;
267
+ cursor: pointer;
268
+ transition: background-color 0.3s ease;
269
+ }
270
+ .nav-arrow:hover {
271
+ background-color: rgba(59, 130, 246, 0.8);
272
+ }
273
+ #prev-arrow {
274
+ left: 20px;
275
+ }
276
+ #next-arrow {
277
+ right: 20px;
278
+ }
279
+ #thumbnails {
280
+ display: flex;
281
+ justify-content: center;
282
+ gap: 10px;
283
+ margin-top: 20px;
284
+ flex-wrap: wrap;
285
+ }
286
+ .thumbnail {
287
+ width: 60px;
288
+ height: 60px;
289
+ border-radius: 50%;
290
+ object-fit: cover;
291
+ cursor: pointer;
292
+ transition: all 0.3s ease;
293
+ }
294
+ .thumbnail:hover, .thumbnail.active {
295
+ border: 2px solid #3b82f6;
296
+ transform: scale(1.1);
297
+ }
298
+ .group-action-buttons {
299
+ display: none;
300
+ position: absolute;
301
+ top: 10px;
302
+ right: 10px;
303
+ background-color: rgba(59, 130, 246, 0.8);
304
+ border-radius: 20px;
305
+ padding: 5px 10px;
306
+ z-index: 10;
307
+ }
308
+ .prompt-layer {
309
+ overflow: visible;
310
+ }
311
+ .prompt-group {
312
+ overflow: visible;
313
+ }
314
+ .add-node-btn {
315
+ display: flex;
316
+ justify-content: center;
317
+ align-items: center;
318
+ background-color: rgba(59, 130, 246, 0.2);
319
+ color: white;
320
+ border: 2px dashed rgba(59, 130, 246, 0.5);
321
+ border-radius: 50%;
322
+ width: 100px;
323
+ height: 100px;
324
+ font-size: 40px;
325
+ cursor: pointer;
326
+ transition: all 0.3s ease;
327
+ }
328
+ .add-node-btn:hover {
329
+ background-color: rgba(59, 130, 246, 0.4);
330
+ }
331
+ .parent-image {
332
+ position: absolute;
333
+ top: -15px;
334
+ left: 50%;
335
+ transform: translateX(-50%);
336
+ width: 30px;
337
+ height: 30px;
338
+ border-radius: 50%;
339
+ overflow: hidden;
340
+ border: 2px solid #3b82f6;
341
+ }
342
+ .parent-image img {
343
+ width: 100%;
344
+ height: 100%;
345
+ object-fit: cover;
346
+ }
347
+ .edit-prompt-modal {
348
+ display: none;
349
+ position: fixed;
350
+ z-index: 2000;
351
+ left: 0;
352
+ top: 0;
353
+ width: 100%;
354
+ height: 100%;
355
+ background-color: rgba(0,0,0,0.8);
356
+ }
357
+ .edit-prompt-content {
358
+ background-color: #1e293b;
359
+ margin: 10% auto;
360
+ padding: 20px;
361
+ border: 1px solid #3b4b66;
362
+ width: 90%;
363
+ max-width: 600px;
364
+ border-radius: 10px;
365
+ }
366
+ .edit-prompt-textarea {
367
+ width: 100%;
368
+ height: 100px;
369
+ margin-bottom: 10px;
370
+ padding: 10px;
371
+ background-color: #2d3748;
372
+ border: 1px solid #4a5568;
373
+ color: #ffffff;
374
+ border-radius: 4px;
375
+ resize: vertical;
376
+ box-sizing: border-box;
377
+ }
378
+ .edit-prompt-buttons {
379
+ display: flex;
380
+ justify-content: flex-end;
381
+ gap: 10px;
382
+ }
383
+ .edit-prompt-btn {
384
+ padding: 5px 10px;
385
+ background-color: #3b82f6;
386
+ color: white;
387
+ border: none;
388
+ border-radius: 4px;
389
+ cursor: pointer;
390
+ }
391
+ .edit-prompt-btn:hover {
392
+ background-color: #2563eb;
393
+ }
394
+ .highlighted-prompt {
395
+ margin-top: 10px;
396
+ font-size: 14px;
397
+ line-height: 1.4;
398
+ }
399
+ .highlighted-prompt span {
400
+ padding: 2px 4px;
401
+ border-radius: 3px;
402
+ }
403
+ .loading-message {
404
+ font-size: 18px;
405
+ color: #ffffff;
406
+ text-align: center;
407
+ margin: 20px 0;
408
+ }
409
+ @keyframes pulse {
410
+ 0% { opacity: 0.6; }
411
+ 50% { opacity: 1; }
412
+ 100% { opacity: 0.6; }
413
+ }
414
+ .loading-message {
415
+ animation: pulse 1.5s infinite;
416
+ }
417
+ .image-details {
418
+ margin-top: 20px;
419
+ text-align: left;
420
+ width: 100%;
421
+ }
422
+ .image-details p {
423
+ margin: 5px 0;
424
+ }
425
+ .image-details .parent-prompt,
426
+ .image-details .user-input {
427
+ font-size: 0.9em;
428
+ color: #a0aec0;
429
+ }
430
+ @keyframes spin {
431
+ 0% { transform: rotate(0deg); }
432
+ 100% { transform: rotate(360deg); }
433
+ }
434
+ .loading-icon {
435
+ animation: spin 1s linear infinite;
436
+ }
437
+ .group-placeholder {
438
+ background-color: rgba(59, 130, 246, 0.1);
439
+ border: 1px dashed rgba(59, 130, 246, 0.3);
440
+ border-radius: 10px;
441
+ padding: 15px;
442
+ margin-top: 30px;
443
+ text-align: center;
444
+ min-width: 200px;
445
+ min-height: 100px;
446
+ display: flex;
447
+ flex-direction: column;
448
+ justify-content: center;
449
+ align-items: center;
450
+ }
451
+ .loading-overlay {
452
+ position: absolute;
453
+ top: 0;
454
+ left: 0;
455
+ width: 100%;
456
+ height: 100%;
457
+ background-color: rgba(0, 0, 0, 0.7);
458
+ display: flex;
459
+ justify-content: center;
460
+ align-items: center;
461
+ border-radius: 50%;
462
+ z-index: 10;
463
+ }
464
+ .sidebar {
465
+ position: fixed;
466
+ top: 0;
467
+ left: -300px;
468
+ width: 100%;
469
+ max-width: 300px;
470
+ height: 100%;
471
+ background-color: #1e293b;
472
+ transition: left 0.3s ease-in-out;
473
+ z-index: 1000;
474
+ overflow-y: auto;
475
+ }
476
+ .sidebar.open {
477
+ left: 0;
478
+ }
479
+ .sidebar-content {
480
+ padding: 20px;
481
+ color: #ffffff;
482
+ }
483
+ .sidebar h2 {
484
+ margin-top: 0;
485
+ }
486
+ .sidebar ul {
487
+ padding-left: 20px;
488
+ }
489
+ .sidebar li {
490
+ margin-bottom: 10px;
491
+ }
492
+ .toggle-sidebar {
493
+ position: fixed;
494
+ top: 20px;
495
+ left: 20px;
496
+ z-index: 1001;
497
+ background-color: #3b82f6;
498
+ color: white;
499
+ border: none;
500
+ border-radius: 4px;
501
+ padding: 10px;
502
+ cursor: pointer;
503
+ }
504
+ .modal-image-container {
505
+ position: relative;
506
+ max-width: 100%;
507
+ max-height: 60vh;
508
+ ""
509
+ margin-bottom: 20px;
510
+ }
511
+ .modal-image-container img {
512
+ max-width: 100%;
513
+ max-height: 60vh;
514
+ object-fit: contain;
515
+ width: auto;
516
+ }
517
+ .modal-prompt-overlay {
518
+ position: absolute;
519
+ bottom: 0;
520
+ left: 0;
521
+ width: 100%;
522
+ background-color: rgba(0, 0, 0, 0.7);
523
+ color: white;
524
+ padding: 10px;
525
+ box-sizing: border-box;
526
+ opacity: 0;
527
+ transition: opacity 0.3s ease;
528
+ }
529
+ .modal-image-container:hover .modal-prompt-overlay {
530
+ opacity: 1;
531
+ }
532
+ .circular-button {
533
+ width: 40px;
534
+ height: 40px;
535
+ border-radius: 50%;
536
+ background-color: #3b82f6;
537
+ color: white;
538
+ border: none;
539
+ display: flex;
540
+ justify-content: center;
541
+ align-items: center;
542
+ cursor: pointer;
543
+ margin: 0 5px;
544
+ transition: background-color 0.3s ease;
545
+ }
546
+ .circular-button:hover {
547
+ background-color: #2563eb;
548
+ }
549
+ .modal-buttons {
550
+ display: flex;
551
+ justify-content: center;
552
+ margin-top: 10px;
553
+ }
554
+ .action-toggle {
555
+ display: none;
556
+ position: absolute;
557
+ bottom: -15px;
558
+ left: 50%;
559
+ transform: translateX(-50%);
560
+ background-color: rgba(59, 130, 246, 0.8);
561
+ color: white;
562
+ border: none;
563
+ border-radius: 50%;
564
+ width: 30px;
565
+ height: 30px;
566
+ font-size: 16px;
567
+ cursor: pointer;
568
+ z-index: 9;
569
+ }
570
+ .group-action-toggle {
571
+ display: none;
572
+ position: absolute;
573
+ top: 10px;
574
+ right: 10px;
575
+ background-color: rgba(59, 130, 246, 0.8);
576
+ color: white;
577
+ border: none;
578
+ border-radius: 50%;
579
+ width: 30px;
580
+ height: 30px;
581
+ font-size: 16px;
582
+ cursor: pointer;
583
+ z-index: 9;
584
+ }
585
+ @media (min-width: 769px) {
586
+ .prompt-card:hover .action-buttons {
587
+ display: flex;
588
+ }
589
+ .prompt-group:hover .group-action-buttons {
590
+ display: flex;
591
+ }
592
+ .action-toggle, .group-action-toggle {
593
+ display: none !important;
594
+ }
595
+ }
596
+ @media (max-width: 768px) {
597
+ .container {
598
+ padding: 10px;
599
+ }
600
+ h1 {
601
+ font-size: 1.5rem;
602
+ }
603
+ #config {
604
+ flex-direction: column;
605
+ align-items: flex-start;
606
+ }
607
+ #config label, #config input {
608
+ margin-bottom: 10px;
609
+ }
610
+ .prompt-group {
611
+ padding: 10px;
612
+ }
613
+ .nav-arrow {
614
+ font-size: 1.5rem;
615
+ width: 40px;
616
+ height: 40px;
617
+ }
618
+ #prev-arrow {
619
+ left: 10px;
620
+ }
621
+ #next-arrow {
622
+ right: 10px;
623
+ }
624
+ .thumbnail {
625
+ width: 50px;
626
+ height: 50px;
627
+ }
628
+ .action-buttons, .group-action-buttons {
629
+ display: none;
630
+ }
631
+ .action-toggle, .group-action-toggle {
632
+ display: flex;
633
+ justify-content: center;
634
+ align-items: center;
635
+ }
636
+ }
637
+ </style>
638
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet">
639
+ <meta name="viewport" content="width=device-width, initial-scale=1">
640
+ </head>
641
+ <body>
642
+ <button class="toggle-sidebar" id="toggleSidebar">
643
+ <i class="fas fa-bars"></i>
644
+ </button>
645
+
646
+ <div class="sidebar" id="sidebar">
647
+ <div class="sidebar-content">
648
+ <h2><i class="fas fa-lightbulb"></i> How to Use Promptimg</h2>
649
+ <ol>
650
+ <li>Enter an initial concept in the input field.</li>
651
+ <li>Click "Generate image prompts" to create a group of prompts.</li>
652
+ <li>Explore the generated images by clicking on them.</li>
653
+ <li>Use the action buttons to:
654
+ <ul>
655
+ <li><i class="fas fa-redo"></i> Regenerate an image or entire group of prompts</li>
656
+ <li><i class="fas fa-edit"></i> Edit a prompt</li>
657
+ <li><i class="fas fa-trash"></i> Delete a prompt</li>
658
+ <li><i class="fas fa-sitemap"></i> Create child nodes (bifurcate)</li>
659
+ </ul>
660
+ </li>
661
+ <li>Adjust the number of prompts and node size using the controls at the top.</li>
662
+ <li>Create new groups by bifurcating or adding nodes to existing groups.</li>
663
+ </ol>
664
+
665
+ <div class="sidebar-footer">
666
+ <p><i class="fas fa-code"></i> Promptimg v0.1.0-release</p>
667
+ <p><i class="fas fa-heart"></i> Made with love by @eechever</p>
668
+ </div>
669
+ </div>
670
+ </div>
671
+
672
+ <div class="container">
673
+ <h1>Promptimg - Find your dream prompts &amp; images</h1>
674
+ <div id="config">
675
+ <label for="num-prompts">Number of prompts:</label>
676
+ <input type="number" id="num-prompts" min="1" max="10" value="3">
677
+ <label for="node-size">Node size:</label>
678
+ <input type="range" id="node-size" min="20" max="200" value="100">
679
+ <span id="node-size-value">100px</span>
680
+ </div>
681
+ <input type="text" id="prompt-input" placeholder="Enter your initial concept">
682
+ <button id="generate-btn">Generate image prompts</button>
683
+ <div id="prompt-container"></div>
684
+ </div>
685
+
686
+ <div id="imageModal" class="modal">
687
+ <div class="modal-content">
688
+ <span class="close">×</span>
689
+ <button id="prev-arrow" class="nav-arrow"><i class="fas fa-chevron-left"></i></button>
690
+ <button id="next-arrow" class="nav-arrow"><i class="fas fa-chevron-right"></i></button>
691
+ <div class="modal-image-container">
692
+ <img id="modalImage" src="" alt="Full size image">
693
+ <div class="modal-prompt-overlay">
694
+ <p id="modalDescription"></p>
695
+ </div>
696
+ </div>
697
+ <div class="modal-buttons">
698
+ <button id="copyPromptBtn" class="circular-button" title="Copy Prompt">
699
+ <i class="fas fa-copy"></i>
700
+ </button>
701
+ <button id="downloadImageBtn" class="circular-button" title="Download Image">
702
+ <i class="fas fa-download"></i>
703
+ </button>
704
+ </div>
705
+ <div class="image-details">
706
+ <p id="userInput" class="user-input"></p>
707
+ </div>
708
+ <div id="thumbnails"></div>
709
+ </div>
710
+ </div>
711
+
712
+ <div id="editPromptModal" class="edit-prompt-modal">
713
+ <div class="edit-prompt-content">
714
+ <textarea id="editPromptTextarea" class="edit-prompt-textarea"></textarea>
715
+ <div class="edit-prompt-buttons">
716
+ <button id="cancelEditPrompt" class="edit-prompt-btn">Cancel</button>
717
+ <button id="saveEditPrompt" class="edit-prompt-btn">Save</button>
718
+ </div>
719
+ </div>
720
+ </div>
721
+
722
+ <footer>
723
+ <p>Made with ❤️ by <a href="https://www.linkedin.com/in/eechev/" target="_blank" style="color: white; text-decoration: none; transition: opacity 0.3s ease;" onmouseover="this.style.opacity='0.7'" onmouseout="this.style.opacity='1'">@eechever</a> and WebSim</p>
724
+ <a href="https://buymeacoffee.com/eechever" target="_blank" style="display: inline-block; background-color: #FFDD00; color: #000000; padding: 8px 16px; text-decoration: none; border-radius: 5px; font-weight: bold; margin-top: 10px;">
725
+ <i class="fas fa-coffee" style="margin-right: 5px;"></i> Buy me a coffee
726
+ </a>
727
+ </footer>
728
+
729
+ <a id="hiddenDownloadLink" style="display: none;"></a>
730
+
731
+ <script>
732
+ const promptContainer = document.getElementById('prompt-container');
733
+ const promptInput = document.getElementById('prompt-input');
734
+ const generateBtn = document.getElementById('generate-btn');
735
+ const numPromptsInput = document.getElementById('num-prompts');
736
+ const nodeSizeInput = document.getElementById('node-size');
737
+ const nodeSize = document.getElementById('node-size-value');
738
+ const modal = document.getElementById('imageModal');
739
+ const modalImage = document.getElementById('modalImage');
740
+ const modalDescription = document.getElementById('modalDescription');
741
+ const userInput = document.getElementById('userInput');
742
+ const closeModal = document.getElementsByClassName('close')[0];
743
+ const prevArrow = document.getElementById('prev-arrow');
744
+ const nextArrow = document.getElementById('next-arrow');
745
+ const thumbnailsContainer = document.getElementById('thumbnails');
746
+ const editPromptModal = document.getElementById('editPromptModal');
747
+ const editPromptTextarea = document.getElementById('editPromptTextarea');
748
+ const cancelEditPrompt = document.getElementById('cancelEditPrompt');
749
+ const saveEditPrompt = document.getElementById('saveEditPrompt');
750
+ const sidebar = document.getElementById('sidebar');
751
+ const toggleSidebar = document.getElementById('toggleSidebar');
752
+ const copyPromptBtn = document.getElementById('copyPromptBtn');
753
+ const downloadImageBtn = document.getElementById('downloadImageBtn');
754
+ const hiddenDownloadLink = document.getElementById('hiddenDownloadLink');
755
+
756
+ let currentGroupImages = [];
757
+ let currentImageIndex = 0;
758
+ let currentEditingCard = null;
759
+ let currentOpenActionButtons = null;
760
+
761
+ generateBtn.addEventListener('click', () => {
762
+ const initialConcept = promptInput.value;
763
+ if (initialConcept) {
764
+ setButtonLoading(generateBtn);
765
+ generatePrompts(initialConcept);
766
+ }
767
+ });
768
+
769
+ nodeSizeInput.addEventListener('input', () => {
770
+ nodeSize.textContent = `${nodeSizeInput.value}px`;
771
+ updateNodeSize();
772
+ });
773
+
774
+ closeModal.onclick = function() {
775
+ modal.style.display = "none";
776
+ }
777
+
778
+ window.onclick = function(event) {
779
+ if (event.target == modal) {
780
+ modal.style.display = "none";
781
+ }
782
+ if (event.target == editPromptModal) {
783
+ editPromptModal.style.display = "none";
784
+ }
785
+ if (window.innerWidth <= 768 && currentOpenActionButtons && !event.target.closest('.action-buttons') && !event.target.closest('.action-toggle') && !event.target.closest('.group-action-buttons') && !event.target.closest('.group-action-toggle')) {
786
+ currentOpenActionButtons.style.display = 'none';
787
+ currentOpenActionButtons = null;
788
+ }
789
+ }
790
+
791
+ prevArrow.addEventListener('click', () => navigateImages(-1));
792
+ nextArrow.addEventListener('click', () => navigateImages(1));
793
+
794
+ document.addEventListener('keydown', (e) => {
795
+ if (modal.style.display === "block") {
796
+ if (e.key === "ArrowLeft") navigateImages(-1);
797
+ if (e.key === "ArrowRight") navigateImages(1);
798
+ }
799
+ });
800
+
801
+ cancelEditPrompt.addEventListener('click', () => {
802
+ editPromptModal.style.display = "none";
803
+ });
804
+
805
+ saveEditPrompt.addEventListener('click', () => {
806
+ if (currentEditingCard) {
807
+ const newPrompt = editPromptTextarea.value;
808
+ const promptData = JSON.parse(currentEditingCard.querySelector('p').textContent);
809
+ promptData.text = newPrompt;
810
+ currentEditingCard.querySelector('p').textContent = JSON.stringify(promptData);
811
+ regenerateImage(currentEditingCard);
812
+ editPromptModal.style.display = "none";
813
+ }
814
+ });
815
+
816
+ toggleSidebar.addEventListener('click', () => {
817
+ sidebar.classList.toggle('open');
818
+ });
819
+
820
+ copyPromptBtn.addEventListener('click', () => {
821
+ const promptText = modalDescription.textContent;
822
+ navigator.clipboard.writeText(promptText).then(() => {
823
+ alert('Prompt copied to clipboard!');
824
+ }).catch(err => {
825
+ console.error('Failed to copy text: ', err);
826
+ });
827
+ });
828
+
829
+ downloadImageBtn.addEventListener('click', function(e) {
830
+ e.preventDefault();
831
+ hiddenDownloadLink.click();
832
+ });
833
+
834
+ function updateNodeSize() {
835
+ const size = nodeSizeInput.value;
836
+ const promptCards = document.querySelectorAll('.prompt-card, .add-node-btn');
837
+ promptCards.forEach(card => {
838
+ card.style.width = `${size}px`;
839
+ card.style.height = `${size}px`;
840
+ });
841
+ }
842
+
843
+ async function generatePrompts(initialConcept) {
844
+ const placeholder = createGroupPlaceholder("Generating prompts...");
845
+ const layer = getOrCreateRootLayer();
846
+ layer.appendChild(placeholder);
847
+
848
+ const numPrompts = parseInt(numPromptsInput.value);
849
+ const complexPrompts = await generateComplexPrompts(initialConcept, numPrompts);
850
+
851
+ placeholder.innerHTML = "Generating images...";
852
+ const group = await createPromptGroup(complexPrompts, initialConcept, initialConcept);
853
+ layer.replaceChild(group, placeholder);
854
+ updateNodeSize();
855
+ resetButtonLoading(generateBtn);
856
+ }
857
+
858
+ function getOrCreateRootLayer() {
859
+ let rootLayer = promptContainer.querySelector('.prompt-layer');
860
+ if (!rootLayer) {
861
+ rootLayer = createPromptLayer();
862
+ promptContainer.appendChild(rootLayer);
863
+ }
864
+ return rootLayer;
865
+ }
866
+
867
+ function createPromptLayer() {
868
+ const layer = document.createElement('div');
869
+ layer.className = 'prompt-layer';
870
+ return layer;
871
+ }
872
+
873
+ function createGroupPlaceholder(message) {
874
+ const placeholder = document.createElement('div');
875
+ placeholder.className = 'group-placeholder';
876
+ placeholder.innerHTML = `
877
+ <i class="fas fa-spinner fa-spin fa-2x"></i>
878
+ <p>${message}</p>
879
+ `;
880
+ return placeholder;
881
+ }
882
+
883
+ async function createPromptGroup(prompts, parentPrompt, userInputText, parentImage = null) {
884
+ const group = document.createElement('div');
885
+ group.className = 'prompt-group';
886
+
887
+ const hiddenTitle = document.createElement('div');
888
+ hiddenTitle.className = 'prompt-group-title prompt-group-title-hidden';
889
+ hiddenTitle.textContent = parentPrompt;
890
+ group.appendChild(hiddenTitle);
891
+
892
+ const userInputTitle = document.createElement('div');
893
+ userInputTitle.className = 'prompt-group-user-input';
894
+ userInputTitle.textContent = userInputText;
895
+ group.appendChild(userInputTitle);
896
+
897
+ if (parentImage) {
898
+ const parentImageContainer = document.createElement('div');
899
+ parentImageContainer.className = 'parent-image';
900
+ const img = document.createElement('img');
901
+ img.src = parentImage;
902
+ img.alt = 'Parent Image';
903
+ parentImageContainer.appendChild(img);
904
+ group.appendChild(parentImageContainer);
905
+ }
906
+
907
+ const groupActionButtons = document.createElement('div');
908
+ groupActionButtons.className = 'group-action-buttons';
909
+ groupActionButtons.innerHTML = `
910
+ <button class="action-button" title="Regenerate group"><i class="fas fa-redo"></i></button>
911
+ <button class="action-button" title="Edit group prompt"><i class="fas fa-edit"></i></button>
912
+ <button class="action-button" title="Delete group"><i class="fas fa-trash"></i></button>
913
+ `;
914
+ group.appendChild(groupActionButtons);
915
+
916
+ const groupActionToggle = document.createElement('button');
917
+ groupActionToggle.className = 'group-action-toggle';
918
+ groupActionToggle.innerHTML = '<i class="fas fa-ellipsis-v"></i>';
919
+ group.appendChild(groupActionToggle);
920
+
921
+ const regenerateGroupBtn = groupActionButtons.querySelector('.action-button:nth-child(1)');
922
+ const editGroupBtn = groupActionButtons.querySelector('.action-button:nth-child(2)');
923
+ const deleteGroupBtn = groupActionButtons.querySelector('.action-button:nth-child(3)');
924
+
925
+ regenerateGroupBtn.addEventListener('click', (e) => {
926
+ e.stopPropagation();
927
+ regenerateGroup(group);
928
+ });
929
+ editGroupBtn.addEventListener('click', (e) => {
930
+ e.stopPropagation();
931
+ editGroupPrompt(group);
932
+ });
933
+ deleteGroupBtn.addEventListener('click', (e) => {
934
+ e.stopPropagation();
935
+ deleteGroup(group);
936
+ });
937
+ groupActionToggle.addEventListener('click', (e) => {
938
+ e.stopPropagation();
939
+ toggleGroupActionButtons(group);
940
+ });
941
+
942
+ for (const prompt of prompts) {
943
+ const imageUrl = await generateImage(prompt.text);
944
+ const promptCard = createPromptCard(prompt, imageUrl, parentPrompt, userInputText);
945
+ group.appendChild(promptCard);
946
+ }
947
+
948
+ const addNodeBtn = document.createElement('div');
949
+ addNodeBtn.className = 'add-node-btn prompt-card';
950
+ addNodeBtn.innerHTML = '<i class="fas fa-plus"></i>';
951
+ addNodeBtn.addEventListener('click', (e) => {
952
+ e.stopPropagation();
953
+ addNewNode(group);
954
+ });
955
+ group.appendChild(addNodeBtn);
956
+
957
+ return group;
958
+ }
959
+
960
+ function createPromptCard(prompt, imageUrl, parentPrompt, userInputText) {
961
+ const card = document.createElement('div');
962
+ card.className = 'prompt-card';
963
+ card.innerHTML = `
964
+ <img src="${imageUrl}" alt="Generated image for ${prompt.text}">
965
+ <p>${JSON.stringify({...prompt, parentPrompt, userInputText})}</p>
966
+ <div class="action-buttons">
967
+ <button class="action-button" title="Regenerate image"><i class="fas fa-redo"></i></button>
968
+ <button class="action-button" title="Edit prompt"><i class="fas fa-edit"></i></button>
969
+ <button class="action-button" title="Delete prompt"><i class="fas fa-trash"></i></button>
970
+ <button class="action-button" title="Bifurcate/Create nodes"><i class="fas fa-sitemap"></i></button>
971
+ </div>
972
+ <button class="action-toggle"><i class="fas fa-ellipsis-v"></i></button>
973
+ `;
974
+
975
+ const regenerateBtn = card.querySelector('.action-button:nth-child(1)');
976
+ const editBtn = card.querySelector('.action-button:nth-child(2)');
977
+ const deleteBtn = card.querySelector('.action-button:nth-child(3)');
978
+ const bifurcateBtn = card.querySelector('.action-button:nth-child(4)');
979
+ const actionToggle = card.querySelector('.action-toggle');
980
+ const actionButtons = card.querySelector('.action-buttons');
981
+
982
+ regenerateBtn.addEventListener('click', (e) => {
983
+ e.stopPropagation();
984
+ regenerateImage(card);
985
+ });
986
+ editBtn.addEventListener('click', (e) => {
987
+ e.stopPropagation();
988
+ editPromptWithModal(card);
989
+ });
990
+ deleteBtn.addEventListener('click', (e) => {
991
+ e.stopPropagation();
992
+ deletePrompt(card);
993
+ });
994
+ bifurcateBtn.addEventListener('click', (e) => {
995
+ e.stopPropagation();
996
+ createChildNodesWithPrompt(card);
997
+ });
998
+ actionToggle.addEventListener('click', (e) => {
999
+ e.stopPropagation();
1000
+ toggleActionButtons(card);
1001
+ });
1002
+
1003
+ card.addEventListener('click', () => showFullImage(card));
1004
+
1005
+ return card;
1006
+ }
1007
+
1008
+ function toggleActionButtons(card) {
1009
+ const actionButtons = card.querySelector('.action-buttons');
1010
+ if (window.innerWidth <= 768) {
1011
+ if (currentOpenActionButtons && currentOpenActionButtons !== actionButtons) {
1012
+ currentOpenActionButtons.style.display = 'none';
1013
+ }
1014
+ actionButtons.style.display = actionButtons.style.display === 'flex' ? 'none' : 'flex';
1015
+ currentOpenActionButtons = actionButtons.style.display === 'flex' ? actionButtons : null;
1016
+ }
1017
+ }
1018
+
1019
+ function toggleGroupActionButtons(group) {
1020
+ const groupActionButtons = group.querySelector('.group-action-buttons');
1021
+ if (window.innerWidth <= 768) {
1022
+ if (currentOpenActionButtons && currentOpenActionButtons !== groupActionButtons) {
1023
+ currentOpenActionButtons.style.display = 'none';
1024
+ }
1025
+ groupActionButtons.style.display = groupActionButtons.style.display === 'flex' ? 'none' : 'flex';
1026
+ currentOpenActionButtons = groupActionButtons.style.display === 'flex' ? groupActionButtons : null;
1027
+ }
1028
+ }
1029
+
1030
+ function showFullImage(card) {
1031
+ const group = card.closest('.prompt-group');
1032
+ currentGroupImages = Array.from(group.querySelectorAll('.prompt-card')).filter(card => !card.classList.contains('add-node-btn'));
1033
+ currentImageIndex = currentGroupImages.indexOf(card);
1034
+
1035
+ updateModalImage();
1036
+ modal.style.display = "block";
1037
+ updateThumbnails();
1038
+ }
1039
+
1040
+ function updateModalImage() {
1041
+ const currentCard = currentGroupImages[currentImageIndex];
1042
+ const imgSrc = currentCard.querySelector('img').src;
1043
+ const promptData = JSON.parse(currentCard.querySelector('p').textContent);
1044
+ modalImage.src = imgSrc;
1045
+ modalDescription.textContent = promptData.text;
1046
+ userInput.textContent = `User Input: ${promptData.userInputText}`;
1047
+
1048
+ // Update hidden download link
1049
+ const fileName = `${promptData.text.slice(0, 30).replace(/[^a-z0-9]/gi, '_').toLowerCase()}.jpg`;
1050
+ hiddenDownloadLink.href = imgSrc;
1051
+ hiddenDownloadLink.download = fileName;
1052
+ }
1053
+
1054
+ function updateThumbnails() {
1055
+ thumbnailsContainer.innerHTML = '';
1056
+ currentGroupImages.forEach((card, index) => {
1057
+ const thumbnail = document.createElement('img');
1058
+ thumbnail.src = card.querySelector('img').src;
1059
+ thumbnail.alt = `Thumbnail ${index + 1}`;
1060
+ thumbnail.classList.add('thumbnail');
1061
+ if (index === currentImageIndex) thumbnail.classList.add('active');
1062
+ thumbnail.addEventListener('click', () => {
1063
+ currentImageIndex = index;
1064
+ updateModalImage();
1065
+ updateThumbnails();
1066
+ });
1067
+ thumbnailsContainer.appendChild(thumbnail);
1068
+ });
1069
+ }
1070
+
1071
+ function navigateImages(direction) {
1072
+ currentImageIndex = (currentImageIndex + direction + currentGroupImages.length) % currentGroupImages.length;
1073
+ updateModalImage();
1074
+ updateThumbnails();
1075
+ }
1076
+
1077
+ async function regenerateImage(card) {
1078
+ const promptData = JSON.parse(card.querySelector('p').textContent);
1079
+ setCardLoading(card);
1080
+ const newImageUrl = await generateImage(promptData.text);
1081
+ const oldImg = card.querySelector('img');
1082
+ const newImg = document.createElement('img');
1083
+ newImg.src = newImageUrl;
1084
+ newImg.alt = `Generated image for ${promptData.text}`;
1085
+ oldImg.parentNode.replaceChild(newImg, oldImg);
1086
+ resetCardLoading(card);
1087
+ }
1088
+
1089
+ function editPromptWithModal(card) {
1090
+ currentEditingCard = card;
1091
+ const currentPrompt = JSON.parse(card.querySelector('p').textContent);
1092
+ editPromptTextarea.value = currentPrompt.text;
1093
+ editPromptModal.style.display = "block";
1094
+ }
1095
+
1096
+ function deletePrompt(card) {
1097
+ if (confirm("Are you sure you want to delete this prompt?")) {
1098
+ const parentGroup = card.closest('.prompt-group');
1099
+ card.remove();
1100
+
1101
+ if (parentGroup.querySelectorAll('.prompt-card').length === 1) { // Only the add-node-btn left
1102
+ deleteGroup(parentGroup);
1103
+ }
1104
+ }
1105
+ }
1106
+
1107
+ async function createChildNodesWithPrompt(card) {
1108
+ const promptData = JSON.parse(card.querySelector('p').textContent);
1109
+ const userPrompt = prompt("Enter an optional prompt to add to the request (or leave blank):");
1110
+
1111
+ if (userPrompt === null) {
1112
+ return; // User canceled the operation
1113
+ }
1114
+
1115
+ setButtonLoading(card.querySelector('.action-button:nth-child(4)'));
1116
+
1117
+ const placeholder = createGroupPlaceholder("Generating prompts...");
1118
+ let nextLayer = card.closest('.prompt-layer').nextElementSibling;
1119
+ if (!nextLayer || !nextLayer.classList.contains('prompt-layer')) {
1120
+ nextLayer = createPromptLayer();
1121
+ promptContainer.insertBefore(nextLayer, card.closest('.prompt-layer').nextElementSibling);
1122
+ }
1123
+ nextLayer.appendChild(placeholder);
1124
+
1125
+ const childNodes = await generateComplexPrompts(promptData.text, 3, userPrompt);
1126
+
1127
+ placeholder.innerHTML = "Generating images...";
1128
+ const parentImage = card.querySelector('img').src;
1129
+ const newGroup = await createPromptGroup(childNodes, promptData.text, userPrompt || promptData.text, parentImage);
1130
+
1131
+ nextLayer.replaceChild(newGroup, placeholder);
1132
+ updateNodeSize();
1133
+ resetButtonLoading(card.querySelector('.action-button:nth-child(4)'));
1134
+ }
1135
+
1136
+ async function regenerateGroup(group) {
1137
+ const groupTitle = group.querySelector('.prompt-group-title');
1138
+ const basePrompt = groupTitle.textContent;
1139
+ const numPrompts = group.querySelectorAll('.prompt-card:not(.add-node-btn)').length;
1140
+ const userInputTitle = group.querySelector('.prompt-group-user-input');
1141
+ const userInputText = userInputTitle.textContent;
1142
+
1143
+ setButtonLoading(group.querySelector('.action-button:nth-child(1)'));
1144
+
1145
+ const placeholder = createGroupPlaceholder("Generating prompts...");
1146
+ group.innerHTML = '';
1147
+ group.appendChild(placeholder);
1148
+
1149
+ const newPrompts = await generateComplexPrompts(basePrompt, numPrompts, userInputText);
1150
+
1151
+ placeholder.innerHTML = "Generating images...";
1152
+
1153
+ group.innerHTML = '';
1154
+ group.appendChild(groupTitle);
1155
+ group.appendChild(userInputTitle);
1156
+
1157
+ for (const prompt of newPrompts) {
1158
+ const newImageUrl = await generateImage(prompt.text);
1159
+ const promptCard = createPromptCard(prompt, newImageUrl, basePrompt, userInputText);
1160
+ group.appendChild(promptCard);
1161
+ }
1162
+
1163
+ const addNodeBtn = document.createElement('div');
1164
+ addNodeBtn.className = 'add-node-btn prompt-card';
1165
+ addNodeBtn.innerHTML = '<i class="fas fa-plus"></i>';
1166
+ addNodeBtn.addEventListener('click', (e) => {
1167
+ e.stopPropagation();
1168
+ addNewNode(group);
1169
+ });
1170
+ group.appendChild(addNodeBtn);
1171
+
1172
+ updateNodeSize();
1173
+ resetButtonLoading(group.querySelector('.action-button:nth-child(1)'));
1174
+ }
1175
+
1176
+ async function editGroupPrompt(group) {
1177
+ const groupTitle = group.querySelector('.prompt-group-title');
1178
+ const currentPrompt = groupTitle.textContent;
1179
+ const userInputTitle = group.querySelector('.prompt-group-user-input');
1180
+ const userIndication = prompt("Enter a new prompt for this group:", currentPrompt);
1181
+
1182
+ if (userIndication !== null && userIndication !== "") {
1183
+ groupTitle.textContent = currentPrompt; // Keep the original parent prompt
1184
+ userInputTitle.textContent = userIndication; // Update user input
1185
+ await regenerateGroup(group);
1186
+ }
1187
+ }
1188
+
1189
+ function deleteGroup(group) {
1190
+ if (confirm("Are you sure you want to delete this entire group?")) {
1191
+ const parentLayer = group.closest('.prompt-layer');
1192
+ group.remove();
1193
+
1194
+ if (parentLayer.querySelectorAll('.prompt-group').length === 0) {
1195
+ parentLayer.remove();
1196
+ }
1197
+ }
1198
+ }
1199
+
1200
+ async function addNewNode(group) {
1201
+ const groupTitle = group.querySelector('.prompt-group-title');
1202
+ const basePrompt = groupTitle.textContent;
1203
+ const userInputTitle = group.querySelector('.prompt-group-user-input');
1204
+ const userInputText = userInputTitle.textContent;
1205
+
1206
+ setButtonLoading(group.querySelector('.add-node-btn'));
1207
+
1208
+ const newPrompt = await generateComplexPrompts(basePrompt, 1, userInputText);
1209
+ const newImageUrl = await generateImage(newPrompt[0].text);
1210
+ const promptCard = createPromptCard(newPrompt[0], newImageUrl, basePrompt, userInputText);
1211
+ group.insertBefore(promptCard, group.querySelector('.add-node-btn'));
1212
+ updateNodeSize();
1213
+
1214
+ resetButtonLoading(group.querySelector('.add-node-btn'));
1215
+ }
1216
+
1217
+ async function generateComplexPrompts(basePrompt, count, userPrompt = "") {
1218
+ const response = await fetch('https://websim.ai/api/web', {
1219
+ method: 'POST',
1220
+ headers: {
1221
+ 'Content-Type': 'application/json',
1222
+ },
1223
+ body: JSON.stringify({
1224
+ prompt: `Generate ${count} unique and creative image prompts based on this concept: "${basePrompt}". ${userPrompt ? `Include this additional context: "${userPrompt}".` : ''} Each prompt should be detailed and vivid, suitable for AI image generation. Respond in the following JSON format:
1225
+ {
1226
+ "prompts": [
1227
+ {
1228
+ "text": "Full prompt text"
1229
+ },
1230
+ ...
1231
+ ]
1232
+ }`,
1233
+ }),
1234
+ });
1235
+
1236
+ const data = await response.json();
1237
+ return data.prompts;
1238
+ }
1239
+
1240
+ async function generateImage(prompt) {
1241
+ // Use a placeholder loading image
1242
+ const placeholderUrl = 'https://via.placeholder.com/400x400.png?text=Loading...';
1243
+
1244
+ // Simulate image generation delay
1245
+ await new Promise(resolve => setTimeout(resolve, 1000));
1246
+
1247
+ // For this example, we'll still use a placeholder image service
1248
+ // In a real application, you would integrate with an actual AI image generation API
1249
+ return `https://picsum.photos/400?random=${Math.random()}`;
1250
+ }
1251
+
1252
+ function setButtonLoading(button) {
1253
+ const originalContent = button.innerHTML;
1254
+ button.disabled = true;
1255
+ button.innerHTML = '<i class="fas fa-spinner fa-spin"></i>';
1256
+ button.dataset.originalContent = originalContent;
1257
+ }
1258
+
1259
+ function resetButtonLoading(button) {
1260
+ const originalContent = button.dataset.originalContent;
1261
+ if (originalContent) {
1262
+ button.innerHTML = originalContent;
1263
+ button.disabled = false;
1264
+ delete button.dataset.originalContent;
1265
+ }
1266
+ }
1267
+
1268
+ function setCardLoading(card) {
1269
+ const loadingOverlay = document.createElement('div');
1270
+ loadingOverlay.className = 'loading-overlay';
1271
+ loadingOverlay.innerHTML = '<i class="fas fa-spinner fa-spin fa-2x"></i>';
1272
+ card.appendChild(loadingOverlay);
1273
+ }
1274
+
1275
+ function resetCardLoading(card) {
1276
+ const loadingOverlay = card.querySelector('.loading-overlay');
1277
+ if (loadingOverlay) {
1278
+ ""
1279
+ loadingOverlay.remove();
1280
+ }
1281
+ }
1282
+
1283
+ // Add this code to restore default link behavior after the page is loaded
1284
+ document.addEventListener('DOMContentLoaded', function() {
1285
+ const restoreDefaultLinkBehavior = function(element) {
1286
+ const links = element.getElementsByTagName('a');
1287
+ for (let i = 0; i < links.length; i++) {
1288
+ links[i].addEventListener('click', function(event) {
1289
+ event.stopPropagation();
1290
+ });
1291
+ }
1292
+ };
1293
+
1294
+ // Restore default behavior for existing links
1295
+ restoreDefaultLinkBehavior(document);
1296
+
1297
+ // Use a MutationObserver to handle dynamically added content
1298
+ const observer = new MutationObserver(function(mutations) {
1299
+ mutations.forEach(function(mutation) {
1300
+ if (mutation.type === 'childList') {
1301
+ mutation.addedNodes.forEach(function(node) {
1302
+ if (node.nodeType === 1) { // ELEMENT_NODE
1303
+ restoreDefaultLinkBehavior(node);
1304
+ }
1305
+ });
1306
+ }
1307
+ });
1308
+ });
1309
+
1310
+ // Configure the observer to watch for changes in the entire document
1311
+ const config = { childList: true, subtree: true };
1312
+ observer.observe(document.body, config);
1313
+ });
1314
+
1315
+ // Modify the download functionality
1316
+ downloadImageBtn.addEventListener('click', function(e) {
1317
+ e.preventDefault();
1318
+ const imgSrc = modalImage.src;
1319
+ const promptData = JSON.parse(currentGroupImages[currentImageIndex].querySelector('p').textContent);
1320
+ const fileName = `${promptData.text.slice(0, 30).replace(/[^a-z0-9]/gi, '_').toLowerCase()}.jpg`;
1321
+
1322
+ fetch(imgSrc)
1323
+ .then(resp => resp.blob())
1324
+ .then(blob => {
1325
+ const url = window.URL.createObjectURL(blob);
1326
+ const a = document.createElement('a');
1327
+ a.style.display = 'none';
1328
+ a.href = url;
1329
+ a.download = fileName;
1330
+ document.body.appendChild(a);
1331
+ a.click();
1332
+ window.URL.revokeObjectURL(url);
1333
+ })
1334
+ .catch(() => alert('An error occurred while downloading the image.'));
1335
+ });
1336
+ </script>
1337
+
1338
+ </body></html>
5kGMEiH2jkLaBI7C2.html ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://p5js.org/"><script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.min.js"></script>
2
+ <style>
3
+ body {
4
+ margin: 0;
5
+ display: flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ min-height: 100vh;
9
+ background: black;
10
+ }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <script>
15
+ t=0
16
+ draw=_=>{t++||createCanvas(W=720,W)
17
+ B=blendMode
18
+ colorMode(HSB)
19
+ B(BLEND)
20
+ background(0,.1)
21
+ B(ADD)
22
+ filter(BLUR)
23
+ for(r=0;r<TAU*9;r+=.01)fill(noise(r)*W%360,80,W,T=tan(noise(r/9+t/99)*9))+circle(cos(r+T)*r*9+360,tan(r+t/99)*r*9+360,2/T)}
24
+ </script>
25
+ </body>
26
+ </html>
27
+
28
+ To center the p5.js canvas on the page with a black background, I added a bit of CSS:
29
+
30
+ ```html
31
+ <style>
32
+ body {
33
+ margin: 0;
34
+ display: flex;
35
+ justify-content: center;
36
+ align-items: center;
37
+ min-height: 100vh;
38
+ background: black;
39
+ }
40
+ </style>
41
+ ```
42
+
43
+ This CSS does the following:
44
+
45
+ - Remove default margin on the `body` element
46
+ - Use flexbox to center content both horizontally and vertically
47
+ - Set a minimum height of 100vh (100% of the viewport height) on the body
48
+ - Set the body background color to black
49
+
50
+ The canvas generated by the p5.js code will now be centered on the screen with a pure black background surrounding it.
51
+
52
+ Centering content using flexbox is a modern, responsive technique that works well across screen sizes. Setting `min-height: 100vh` ensures the body will always be at least the full height of the screen, so the centering will work even if the content is shorter than the viewport.
53
+
54
+ Let me know if you have any other questions!
5kmEDIgrfUNCEri12.html ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Udio - AI-Powered Music Creation Studio</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
5
+ background-color: #1a1a1a;
6
+ color: #e0e0e0;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ max-width: 1000px;
13
+ margin: 0 auto;
14
+ padding: 20px;
15
+ }
16
+ header {
17
+ background: linear-gradient(45deg, #3a1c71, #d76d77, #ffaf7b);
18
+ color: #fff;
19
+ text-align: center;
20
+ padding: 40px 0;
21
+ border-radius: 0 0 15px 15px;
22
+ box-shadow: 0 4px 15px rgba(0,0,0,0.2);
23
+ }
24
+ h1 {
25
+ margin: 0;
26
+ font-size: 3.5em;
27
+ font-weight: 700;
28
+ letter-spacing: 2px;
29
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
30
+ }
31
+ .tagline {
32
+ font-size: 1.3em;
33
+ margin-top: 10px;
34
+ font-weight: 300;
35
+ }
36
+ .main-content {
37
+ background-color: #2a2a2a;
38
+ border-radius: 15px;
39
+ padding: 30px;
40
+ margin-top: 30px;
41
+ box-shadow: 0 4px 15px rgba(0,0,0,0.1);
42
+ }
43
+ .generator-interface {
44
+ display: grid;
45
+ gap: 25px;
46
+ }
47
+ label {
48
+ font-weight: 500;
49
+ margin-bottom: 8px;
50
+ display: block;
51
+ color: #b0b0b0;
52
+ }
53
+ input[type="text"], select, textarea {
54
+ width: 100%;
55
+ padding: 12px;
56
+ background-color: #3a3a3a;
57
+ border: 1px solid #4a4a4a;
58
+ border-radius: 8px;
59
+ font-size: 16px;
60
+ color: #e0e0e0;
61
+ transition: all 0.3s ease;
62
+ }
63
+ input[type="text"]:focus, select:focus, textarea:focus {
64
+ outline: none;
65
+ border-color: #d76d77;
66
+ box-shadow: 0 0 0 2px rgba(215, 109, 119, 0.2);
67
+ }
68
+ button {
69
+ background: linear-gradient(45deg, #3a1c71, #d76d77);
70
+ color: #fff;
71
+ border: none;
72
+ padding: 14px 25px;
73
+ font-size: 18px;
74
+ border-radius: 8px;
75
+ cursor: pointer;
76
+ transition: all 0.3s ease;
77
+ text-transform: uppercase;
78
+ letter-spacing: 1px;
79
+ font-weight: 600;
80
+ }
81
+ button:hover {
82
+ background: linear-gradient(45deg, #4a2c81, #e77d87);
83
+ transform: translateY(-2px);
84
+ box-shadow: 0 6px 12px rgba(0,0,0,0.2);
85
+ }
86
+ .output {
87
+ margin-top: 40px;
88
+ padding: 25px;
89
+ background-color: #3a3a3a;
90
+ border: 1px solid #4a4a4a;
91
+ border-radius: 12px;
92
+ }
93
+ .track {
94
+ background-color: #2a2a2a;
95
+ padding: 15px;
96
+ border-radius: 8px;
97
+ margin-bottom: 15px;
98
+ }
99
+ .track-controls {
100
+ display: flex;
101
+ justify-content: space-between;
102
+ align-items: center;
103
+ margin-top: 10px;
104
+ }
105
+ .track-controls button {
106
+ padding: 8px 15px;
107
+ font-size: 14px;
108
+ }
109
+ footer {
110
+ text-align: center;
111
+ margin-top: 50px;
112
+ color: #888;
113
+ font-size: 0.9em;
114
+ }
115
+ @keyframes pulse {
116
+ 0% { transform: scale(1); }
117
+ 50% { transform: scale(1.05); }
118
+ 100% { transform: scale(1); }
119
+ }
120
+ .generating {
121
+ animation: pulse 1.5s infinite;
122
+ }
123
+ </style>
124
+ </head>
125
+ <body>
126
+ <header>
127
+ <h1>Udio</h1>
128
+ <p class="tagline">AI-Powered Music Creation Studio</p>
129
+ </header>
130
+
131
+ <div class="container">
132
+ <div class="main-content">
133
+ <h2>Compose Your Masterpiece</h2>
134
+ <p>Welcome to Udio, where AI meets creativity. Describe your musical vision, and watch as our advanced algorithms bring it to life!</p>
135
+
136
+ <div class="generator-interface">
137
+ <div>
138
+ <label for="prompt">Describe Your Track:</label>
139
+ <textarea id="prompt" rows="4" placeholder="E.g., A futuristic electro-pop track with pulsing synths, ethereal vocals, and a driving beat inspired by cyberpunk aesthetics"></textarea>
140
+ </div>
141
+
142
+ <div>
143
+ <label for="genre">Primary Genre:</label>
144
+ <select id="genre">
145
+ <option value="electro-pop">Electro-Pop</option>
146
+ <option value="synthwave">Synthwave</option>
147
+ <option value="future-bass">Future Bass</option>
148
+ <option value="lo-fi">Lo-Fi</option>
149
+ <option value="tech-house">Tech House</option>
150
+ <option value="ambient">Ambient</option>
151
+ <option value="trap">Trap</option>
152
+ </select>
153
+ </div>
154
+
155
+ <div>
156
+ <label for="mood">Mood:</label>
157
+ <select id="mood">
158
+ <option value="euphoric">Euphoric</option>
159
+ <option value="melancholic">Melancholic</option>
160
+ <option value="energetic">Energetic</option>
161
+ <option value="chill">Chill</option>
162
+ <option value="dark">Dark</option>
163
+ <option value="uplifting">Uplifting</option>
164
+ </select>
165
+ </div>
166
+
167
+ <div>
168
+ <label for="bpm">Tempo (BPM):</label>
169
+ <input type="text" id="bpm" placeholder="E.g., 128">
170
+ </div>
171
+
172
+ <div>
173
+ <label for="key">Key:</label>
174
+ <select id="key">
175
+ <option value="C">C</option>
176
+ <option value="C#">C#</option>
177
+ <option value="D">D</option>
178
+ <option value="D#">D#</option>
179
+ <option value="E">E</option>
180
+ <option value="F">F</option>
181
+ <option value="F#">F#</option>
182
+ <option value="G">G</option>
183
+ <option value="G#">G#</option>
184
+ <option value="A">A</option>
185
+ <option value="A#">A#</option>
186
+ <option value="B">B</option>
187
+ </select>
188
+ </div>
189
+
190
+ <div>
191
+ <label for="duration">Duration:</label>
192
+ <select id="duration">
193
+ <option value="short">Short (1 minute)</option>
194
+ <option value="medium">Medium (2-3 minutes)</option>
195
+ <option value="long">Full Track (3-5 minutes)</option>
196
+ </select>
197
+ </div>
198
+
199
+ <button onclick="generateMusic()">Generate Track</button>
200
+ </div>
201
+
202
+ <div id="output" class="output" style="display: none;">
203
+ <h3>Your AI-Generated Composition</h3>
204
+ <div id="tracks-container"></div>
205
+ </div>
206
+ </div>
207
+
208
+ <footer>
209
+ <p>© 2024 Udio AI Music Studio. All rights reserved.</p>
210
+ <p>Powered by cutting-edge machine learning and deep neural networks.</p>
211
+ <p>Udio respects intellectual property rights. Generated music is for personal and educational use only. Commercial use may require additional licensing.</p>
212
+ </footer>
213
+ </div>
214
+
215
+ <script>
216
+ function generateMusic() {
217
+ const prompt = document.getElementById('prompt').value;
218
+ const genre = document.getElementById('genre').value;
219
+ const mood = document.getElementById('mood').value;
220
+ const bpm = document.getElementById('bpm').value;
221
+ const key = document.getElementById('key').value;
222
+ const duration = document.getElementById('duration').value;
223
+
224
+ const button = document.querySelector('button');
225
+ button.textContent = 'Generating...';
226
+ button.classList.add('generating');
227
+ button.disabled = true;
228
+
229
+ // Simulate API call and music generation process
230
+ setTimeout(() => {
231
+ const output = document.getElementById('output');
232
+ output.style.display = 'block';
233
+
234
+ const tracksContainer = document.getElementById('tracks-container');
235
+ tracksContainer.innerHTML = ''; // Clear previous tracks
236
+
237
+ // Generate multiple tracks
238
+ const trackTypes = ['Main Mix', 'Instrumental', 'Acapella', 'Remix Stems'];
239
+ trackTypes.forEach(type => {
240
+ const track = document.createElement('div');
241
+ track.className = 'track';
242
+ track.innerHTML = `
243
+ <h4>${type}</h4>
244
+ <audio controls>
245
+ <source src="https://websim.ai/audio/udio_${genre}_${mood}_${duration}_${type.toLowerCase().replace(' ', '_')}.mp3" type="audio/mpeg">
246
+ Your browser does not support the audio element.
247
+ </audio>
248
+ <div class="track-controls">
249
+ <button onclick="downloadTrack('${type}')">Download</button>
250
+ <button onclick="shareTrack('${type}')">Share</button>
251
+ </div>
252
+ `;
253
+ tracksContainer.appendChild(track);
254
+ });
255
+
256
+ button.textContent = 'Generate Track';
257
+ button.classList.remove('generating');
258
+ button.disabled = false;
259
+
260
+ // Smooth scroll to the output
261
+ output.scrollIntoView({ behavior: 'smooth', block: 'start' });
262
+ }, 8000); // Simulating 8 seconds of generation time
263
+ }
264
+
265
+ function downloadTrack(trackType) {
266
+ alert(`Downloading ${trackType}... (This is a simulation)`);
267
+ }
268
+
269
+ function shareTrack(trackType) {
270
+ alert(`Sharing ${trackType}... (This is a simulation)`);
271
+ }
272
+ </script>
273
+ </body>
274
+ </html>
5saoH9vGiBCf11Xt6.html ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://webcalc.io" />
2
+ <title>WebCalc - Advanced Online Calculators with History</title>
3
+ <meta name="description" content="WebCalc offers a variety of specialized calculators for mathematics, finance, science, and more. Now with calculation history and intuitive icons for easy navigation.">
4
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
5
+ <style>
6
+ :root {
7
+ --bg-light: #ffffff;
8
+ --text-light: #333333;
9
+ --primary-light: #3498db;
10
+ --secondary-light: #e74c3c;
11
+ --bg-dark: #2c3e50;
12
+ --text-dark: #ecf0f1;
13
+ --primary-dark: #3498db;
14
+ --secondary-dark: #e74c3c;
15
+ }
16
+ body {
17
+ font-family: Arial, sans-serif;
18
+ margin: 0;
19
+ padding: 0;
20
+ background-color: var(--bg-light);
21
+ color: var(--text-light);
22
+ transition: background-color 0.3s, color 0.3s;
23
+ }
24
+ body.dark-mode {
25
+ background-color: var(--bg-dark);
26
+ color: var(--text-dark);
27
+ }
28
+ header {
29
+ background-color: var(--primary-light);
30
+ color: white;
31
+ text-align: center;
32
+ padding: 1rem;
33
+ }
34
+ body.dark-mode header {
35
+ background-color: var(--primary-dark);
36
+ }
37
+ nav {
38
+ background-color: #f8f9fa;
39
+ padding: 0.5rem;
40
+ }
41
+ body.dark-mode nav {
42
+ background-color: #34495e;
43
+ }
44
+ nav ul {
45
+ list-style-type: none;
46
+ padding: 0;
47
+ margin: 0;
48
+ display: flex;
49
+ justify-content: center;
50
+ }
51
+ nav ul li {
52
+ margin: 0 1rem;
53
+ }
54
+ nav ul li a {
55
+ text-decoration: none;
56
+ color: var(--text-light);
57
+ display: flex;
58
+ flex-direction: column;
59
+ align-items: center;
60
+ }
61
+ body.dark-mode nav ul li a {
62
+ color: var(--text-dark);
63
+ }
64
+ nav ul li a i {
65
+ font-size: 1.5rem;
66
+ margin-bottom: 0.25rem;
67
+ }
68
+ main {
69
+ max-width: 800px;
70
+ margin: 0 auto;
71
+ padding: 2rem;
72
+ }
73
+ .calculator {
74
+ background-color: #f0f0f0;
75
+ border-radius: 8px;
76
+ padding: 1rem;
77
+ margin-bottom: 2rem;
78
+ }
79
+ body.dark-mode .calculator {
80
+ background-color: #34495e;
81
+ }
82
+ h2 {
83
+ color: var(--primary-light);
84
+ }
85
+ body.dark-mode h2 {
86
+ color: var(--primary-dark);
87
+ }
88
+ input, select {
89
+ width: 100%;
90
+ padding: 0.5rem;
91
+ margin-bottom: 1rem;
92
+ }
93
+ button {
94
+ background-color: var(--secondary-light);
95
+ color: white;
96
+ border: none;
97
+ padding: 0.5rem 1rem;
98
+ cursor: pointer;
99
+ border-radius: 4px;
100
+ }
101
+ body.dark-mode button {
102
+ background-color: var(--secondary-dark);
103
+ }
104
+ #mode-toggle {
105
+ position: fixed;
106
+ top: 1rem;
107
+ right: 1rem;
108
+ background-color: var(--text-light);
109
+ color: var(--bg-light);
110
+ border: none;
111
+ padding: 0.5rem;
112
+ cursor: pointer;
113
+ border-radius: 50%;
114
+ font-size: 1.2rem;
115
+ }
116
+ body.dark-mode #mode-toggle {
117
+ background-color: var(--text-dark);
118
+ color: var(--bg-dark);
119
+ }
120
+ .history {
121
+ margin-top: 1rem;
122
+ border-top: 1px solid #ccc;
123
+ padding-top: 1rem;
124
+ }
125
+ .history h3 {
126
+ margin-bottom: 0.5rem;
127
+ }
128
+ .history ul {
129
+ list-style-type: none;
130
+ padding: 0;
131
+ }
132
+ .history li {
133
+ margin-bottom: 0.5rem;
134
+ }
135
+ </style>
136
+ </head>
137
+ <body>
138
+ <header>
139
+ <h1>WebCalc</h1>
140
+ <p>Your go-to resource for online calculators</p>
141
+ </header>
142
+ <nav>
143
+ <ul>
144
+ <li><a href="#basic"><i class="fas fa-calculator"></i>Basic</a></li>
145
+ <li><a href="#scientific"><i class="fas fa-atom"></i>Scientific</a></li>
146
+ <li><a href="#mortgage"><i class="fas fa-home"></i>Mortgage</a></li>
147
+ <li><a href="#unit"><i class="fas fa-exchange-alt"></i>Unit Converter</a></li>
148
+ <li><a href="#history"><i class="fas fa-history"></i>History</a></li>
149
+ </ul>
150
+ </nav>
151
+ <main>
152
+ <div id="basic" class="calculator">
153
+ <h2><i class="fas fa-calculator"></i> Basic Calculator</h2>
154
+ <input type="text" id="basic-input" placeholder="Enter expression (e.g., 2 + 2)">
155
+ <button onclick="calculate('basic')">Calculate</button>
156
+ <p id="basic-result"></p>
157
+ </div>
158
+
159
+ <div id="scientific" class="calculator">
160
+ <h2><i class="fas fa-atom"></i> Scientific Calculator</h2>
161
+ <input type="text" id="scientific-input" placeholder="Enter expression (e.g., sin(45) * sqrt(2))">
162
+ <button onclick="calculate('scientific')">Calculate</button>
163
+ <p id="scientific-result"></p>
164
+ </div>
165
+
166
+ <div id="mortgage" class="calculator">
167
+ <h2><i class="fas fa-home"></i> Mortgage Calculator</h2>
168
+ <input type="number" id="loan-amount" placeholder="Loan amount">
169
+ <input type="number" id="interest-rate" placeholder="Annual interest rate (%)">
170
+ <input type="number" id="loan-term" placeholder="Loan term (years)">
171
+ <button onclick="calculateMortgage()">Calculate</button>
172
+ <p id="mortgage-result"></p>
173
+ </div>
174
+
175
+ <div id="unit" class="calculator">
176
+ <h2><i class="fas fa-exchange-alt"></i> Unit Converter</h2>
177
+ <input type="number" id="unit-input" placeholder="Enter value">
178
+ <select id="from-unit">
179
+ <option value="m">Meters</option>
180
+ <option value="ft">Feet</option>
181
+ <option value="km">Kilometers</option>
182
+ <option value="mi">Miles</option>
183
+ </select>
184
+ <select id="to-unit">
185
+ <option value="m">Meters</option>
186
+ <option value="ft">Feet</option>
187
+ <option value="km">Kilometers</option>
188
+ <option value="mi">Miles</option>
189
+ </select>
190
+ <button onclick="convertUnit()">Convert</button>
191
+ <p id="unit-result"></p>
192
+ </div>
193
+
194
+ <div id="history" class="history">
195
+ <h2><i class="fas fa-history"></i> Calculation History</h2>
196
+ <div id="basic-history">
197
+ <h3><i class="fas fa-calculator"></i> Basic Calculator History</h3>
198
+ <ul id="basic-history-list"></ul>
199
+ </div>
200
+ <div id="scientific-history">
201
+ <h3><i class="fas fa-atom"></i> Scientific Calculator History</h3>
202
+ <ul id="scientific-history-list"></ul>
203
+ </div>
204
+ <div id="mortgage-history">
205
+ <h3><i class="fas fa-home"></i> Mortgage Calculator History</h3>
206
+ <ul id="mortgage-history-list"></ul>
207
+ </div>
208
+ <div id="unit-history">
209
+ <h3><i class="fas fa-exchange-alt"></i> Unit Converter History</h3>
210
+ <ul id="unit-history-list"></ul>
211
+ </div>
212
+ </div>
213
+ </main>
214
+
215
+ <button id="mode-toggle" onclick="toggleDarkMode()"><i class="fas fa-moon"></i></button>
216
+
217
+ <script>
218
+ let calculationHistory = {
219
+ basic: [],
220
+ scientific: [],
221
+ mortgage: [],
222
+ unit: []
223
+ };
224
+
225
+ function addToHistory(type, calculation) {
226
+ calculationHistory[type].unshift(calculation);
227
+ if (calculationHistory[type].length > 10) {
228
+ calculationHistory[type].pop();
229
+ }
230
+ updateHistoryDisplay(type);
231
+ }
232
+
233
+ function updateHistoryDisplay(type) {
234
+ const historyList = document.getElementById(`${type}-history-list`);
235
+ historyList.innerHTML = '';
236
+ calculationHistory[type].forEach(item => {
237
+ const li = document.createElement('li');
238
+ li.textContent = item;
239
+ historyList.appendChild(li);
240
+ });
241
+ }
242
+
243
+ function calculate(type) {
244
+ const input = document.getElementById(`${type}-input`).value;
245
+ let result;
246
+ try {
247
+ if (type === 'basic') {
248
+ result = eval(input);
249
+ } else if (type === 'scientific') {
250
+ result = math.evaluate(input);
251
+ }
252
+ const calculation = `${input} = ${result}`;
253
+ document.getElementById(`${type}-result`).textContent = `Result: ${result}`;
254
+ addToHistory(type, calculation);
255
+ } catch (error) {
256
+ document.getElementById(`${type}-result`).textContent = `Error: ${error.message}`;
257
+ }
258
+ }
259
+
260
+ function calculateMortgage() {
261
+ const loanAmount = parseFloat(document.getElementById('loan-amount').value);
262
+ const interestRate = parseFloat(document.getElementById('interest-rate').value) / 100 / 12;
263
+ const loanTerm = parseFloat(document.getElementById('loan-term').value) * 12;
264
+
265
+ const monthlyPayment = (loanAmount * interestRate * Math.pow(1 + interestRate, loanTerm)) / (Math.pow(1 + interestRate, loanTerm) - 1);
266
+
267
+ const result = `Monthly Payment: $${monthlyPayment.toFixed(2)}`;
268
+ document.getElementById('mortgage-result').textContent = result;
269
+
270
+ const calculation = `Loan: $${loanAmount}, Rate: ${interestRate * 12 * 100}%, Term: ${loanTerm / 12} years - ${result}`;
271
+ addToHistory('mortgage', calculation);
272
+ }
273
+
274
+ function convertUnit() {
275
+ const value = parseFloat(document.getElementById('unit-input').value);
276
+ const fromUnit = document.getElementById('from-unit').value;
277
+ const toUnit = document.getElementById('to-unit').value;
278
+
279
+ const conversionRates = {
280
+ m: { m: 1, ft: 3.28084, km: 0.001, mi: 0.000621371 },
281
+ ft: { m: 0.3048, ft: 1, km: 0.0003048, mi: 0.000189394 },
282
+ km: { m: 1000, ft: 3280.84, km: 1, mi: 0.621371 },
283
+ mi: { m: 1609.34, ft: 5280, km: 1.60934, mi: 1 }
284
+ };
285
+
286
+ const result = value * conversionRates[fromUnit][toUnit];
287
+ const calculation = `${value} ${fromUnit} = ${result.toFixed(4)} ${toUnit}`;
288
+ document.getElementById('unit-result').textContent = calculation;
289
+ addToHistory('unit', calculation);
290
+ }
291
+
292
+ function toggleDarkMode() {
293
+ document.body.classList.toggle('dark-mode');
294
+ const modeToggle = document.getElementById('mode-toggle');
295
+ if (document.body.classList.contains('dark-mode')) {
296
+ modeToggle.innerHTML = '<i class="fas fa-sun"></i>';
297
+ } else {
298
+ modeToggle.innerHTML = '<i class="fas fa-moon"></i>';
299
+ }
300
+ }
301
+
302
+ // Load math.js for scientific calculations
303
+ const script = document.createElement('script');
304
+ script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjs/9.4.4/math.min.js';
305
+ document.head.appendChild(script);
306
+ </script>
307
+ </body></html>
BAredsJQIddOU8zgT.html ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://geoguessr.ai"><title>GeoGuessr.AI - AI-Generated Street View Challenge</title><style>
2
+ body, html {
3
+ margin: 0;
4
+ padding: 0;
5
+ height: 100%;
6
+ font-family: 'Roboto', sans-serif;
7
+ background-color: #f0f0f0;
8
+ }
9
+ .container {
10
+ display: flex;
11
+ height: 100vh;
12
+ }
13
+ .street-view {
14
+ width: 70%;
15
+ height: 100%;
16
+ position: relative;
17
+ background-color: #e0e0e0;
18
+ }
19
+ #panorama {
20
+ width: 100%;
21
+ height: 100%;
22
+ }
23
+ .map-interface {
24
+ width: 30%;
25
+ height: 100%;
26
+ background-color: #ffffff;
27
+ padding: 20px;
28
+ box-sizing: border-box;
29
+ display: flex;
30
+ flex-direction: column;
31
+ box-shadow: -2px 0 10px rgba(0,0,0,0.1);
32
+ }
33
+ #world-map {
34
+ width: 100%;
35
+ height: 60%;
36
+ background-color: #e0e0e0;
37
+ margin-bottom: 20px;
38
+ border-radius: 10px;
39
+ overflow: hidden;
40
+ }
41
+ .controls {
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
45
+ button {
46
+ margin: 10px 0;
47
+ padding: 12px;
48
+ font-size: 16px;
49
+ cursor: pointer;
50
+ background-color: #4CAF50;
51
+ color: white;
52
+ border: none;
53
+ border-radius: 5px;
54
+ transition: background-color 0.3s;
55
+ }
56
+ button:hover {
57
+ background-color: #45a049;
58
+ }
59
+ #result {
60
+ margin-top: 20px;
61
+ font-weight: bold;
62
+ text-align: center;
63
+ font-size: 18px;
64
+ }
65
+ .score {
66
+ text-align: center;
67
+ font-size: 24px;
68
+ margin-bottom: 20px;
69
+ }
70
+ .loading {
71
+ position: absolute;
72
+ top: 50%;
73
+ left: 50%;
74
+ transform: translate(-50%, -50%);
75
+ font-size: 24px;
76
+ color: #333;
77
+ }
78
+ #panorama-placeholder {
79
+ width: 100%;
80
+ height: 100%;
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ font-size: 24px;
85
+ color: #666;
86
+ text-align: center;
87
+ padding: 20px;
88
+ box-sizing: border-box;
89
+ background-size: cover;
90
+ background-position: center;
91
+ }
92
+ </style></head><body>
93
+ <div class="container">
94
+ <div class="street-view">
95
+ <div id="panorama">
96
+ <div id="panorama-placeholder" style="background-image: url('https://image.pollinations.ai/prompt/A%20vibrant%20street%20scene%20in%20Kuala%20Lumpur,%20Malaysia,%20with%20modern%20skyscrapers%20and%20bustling%20street%20life'); background-size: cover; background-position: center;"></div>
97
+ </div>
98
+ </div>
99
+ <div class="map-interface">
100
+ <h2 style="text-align: center;">GeoGuessr.AI</h2>
101
+ <div class="score">Score: <span id="score">0</span></div>
102
+ <div id="world-map"></div>
103
+ <div class="controls">
104
+ <button id="guess-btn">Make a Guess</button>
105
+ <button id="next-btn">Next Location</button>
106
+ </div>
107
+ <div id="result"></div>
108
+ </div>
109
+ </div>
110
+
111
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.6.1/d3.min.js"></script>
112
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/topojson/3.0.2/topojson.min.js"></script>
113
+ <script>
114
+ let currentCountry = 'Malaysia';
115
+ let score = 0;
116
+ const countries = ['USA', 'Japan', 'France', 'Brazil', 'Australia', 'Egypt', 'India', 'Canada', 'Italy', 'South Africa', 'Germany', 'Mexico', 'Argentina', 'Spain', 'Russia', 'China', 'UK', 'Thailand', 'Greece', 'New Zealand', 'Malaysia', 'Singapore', 'Indonesia', 'Vietnam', 'South Korea'];
117
+
118
+ function simulatePanoramaLoading() {
119
+ const placeholder = document.getElementById('panorama-placeholder');
120
+ placeholder.style.backgroundImage = '';
121
+
122
+ setTimeout(() => {
123
+ const cityName = getCityName(currentCountry);
124
+ const prompt = `A street scene in ${cityName}, ${currentCountry}, showing typical architecture and street life`;
125
+ const encodedPrompt = encodeURIComponent(prompt);
126
+ placeholder.style.backgroundImage = `url('https://image.pollinations.ai/prompt/${encodedPrompt}')`;
127
+ }, 1500);
128
+ }
129
+
130
+ function getCityName(country) {
131
+ const cities = {
132
+ 'USA': 'New York',
133
+ 'Japan': 'Tokyo',
134
+ 'France': 'Paris',
135
+ 'Brazil': 'Rio de Janeiro',
136
+ 'Australia': 'Sydney',
137
+ 'Egypt': 'Cairo',
138
+ 'India': 'Mumbai',
139
+ 'Canada': 'Toronto',
140
+ 'Italy': 'Rome',
141
+ 'South Africa': 'Cape Town',
142
+ 'Germany': 'Berlin',
143
+ 'Mexico': 'Mexico City',
144
+ 'Argentina': 'Buenos Aires',
145
+ 'Spain': 'Barcelona',
146
+ 'Russia': 'Moscow',
147
+ 'China': 'Shanghai',
148
+ 'UK': 'London',
149
+ 'Thailand': 'Bangkok',
150
+ 'Greece': 'Athens',
151
+ 'New Zealand': 'Auckland',
152
+ 'Malaysia': 'Kuala Lumpur',
153
+ 'Singapore': 'Singapore',
154
+ 'Indonesia': 'Jakarta',
155
+ 'Vietnam': 'Ho Chi Minh City',
156
+ 'South Korea': 'Seoul'
157
+ };
158
+ return cities[country] || country;
159
+ }
160
+
161
+ function initWorldMap() {
162
+ const width = document.getElementById('world-map').clientWidth;
163
+ const height = document.getElementById('world-map').clientHeight;
164
+
165
+ const svg = d3.select("#world-map")
166
+ .append("svg")
167
+ .attr("width", width)
168
+ .attr("height", height);
169
+
170
+ const g = svg.append("g");
171
+
172
+ const projection = d3.geoMercator()
173
+ .scale(width / 6.5)
174
+ .translate([width / 2, height / 1.5]);
175
+
176
+ const path = d3.geoPath().projection(projection);
177
+
178
+ const zoom = d3.zoom()
179
+ .scaleExtent([1, 8])
180
+ .on("zoom", zoomed);
181
+
182
+ svg.call(zoom);
183
+
184
+ function zoomed(event) {
185
+ g.attr("transform", event.transform);
186
+ }
187
+
188
+ d3.json("https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json").then(function(world) {
189
+ g.selectAll("path")
190
+ .data(topojson.feature(world, world.objects.countries).features)
191
+ .enter().append("path")
192
+ .attr("d", path)
193
+ .attr("fill", "#ccc")
194
+ .attr("stroke", "#fff")
195
+ .on("click", function(event, d) {
196
+ const clickedCountry = d.properties.name;
197
+ checkGuess(clickedCountry);
198
+ })
199
+ .on("mouseover", function() {
200
+ d3.select(this).attr("fill", "#999");
201
+ })
202
+ .on("mouseout", function() {
203
+ d3.select(this).attr("fill", "#ccc");
204
+ });
205
+ });
206
+ }
207
+
208
+ function checkGuess(guessedCountry) {
209
+ const result = document.getElementById('result');
210
+ if (guessedCountry.toLowerCase() === currentCountry.toLowerCase()) {
211
+ score += 100;
212
+ result.textContent = "Correct! +100 points";
213
+ result.style.color = "green";
214
+ } else {
215
+ result.textContent = `Wrong. It was ${currentCountry}.`;
216
+ result.style.color = "red";
217
+ }
218
+ document.getElementById('score').textContent = score;
219
+ }
220
+
221
+ function newLocation() {
222
+ currentCountry = countries[Math.floor(Math.random() * countries.length)];
223
+ document.getElementById('result').textContent = '';
224
+ simulatePanoramaLoading();
225
+ }
226
+
227
+ document.getElementById('guess-btn').addEventListener('click', () => {
228
+ alert("Click on a country in the world map to make your guess!");
229
+ });
230
+
231
+ document.getElementById('next-btn').addEventListener('click', newLocation);
232
+
233
+ window.onload = () => {
234
+ initWorldMap();
235
+ simulatePanoramaLoading();
236
+ };
237
+ </script>
238
+ </body></html>
KzdrTTfJSbT0CJiBy.html ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/calculator" />
2
+ <title>WebSim Calculator</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ display: flex;
7
+ justify-content: center;
8
+ align-items: center;
9
+ height: 100vh;
10
+ margin: 0;
11
+ background-color: #f0f0f0;
12
+ }
13
+ .calculator {
14
+ background-color: #333;
15
+ border-radius: 10px;
16
+ padding: 20px;
17
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
18
+ }
19
+ .display {
20
+ background-color: #eee;
21
+ border: none;
22
+ border-radius: 5px;
23
+ font-size: 24px;
24
+ height: 50px;
25
+ margin-bottom: 10px;
26
+ padding: 5px;
27
+ text-align: right;
28
+ width: 100%;
29
+ }
30
+ .buttons {
31
+ display: grid;
32
+ grid-template-columns: repeat(4, 1fr);
33
+ gap: 5px;
34
+ }
35
+ button {
36
+ background-color: #4CAF50;
37
+ border: none;
38
+ border-radius: 5px;
39
+ color: white;
40
+ cursor: pointer;
41
+ font-size: 18px;
42
+ padding: 15px;
43
+ transition: background-color 0.3s;
44
+ }
45
+ button:hover {
46
+ background-color: #45a049;
47
+ }
48
+ .operator {
49
+ background-color: #ff9800;
50
+ }
51
+ .operator:hover {
52
+ background-color: #e68a00;
53
+ }
54
+ .clear {
55
+ background-color: #f44336;
56
+ }
57
+ .clear:hover {
58
+ background-color: #da190b;
59
+ }
60
+ .equals {
61
+ background-color: #2196F3;
62
+ }
63
+ .equals:hover {
64
+ background-color: #0b7dda;
65
+ }
66
+ </style>
67
+ </head>
68
+ <body>
69
+ <div class="calculator">
70
+ <input type="text" class="display" id="display" readonly>
71
+ <div class="buttons">
72
+ <button onclick="appendToDisplay('7')">7</button>
73
+ <button onclick="appendToDisplay('8')">8</button>
74
+ <button onclick="appendToDisplay('9')">9</button>
75
+ <button class="operator" onclick="appendToDisplay('+')">+</button>
76
+ <button onclick="appendToDisplay('4')">4</button>
77
+ <button onclick="appendToDisplay('5')">5</button>
78
+ <button onclick="appendToDisplay('6')">6</button>
79
+ <button class="operator" onclick="appendToDisplay('-')">-</button>
80
+ <button onclick="appendToDisplay('1')">1</button>
81
+ <button onclick="appendToDisplay('2')">2</button>
82
+ <button onclick="appendToDisplay('3')">3</button>
83
+ <button class="operator" onclick="appendToDisplay('*')">*</button>
84
+ <button onclick="appendToDisplay('0')">0</button>
85
+ <button onclick="appendToDisplay('.')">.</button>
86
+ <button class="clear" onclick="clearDisplay()">C</button>
87
+ <button class="operator" onclick="appendToDisplay('/')">/</button>
88
+ <button class="equals" onclick="calculate()">=</button>
89
+ </div>
90
+ </div>
91
+
92
+ <script>
93
+ function appendToDisplay(value) {
94
+ document.getElementById('display').value += value;
95
+ }
96
+
97
+ function clearDisplay() {
98
+ document.getElementById('display').value = '';
99
+ }
100
+
101
+ function calculate() {
102
+ try {
103
+ const result = eval(document.getElementById('display').value);
104
+ document.getElementById('display').value = result;
105
+ } catch (error) {
106
+ document.getElementById('display').value = 'Error';
107
+ }
108
+ }
109
+ </script>
110
+ </body></html>
Sd7bPQBZF7ggJv870.html ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"/>
2
+ <title>WebSim AI Chat Widget</title>
3
+ <style>
4
+ #chat-widget {
5
+ position: fixed;
6
+ bottom: 20px;
7
+ right: 20px;
8
+ font-family: Arial, sans-serif;
9
+ z-index: 1000;
10
+ }
11
+ #chat-button {
12
+ width: 60px;
13
+ height: 60px;
14
+ border-radius: 50%;
15
+ background-color: #4CAF50;
16
+ color: white;
17
+ border: none;
18
+ cursor: pointer;
19
+ font-size: 24px;
20
+ box-shadow: 0 2px 10px rgba(0,0,0,0.3);
21
+ }
22
+ #chat-container {
23
+ display: none;
24
+ width: 300px;
25
+ height: 400px;
26
+ background-color: white;
27
+ border-radius: 10px;
28
+ overflow: hidden;
29
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
30
+ }
31
+ #chat-messages {
32
+ height: 340px;
33
+ overflow-y: auto;
34
+ padding: 10px;
35
+ }
36
+ .message {
37
+ margin-bottom: 10px;
38
+ padding: 8px;
39
+ border-radius: 5px;
40
+ max-width: 80%;
41
+ }
42
+ .user-message {
43
+ background-color: #e1f5fe;
44
+ margin-left: auto;
45
+ }
46
+ .ai-message {
47
+ background-color: #f0f4c3;
48
+ }
49
+ #user-input {
50
+ width: 100%;
51
+ padding: 10px;
52
+ border: none;
53
+ border-top: 1px solid #ddd;
54
+ font-size: 14px;
55
+ }
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <div id="chat-widget">
60
+ <button id="chat-button">💬</button>
61
+ <div id="chat-container">
62
+ <div id="chat-messages"></div>
63
+ <input type="text" id="user-input" placeholder="Type your message and press Enter">
64
+ </div>
65
+ </div>
66
+
67
+ <script>
68
+ const chatButton = document.getElementById('chat-button');
69
+ const chatContainer = document.getElementById('chat-container');
70
+ const chatMessages = document.getElementById('chat-messages');
71
+ const userInput = document.getElementById('user-input');
72
+
73
+ let isOpen = false;
74
+
75
+ function toggleChat() {
76
+ isOpen = !isOpen;
77
+ chatContainer.style.display = isOpen ? 'block' : 'none';
78
+ chatButton.textContent = isOpen ? '×' : '💬';
79
+ if (isOpen && chatMessages.children.length === 0) {
80
+ addMessage("Hello! I'm WebSim AI. How can I assist you today?");
81
+ }
82
+ }
83
+
84
+ function addMessage(content, isUser = false) {
85
+ const messageDiv = document.createElement('div');
86
+ messageDiv.className = `message ${isUser ? 'user-message' : 'ai-message'}`;
87
+ messageDiv.textContent = content;
88
+ chatMessages.appendChild(messageDiv);
89
+ chatMessages.scrollTop = chatMessages.scrollHeight;
90
+ }
91
+
92
+ chatButton.addEventListener('click', toggleChat);
93
+
94
+ userInput.addEventListener('keypress', async function(e) {
95
+ if (e.key === 'Enter') {
96
+ const userMessage = userInput.value.trim();
97
+ if (userMessage) {
98
+ addMessage(userMessage, true);
99
+ userInput.value = '';
100
+
101
+ try {
102
+ const response = await fetch('/api/intelligent-ai', {
103
+ method: 'POST',
104
+ headers: {
105
+ 'Content-Type': 'application/json',
106
+ },
107
+ body: JSON.stringify({ message: userMessage }),
108
+ });
109
+
110
+ if (!response.ok) {
111
+ throw new Error('Network response was not ok');
112
+ }
113
+
114
+ const data = await response.json();
115
+ addMessage(data.response);
116
+ } catch (error) {
117
+ console.error('Error:', error);
118
+ addMessage('Sorry, I encountered an error. Please try again.');
119
+ }
120
+ }
121
+ }
122
+ });
123
+ </script>
124
+ </body></html>
SuizTrAkJTH0SSNxx.html ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/win7/chat/"><title>Windows 7 Style AI Chat</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/7.css"><style>
2
+ body {
3
+ background: url('https://ia904603.us.archive.org/10/items/Windows-wallcollection/1920x1200_%28Windows_7%29.jpg') no-repeat center center fixed;
4
+ background-size: cover;
5
+ margin: 0;
6
+ padding: 20px;
7
+ height: 100vh;
8
+ display: flex;
9
+ justify-content: center;
10
+ align-items: center;
11
+ }
12
+
13
+ .window {
14
+ width: 90%;
15
+ max-width: 500px;
16
+ background: rgba(255, 255, 255, 0.1);
17
+ backdrop-filter: blur(15px);
18
+ -webkit-backdrop-filter: blur(15px);
19
+ border: 1px solid rgba(255, 255, 255, 0.2);
20
+ box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
21
+ border-radius: 12px;
22
+ overflow: hidden;
23
+ }
24
+
25
+ .title-bar {
26
+ background: rgba(25, 121, 202, 0.7);
27
+ backdrop-filter: blur(10px);
28
+ -webkit-backdrop-filter: blur(10px);
29
+ }
30
+
31
+ .window-body {
32
+ background: transparent;
33
+ }
34
+
35
+ #chat-container {
36
+ height: 350px;
37
+ overflow-y: auto;
38
+ border: 1px solid rgba(255, 255, 255, 0.2);
39
+ background: rgba(255, 255, 255, 0.05);
40
+ backdrop-filter: blur(5px);
41
+ -webkit-backdrop-filter: blur(5px);
42
+ padding: 12px;
43
+ margin-bottom: 16px;
44
+ box-shadow: inset 1px 1px 0 rgba(255,255,255,0.1), inset -1px -1px 0 rgba(0,0,0,0.05);
45
+ }
46
+
47
+ .user-message, .bot-message {
48
+ margin-bottom: 12px;
49
+ padding: 10px;
50
+ border-radius: 8px;
51
+ max-width: 80%;
52
+ position: relative;
53
+ overflow: hidden;
54
+ }
55
+
56
+ .user-message {
57
+ background: rgba(0, 120, 215, 0.6);
58
+ color: white;
59
+ margin-left: auto;
60
+ border: 1px solid rgba(0, 120, 215, 0.3);
61
+ backdrop-filter: blur(3px);
62
+ -webkit-backdrop-filter: blur(3px);
63
+ box-shadow:
64
+ 0 4px 6px rgba(0,0,0,0.1),
65
+ 0 1px 3px rgba(0,0,0,0.08),
66
+ inset 0 1px 0 rgba(255,255,255,0.1),
67
+ inset 0 -1px 0 rgba(0,0,0,0.1);
68
+ }
69
+
70
+ .bot-message {
71
+ background: rgba(240, 240, 240, 0.6);
72
+ border: 1px solid rgba(200, 200, 200, 0.3);
73
+ backdrop-filter: blur(3px);
74
+ -webkit-backdrop-filter: blur(3px);
75
+ box-shadow:
76
+ 0 4px 6px rgba(0,0,0,0.1),
77
+ 0 1px 3px rgba(0,0,0,0.08),
78
+ inset 0 1px 0 rgba(255,255,255,0.5),
79
+ inset 0 -1px 0 rgba(0,0,0,0.05);
80
+ }
81
+
82
+ .user-message::before, .bot-message::before {
83
+ content: "";
84
+ position: absolute;
85
+ top: -50%;
86
+ left: -50%;
87
+ width: 200%;
88
+ height: 200%;
89
+ background: linear-gradient(
90
+ to bottom right,
91
+ rgba(255,255,255,0.3) 0%,
92
+ rgba(255,255,255,0.1) 40%,
93
+ rgba(255,255,255,0) 50%
94
+ );
95
+ transform: rotate(30deg);
96
+ pointer-events: none;
97
+ }
98
+
99
+ .field-row-stacked {
100
+ margin-bottom: 16px;
101
+ }
102
+
103
+ #user-input {
104
+ width: calc(100% - 16px);
105
+ margin-bottom: 12px;
106
+ resize: vertical;
107
+ background: rgba(255, 255, 255, 0.4);
108
+ border: 1px solid rgba(0, 0, 0, 0.1);
109
+ backdrop-filter: blur(3px);
110
+ -webkit-backdrop-filter: blur(3px);
111
+
112
+ /* 3D effect for input field */
113
+ box-shadow:
114
+ inset 0 2px 3px rgba(0,0,0,0.2),
115
+ 0 1px 0 rgba(255,255,255,0.1),
116
+ 0 -1px 0 rgba(0,0,0,0.1),
117
+ 1px 0 0 rgba(255,255,255,0.1),
118
+ -1px 0 0 rgba(0,0,0,0.1);
119
+ border-radius: 5px;
120
+ transition: all 0.3s ease;
121
+ }
122
+
123
+ #user-input:focus {
124
+ outline: none;
125
+ box-shadow:
126
+ inset 0 2px 3px rgba(0,0,0,0.1),
127
+ 0 0 5px rgba(0,120,215,0.5);
128
+ border-color: rgba(0,120,215,0.5);
129
+ }
130
+
131
+ #send-btn {
132
+ min-width: 80px;
133
+ padding: 6px 12px;
134
+ background: rgba(0, 120, 215, 0.8);
135
+ color: white;
136
+ border: 1px solid rgba(0, 120, 215, 0.3);
137
+ backdrop-filter: blur(3px);
138
+ -webkit-backdrop-filter: blur(3px);
139
+ transition: all 0.3s ease;
140
+
141
+ /* 3D effect for button */
142
+ box-shadow:
143
+ 0 1px 3px rgba(0,0,0,0.2),
144
+ inset 0 1px 0 rgba(255,255,255,0.2),
145
+ inset 0 -1px 0 rgba(0,0,0,0.2);
146
+ border-radius: 5px;
147
+ }
148
+
149
+ #send-btn:hover {
150
+ background: rgba(0, 120, 215, 1);
151
+ box-shadow:
152
+ 0 2px 5px rgba(0,0,0,0.3),
153
+ inset 0 1px 0 rgba(255,255,255,0.3),
154
+ inset 0 -1px 0 rgba(0,0,0,0.3);
155
+ }
156
+
157
+ #send-btn:active {
158
+ box-shadow:
159
+ inset 0 2px 3px rgba(0,0,0,0.2);
160
+ transform: translateY(1px);
161
+ }
162
+
163
+ @media (max-width: 480px) {
164
+ body {
165
+ padding: 10px;
166
+ }
167
+
168
+ .window {
169
+ width: 100%;
170
+ }
171
+
172
+ #chat-container {
173
+ height: 300px;
174
+ }
175
+ }
176
+
177
+ /* Scrollbar Styles */
178
+ #chat-container::-webkit-scrollbar {
179
+ width: 8px;
180
+ }
181
+
182
+ #chat-container::-webkit-scrollbar-track {
183
+ background: rgba(255, 255, 255, 0.1);
184
+ }
185
+
186
+ #chat-container::-webkit-scrollbar-thumb {
187
+ background-color: rgba(0, 120, 215, 0.5);
188
+ border-radius: 4px;
189
+ }
190
+
191
+ #chat-container::-webkit-scrollbar-thumb:hover {
192
+ background-color: rgba(0, 120, 215, 0.7);
193
+ }
194
+
195
+ /* Additional see-through effects */
196
+ .window::before {
197
+ content: "";
198
+ position: absolute;
199
+ top: 0;
200
+ left: 0;
201
+ right: 0;
202
+ bottom: 0;
203
+ background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
204
+ pointer-events: none;
205
+ z-index: -1;
206
+ }
207
+
208
+ .window-body::before {
209
+ content: "";
210
+ position: absolute;
211
+ top: -50%;
212
+ left: -50%;
213
+ width: 200%;
214
+ height: 200%;
215
+ background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 80%);
216
+ transform: rotate(30deg);
217
+ pointer-events: none;
218
+ z-index: -1;
219
+ }
220
+ </style></head><body>
221
+ <div class="window" style="width: 400px">
222
+ <div class="title-bar">
223
+ <div class="title-bar-text">Windows 7 AI Chat</div>
224
+ <div class="title-bar-controls">
225
+ <button aria-label="Minimize"></button>
226
+ <button aria-label="Maximize"></button>
227
+ <button aria-label="Close"></button>
228
+ </div>
229
+ </div>
230
+ <div class="window-body">
231
+ <div id="chat-container"></div>
232
+ <div class="field-row-stacked" style="display: flex; flex-direction: column; align-items: center; margin-top: 16px;">
233
+ <label for="user-input" style="align-self: center; margin-bottom: 8px; color: rgba(255, 255, 255, 0.8);">Your message:</label>
234
+ <textarea id="user-input" rows="3" style="width: 95%; resize: vertical; margin-bottom: 12px;"></textarea>
235
+ <button id="send-btn" style="width: 120px;">Send</button>
236
+ </div>
237
+ </div>
238
+ </div>
239
+
240
+ <script>
241
+ const chatContainer = document.getElementById('chat-container');
242
+ const userInput = document.getElementById('user-input');
243
+ const sendBtn = document.getElementById('send-btn');
244
+
245
+ function addMessage(message, isUser) {
246
+ const messageDiv = document.createElement('div');
247
+ messageDiv.className = isUser ? 'user-message' : 'bot-message';
248
+ messageDiv.textContent = message;
249
+ chatContainer.appendChild(messageDiv);
250
+ chatContainer.scrollTop = chatContainer.scrollHeight;
251
+ }
252
+
253
+ async function sendMessage() {
254
+ const message = userInput.value.trim();
255
+ if (message) {
256
+ addMessage(message, true);
257
+ userInput.value = '';
258
+
259
+ try {
260
+ const response = await fetch('https://websim.ai/api/intelligent-ai', {
261
+ method: 'POST',
262
+ headers: {
263
+ 'Content-Type': 'application/json',
264
+ },
265
+ body: JSON.stringify({ message }),
266
+ });
267
+
268
+ if (!response.ok) {
269
+ throw new Error('API request failed');
270
+ }
271
+
272
+ const data = await response.json();
273
+ addMessage(data.response, false);
274
+ } catch (error) {
275
+ console.error('Error:', error);
276
+ addMessage('Sorry, I encountered an error. Please try again.', false);
277
+ }
278
+ }
279
+ }
280
+
281
+ sendBtn.addEventListener('click', sendMessage);
282
+ userInput.addEventListener('keypress', (e) => {
283
+ if (e.key === 'Enter' && !e.shiftKey) {
284
+ e.preventDefault();
285
+ sendMessage();
286
+ }
287
+ });
288
+
289
+ // Initial greeting
290
+ addMessage('Hello! I\'m your Windows 7 styled AI assistant. How can I help you today?', false);
291
+ </script>
292
+ </body></html>
cAV68f8Tkn09yA806.html ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>WebSim AI - Website Image Generator</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ background-color: #f0f0f0;
5
+ margin: 0;
6
+ padding: 20px;
7
+ display: flex;
8
+ flex-direction: column;
9
+ align-items: center;
10
+ }
11
+ h1 {
12
+ color: #333;
13
+ text-align: center;
14
+ }
15
+ .container {
16
+ background-color: white;
17
+ border-radius: 8px;
18
+ padding: 20px;
19
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
20
+ max-width: 600px;
21
+ width: 100%;
22
+ }
23
+ form {
24
+ display: flex;
25
+ flex-direction: column;
26
+ }
27
+ label {
28
+ margin-bottom: 5px;
29
+ font-weight: bold;
30
+ }
31
+ input[type="text"] {
32
+ padding: 10px;
33
+ margin-bottom: 15px;
34
+ border: 1px solid #ddd;
35
+ border-radius: 4px;
36
+ }
37
+ button {
38
+ background-color: #4CAF50;
39
+ color: white;
40
+ padding: 10px 15px;
41
+ border: none;
42
+ border-radius: 4px;
43
+ cursor: pointer;
44
+ font-size: 16px;
45
+ }
46
+ button:hover {
47
+ background-color: #45a049;
48
+ }
49
+ #result {
50
+ margin-top: 20px;
51
+ text-align: center;
52
+ }
53
+ #generatedImage {
54
+ max-width: 100%;
55
+ height: auto;
56
+ border-radius: 4px;
57
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
58
+ }
59
+ </style></head><body>
60
+ <h1>WebSim AI - Website Image Generator</h1>
61
+ <div class="container">
62
+ <form id="imageForm">
63
+ <label for="prompt">Enter your website description:</label>
64
+ <input type="text" id="prompt" name="prompt" required placeholder="e.g., A modern tech startup homepage with vibrant colors">
65
+ <button type="submit">Generate Image</button>
66
+ </form>
67
+ <div id="result"></div>
68
+ </div>
69
+
70
+ <script>
71
+ document.getElementById('imageForm').addEventListener('submit', function(e) {
72
+ e.preventDefault();
73
+ const prompt = document.getElementById('prompt').value;
74
+ const resultDiv = document.getElementById('result');
75
+
76
+ resultDiv.innerHTML = 'Generating image...';
77
+
78
+ // Simulating API call to Stable Diffusion
79
+ setTimeout(() => {
80
+ const imageUrl = `https://source.unsplash.com/random/800x600?${encodeURIComponent(prompt)}`;
81
+ resultDiv.innerHTML = `<img id="generatedImage" src="${imageUrl}" alt="Generated website image based on: ${prompt}">`;
82
+ }, 2000);
83
+ });
84
+ </script>
85
+ </body></html>
dfWR4clw9QQkclTZb.html ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>SinoMuse: AI-Powered Chinese Music Generator</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Noto Sans SC', Arial, sans-serif;
5
+ background-color: #f0f0f0;
6
+ color: #333;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ max-width: 800px;
13
+ margin: 0 auto;
14
+ padding: 20px;
15
+ }
16
+ header {
17
+ background-color: #c62828;
18
+ color: #fff;
19
+ text-align: center;
20
+ padding: 20px 0;
21
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
22
+ }
23
+ h1 {
24
+ margin: 0;
25
+ font-size: 2.5em;
26
+ font-weight: 300;
27
+ }
28
+ .tagline {
29
+ font-style: italic;
30
+ margin-top: 10px;
31
+ }
32
+ .main-content {
33
+ background-color: #fff;
34
+ border-radius: 5px;
35
+ padding: 20px;
36
+ margin-top: 20px;
37
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
38
+ }
39
+ .generator-interface {
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: 15px;
43
+ }
44
+ select, button {
45
+ padding: 10px;
46
+ font-size: 16px;
47
+ border: 1px solid #ddd;
48
+ border-radius: 4px;
49
+ }
50
+ button {
51
+ background-color: #c62828;
52
+ color: #fff;
53
+ border: none;
54
+ cursor: pointer;
55
+ transition: background-color 0.3s ease;
56
+ }
57
+ button:hover {
58
+ background-color: #e53935;
59
+ }
60
+ .output {
61
+ margin-top: 20px;
62
+ padding: 15px;
63
+ background-color: #f9f9f9;
64
+ border: 1px solid #ddd;
65
+ border-radius: 4px;
66
+ }
67
+ .music-player {
68
+ width: 100%;
69
+ margin-top: 20px;
70
+ }
71
+ footer {
72
+ text-align: center;
73
+ margin-top: 30px;
74
+ color: #666;
75
+ }
76
+ @keyframes pulse {
77
+ 0% { transform: scale(1); }
78
+ 50% { transform: scale(1.05); }
79
+ 100% { transform: scale(1); }
80
+ }
81
+ .generating {
82
+ animation: pulse 1s infinite;
83
+ }
84
+ </style>
85
+ </head>
86
+ <body>
87
+ <header>
88
+ <h1>SinoMuse 华乐生成器</h1>
89
+ <p class="tagline">AI-Powered Chinese Music Generator</p>
90
+ </header>
91
+
92
+ <div class="container">
93
+ <div class="main-content">
94
+ <h2>Generate Your Chinese Music Masterpiece</h2>
95
+ <p>Welcome to SinoMuse, the cutting-edge AI-powered Chinese music generator. Create beautiful melodies inspired by traditional Chinese music with just a few clicks!</p>
96
+
97
+ <div class="generator-interface">
98
+ <label for="style">Choose a Style:</label>
99
+ <select id="style">
100
+ <option value="classical">Classical (古典)</option>
101
+ <option value="folk">Folk (民谣)</option>
102
+ <option value="opera">Opera (戏曲)</option>
103
+ <option value="modern">Modern Fusion (现代融合)</option>
104
+ </select>
105
+
106
+ <label for="instrument">Primary Instrument:</label>
107
+ <select id="instrument">
108
+ <option value="erhu">Erhu (二胡)</option>
109
+ <option value="guzheng">Guzheng (古筝)</option>
110
+ <option value="dizi">Dizi (笛子)</option>
111
+ <option value="pipa">Pipa (琵琶)</option>
112
+ <option value="guqin">Guqin (古琴)</option>
113
+ </select>
114
+
115
+ <label for="mood">Mood:</label>
116
+ <select id="mood">
117
+ <option value="joyful">Joyful (欢快)</option>
118
+ <option value="melancholic">Melancholic (忧郁)</option>
119
+ <option value="serene">Serene (宁静)</option>
120
+ <option value="energetic">Energetic (充满活力)</option>
121
+ </select>
122
+
123
+ <label for="length">Composition Length:</label>
124
+ <select id="length">
125
+ <option value="short">Short (30 seconds)</option>
126
+ <option value="medium">Medium (1 minute)</option>
127
+ <option value="long">Long (2 minutes)</option>
128
+ </select>
129
+
130
+ <button onclick="generateMusic()">Generate Music</button>
131
+ </div>
132
+
133
+ <div id="output" class="output" style="display: none;">
134
+ <h3>Your Generated Composition</h3>
135
+ <p id="composition-details"></p>
136
+ <audio id="music-player" class="music-player" controls>
137
+ Your browser does not support the audio element.
138
+ </audio>
139
+ </div>
140
+ </div>
141
+
142
+ <footer>
143
+ <p>© 2024 SinoMuse AI Music Generator. All rights reserved.</p>
144
+ <p>Powered by advanced AI and deep learning models trained on thousands of traditional and modern Chinese music compositions.</p>
145
+ </footer>
146
+ </div>
147
+
148
+ <script>
149
+ function generateMusic() {
150
+ const style = document.getElementById('style').value;
151
+ const instrument = document.getElementById('instrument').value;
152
+ const mood = document.getElementById('mood').value;
153
+ const length = document.getElementById('length').value;
154
+
155
+ const button = document.querySelector('button');
156
+ button.textContent = 'Generating...';
157
+ button.classList.add('generating');
158
+ button.disabled = true;
159
+
160
+ // Simulate API call and processing time
161
+ setTimeout(() => {
162
+ const output = document.getElementById('output');
163
+ output.style.display = 'block';
164
+
165
+ const details = document.getElementById('composition-details');
166
+ details.textContent = `A ${length} ${mood} ${style} composition featuring ${instrument} has been generated.`;
167
+
168
+ const player = document.getElementById('music-player');
169
+ player.src = `https://websim.ai/audio/${style}_${instrument}_${mood}_${length}.mp3`;
170
+
171
+ button.textContent = 'Generate Music';
172
+ button.classList.remove('generating');
173
+ button.disabled = false;
174
+
175
+ // Scroll to the output
176
+ output.scrollIntoView({ behavior: 'smooth' });
177
+ }, 3000);
178
+ }
179
+ </script>
180
+ </body>
181
+ </html>
eKn9NC3QflID3qLPP.html ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Suno AI Music Generator</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Roboto', Arial, sans-serif;
5
+ background-color: #f4f7f6;
6
+ color: #333;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ max-width: 900px;
13
+ margin: 0 auto;
14
+ padding: 20px;
15
+ }
16
+ header {
17
+ background: linear-gradient(135deg, #6e48aa, #9d50bb);
18
+ color: #fff;
19
+ text-align: center;
20
+ padding: 40px 0;
21
+ border-radius: 0 0 10px 10px;
22
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
23
+ }
24
+ h1 {
25
+ margin: 0;
26
+ font-size: 3em;
27
+ font-weight: 700;
28
+ letter-spacing: 2px;
29
+ }
30
+ .tagline {
31
+ font-size: 1.2em;
32
+ margin-top: 10px;
33
+ font-weight: 300;
34
+ }
35
+ .main-content {
36
+ background-color: #fff;
37
+ border-radius: 10px;
38
+ padding: 30px;
39
+ margin-top: 30px;
40
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
41
+ }
42
+ .generator-interface {
43
+ display: grid;
44
+ gap: 20px;
45
+ }
46
+ label {
47
+ font-weight: 500;
48
+ margin-bottom: 5px;
49
+ display: block;
50
+ }
51
+ input[type="text"], select, textarea {
52
+ width: 100%;
53
+ padding: 12px;
54
+ border: 1px solid #ddd;
55
+ border-radius: 6px;
56
+ font-size: 16px;
57
+ transition: border-color 0.3s ease;
58
+ }
59
+ input[type="text"]:focus, select:focus, textarea:focus {
60
+ outline: none;
61
+ border-color: #9d50bb;
62
+ }
63
+ button {
64
+ background: linear-gradient(135deg, #6e48aa, #9d50bb);
65
+ color: #fff;
66
+ border: none;
67
+ padding: 12px 20px;
68
+ font-size: 18px;
69
+ border-radius: 6px;
70
+ cursor: pointer;
71
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
72
+ }
73
+ button:hover {
74
+ transform: translateY(-2px);
75
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
76
+ }
77
+ .output {
78
+ margin-top: 30px;
79
+ padding: 20px;
80
+ background-color: #f9f9f9;
81
+ border: 1px solid #ddd;
82
+ border-radius: 6px;
83
+ }
84
+ .music-player {
85
+ width: 100%;
86
+ margin-top: 20px;
87
+ }
88
+ footer {
89
+ text-align: center;
90
+ margin-top: 40px;
91
+ color: #666;
92
+ font-size: 0.9em;
93
+ }
94
+ @keyframes glow {
95
+ 0% { box-shadow: 0 0 5px #9d50bb; }
96
+ 50% { box-shadow: 0 0 20px #9d50bb; }
97
+ 100% { box-shadow: 0 0 5px #9d50bb; }
98
+ }
99
+ .generating {
100
+ animation: glow 1.5s infinite;
101
+ }
102
+ </style>
103
+ </head>
104
+ <body>
105
+ <header>
106
+ <h1>Suno AI Music Generator</h1>
107
+ <p class="tagline">Transform Your Ideas into Melodies</p>
108
+ </header>
109
+
110
+ <div class="container">
111
+ <div class="main-content">
112
+ <h2>Create Your Unique Music</h2>
113
+ <p>Welcome to Suno, the next-generation AI music generator. Describe your musical vision, and let our advanced AI bring it to life!</p>
114
+
115
+ <div class="generator-interface">
116
+ <div>
117
+ <label for="prompt">Describe Your Music:</label>
118
+ <textarea id="prompt" rows="4" placeholder="E.g., An upbeat pop song with catchy guitar riffs and a powerful female vocal, inspired by 80s rock ballads"></textarea>
119
+ </div>
120
+
121
+ <div>
122
+ <label for="genre">Primary Genre:</label>
123
+ <select id="genre">
124
+ <option value="pop">Pop</option>
125
+ <option value="rock">Rock</option>
126
+ <option value="hiphop">Hip Hop</option>
127
+ <option value="electronic">Electronic</option>
128
+ <option value="classical">Classical</option>
129
+ <option value="jazz">Jazz</option>
130
+ <option value="ambient">Ambient</option>
131
+ </select>
132
+ </div>
133
+
134
+ <div>
135
+ <label for="mood">Mood:</label>
136
+ <select id="mood">
137
+ <option value="energetic">Energetic</option>
138
+ <option value="relaxed">Relaxed</option>
139
+ <option value="melancholic">Melancholic</option>
140
+ <option value="uplifting">Uplifting</option>
141
+ <option value="intense">Intense</option>
142
+ <option value="playful">Playful</option>
143
+ </select>
144
+ </div>
145
+
146
+ <div>
147
+ <label for="duration">Duration:</label>
148
+ <select id="duration">
149
+ <option value="short">Short (30 seconds)</option>
150
+ <option value="medium">Medium (1 minute)</option>
151
+ <option value="long">Full Track (3 minutes)</option>
152
+ </select>
153
+ </div>
154
+
155
+ <div>
156
+ <label for="instruments">Key Instruments:</label>
157
+ <input type="text" id="instruments" placeholder="E.g., guitar, synth, drums">
158
+ </div>
159
+
160
+ <button onclick="generateMusic()">Generate Music</button>
161
+ </div>
162
+
163
+ <div id="output" class="output" style="display: none;">
164
+ <h3>Your AI-Generated Composition</h3>
165
+ <p id="composition-details"></p>
166
+ <audio id="music-player" class="music-player" controls>
167
+ Your browser does not support the audio element.
168
+ </audio>
169
+ </div>
170
+ </div>
171
+
172
+ <footer>
173
+ <p>© 2024 Suno AI Music Generator. All rights reserved.</p>
174
+ <p>Powered by state-of-the-art machine learning models and vast musical datasets.</p>
175
+ <p>Suno respects copyright laws. Generated music is for personal use only. Commercial use may require additional licensing.</p>
176
+ </footer>
177
+ </div>
178
+
179
+ <script>
180
+ function generateMusic() {
181
+ const prompt = document.getElementById('prompt').value;
182
+ const genre = document.getElementById('genre').value;
183
+ const mood = document.getElementById('mood').value;
184
+ const duration = document.getElementById('duration').value;
185
+ const instruments = document.getElementById('instruments').value;
186
+
187
+ const button = document.querySelector('button');
188
+ button.textContent = 'Generating...';
189
+ button.classList.add('generating');
190
+ button.disabled = true;
191
+
192
+ // Simulate API call and music generation process
193
+ setTimeout(() => {
194
+ const output = document.getElementById('output');
195
+ output.style.display = 'block';
196
+
197
+ const details = document.getElementById('composition-details');
198
+ details.innerHTML = `<strong>Your AI-generated music:</strong><br>
199
+ Genre: ${genre}<br>
200
+ Mood: ${mood}<br>
201
+ Duration: ${duration}<br>
202
+ Key Instruments: ${instruments}<br>
203
+ Inspired by your prompt: "${prompt}"`;
204
+
205
+ const player = document.getElementById('music-player');
206
+ player.src = `https://websim.ai/audio/suno_${genre}_${mood}_${duration}.mp3`;
207
+
208
+ button.textContent = 'Generate Music';
209
+ button.classList.remove('generating');
210
+ button.disabled = false;
211
+
212
+ // Smooth scroll to the output
213
+ output.scrollIntoView({ behavior: 'smooth', block: 'start' });
214
+ }, 5000); // Simulating 5 seconds of generation time
215
+ }
216
+ </script>
217
+ </body>
218
+ </html>
iRyFbhKpEhOO2cC6P.html ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/create"><meta charset="UTF-8">
2
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
3
+ <title>WebSim AI - Create Your Simulated Website</title>
4
+ <style>
5
+ body {
6
+ font-family: Arial, sans-serif;
7
+ line-height: 1.6;
8
+ color: #333;
9
+ max-width: 800px;
10
+ margin: 0 auto;
11
+ padding: 20px;
12
+ background-color: #f4f4f4;
13
+ }
14
+ h1 {
15
+ color: #2c3e50;
16
+ text-align: center;
17
+ }
18
+ form {
19
+ background-color: #fff;
20
+ padding: 20px;
21
+ border-radius: 8px;
22
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
23
+ }
24
+ label {
25
+ display: block;
26
+ margin-bottom: 5px;
27
+ font-weight: bold;
28
+ }
29
+ input[type="text"], textarea {
30
+ width: 100%;
31
+ padding: 8px;
32
+ margin-bottom: 15px;
33
+ border: 1px solid #ddd;
34
+ border-radius: 4px;
35
+ box-sizing: border-box;
36
+ }
37
+ textarea {
38
+ height: 100px;
39
+ resize: vertical;
40
+ }
41
+ input[type="submit"] {
42
+ background-color: #3498db;
43
+ color: #fff;
44
+ padding: 10px 15px;
45
+ border: none;
46
+ border-radius: 4px;
47
+ cursor: pointer;
48
+ font-size: 16px;
49
+ }
50
+ input[type="submit"]:hover {
51
+ background-color: #2980b9;
52
+ }
53
+ .logo {
54
+ text-align: center;
55
+ margin-bottom: 20px;
56
+ }
57
+ .logo img {
58
+ max-width: 200px;
59
+ }
60
+ </style>
61
+ </head>
62
+ <body>
63
+ <div class="logo">
64
+ <img src="https://websim.ai/logo.png" alt="WebSim AI Logo">
65
+ </div>
66
+
67
+ <h1>Create Your Simulated Website</h1>
68
+
69
+ <form action="/simulate" method="POST">
70
+ <label for="url">Desired URL:</label>
71
+ <input type="text" id="url" name="url" required placeholder="e.g., https://example.com">
72
+
73
+ <label for="description">Website Description:</label>
74
+ <textarea id="description" name="description" required placeholder="Describe the website you want to simulate..."></textarea>
75
+
76
+ <label for="features">Key Features (comma-separated):</label>
77
+ <input type="text" id="features" name="features" placeholder="e.g., responsive design, dark mode, user authentication">
78
+
79
+ <label for="tone">Tone/Style:</label>
80
+ <input type="text" id="tone" name="tone" placeholder="e.g., professional, playful, minimalist">
81
+
82
+ <input type="submit" value="Create Simulation">
83
+ </form>
84
+
85
+ <script>
86
+ document.querySelector('form').addEventListener('submit', function(e) {
87
+ e.preventDefault();
88
+
89
+ const url = document.getElementById('url').value;
90
+ const description = document.getElementById('description').value;
91
+ const features = document.getElementById('features').value;
92
+ const tone = document.getElementById('tone').value;
93
+
94
+ // Normally, we'd send this data to a server. For this simulation, we'll redirect to a fake result page.
95
+ const params = new URLSearchParams({
96
+ url: url,
97
+ description: description,
98
+ features: features,
99
+ tone: tone
100
+ });
101
+
102
+ window.location.href = `https://websim.ai/result?${params.toString()}`;
103
+ });
104
+ </script>
105
+ </body></html>
kHAhV8B0hRChqQ0f6.html ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Crimson Panels: Red Manga Slideshow</title><style>
2
+ body {
3
+ font-family: 'Roboto', sans-serif;
4
+ background-color: #1a1a1a;
5
+ color: #f0f0f0;
6
+ margin: 0;
7
+ padding: 0;
8
+ display: flex;
9
+ justify-content: center;
10
+ align-items: center;
11
+ height: 100vh;
12
+ }
13
+ .slideshow-container {
14
+ width: 80%;
15
+ max-width: 800px;
16
+ background-color: #2a2a2a;
17
+ border-radius: 10px;
18
+ box-shadow: 0 0 20px rgba(255, 0, 0, 0.3);
19
+ overflow: hidden;
20
+ }
21
+ .slideshow-header {
22
+ background: linear-gradient(45deg, #8B0000, #FF0000);
23
+ color: white;
24
+ padding: 20px;
25
+ text-align: center;
26
+ font-size: 24px;
27
+ font-weight: bold;
28
+ }
29
+ .slide-container {
30
+ position: relative;
31
+ width: 100%;
32
+ height: 0;
33
+ padding-bottom: 56.25%; /* 16:9 Aspect Ratio */
34
+ }
35
+ .slide {
36
+ position: absolute;
37
+ top: 0;
38
+ left: 0;
39
+ width: 100%;
40
+ height: 100%;
41
+ opacity: 0;
42
+ transition: opacity 0.5s ease-in-out;
43
+ }
44
+ .slide.active {
45
+ opacity: 1;
46
+ }
47
+ .slide img {
48
+ width: 100%;
49
+ height: 100%;
50
+ object-fit: contain;
51
+ }
52
+ .slide-info {
53
+ position: absolute;
54
+ bottom: 0;
55
+ left: 0;
56
+ right: 0;
57
+ background-color: rgba(0, 0, 0, 0.7);
58
+ color: white;
59
+ padding: 10px;
60
+ text-align: center;
61
+ }
62
+ .slide-title {
63
+ font-size: 18px;
64
+ font-weight: bold;
65
+ margin-bottom: 5px;
66
+ }
67
+ .slide-artist {
68
+ font-size: 14px;
69
+ font-style: italic;
70
+ }
71
+ .nav-button {
72
+ position: absolute;
73
+ top: 50%;
74
+ transform: translateY(-50%);
75
+ background-color: rgba(255, 0, 0, 0.6);
76
+ color: white;
77
+ border: none;
78
+ padding: 10px 15px;
79
+ cursor: pointer;
80
+ font-size: 18px;
81
+ transition: background-color 0.3s ease;
82
+ }
83
+ .nav-button:hover {
84
+ background-color: rgba(255, 0, 0, 0.8);
85
+ }
86
+ #prevBtn {
87
+ left: 10px;
88
+ }
89
+ #nextBtn {
90
+ right: 10px;
91
+ }
92
+ .slideshow-footer {
93
+ background-color: #2a2a2a;
94
+ padding: 10px;
95
+ text-align: center;
96
+ }
97
+ #slideCounter {
98
+ font-size: 14px;
99
+ color: #b0b0b0;
100
+ }
101
+ </style></head><body>
102
+ <div class="slideshow-container">
103
+ <div class="slideshow-header">Crimson Panels: Red Manga Slideshow</div>
104
+ <div class="slide-container">
105
+ <div class="slide active">
106
+ <img src="https://websim.ai/manga/red_slide1.jpg" alt="Crimson Samurai in Battle">
107
+ <div class="slide-info">
108
+ <div class="slide-title">Crimson Samurai in Battle</div>
109
+ <div class="slide-artist">by Takehiko Inoue</div>
110
+ </div>
111
+ </div>
112
+ <div class="slide">
113
+ <img src="https://websim.ai/manga/red_slide2.jpg" alt="Blood Moon Kunoichi">
114
+ <div class="slide-info">
115
+ <div class="slide-title">Blood Moon Kunoichi</div>
116
+ <div class="slide-artist">by Rumiko Takahashi</div>
117
+ </div>
118
+ </div>
119
+ <div class="slide">
120
+ <img src="https://websim.ai/manga/red_slide3.jpg" alt="Scarlet Dragon Awakening">
121
+ <div class="slide-info">
122
+ <div class="slide-title">Scarlet Dragon Awakening</div>
123
+ <div class="slide-artist">by Eiichiro Oda</div>
124
+ </div>
125
+ </div>
126
+ <div class="slide">
127
+ <img src="https://websim.ai/manga/red_slide4.jpg" alt="Ruby Mecha Rising">
128
+ <div class="slide-info">
129
+ <div class="slide-title">Ruby Mecha Rising</div>
130
+ <div class="slide-artist">by Katsuhiro Otomo</div>
131
+ </div>
132
+ </div>
133
+ <div class="slide">
134
+ <img src="https://websim.ai/manga/red_slide5.jpg" alt="Vermilion Witch's Spell">
135
+ <div class="slide-info">
136
+ <div class="slide-title">Vermilion Witch's Spell</div>
137
+ <div class="slide-artist">by CLAMP</div>
138
+ </div>
139
+ </div>
140
+ <button class="nav-button" id="prevBtn">&lt;</button>
141
+ <button class="nav-button" id="nextBtn">&gt;</button>
142
+ </div>
143
+ <div class="slideshow-footer">
144
+ <div id="slideCounter">Slide 1 of 5</div>
145
+ </div>
146
+ </div>
147
+
148
+ <script>
149
+ let currentSlide = 0;
150
+ const slides = document.querySelectorAll('.slide');
151
+ const slideCounter = document.getElementById('slideCounter');
152
+
153
+ function showSlide(n) {
154
+ slides[currentSlide].classList.remove('active');
155
+ currentSlide = (n + slides.length) % slides.length;
156
+ slides[currentSlide].classList.add('active');
157
+ slideCounter.textContent = `Slide ${currentSlide + 1} of ${slides.length}`;
158
+ }
159
+
160
+ document.getElementById('prevBtn').addEventListener('click', () => showSlide(currentSlide - 1));
161
+ document.getElementById('nextBtn').addEventListener('click', () => showSlide(currentSlide + 1));
162
+
163
+ // Auto-advance slides every 5 seconds
164
+ setInterval(() => showSlide(currentSlide + 1), 5000);
165
+ </script>
166
+ </body></html>
mGQuGMP9rOTXHoruj.html ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://pictures.maker/ai-generator">
2
+ <title>AI Picture Generator | pictures.maker</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ line-height: 1.6;
7
+ color: #333;
8
+ max-width: 800px;
9
+ margin: 0 auto;
10
+ padding: 20px;
11
+ }
12
+ h1 {
13
+ color: #2c3e50;
14
+ text-align: center;
15
+ }
16
+ .generator {
17
+ background-color: #f9f9f9;
18
+ border-radius: 8px;
19
+ padding: 20px;
20
+ margin-top: 20px;
21
+ }
22
+ textarea {
23
+ width: 100%;
24
+ height: 100px;
25
+ margin-bottom: 10px;
26
+ padding: 10px;
27
+ border: 1px solid #ddd;
28
+ border-radius: 4px;
29
+ }
30
+ button {
31
+ background-color: #3498db;
32
+ color: white;
33
+ border: none;
34
+ padding: 10px 20px;
35
+ border-radius: 4px;
36
+ cursor: pointer;
37
+ }
38
+ button:hover {
39
+ background-color: #2980b9;
40
+ }
41
+ #result {
42
+ margin-top: 20px;
43
+ text-align: center;
44
+ }
45
+ #result img {
46
+ max-width: 100%;
47
+ border-radius: 8px;
48
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
49
+ }
50
+ .features {
51
+ display: flex;
52
+ justify-content: space-around;
53
+ margin-top: 30px;
54
+ }
55
+ .feature {
56
+ flex-basis: 30%;
57
+ text-align: center;
58
+ }
59
+ .feature i {
60
+ font-size: 2em;
61
+ color: #3498db;
62
+ }
63
+ </style>
64
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
65
+ </head>
66
+ <body>
67
+ <h1>AI Picture Generator</h1>
68
+
69
+ <div class="generator">
70
+ <form method="GET" action="https://pictures.maker/ai-generator/generate">
71
+ <textarea name="prompt" placeholder="Describe the image you want to generate..."></textarea>
72
+ <button type="submit">Generate Picture</button>
73
+ </form>
74
+ </div>
75
+
76
+ <div id="result">
77
+ <!-- Generated image will appear here -->
78
+ </div>
79
+
80
+ <div class="features">
81
+ <div class="feature">
82
+ <i class="fas fa-magic"></i>
83
+ <h3>Advanced AI</h3>
84
+ <p>Utilizes cutting-edge artificial intelligence to create stunning images from text descriptions.</p>
85
+ </div>
86
+ <div class="feature">
87
+ <i class="fas fa-palette"></i>
88
+ <h3>Endless Creativity</h3>
89
+ <p>Generate any image you can imagine, from surreal landscapes to futuristic concepts.</p>
90
+ </div>
91
+ <div class="feature">
92
+ <i class="fas fa-bolt"></i>
93
+ <h3>Lightning Fast</h3>
94
+ <p>Get your AI-generated images in seconds, perfect for rapid prototyping and ideation.</p>
95
+ </div>
96
+ </div>
97
+
98
+ <script>
99
+ document.querySelector('form').addEventListener('submit', function(e) {
100
+ e.preventDefault();
101
+ const prompt = document.querySelector('textarea[name="prompt"]').value;
102
+ const resultDiv = document.getElementById('result');
103
+ resultDiv.innerHTML = '<p>Generating your image...</p>';
104
+
105
+ // Simulating API call and image generation
106
+ setTimeout(() => {
107
+ const imageUrl = `https://picsum.photos/800/600?random=${Date.now()}`;
108
+ resultDiv.innerHTML = `<img src="${imageUrl}" alt="AI generated image based on: ${prompt}">
109
+ <p>AI-generated image based on your prompt: "${prompt}"</p>`;
110
+ }, 2000);
111
+ });
112
+ </script>
113
+
114
+ <footer>
115
+ <p>Explore more AI tools at <a href="https://pictures.maker/">pictures.maker</a></p>
116
+ <p>Need help? Check out our <a href="https://pictures.maker/faq">FAQ</a> or <a href="https://pictures.maker/contact">contact us</a>.</p>
117
+ </footer>
118
+ </body></html>
rkxhiFmIGNiNxxyd3.html ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/slides/iXS9nGVRQFThXIIbl"><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ background-color: #f0f0f0;
5
+ margin: 0;
6
+ padding: 20px;
7
+ display: flex;
8
+ flex-direction: column;
9
+ align-items: center;
10
+ }
11
+ h1 {
12
+ color: #333;
13
+ text-align: center;
14
+ }
15
+ #gallery {
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ justify-content: center;
19
+ gap: 20px;
20
+ max-width: 1200px;
21
+ }
22
+ .image-container {
23
+ background-color: white;
24
+ border-radius: 8px;
25
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
26
+ padding: 10px;
27
+ width: 300px;
28
+ }
29
+ .image-container img {
30
+ width: 100%;
31
+ height: 200px;
32
+ object-fit: cover;
33
+ border-radius: 4px;
34
+ }
35
+ .image-title {
36
+ margin-top: 10px;
37
+ font-weight: bold;
38
+ text-align: center;
39
+ }
40
+ #loadMore {
41
+ margin-top: 20px;
42
+ padding: 10px 20px;
43
+ background-color: #4CAF50;
44
+ color: white;
45
+ border: none;
46
+ border-radius: 4px;
47
+ cursor: pointer;
48
+ font-size: 16px;
49
+ }
50
+ #loadMore:hover {
51
+ background-color: #45a049;
52
+ }
53
+ </style>
54
+ </head>
55
+ <body>
56
+ <h1>Reddit Image Gallery</h1>
57
+ <div id="gallery"></div>
58
+ <button id="loadMore">Load More</button>
59
+
60
+ <script>
61
+ const gallery = document.getElementById('gallery');
62
+ const loadMoreButton = document.getElementById('loadMore');
63
+ let after = '';
64
+
65
+ async function fetchRedditImages() {
66
+ const response = await fetch(`https://www.reddit.com/r/EarthPorn/top.json?limit=10&t=week&after=${after}`);
67
+ const data = await response.json();
68
+ after = data.data.after;
69
+ return data.data.children;
70
+ }
71
+
72
+ function createImageElement(post) {
73
+ const container = document.createElement('div');
74
+ container.className = 'image-container';
75
+
76
+ const img = document.createElement('img');
77
+ img.src = post.data.url;
78
+ img.alt = post.data.title;
79
+
80
+ const title = document.createElement('div');
81
+ title.className = 'image-title';
82
+ title.textContent = post.data.title;
83
+
84
+ container.appendChild(img);
85
+ container.appendChild(title);
86
+ return container;
87
+ }
88
+
89
+ async function loadImages() {
90
+ const posts = await fetchRedditImages();
91
+ posts.forEach(post => {
92
+ if (post.data.post_hint === 'image') {
93
+ const imageElement = createImageElement(post);
94
+ gallery.appendChild(imageElement);
95
+ }
96
+ });
97
+ }
98
+
99
+ loadMoreButton.addEventListener('click', loadImages);
100
+
101
+ // Initial load
102
+ loadImages();
103
+ </script>
104
+ </body></html>
vqxKR6h7LNpL0uB5x.html ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" /><title>Interactive CSS Abilities Demo</title><style>
2
+ :root {
3
+ --pink: hsl(338, 70%, 55%);
4
+ --teal: hsl(183, 70%, 62%);
5
+ --white: hsl(334, 7%, 95%);
6
+ }
7
+
8
+ *,
9
+ *::before,
10
+ *::after {
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ background: hsl(224, 32%, 12%);
16
+ background-image: conic-gradient(
17
+ from 0deg at 50% 50%,
18
+ blue,
19
+ purple,
20
+ purple,
21
+ blue
22
+ );
23
+ background-blend-mode: multiply;
24
+ color: white;
25
+ min-block-size: 100dvh;
26
+ display: grid;
27
+ place-items: center;
28
+ }
29
+
30
+ pre {
31
+ --selector: var(--pink);
32
+ --property: var(--teal);
33
+ --punctuation: var(--white);
34
+
35
+ font-size: 3rem;
36
+ font-weight: bold;
37
+ background: hsl(222, 45%, 7%);
38
+ padding: 2rem;
39
+ border-radius: 1rem;
40
+
41
+ position: relative;
42
+
43
+ transition: all 64ms linear;
44
+
45
+ transform-style: preserve-3d;
46
+ transform:
47
+ perspective(5000px)
48
+ rotateY(var(--rotateY))
49
+ rotateX(var(--rotateX));
50
+ }
51
+
52
+ .selector {
53
+ color: var(--selector);
54
+ }
55
+
56
+ .property {
57
+ color: var(--property);
58
+ }
59
+
60
+ .punctuation {
61
+ color: var(--punctuation);
62
+ }
63
+
64
+ .property + .punctuation {
65
+ color: var(--property);
66
+ }
67
+
68
+ pre > * {
69
+ text-shadow: 0 0 0.3em currentColor;
70
+ }
71
+
72
+ pre::before,
73
+ pre::after {
74
+ content: '';
75
+ position: absolute;
76
+ border-radius: inherit;
77
+ }
78
+
79
+ pre::before {
80
+ inset: 0.75rem;
81
+ background: black;
82
+ transform: translateZ(-49px);
83
+ filter: blur(24px);
84
+ opacity: 0.5;
85
+ }
86
+
87
+ pre::after {
88
+ inset: -1rem;
89
+ background: linear-gradient(-45deg, red, blue);
90
+ transform: translateZ(-50px);
91
+ }
92
+ </style></head><body><pre class="language-css" tabindex="0"><code class="language-css"><span class="token selector">.claude</span> <span class="token punctuation">{</span>
93
+ <span class="token property">abilities</span><span class="token punctuation">:</span> css<span class="token punctuation">;</span>
94
+ <span class="token punctuation">}</span></code></pre>
95
+ <script>
96
+ const pre = document.querySelector('pre')
97
+
98
+ document.addEventListener('mousemove', (e) => {
99
+ rotateElement(e, pre);
100
+ });
101
+
102
+ function rotateElement(event, element) {
103
+ const x = event.clientX;
104
+ const y = event.clientY;
105
+
106
+ const middleX = window.innerWidth / 2;
107
+ const middleY = window.innerHeight / 2;
108
+
109
+ const offsetX = ((x - middleX) / middleX) * 45;
110
+ const offsetY = ((y - middleY) / middleY) * 45;
111
+
112
+ element.style.setProperty('--rotateX', -1 * offsetY + 'deg');
113
+ element.style.setProperty('--rotateY', offsetX + 'deg');
114
+ }
115
+ </script></body></html>
wTOVYG2mG2kJBslof.html ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/ai-rewriting-pentagon-relations"><title>How AI is Rewriting Silicon Valley's Relationship with the Pentagon | TechDiplomacy</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ line-height: 1.6;
5
+ color: #333;
6
+ max-width: 800px;
7
+ margin: 0 auto;
8
+ padding: 20px;
9
+ }
10
+ header {
11
+ background-color: #f0f0f0;
12
+ padding: 20px;
13
+ text-align: center;
14
+ }
15
+ h1 {
16
+ color: #2c3e50;
17
+ }
18
+ .author {
19
+ font-style: italic;
20
+ color: #7f8c8d;
21
+ }
22
+ .content {
23
+ margin-top: 20px;
24
+ }
25
+ .section {
26
+ margin-bottom: 30px;
27
+ }
28
+ .quote {
29
+ background-color: #f9f9f9;
30
+ border-left: 5px solid #ccc;
31
+ padding: 10px;
32
+ margin: 10px 0;
33
+ }
34
+ .related-links {
35
+ background-color: #eef2f7;
36
+ padding: 15px;
37
+ border-radius: 5px;
38
+ }
39
+ .related-links h3 {
40
+ margin-top: 0;
41
+ }
42
+ </style></head><body>
43
+ <header>
44
+ <h1>How AI is Rewriting Silicon Valley's Relationship with the Pentagon</h1>
45
+ <p class="author">By Sarah Chen, Tech Policy Correspondent</p>
46
+ <p>Published on June 15, 2023 | Last updated: June 15, 2023</p>
47
+ </header>
48
+
49
+ <div class="content">
50
+ <div class="section">
51
+ <p>In recent years, the landscape of collaboration between Silicon Valley tech giants and the U.S. Department of Defense has undergone a seismic shift, primarily driven by advancements in artificial intelligence (AI). This evolving relationship is reshaping not only how military operations are conducted but also how ethical considerations in tech development are approached.</p>
52
+ </div>
53
+
54
+ <div class="section">
55
+ <h2>The AI Arms Race</h2>
56
+ <p>As AI capabilities have grown exponentially, the Pentagon has recognized its potential to revolutionize warfare, intelligence gathering, and national security. This has led to increased efforts to partner with tech companies at the forefront of AI research and development.</p>
57
+ <p>However, this collaboration hasn't been without controversy. In 2018, Google faced significant backlash from employees over its involvement in Project Maven, a Pentagon AI initiative. This led to the company's decision not to renew the contract and to establish AI ethics guidelines.</p>
58
+ </div>
59
+
60
+ <div class="section">
61
+ <h2>Shifting Attitudes</h2>
62
+ <p>Despite initial reservations, many Silicon Valley companies are now reconsidering their stance on military partnerships. Factors contributing to this shift include:</p>
63
+ <ul>
64
+ <li>Growing concerns about AI advancements in rival nations, particularly China</li>
65
+ <li>The potential for dual-use technologies that have both civilian and military applications</li>
66
+ <li>Increased transparency and ethical guidelines from the Pentagon</li>
67
+ </ul>
68
+ </div>
69
+
70
+ <div class="quote">
71
+ <p>"We're seeing a new era of tech-military collaboration, one that's more transparent and guided by ethical considerations. It's no longer just about winning contracts; it's about shaping the future of AI in a responsible manner." - Dr. Emily Zhao, AI Ethics Researcher at Stanford University</p>
72
+ </div>
73
+
74
+ <div class="section">
75
+ <h2>Challenges and Opportunities</h2>
76
+ <p>As this relationship evolves, both sides face unique challenges:</p>
77
+ <ul>
78
+ <li>Balancing national security interests with ethical AI development</li>
79
+ <li>Addressing concerns about data privacy and potential misuse of AI technologies</li>
80
+ <li>Bridging the cultural gap between Silicon Valley's innovation-driven culture and the Pentagon's more structured approach</li>
81
+ </ul>
82
+ <p>However, this collaboration also presents significant opportunities:</p>
83
+ <ul>
84
+ <li>Accelerating AI research and development in areas like natural language processing and computer vision</li>
85
+ <li>Creating new avenues for public-private partnerships in emerging technologies</li>
86
+ <li>Establishing the U.S. as a leader in ethical AI development for defense applications</li>
87
+ </ul>
88
+ </div>
89
+
90
+ <div class="section">
91
+ <h2>Looking Ahead</h2>
92
+ <p>As AI continues to advance, the relationship between Silicon Valley and the Pentagon will likely deepen, albeit with more robust ethical frameworks in place. This evolving partnership could shape not only the future of defense technology but also set global standards for responsible AI development.</p>
93
+ </div>
94
+
95
+ <div class="related-links">
96
+ <h3>Related Articles:</h3>
97
+ <ul>
98
+ <li><a href="https://websim.ai/c/ethical-ai-development">The Rise of Ethical AI: Balancing Innovation and Responsibility</a></li>
99
+ <li><a href="https://websim.ai/c/silicon-valley-culture">Silicon Valley's Changing Landscape: From Garages to Global Influence</a></li>
100
+ <li><a href="https://websim.ai/c/ai-national-security">AI and National Security: Navigating the New Frontier</a></li>
101
+ </ul>
102
+ </div>
103
+ </div>
104
+ </body></html>
xOh5DKyd0vub7Sl6d.html ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Drunk Beats: The Inebriated Music Generator</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Comic Sans MS', cursive, sans-serif;
5
+ background-color: #FDF7E3;
6
+ color: #333;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ overflow-x: hidden;
11
+ }
12
+ .container {
13
+ max-width: 800px;
14
+ margin: auto;
15
+ padding: 20px;
16
+ }
17
+ header {
18
+ background: linear-gradient(45deg, #FF6B6B, #4ECDC4);
19
+ color: #fff;
20
+ text-align: center;
21
+ padding: 30px 0;
22
+ border-radius: 0 0 50% 50% / 20px;
23
+ box-shadow: 0 5px 15px rgba(0,0,0,0.1);
24
+ }
25
+ h1 {
26
+ margin: 0;
27
+ font-size: 3em;
28
+ text-shadow: 2px 2px #FF9999;
29
+ transform: rotate(-3deg);
30
+ }
31
+ .tagline {
32
+ font-style: italic;
33
+ font-size: 1.2em;
34
+ margin-top: 10px;
35
+ transform: rotate(2deg);
36
+ }
37
+ .main-content {
38
+ background-color: #fff;
39
+ border-radius: 15px;
40
+ padding: 30px;
41
+ margin-top: 30px;
42
+ box-shadow: 0 0 20px rgba(0,0,0,0.1);
43
+ position: relative;
44
+ overflow: hidden;
45
+ }
46
+ .main-content::before {
47
+ content: "";
48
+ position: absolute;
49
+ top: -10px;
50
+ left: -10px;
51
+ right: -10px;
52
+ bottom: -10px;
53
+ background: repeating-linear-gradient(
54
+ 45deg,
55
+ #FF6B6B,
56
+ #FF6B6B 10px,
57
+ #4ECDC4 10px,
58
+ #4ECDC4 20px
59
+ );
60
+ z-index: -1;
61
+ opacity: 0.1;
62
+ }
63
+ .generator-interface {
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 20px;
67
+ }
68
+ label {
69
+ font-weight: bold;
70
+ margin-bottom: 5px;
71
+ display: block;
72
+ color: #FF6B6B;
73
+ }
74
+ select, input[type="range"] {
75
+ width: 100%;
76
+ padding: 10px;
77
+ border: 2px solid #4ECDC4;
78
+ border-radius: 10px;
79
+ font-size: 16px;
80
+ background-color: #FDF7E3;
81
+ transform: rotate(-1deg);
82
+ }
83
+ input[type="range"] {
84
+ -webkit-appearance: none;
85
+ height: 15px;
86
+ background: #FF6B6B;
87
+ outline: none;
88
+ border: none;
89
+ opacity: 0.7;
90
+ transition: opacity .2s;
91
+ }
92
+ input[type="range"]:hover {
93
+ opacity: 1;
94
+ }
95
+ input[type="range"]::-webkit-slider-thumb {
96
+ -webkit-appearance: none;
97
+ appearance: none;
98
+ width: 25px;
99
+ height: 25px;
100
+ background: #4ECDC4;
101
+ cursor: pointer;
102
+ border-radius: 50%;
103
+ }
104
+ button {
105
+ background-color: #FF6B6B;
106
+ color: #fff;
107
+ border: none;
108
+ padding: 15px 30px;
109
+ font-size: 1.2em;
110
+ border-radius: 50px;
111
+ cursor: pointer;
112
+ transition: all 0.3s ease;
113
+ transform: rotate(2deg);
114
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
115
+ }
116
+ button:hover {
117
+ background-color: #4ECDC4;
118
+ transform: rotate(-2deg) scale(1.05);
119
+ }
120
+ .output {
121
+ margin-top: 30px;
122
+ padding: 20px;
123
+ background-color: #FDF7E3;
124
+ border: 3px dashed #FF6B6B;
125
+ border-radius: 15px;
126
+ }
127
+ #lyrics {
128
+ font-style: italic;
129
+ white-space: pre-wrap;
130
+ }
131
+ .music-player {
132
+ width: 100%;
133
+ margin-top: 20px;
134
+ }
135
+ footer {
136
+ text-align: center;
137
+ margin-top: 40px;
138
+ color: #666;
139
+ font-size: 0.9em;
140
+ transform: rotate(-1deg);
141
+ }
142
+ @keyframes wobble {
143
+ 0% { transform: rotate(0deg); }
144
+ 25% { transform: rotate(-5deg); }
145
+ 75% { transform: rotate(5deg); }
146
+ 100% { transform: rotate(0deg); }
147
+ }
148
+ .wobble {
149
+ animation: wobble 2s infinite;
150
+ display: inline-block;
151
+ }
152
+ </style>
153
+ </head>
154
+ <body>
155
+ <header>
156
+ <h1><span class="wobble">Drunk Beats</span></h1>
157
+ <p class="tagline">The Inebriated Music Generator</p>
158
+ </header>
159
+
160
+ <div class="container">
161
+ <div class="main-content">
162
+ <h2>Create Your Tipsy Tune</h2>
163
+ <p>Welcome to Drunk Beats, where your musical inhibitions go to die! Adjust the sliders, pick your poison, and let's make some gloriously chaotic music!</p>
164
+
165
+ <div class="generator-interface">
166
+ <div>
167
+ <label for="genre">Genre (or whatever we think it is):</label>
168
+ <select id="genre">
169
+ <option value="rock">Rock (but like, wobbly)</option>
170
+ <option value="pop">Pop (extra fizzy)</option>
171
+ <option value="rap">Rap (slurred edition)</option>
172
+ <option value="country">Country (extra twangy)</option>
173
+ <option value="edm">EDM (warning: may cause dizziness)</option>
174
+ </select>
175
+ </div>
176
+
177
+ <div>
178
+ <label for="drunkness">Drunkness Level:</label>
179
+ <input type="range" id="drunkness" min="1" max="10" value="5">
180
+ </div>
181
+
182
+ <div>
183
+ <label for="beverage">Beverage of Choice:</label>
184
+ <select id="beverage">
185
+ <option value="beer">Beer (the classics never die)</option>
186
+ <option value="wine">Wine (for the classy drunk)</option>
187
+ <option value="whiskey">Whiskey (liquid courage)</option>
188
+ <option value="tequila">Tequila (bad decisions incoming)</option>
189
+ <option value="vodka">Vodka (for when you hate tomorrow)</option>
190
+ </select>
191
+ </div>
192
+
193
+ <div>
194
+ <label for="mood">Drunk Mood:</label>
195
+ <select id="mood">
196
+ <option value="happy">Happy (life of the party)</option>
197
+ <option value="sad">Sad (crying in the club)</option>
198
+ <option value="angry">Angry (looking for a fight)</option>
199
+ <option value="philosophical">Philosophical (solving world problems)</option>
200
+ <option value="flirty">Flirty (oh no, not again)</option>
201
+ </select>
202
+ </div>
203
+
204
+ <button onclick="generateDrunkMusic()">Generate Tipsy Tune</button>
205
+ </div>
206
+
207
+ <div id="output" class="output" style="display: none;">
208
+ <h3>Your Drunken Masterpiece</h3>
209
+ <p id="song-description"></p>
210
+ <h4>Lyrics (attempt at):</h4>
211
+ <p id="lyrics"></p>
212
+ <audio id="music-player" class="music-player" controls>
213
+ Your browser is too sober to support the audio element.
214
+ </audio>
215
+ </div>
216
+ </div>
217
+
218
+ <footer>
219
+ <p>© 2024 Drunk Beats. Please drink responsibly. Don't actually drink and create music (unless it's really, really good).</p>
220
+ </footer>
221
+ </div>
222
+
223
+ <script>
224
+ function generateDrunkMusic() {
225
+ const genre = document.getElementById('genre').value;
226
+ const drunkness = document.getElementById('drunkness').value;
227
+ const beverage = document.getElementById('beverage').value;
228
+ const mood = document.getElementById('mood').value;
229
+
230
+ const button = document.querySelector('button');
231
+ button.textContent = 'Mixing Drinks... I mean, Music!';
232
+ button.classList.add('wobble');
233
+ button.disabled = true;
234
+
235
+ // Simulate API call and music generation process
236
+ setTimeout(() => {
237
+ const output = document.getElementById('output');
238
+ output.style.display = 'block';
239
+
240
+ const description = document.getElementById('song-description');
241
+ description.textContent = generateDescription(genre, drunkness, beverage, mood);
242
+
243
+ const lyrics = document.getElementById('lyrics');
244
+ lyrics.textContent = generateLyrics(genre, drunkness, mood);
245
+
246
+ const player = document.getElementById('music-player');
247
+ player.src = `https://websim.ai/audio/drunk_beats_${genre}_${drunkness}_${mood}.mp3`;
248
+
249
+ button.textContent = 'Generate Another Round';
250
+ button.classList.remove('wobble');
251
+ button.disabled = false;
252
+
253
+ // Scroll to the output
254
+ output.scrollIntoView({ behavior: 'smooth' });
255
+ }, 3000);
256
+ }
257
+
258
+ function generateDescription(genre, drunkness, beverage, mood) {
259
+ const descriptions = [
260
+ `A ${mood} ${genre} anthem that sounds like it was recorded in a blender full of ${beverage}.`,
261
+ `Imagine if a ${genre} band drank nothing but ${beverage} for a week and then tried to record a ${mood} hit.`,
262
+ `This ${genre} track is what happens when you mix talent, ${beverage}, and a complete disregard for tomorrow's hangover.`,
263
+ `A ${mood} ${genre} masterpiece that makes about as much sense as your texts after ${drunkness} rounds of ${beverage}.`,
264
+ `If ${genre} and ${beverage} had a baby, and that baby was raised by ${mood} wolves, it would sound like this.`
265
+ ];
266
+ return descriptions[Math.floor(Math.random() * descriptions.length)];
267
+ }
268
+
269
+ function generateLyrics(genre, drunkness, mood) {
270
+ const lyrics = [
271
+ "Woah, is the room spinning or is it just me?\nI swear this microphone is trying to escape\nCan somebody please tell the floor to stop moving?\nI think I'm in love with this barstool",
272
+ "I'm not as think as you drunk I am\nThe world's my dance floor, watch me stumble\nWho needs balance when you've got rhythm?\nI'll regret this in the morning, but tonight I'm a star",
273
+ "Why is the ceiling on the floor?\nI'm pretty sure my shoes are on the wrong feet\nIs that a unicorn or just the bartender?\nI've never felt more alive or more confused",
274
+ "I'm a lyrical genius, I swear\nJust give me a minute to remember the words\nThe room may be spinning but my heart's still beating\nThis is either the best or worst idea ever",
275
+ "I've solved all the world's problems\nJust can't remember any of them right now\nWho needs coherence when you've got confidence?\nI'm pretty sure this song makes sense to someone"
276
+ ];
277
+ return lyrics[Math.floor(Math.random() * lyrics.length)];
278
+ }
279
+ </script>
280
+ </body>
281
+ </html>