randomtable commited on
Commit
571a1d1
1 Parent(s): fe2cb45

Upload 6 files

Browse files
assets/icons/copypaste.png ADDED
assets/images/favicon.png ADDED
assets/images/logo.webp ADDED
css/styles.css ADDED
@@ -0,0 +1,1239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ ! tailwindcss v3.2.7 | MIT License | https://tailwindcss.com
3
+ */
4
+
5
+ /*
6
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
7
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
8
+ */
9
+
10
+ *,
11
+ ::before,
12
+ ::after {
13
+ box-sizing: border-box;
14
+ /* 1 */
15
+ border-width: 0;
16
+ /* 2 */
17
+ border-style: solid;
18
+ /* 2 */
19
+ border-color: currentColor;
20
+ /* 2 */
21
+ }
22
+
23
+ ::before,
24
+ ::after {
25
+ --tw-content: '';
26
+ }
27
+
28
+ /*
29
+ 1. Use a consistent sensible line-height in all browsers.
30
+ 2. Prevent adjustments of font size after orientation changes in iOS.
31
+ 3. Use a more readable tab size.
32
+ 4. Use the user's configured `sans` font-family by default.
33
+ 5. Use the user's configured `sans` font-feature-settings by default.
34
+ */
35
+
36
+ html {
37
+ line-height: 1.5;
38
+ /* 1 */
39
+ -webkit-text-size-adjust: 100%;
40
+ /* 2 */
41
+ -moz-tab-size: 4;
42
+ /* 3 */
43
+ -o-tab-size: 4;
44
+ tab-size: 4;
45
+ /* 3 */
46
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
47
+ /* 4 */
48
+ font-feature-settings: normal;
49
+ /* 5 */
50
+ }
51
+
52
+ /*
53
+ 1. Remove the margin in all browsers.
54
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
55
+ */
56
+
57
+ body {
58
+ margin: 0;
59
+ /* 1 */
60
+ line-height: inherit;
61
+ /* 2 */
62
+ }
63
+
64
+ /*
65
+ 1. Add the correct height in Firefox.
66
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
67
+ 3. Ensure horizontal rules are visible by default.
68
+ */
69
+
70
+ hr {
71
+ height: 0;
72
+ /* 1 */
73
+ color: inherit;
74
+ /* 2 */
75
+ border-top-width: 1px;
76
+ /* 3 */
77
+ }
78
+
79
+ /*
80
+ Add the correct text decoration in Chrome, Edge, and Safari.
81
+ */
82
+
83
+ abbr:where([title]) {
84
+ -webkit-text-decoration: underline dotted;
85
+ text-decoration: underline dotted;
86
+ }
87
+
88
+ /*
89
+ Remove the default font size and weight for headings.
90
+ */
91
+
92
+ h1,
93
+ h2,
94
+ h3,
95
+ h4,
96
+ h5,
97
+ h6 {
98
+ font-size: inherit;
99
+ font-weight: inherit;
100
+ }
101
+
102
+ /*
103
+ Reset links to optimize for opt-in styling instead of opt-out.
104
+ */
105
+
106
+ a {
107
+ color: inherit;
108
+ text-decoration: inherit;
109
+ }
110
+
111
+ /*
112
+ Add the correct font weight in Edge and Safari.
113
+ */
114
+
115
+ b,
116
+ strong {
117
+ font-weight: bolder;
118
+ }
119
+
120
+ /*
121
+ 1. Use the user's configured `mono` font family by default.
122
+ 2. Correct the odd `em` font sizing in all browsers.
123
+ */
124
+
125
+ code,
126
+ kbd,
127
+ samp,
128
+ pre {
129
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
130
+ /* 1 */
131
+ font-size: 1em;
132
+ /* 2 */
133
+ }
134
+
135
+ /*
136
+ Add the correct font size in all browsers.
137
+ */
138
+
139
+ small {
140
+ font-size: 80%;
141
+ }
142
+
143
+ /*
144
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
145
+ */
146
+
147
+ sub,
148
+ sup {
149
+ font-size: 75%;
150
+ line-height: 0;
151
+ position: relative;
152
+ vertical-align: baseline;
153
+ }
154
+
155
+ sub {
156
+ bottom: -0.25em;
157
+ }
158
+
159
+ sup {
160
+ top: -0.5em;
161
+ }
162
+
163
+ /*
164
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
165
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
166
+ 3. Remove gaps between table borders by default.
167
+ */
168
+
169
+ table {
170
+ text-indent: 0;
171
+ /* 1 */
172
+ border-color: inherit;
173
+ /* 2 */
174
+ border-collapse: collapse;
175
+ /* 3 */
176
+ }
177
+
178
+ /*
179
+ 1. Change the font styles in all browsers.
180
+ 2. Remove the margin in Firefox and Safari.
181
+ 3. Remove default padding in all browsers.
182
+ */
183
+
184
+ button,
185
+ input,
186
+ optgroup,
187
+ select,
188
+ textarea {
189
+ font-family: inherit;
190
+ /* 1 */
191
+ font-size: 100%;
192
+ /* 1 */
193
+ font-weight: inherit;
194
+ /* 1 */
195
+ line-height: inherit;
196
+ /* 1 */
197
+ color: inherit;
198
+ /* 1 */
199
+ margin: 0;
200
+ /* 2 */
201
+ padding: 0;
202
+ /* 3 */
203
+ }
204
+
205
+ /*
206
+ Remove the inheritance of text transform in Edge and Firefox.
207
+ */
208
+
209
+ button,
210
+ select {
211
+ text-transform: none;
212
+ }
213
+
214
+ /*
215
+ 1. Correct the inability to style clickable types in iOS and Safari.
216
+ 2. Remove default button styles.
217
+ */
218
+
219
+ button,
220
+ [type='button'],
221
+ [type='reset'],
222
+ [type='submit'] {
223
+ -webkit-appearance: button;
224
+ /* 1 */
225
+ background-color: transparent;
226
+ /* 2 */
227
+ background-image: none;
228
+ /* 2 */
229
+ }
230
+
231
+ /*
232
+ Use the modern Firefox focus style for all focusable elements.
233
+ */
234
+
235
+ :-moz-focusring {
236
+ outline: auto;
237
+ }
238
+
239
+ /*
240
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
241
+ */
242
+
243
+ :-moz-ui-invalid {
244
+ box-shadow: none;
245
+ }
246
+
247
+ /*
248
+ Add the correct vertical alignment in Chrome and Firefox.
249
+ */
250
+
251
+ progress {
252
+ vertical-align: baseline;
253
+ }
254
+
255
+ /*
256
+ Correct the cursor style of increment and decrement buttons in Safari.
257
+ */
258
+
259
+ ::-webkit-inner-spin-button,
260
+ ::-webkit-outer-spin-button {
261
+ height: auto;
262
+ }
263
+
264
+ /*
265
+ 1. Correct the odd appearance in Chrome and Safari.
266
+ 2. Correct the outline style in Safari.
267
+ */
268
+
269
+ [type='search'] {
270
+ -webkit-appearance: textfield;
271
+ /* 1 */
272
+ outline-offset: -2px;
273
+ /* 2 */
274
+ }
275
+
276
+ /*
277
+ Remove the inner padding in Chrome and Safari on macOS.
278
+ */
279
+
280
+ ::-webkit-search-decoration {
281
+ -webkit-appearance: none;
282
+ }
283
+
284
+ /*
285
+ 1. Correct the inability to style clickable types in iOS and Safari.
286
+ 2. Change font properties to `inherit` in Safari.
287
+ */
288
+
289
+ ::-webkit-file-upload-button {
290
+ -webkit-appearance: button;
291
+ /* 1 */
292
+ font: inherit;
293
+ /* 2 */
294
+ }
295
+
296
+ /*
297
+ Add the correct display in Chrome and Safari.
298
+ */
299
+
300
+ summary {
301
+ display: list-item;
302
+ }
303
+
304
+ /*
305
+ Removes the default spacing and border for appropriate elements.
306
+ */
307
+
308
+ blockquote,
309
+ dl,
310
+ dd,
311
+ h1,
312
+ h2,
313
+ h3,
314
+ h4,
315
+ h5,
316
+ h6,
317
+ hr,
318
+ figure,
319
+ p,
320
+ pre {
321
+ margin: 0;
322
+ }
323
+
324
+ fieldset {
325
+ margin: 0;
326
+ padding: 0;
327
+ }
328
+
329
+ legend {
330
+ padding: 0;
331
+ }
332
+
333
+ ol,
334
+ ul,
335
+ menu {
336
+ list-style: none;
337
+ margin: 0;
338
+ padding: 0;
339
+ }
340
+
341
+ /*
342
+ Prevent resizing textareas horizontally by default.
343
+ */
344
+
345
+ textarea {
346
+ resize: vertical;
347
+ }
348
+
349
+ /*
350
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
351
+ 2. Set the default placeholder color to the user's configured gray 400 color.
352
+ */
353
+
354
+ input::-moz-placeholder, textarea::-moz-placeholder {
355
+ opacity: 1;
356
+ /* 1 */
357
+ color: #9ca3af;
358
+ /* 2 */
359
+ }
360
+
361
+ input::placeholder,
362
+ textarea::placeholder {
363
+ opacity: 1;
364
+ /* 1 */
365
+ color: #9ca3af;
366
+ /* 2 */
367
+ }
368
+
369
+ /*
370
+ Set the default cursor for buttons.
371
+ */
372
+
373
+ button,
374
+ [role="button"] {
375
+ cursor: pointer;
376
+ }
377
+
378
+ /*
379
+ Make sure disabled buttons don't get the pointer cursor.
380
+ */
381
+
382
+ :disabled {
383
+ cursor: default;
384
+ }
385
+
386
+ /*
387
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
388
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
389
+ This can trigger a poorly considered lint error in some tools but is included by design.
390
+ */
391
+
392
+ img,
393
+ svg,
394
+ video,
395
+ canvas,
396
+ audio,
397
+ iframe,
398
+ embed,
399
+ object {
400
+ display: block;
401
+ /* 1 */
402
+ vertical-align: middle;
403
+ /* 2 */
404
+ }
405
+
406
+ /*
407
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
408
+ */
409
+
410
+ img,
411
+ video {
412
+ max-width: 100%;
413
+ height: auto;
414
+ }
415
+
416
+ /* Make elements with the HTML hidden attribute stay hidden by default */
417
+
418
+ [hidden] {
419
+ display: none;
420
+ }
421
+
422
+ *, ::before, ::after {
423
+ --tw-border-spacing-x: 0;
424
+ --tw-border-spacing-y: 0;
425
+ --tw-translate-x: 0;
426
+ --tw-translate-y: 0;
427
+ --tw-rotate: 0;
428
+ --tw-skew-x: 0;
429
+ --tw-skew-y: 0;
430
+ --tw-scale-x: 1;
431
+ --tw-scale-y: 1;
432
+ --tw-pan-x: ;
433
+ --tw-pan-y: ;
434
+ --tw-pinch-zoom: ;
435
+ --tw-scroll-snap-strictness: proximity;
436
+ --tw-ordinal: ;
437
+ --tw-slashed-zero: ;
438
+ --tw-numeric-figure: ;
439
+ --tw-numeric-spacing: ;
440
+ --tw-numeric-fraction: ;
441
+ --tw-ring-inset: ;
442
+ --tw-ring-offset-width: 0px;
443
+ --tw-ring-offset-color: #fff;
444
+ --tw-ring-color: rgb(59 130 246 / 0.5);
445
+ --tw-ring-offset-shadow: 0 0 #0000;
446
+ --tw-ring-shadow: 0 0 #0000;
447
+ --tw-shadow: 0 0 #0000;
448
+ --tw-shadow-colored: 0 0 #0000;
449
+ --tw-blur: ;
450
+ --tw-brightness: ;
451
+ --tw-contrast: ;
452
+ --tw-grayscale: ;
453
+ --tw-hue-rotate: ;
454
+ --tw-invert: ;
455
+ --tw-saturate: ;
456
+ --tw-sepia: ;
457
+ --tw-drop-shadow: ;
458
+ --tw-backdrop-blur: ;
459
+ --tw-backdrop-brightness: ;
460
+ --tw-backdrop-contrast: ;
461
+ --tw-backdrop-grayscale: ;
462
+ --tw-backdrop-hue-rotate: ;
463
+ --tw-backdrop-invert: ;
464
+ --tw-backdrop-opacity: ;
465
+ --tw-backdrop-saturate: ;
466
+ --tw-backdrop-sepia: ;
467
+ }
468
+
469
+ ::backdrop {
470
+ --tw-border-spacing-x: 0;
471
+ --tw-border-spacing-y: 0;
472
+ --tw-translate-x: 0;
473
+ --tw-translate-y: 0;
474
+ --tw-rotate: 0;
475
+ --tw-skew-x: 0;
476
+ --tw-skew-y: 0;
477
+ --tw-scale-x: 1;
478
+ --tw-scale-y: 1;
479
+ --tw-pan-x: ;
480
+ --tw-pan-y: ;
481
+ --tw-pinch-zoom: ;
482
+ --tw-scroll-snap-strictness: proximity;
483
+ --tw-ordinal: ;
484
+ --tw-slashed-zero: ;
485
+ --tw-numeric-figure: ;
486
+ --tw-numeric-spacing: ;
487
+ --tw-numeric-fraction: ;
488
+ --tw-ring-inset: ;
489
+ --tw-ring-offset-width: 0px;
490
+ --tw-ring-offset-color: #fff;
491
+ --tw-ring-color: rgb(59 130 246 / 0.5);
492
+ --tw-ring-offset-shadow: 0 0 #0000;
493
+ --tw-ring-shadow: 0 0 #0000;
494
+ --tw-shadow: 0 0 #0000;
495
+ --tw-shadow-colored: 0 0 #0000;
496
+ --tw-blur: ;
497
+ --tw-brightness: ;
498
+ --tw-contrast: ;
499
+ --tw-grayscale: ;
500
+ --tw-hue-rotate: ;
501
+ --tw-invert: ;
502
+ --tw-saturate: ;
503
+ --tw-sepia: ;
504
+ --tw-drop-shadow: ;
505
+ --tw-backdrop-blur: ;
506
+ --tw-backdrop-brightness: ;
507
+ --tw-backdrop-contrast: ;
508
+ --tw-backdrop-grayscale: ;
509
+ --tw-backdrop-hue-rotate: ;
510
+ --tw-backdrop-invert: ;
511
+ --tw-backdrop-opacity: ;
512
+ --tw-backdrop-saturate: ;
513
+ --tw-backdrop-sepia: ;
514
+ }
515
+
516
+ .visible {
517
+ visibility: visible;
518
+ }
519
+
520
+ .fixed {
521
+ position: fixed;
522
+ }
523
+
524
+ .absolute {
525
+ position: absolute;
526
+ }
527
+
528
+ .relative {
529
+ position: relative;
530
+ }
531
+
532
+ .left-0 {
533
+ left: 0px;
534
+ }
535
+
536
+ .right-2 {
537
+ right: 0.5rem;
538
+ }
539
+
540
+ .top-2 {
541
+ top: 0.5rem;
542
+ }
543
+
544
+ .top-2\.5 {
545
+ top: 0.625rem;
546
+ }
547
+
548
+ .top-\[90px\] {
549
+ top: 90px;
550
+ }
551
+
552
+ .z-40 {
553
+ z-index: 40;
554
+ }
555
+
556
+ .z-50 {
557
+ z-index: 50;
558
+ }
559
+
560
+ .m-auto {
561
+ margin: auto;
562
+ }
563
+
564
+ .mx-auto {
565
+ margin-left: auto;
566
+ margin-right: auto;
567
+ }
568
+
569
+ .mb-10 {
570
+ margin-bottom: 2.5rem;
571
+ }
572
+
573
+ .mb-2 {
574
+ margin-bottom: 0.5rem;
575
+ }
576
+
577
+ .mb-3 {
578
+ margin-bottom: 0.75rem;
579
+ }
580
+
581
+ .mb-4 {
582
+ margin-bottom: 1rem;
583
+ }
584
+
585
+ .mb-5 {
586
+ margin-bottom: 1.25rem;
587
+ }
588
+
589
+ .mb-7 {
590
+ margin-bottom: 1.75rem;
591
+ }
592
+
593
+ .mb-8 {
594
+ margin-bottom: 2rem;
595
+ }
596
+
597
+ .flex {
598
+ display: flex;
599
+ }
600
+
601
+ .hidden {
602
+ display: none;
603
+ }
604
+
605
+ .h-5 {
606
+ height: 1.25rem;
607
+ }
608
+
609
+ .h-\[20px\] {
610
+ height: 20px;
611
+ }
612
+
613
+ .h-\[2px\] {
614
+ height: 2px;
615
+ }
616
+
617
+ .h-\[50px\] {
618
+ height: 50px;
619
+ }
620
+
621
+ .h-full {
622
+ height: 100%;
623
+ }
624
+
625
+ .h-screen {
626
+ height: 100vh;
627
+ }
628
+
629
+ .w-0 {
630
+ width: 0px;
631
+ }
632
+
633
+ .w-10 {
634
+ width: 2.5rem;
635
+ }
636
+
637
+ .w-11\/12 {
638
+ width: 91.666667%;
639
+ }
640
+
641
+ .w-24 {
642
+ width: 6rem;
643
+ }
644
+
645
+ .w-5 {
646
+ width: 1.25rem;
647
+ }
648
+
649
+ .w-60 {
650
+ width: 15rem;
651
+ }
652
+
653
+ .w-7 {
654
+ width: 1.75rem;
655
+ }
656
+
657
+ .w-80 {
658
+ width: 20rem;
659
+ }
660
+
661
+ .w-\[20px\] {
662
+ width: 20px;
663
+ }
664
+
665
+ .w-\[50px\] {
666
+ width: 50px;
667
+ }
668
+
669
+ .w-full {
670
+ width: 100%;
671
+ }
672
+
673
+ .w-screen {
674
+ width: 100vw;
675
+ }
676
+
677
+ .min-w-fit {
678
+ min-width: -moz-fit-content;
679
+ min-width: fit-content;
680
+ }
681
+
682
+ .max-w-5xl {
683
+ max-width: 64rem;
684
+ }
685
+
686
+ .max-w-6xl {
687
+ max-width: 72rem;
688
+ }
689
+
690
+ .max-w-md {
691
+ max-width: 28rem;
692
+ }
693
+
694
+ .flex-1 {
695
+ flex: 1 1 0%;
696
+ }
697
+
698
+ .origin-center {
699
+ transform-origin: center;
700
+ }
701
+
702
+ .origin-left {
703
+ transform-origin: left;
704
+ }
705
+
706
+ .-translate-x-10 {
707
+ --tw-translate-x: -2.5rem;
708
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
709
+ }
710
+
711
+ .-rotate-0 {
712
+ --tw-rotate: -0deg;
713
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
714
+ }
715
+
716
+ .rotate-0 {
717
+ --tw-rotate: 0deg;
718
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
719
+ }
720
+
721
+ .transform {
722
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
723
+ }
724
+
725
+ .cursor-pointer {
726
+ cursor: pointer;
727
+ }
728
+
729
+ .flex-col {
730
+ flex-direction: column;
731
+ }
732
+
733
+ .flex-wrap {
734
+ flex-wrap: wrap;
735
+ }
736
+
737
+ .items-center {
738
+ align-items: center;
739
+ }
740
+
741
+ .justify-center {
742
+ justify-content: center;
743
+ }
744
+
745
+ .justify-between {
746
+ justify-content: space-between;
747
+ }
748
+
749
+ .gap-4 {
750
+ gap: 1rem;
751
+ }
752
+
753
+ .gap-5 {
754
+ gap: 1.25rem;
755
+ }
756
+
757
+ .overflow-hidden {
758
+ overflow: hidden;
759
+ }
760
+
761
+ .rounded {
762
+ border-radius: 0.25rem;
763
+ }
764
+
765
+ .rounded-full {
766
+ border-radius: 9999px;
767
+ }
768
+
769
+ .rounded-md {
770
+ border-radius: 0.375rem;
771
+ }
772
+
773
+ .border-2 {
774
+ border-width: 2px;
775
+ }
776
+
777
+ .border-solid {
778
+ border-style: solid;
779
+ }
780
+
781
+ .border-fublu-300 {
782
+ --tw-border-opacity: 1;
783
+ border-color: rgb(170 173 247 / var(--tw-border-opacity));
784
+ }
785
+
786
+ .border-fublu-800 {
787
+ --tw-border-opacity: 1;
788
+ border-color: rgb(75 54 157 / var(--tw-border-opacity));
789
+ }
790
+
791
+ .border-thunderbird-800 {
792
+ --tw-border-opacity: 1;
793
+ border-color: rgb(159 21 21 / var(--tw-border-opacity));
794
+ }
795
+
796
+ .bg-fublu-100 {
797
+ --tw-bg-opacity: 1;
798
+ background-color: rgb(226 228 253 / var(--tw-bg-opacity));
799
+ }
800
+
801
+ .bg-fublu-200 {
802
+ --tw-bg-opacity: 1;
803
+ background-color: rgb(202 205 251 / var(--tw-bg-opacity));
804
+ }
805
+
806
+ .bg-fublu-600 {
807
+ --tw-bg-opacity: 1;
808
+ background-color: rgb(106 79 220 / var(--tw-bg-opacity));
809
+ }
810
+
811
+ .bg-fublu-800 {
812
+ --tw-bg-opacity: 1;
813
+ background-color: rgb(75 54 157 / var(--tw-bg-opacity));
814
+ }
815
+
816
+ .bg-fublu-900 {
817
+ --tw-bg-opacity: 1;
818
+ background-color: rgb(63 51 124 / var(--tw-bg-opacity));
819
+ }
820
+
821
+ .bg-thunderbird-500 {
822
+ --tw-bg-opacity: 1;
823
+ background-color: rgb(247 60 60 / var(--tw-bg-opacity));
824
+ }
825
+
826
+ .bg-white {
827
+ --tw-bg-opacity: 1;
828
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
829
+ }
830
+
831
+ .bg-opacity-70 {
832
+ --tw-bg-opacity: 0.7;
833
+ }
834
+
835
+ .p-2 {
836
+ padding: 0.5rem;
837
+ }
838
+
839
+ .p-3 {
840
+ padding: 0.75rem;
841
+ }
842
+
843
+ .p-4 {
844
+ padding: 1rem;
845
+ }
846
+
847
+ .px-2 {
848
+ padding-left: 0.5rem;
849
+ padding-right: 0.5rem;
850
+ }
851
+
852
+ .px-3 {
853
+ padding-left: 0.75rem;
854
+ padding-right: 0.75rem;
855
+ }
856
+
857
+ .px-4 {
858
+ padding-left: 1rem;
859
+ padding-right: 1rem;
860
+ }
861
+
862
+ .px-5 {
863
+ padding-left: 1.25rem;
864
+ padding-right: 1.25rem;
865
+ }
866
+
867
+ .py-1 {
868
+ padding-top: 0.25rem;
869
+ padding-bottom: 0.25rem;
870
+ }
871
+
872
+ .py-2 {
873
+ padding-top: 0.5rem;
874
+ padding-bottom: 0.5rem;
875
+ }
876
+
877
+ .py-3 {
878
+ padding-top: 0.75rem;
879
+ padding-bottom: 0.75rem;
880
+ }
881
+
882
+ .py-4 {
883
+ padding-top: 1rem;
884
+ padding-bottom: 1rem;
885
+ }
886
+
887
+ .py-9 {
888
+ padding-top: 2.25rem;
889
+ padding-bottom: 2.25rem;
890
+ }
891
+
892
+ .pb-8 {
893
+ padding-bottom: 2rem;
894
+ }
895
+
896
+ .pt-4 {
897
+ padding-top: 1rem;
898
+ }
899
+
900
+ .text-center {
901
+ text-align: center;
902
+ }
903
+
904
+ .align-middle {
905
+ vertical-align: middle;
906
+ }
907
+
908
+ .text-2xl {
909
+ font-size: 1.5rem;
910
+ line-height: 2rem;
911
+ }
912
+
913
+ .text-base {
914
+ font-size: 1rem;
915
+ line-height: 1.5rem;
916
+ }
917
+
918
+ .text-sm {
919
+ font-size: 0.875rem;
920
+ line-height: 1.25rem;
921
+ }
922
+
923
+ .text-xl {
924
+ font-size: 1.25rem;
925
+ line-height: 1.75rem;
926
+ }
927
+
928
+ .text-xs {
929
+ font-size: 0.75rem;
930
+ line-height: 1rem;
931
+ }
932
+
933
+ .font-bold {
934
+ font-weight: 700;
935
+ }
936
+
937
+ .text-fublu-50 {
938
+ --tw-text-opacity: 1;
939
+ color: rgb(239 241 254 / var(--tw-text-opacity));
940
+ }
941
+
942
+ .text-fublu-600 {
943
+ --tw-text-opacity: 1;
944
+ color: rgb(106 79 220 / var(--tw-text-opacity));
945
+ }
946
+
947
+ .text-fublu-800 {
948
+ --tw-text-opacity: 1;
949
+ color: rgb(75 54 157 / var(--tw-text-opacity));
950
+ }
951
+
952
+ .text-thunderbird-50 {
953
+ --tw-text-opacity: 1;
954
+ color: rgb(255 241 241 / var(--tw-text-opacity));
955
+ }
956
+
957
+ .text-white {
958
+ --tw-text-opacity: 1;
959
+ color: rgb(255 255 255 / var(--tw-text-opacity));
960
+ }
961
+
962
+ .shadow-sm {
963
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
964
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
965
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
966
+ }
967
+
968
+ .shadow-fublu-200 {
969
+ --tw-shadow-color: #cacdfb;
970
+ --tw-shadow: var(--tw-shadow-colored);
971
+ }
972
+
973
+ .ring-0 {
974
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
975
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
976
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
977
+ }
978
+
979
+ .ring-fublu-300 {
980
+ --tw-ring-opacity: 1;
981
+ --tw-ring-color: rgb(170 173 247 / var(--tw-ring-opacity));
982
+ }
983
+
984
+ .ring-opacity-30 {
985
+ --tw-ring-opacity: 0.3;
986
+ }
987
+
988
+ .blur {
989
+ --tw-blur: blur(8px);
990
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
991
+ }
992
+
993
+ .invert {
994
+ --tw-invert: invert(100%);
995
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
996
+ }
997
+
998
+ .filter {
999
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1000
+ }
1001
+
1002
+ .transition-all {
1003
+ transition-property: all;
1004
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1005
+ transition-duration: 150ms;
1006
+ }
1007
+
1008
+ .delay-100 {
1009
+ transition-delay: 100ms;
1010
+ }
1011
+
1012
+ .delay-300 {
1013
+ transition-delay: 300ms;
1014
+ }
1015
+
1016
+ .delay-75 {
1017
+ transition-delay: 75ms;
1018
+ }
1019
+
1020
+ .duration-200 {
1021
+ transition-duration: 200ms;
1022
+ }
1023
+
1024
+ .duration-300 {
1025
+ transition-duration: 300ms;
1026
+ }
1027
+
1028
+ .duration-500 {
1029
+ transition-duration: 500ms;
1030
+ }
1031
+
1032
+ .placeholder\:p-0::-moz-placeholder {
1033
+ padding: 0px;
1034
+ }
1035
+
1036
+ .placeholder\:p-0::placeholder {
1037
+ padding: 0px;
1038
+ }
1039
+
1040
+ .placeholder\:text-center::-moz-placeholder {
1041
+ text-align: center;
1042
+ }
1043
+
1044
+ .placeholder\:text-center::placeholder {
1045
+ text-align: center;
1046
+ }
1047
+
1048
+ .hover\:bg-fublu-100:hover {
1049
+ --tw-bg-opacity: 1;
1050
+ background-color: rgb(226 228 253 / var(--tw-bg-opacity));
1051
+ }
1052
+
1053
+ .hover\:bg-fublu-500:hover {
1054
+ --tw-bg-opacity: 1;
1055
+ background-color: rgb(121 107 233 / var(--tw-bg-opacity));
1056
+ }
1057
+
1058
+ .hover\:bg-fublu-700:hover {
1059
+ --tw-bg-opacity: 1;
1060
+ background-color: rgb(100 74 197 / var(--tw-bg-opacity));
1061
+ }
1062
+
1063
+ .hover\:bg-thunderbird-600:hover {
1064
+ --tw-bg-opacity: 1;
1065
+ background-color: rgb(228 30 30 / var(--tw-bg-opacity));
1066
+ }
1067
+
1068
+ .hover\:ring-8:hover {
1069
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1070
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1071
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
1072
+ }
1073
+
1074
+ .focus\:ring-2:focus {
1075
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1076
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1077
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
1078
+ }
1079
+
1080
+ .focus\:ring-fublu-500:focus {
1081
+ --tw-ring-opacity: 1;
1082
+ --tw-ring-color: rgb(121 107 233 / var(--tw-ring-opacity));
1083
+ }
1084
+
1085
+ .focus-visible\:border-fublu-900:focus-visible {
1086
+ --tw-border-opacity: 1;
1087
+ border-color: rgb(63 51 124 / var(--tw-border-opacity));
1088
+ }
1089
+
1090
+ .group:focus .group-focus\:w-12 {
1091
+ width: 3rem;
1092
+ }
1093
+
1094
+ .group:focus .group-focus\:translate-x-0 {
1095
+ --tw-translate-x: 0px;
1096
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1097
+ }
1098
+
1099
+ .group:focus .group-focus\:translate-y-6 {
1100
+ --tw-translate-y: 1.5rem;
1101
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1102
+ }
1103
+
1104
+ .group:focus .group-focus\:-rotate-45 {
1105
+ --tw-rotate: -45deg;
1106
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1107
+ }
1108
+
1109
+ .group:focus .group-focus\:rotate-45 {
1110
+ --tw-rotate: 45deg;
1111
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1112
+ }
1113
+
1114
+ .group:focus .group-focus\:ring-4 {
1115
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
1116
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
1117
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
1118
+ }
1119
+
1120
+ @media not all and (min-width: 768px) {
1121
+ .max-md\:hidden {
1122
+ display: none;
1123
+ }
1124
+
1125
+ .max-md\:flex-col {
1126
+ flex-direction: column;
1127
+ }
1128
+ }
1129
+
1130
+ @media (min-width: 640px) {
1131
+ .sm\:text-3xl {
1132
+ font-size: 1.875rem;
1133
+ line-height: 2.25rem;
1134
+ }
1135
+
1136
+ .sm\:text-base {
1137
+ font-size: 1rem;
1138
+ line-height: 1.5rem;
1139
+ }
1140
+
1141
+ .sm\:text-lg {
1142
+ font-size: 1.125rem;
1143
+ line-height: 1.75rem;
1144
+ }
1145
+ }
1146
+
1147
+ @media (min-width: 768px) {
1148
+ .md\:hidden {
1149
+ display: none;
1150
+ }
1151
+
1152
+ .md\:h-4 {
1153
+ height: 1rem;
1154
+ }
1155
+
1156
+ .md\:h-8 {
1157
+ height: 2rem;
1158
+ }
1159
+
1160
+ .md\:w-32 {
1161
+ width: 8rem;
1162
+ }
1163
+
1164
+ .md\:w-4 {
1165
+ width: 1rem;
1166
+ }
1167
+
1168
+ .md\:w-8 {
1169
+ width: 2rem;
1170
+ }
1171
+
1172
+ .md\:w-80 {
1173
+ width: 20rem;
1174
+ }
1175
+
1176
+ .md\:justify-center {
1177
+ justify-content: center;
1178
+ }
1179
+
1180
+ .md\:gap-20 {
1181
+ gap: 5rem;
1182
+ }
1183
+
1184
+ .md\:text-5xl {
1185
+ font-size: 3rem;
1186
+ line-height: 1;
1187
+ }
1188
+
1189
+ .md\:text-base {
1190
+ font-size: 1rem;
1191
+ line-height: 1.5rem;
1192
+ }
1193
+
1194
+ .md\:text-lg {
1195
+ font-size: 1.125rem;
1196
+ line-height: 1.75rem;
1197
+ }
1198
+
1199
+ .md\:text-sm {
1200
+ font-size: 0.875rem;
1201
+ line-height: 1.25rem;
1202
+ }
1203
+
1204
+ .md\:text-xl {
1205
+ font-size: 1.25rem;
1206
+ line-height: 1.75rem;
1207
+ }
1208
+ }
1209
+
1210
+ @media (min-width: 1024px) {
1211
+ .lg\:mb-10 {
1212
+ margin-bottom: 2.5rem;
1213
+ }
1214
+
1215
+ .lg\:px-20 {
1216
+ padding-left: 5rem;
1217
+ padding-right: 5rem;
1218
+ }
1219
+
1220
+ .lg\:text-6xl {
1221
+ font-size: 3.75rem;
1222
+ line-height: 1;
1223
+ }
1224
+
1225
+ .lg\:text-base {
1226
+ font-size: 1rem;
1227
+ line-height: 1.5rem;
1228
+ }
1229
+
1230
+ .lg\:text-lg {
1231
+ font-size: 1.125rem;
1232
+ line-height: 1.75rem;
1233
+ }
1234
+
1235
+ .lg\:text-xl {
1236
+ font-size: 1.25rem;
1237
+ line-height: 1.75rem;
1238
+ }
1239
+ }
index.html ADDED
@@ -0,0 +1,406 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <meta name="description" content="Random prompts generator with multiple options for Stable Diffusion and Midjourney, AI Art generators." />
8
+ <link href="css/styles.css" rel="stylesheet" />
9
+ <link rel="icon" type="image/x-icon" href="assets/images/favicon.png" />
10
+ <title>Stable Diffusion Prompts Generator</title>
11
+ </head>
12
+ <body class="pb-8 text-xs text-fublu-600 sm:text-base md:text-lg lg:text-xl">
13
+ <!--Nav wrapper-->
14
+ <div class="mb-7 lg:mb-10">
15
+ <nav class="flex items-center justify-between px-3 py-1 md:justify-center bg-fublu-800">
16
+ <!-- Desktop navbar -->
17
+ <ul class="flex items-center justify-center w-full max-w-5xl text-sm text-center lg:text-lg max-md:flex-col md:gap-20 text-fublu-50 max-md:hidden">
18
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 randomLink"><a href="#" class="randomLink">Home</a></li>
19
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 portraitLink"
20
+ ><a href="#" class="portraitLink">Portraits</a></li
21
+ >
22
+ <li class="flex-1 px-4 py-2 min-w-fit"
23
+ ><img src="assets/images/logo.webp" alt="Stable Diffusion Prompts Generator" class="m-auto" width="50px" height="50px"
24
+ /></li>
25
+
26
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 landscapesLink"
27
+ ><a href="#" class="landscapesLink">Landscapes</a></li
28
+ >
29
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 randomLink"><a href="#" class="randomLink">Random</a></li>
30
+ </ul>
31
+ <!-- End of desktop navbar -->
32
+ <!-- Mobile hamburger button -->
33
+ <div class="z-50 flex justify-between w-full px-2 py-4 md:hidden">
34
+ <img src="assets/images/logo.webp" alt="Stable Diffusion Prompts Generator" width="50px" height="50px" />
35
+ <button class="relative group" id="hamburgerButton" name="hamburgerButton" aria-label="Menu Button">
36
+ <div
37
+ class="relative flex overflow-hidden items-center justify-center rounded-full w-[50px] h-[50px] transform transition-all bg-slate-700 ring-0 ring-fublu-300 hover:ring-8 group-focus:ring-4 ring-opacity-30 duration-200"
38
+ >
39
+ <div class="flex flex-col justify-between w-[20px] h-[20px] transform transition-all duration-300 origin-center overflow-hidden">
40
+ <div class="bg-white h-[2px] w-7 transform transition-all duration-300 origin-left group-focus:translate-y-6 delay-100"></div>
41
+ <div class="bg-white h-[2px] w-7 rounded transform transition-all duration-300 group-focus:translate-y-6 delay-75"></div>
42
+ <div class="bg-white h-[2px] w-7 transform transition-all duration-300 origin-left group-focus:translate-y-6"></div>
43
+
44
+ <div
45
+ class="absolute items-center justify-between transform transition-all duration-500 top-2.5 -translate-x-10 group-focus:translate-x-0 flex w-0 group-focus:w-12"
46
+ >
47
+ <div class="absolute bg-white h-[2px] w-5 transform transition-all duration-500 rotate-0 delay-300 group-focus:rotate-45"></div>
48
+ <div class="absolute bg-white h-[2px] w-5 transform transition-all duration-500 -rotate-0 delay-300 group-focus:-rotate-45"></div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </button>
53
+ </div>
54
+ <!-- End of mobile hamburger button -->
55
+ </nav>
56
+ <!-- Mobile menu -->
57
+ <div class="fixed top-[90px] left-0 w-screen h-screen bg-opacity-70 bg-fublu-900 z-40 hidden" id="bgMobileMenu">
58
+ <nav class="flex items-center justify-between hidden px-3 pt-4 pb-8 md:justify-center bg-fublu-800" id="menuList">
59
+ <ul class="flex-col items-center justify-center w-full h-full max-w-5xl text-2xl text-center md:gap-20 text-fublu-50">
60
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 randomLink"><a href="#" class="randomLink">Home</a></li>
61
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 portraitLink"
62
+ ><a href="#" class="portraitLink">Portraits</a></li
63
+ >
64
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 landscapesLink"
65
+ ><a href="#" class="landscapesLink">Landscapes</a></li
66
+ >
67
+ <li class="flex-1 px-4 py-2 transition-all rounded-md cursor-pointer hover:bg-fublu-700 randomLink"><a href="#" class="randomLink">Random</a></li>
68
+ </ul>
69
+ </nav>
70
+ </div>
71
+ <!-- End of mobile menu -->
72
+ </div>
73
+ <!--Nav end-->
74
+ <!--User's inputs-->
75
+ <div class="px-5 lg:px-20">
76
+ <!-- Portraits -->
77
+ <div class="flex flex-col items-center justify-center hidden text-center" id="portraitDiv">
78
+ <h2 class="mb-5 text-xl font-bold sm:text-3xl md:text-5xl lg:text-6xl">Portrait prompts generator</h2>
79
+ <section class="mb-4 text-base sm:text-lg md:text-xl">
80
+ <h3 class="mb-2 font-bold">Type of shot</h3>
81
+ <select name="portraitShotSelect" id="portraitShotSelect" class="p-2 text-center border-2 rounded-md border-fublu-800">
82
+ <option value="Random Shot" title="Choose a random type of portrait shot." selected>Random shot</option>
83
+ <option value="Full-Length Shot" title="A shot that shows the person or object in its complete environment.">Full-length shot</option>
84
+ <option value="American Shot" title="A shot that shows the person or object from the waist to the knees.">American shot</option>
85
+ <option value="Medium Shot" title="A shot that shows the person or object from the waist to the hips or knees.">Medium shot</option>
86
+ <option value="Close-Up Shot" title="A shot that shows the person or object up close, cut just above the shoulders or higher."
87
+ >Close-up shot</option
88
+ >
89
+ <option value="Extreme Close-Up Shot" title="A shot that shows a very specific part of the person or object, such as the eyes, mouth, or hands."
90
+ >Extreme close-up shot</option
91
+ >
92
+ </select>
93
+ </section>
94
+ </div>
95
+ <!-- Portraits End-->
96
+ <!-- Landscapes -->
97
+ <div class="flex flex-col items-center justify-center hidden text-center" id="landscapesDiv">
98
+ <h2 class="mb-5 text-xl font-bold sm:text-3xl md:text-5xl lg:text-6xl">Landscapes prompts generator</h2>
99
+ <section class="mb-4 text-base sm:text-lg md:text-xl">
100
+ <h3 class="mb-2 font-bold">Type of shot</h3>
101
+ <select name="landscapesShotSelect" id="landscapesShotSelect" class="p-2 text-center border-2 rounded-md border-fublu-800">
102
+ <option value="Random Shot" title="Choose a random type of portrait shot." selected>Random shot</option>
103
+ <option value="Long Shot" title="A shot that shows an overall view of the landscape.">Long shot</option>
104
+ <option value="Medium Shot" title="A shot that shows a specific part of the landscape, such as a mountain or a valley.">Medium shot</option>
105
+ <option value="Close-Up Shot" title="A shot that shows a particular element of the landscape, such as a flower or a rock.">Close-up shot</option>
106
+ <option
107
+ value="Extreme Close-Up Shot"
108
+ title="A shot that shows a very specific detail of the landscape, such as the texture of a tree or the shape of clouds."
109
+ >Extreme close-up shot</option
110
+ >
111
+ </select>
112
+ </section>
113
+ </div>
114
+ <!-- Landscapes End-->
115
+ <!-- Random -->
116
+ <div class="flex flex-col items-center justify-center text-center" id="randomDiv">
117
+ <h2 class="mb-5 text-xl font-bold sm:text-3xl md:text-5xl lg:text-6xl">Random prompts generator</h2>
118
+ </div>
119
+ <!-- Random End-->
120
+ <!-- Num of prompts & show generator's options -->
121
+ <div class="flex items-center justify-center mb-5">
122
+ <section class="flex flex-col items-center justify-center text-base text-center sm:text-lg md:text-xl w-80 placeholder:p-0 placeholder:text-center">
123
+ <h3 class="mb-4 font-bold">How many prompts to generate</h3>
124
+ <input
125
+ type="text"
126
+ id="promptsNumberInput"
127
+ name="promptsNumberInput"
128
+ value="10"
129
+ title="How many prompts you want to generate"
130
+ class="w-24 px-2 py-1 mb-5 text-center border-2 border-solid rounded-md md:w-32 border-fublu-800"
131
+ />
132
+ <button
133
+ class="p-4 border-2 rounded-md text-fublu-800 md:w-80 bg-fublu-200 hover:bg-fublu-100 border-fublu-800"
134
+ id="generatorOptionsButton"
135
+ aria-label="Show options"
136
+ >Show options</button
137
+ >
138
+ </section>
139
+ </div>
140
+ <!-- Enf of num of prompts & show generator's options -->
141
+ <!-- Hidden inputs -->
142
+ <div class="flex flex-col items-center hidden mb-7" id="inputsDisclaimer">
143
+ <p class="mb-5 text-center"
144
+ >* All inputs are optional. If you leave them empty, random ideas from our lists will replace them accordingly to their core concept (places,
145
+ characters, objects, artists...).</p
146
+ >
147
+ <button
148
+ class="p-4 border-2 rounded-md text-thunderbird-50 md:w-80 bg-thunderbird-500 hover:bg-thunderbird-600 border-thunderbird-800"
149
+ id="resetInputsButton"
150
+ aria-label="Reset inputs"
151
+ >Reset inputs</button
152
+ >
153
+ </div>
154
+ <div class="flex flex-wrap justify-center hidden gap-5 mb-8" id="generatorOptionsDiv">
155
+ <section class="flex flex-col flex-1 max-w-md mb-3" id="charactersInputDiv">
156
+ <div class="flex items-center justify-center gap-4 mb-4">
157
+ <h3 class="font-bold text-center">Characters</h3>
158
+ </div>
159
+ <textarea
160
+ id="charactersTextArea"
161
+ cols="30"
162
+ rows="4"
163
+ placeholder="Add characters to the generator, one per line (e.g. Medusa, Dog, Hercules...)"
164
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
165
+ ></textarea>
166
+ </section>
167
+ <section class="flex flex-col flex-1 max-w-md mb-3" id="objectsInputDiv">
168
+ <div class="flex items-center justify-center gap-4 mb-4">
169
+ <input
170
+ type="checkbox"
171
+ name="objectsActive"
172
+ id="objectsActive"
173
+ checked
174
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
175
+ /><h3 class="font-bold text-center">Objects</h3>
176
+ </div>
177
+ <textarea
178
+ id="objectsTextArea"
179
+ cols="30"
180
+ rows="4"
181
+ placeholder="Add Objects to the generator, one per line (e.g. Pan, Sword, Helmet...)"
182
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
183
+ ></textarea>
184
+ </section>
185
+ <section class="flex flex-col flex-1 max-w-md mb-3">
186
+ <div class="flex items-center justify-center gap-4 mb-4">
187
+ <input
188
+ type="checkbox"
189
+ name="placesActive"
190
+ id="placesActive"
191
+ checked
192
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
193
+ />
194
+ <h3 class="font-bold text-center">Places</h3>
195
+ </div>
196
+ <textarea
197
+ id="placesTextArea"
198
+ cols="30"
199
+ rows="4"
200
+ placeholder="Add places to the generator, one per line (e.g. Hidden Cave, Space Station, Underwater City...)"
201
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
202
+ ></textarea>
203
+ </section>
204
+ <section class="flex flex-col flex-1 max-w-md mb-3">
205
+ <div class="flex items-center justify-center gap-4 mb-4">
206
+ <input
207
+ type="checkbox"
208
+ name="artistsActive"
209
+ id="artistsActive"
210
+ checked
211
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
212
+ />
213
+ <h3 class="font-bold text-center">Artists</h3>
214
+ <input
215
+ type="number"
216
+ min="1"
217
+ max="5"
218
+ value="1"
219
+ class="w-10 text-sm text-center border-2 border-solid rounded-md md:text-base border-fublu-800"
220
+ title="How many artists do you want to include in the prompt ? (max: 5)"
221
+ id="numArtists"
222
+ />
223
+ </div>
224
+ <textarea
225
+ id="artistsTextArea"
226
+ cols="30"
227
+ rows="4"
228
+ placeholder="Add artists to the generator, one per line (e.g. Makoto Shinkai, Artgerm, Rebeca Saray...)"
229
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
230
+ ></textarea>
231
+ </section>
232
+ <section class="flex flex-col flex-1 max-w-md mb-3">
233
+ <div class="flex items-center justify-center gap-4 mb-4">
234
+ <input
235
+ type="checkbox"
236
+ name="stylesActive"
237
+ id="stylesActive"
238
+ checked
239
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
240
+ />
241
+ <h3 class="font-bold text-center">Styles &amp; Mediums</h3>
242
+ <input
243
+ type="number"
244
+ min="1"
245
+ max="3"
246
+ value="1"
247
+ class="w-10 text-sm text-center border-2 border-solid rounded-md md:text-base border-fublu-800"
248
+ title="How many styles and mediums do you want to include in the prompt ? (max: 3)"
249
+ id="numStyles"
250
+ />
251
+ </div>
252
+ <textarea
253
+ id="stylesTextArea"
254
+ cols="30"
255
+ rows="4"
256
+ placeholder="Add styles and mediums to the generator, one per line (e.g. Anime, Futurism, Woodcut Print...)"
257
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
258
+ ></textarea>
259
+ </section>
260
+ <section class="flex flex-col flex-1 max-w-md mb-5">
261
+ <div class="flex items-center justify-center gap-4 mb-4">
262
+ <input
263
+ type="checkbox"
264
+ name="colorsActive"
265
+ id="colorsActive"
266
+ checked
267
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
268
+ />
269
+ <h3 class="font-bold text-center">Colors</h3>
270
+ </div>
271
+ <textarea
272
+ id="colorsTextArea"
273
+ cols="30"
274
+ rows="4"
275
+ placeholder="Add colors to the generator, one per line (e.g. Black and White, Complimentary Colors, Sepia...)"
276
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
277
+ ></textarea>
278
+ </section>
279
+ <section class="flex flex-col flex-1 max-w-md mb-5">
280
+ <div class="flex items-center justify-center gap-4 mb-4">
281
+ <input
282
+ type="checkbox"
283
+ name="adjectivesActive"
284
+ id="adjectivesActive"
285
+ checked
286
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
287
+ />
288
+ <h3 class="font-bold text-center">Adjectives</h3>
289
+ </div>
290
+ <textarea
291
+ id="adjectivesTextArea"
292
+ cols="30"
293
+ rows="4"
294
+ placeholder="Add adjectives to the generator, one per line (e.g. Mystic, Heavenly, Majestic...)"
295
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
296
+ ></textarea>
297
+ </section>
298
+ <section class="flex flex-col flex-1 max-w-md mb-5" id="elementsInputDiv">
299
+ <div class="flex items-center justify-center gap-4 mb-4">
300
+ <input
301
+ type="checkbox"
302
+ name="elementsActive"
303
+ id="elementsActive"
304
+ checked
305
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
306
+ />
307
+ <h3 class="font-bold text-center">Elements</h3>
308
+ </div>
309
+ <textarea
310
+ id="elementsTextArea"
311
+ cols="30"
312
+ rows="4"
313
+ placeholder="Add elements to the generator, one per line (e.g. Water, Ice, Fire...)"
314
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
315
+ ></textarea>
316
+ </section>
317
+ <section class="flex flex-col flex-1 max-w-md mb-5">
318
+ <div class="flex items-center justify-center gap-4 mb-4">
319
+ <input
320
+ type="checkbox"
321
+ name="improversActive"
322
+ id="improversActive"
323
+ checked
324
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
325
+ />
326
+ <h3 class="font-bold text-center">Improvers</h3>
327
+ </div>
328
+ <textarea
329
+ id="improversTextArea"
330
+ cols="30"
331
+ rows="4"
332
+ placeholder="Add improvers to the generator, one per line (e.g. trending on Artstation, masterpiece...)"
333
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
334
+ ></textarea>
335
+ </section>
336
+ <section class="flex flex-col flex-1 max-w-md mb-5" id="prefixesInputDiv">
337
+ <div class="flex items-center justify-center gap-4 mb-4">
338
+ <input
339
+ type="checkbox"
340
+ name="prefixesActive"
341
+ id="prefixesActive"
342
+ checked
343
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
344
+ />
345
+ <h3 class="font-bold text-center">Prefixes</h3>
346
+ </div>
347
+ <textarea
348
+ id="prefixesTextArea"
349
+ cols="30"
350
+ rows="4"
351
+ placeholder="Add prefixes to the generator, one per line (e.g. zombie, superhero, wizard...)"
352
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
353
+ ></textarea>
354
+ </section>
355
+ <section class="flex flex-col flex-1 max-w-md mb-5" id="suffixesInputDiv">
356
+ <div class="flex items-center justify-center gap-4 mb-4">
357
+ <input
358
+ type="checkbox"
359
+ name="suffixesActive"
360
+ id="suffixesActive"
361
+ checked
362
+ class="align-middle rounded md:w-4 md:h-4 text-fublu-600 bg-fublu-900 border-fublu-300 focus:ring-fublu-500 focus:ring-2"
363
+ />
364
+ <h3 class="font-bold text-center">Suffixes</h3>
365
+ </div>
366
+ <textarea
367
+ id="suffixesTextArea"
368
+ cols="30"
369
+ rows="4"
370
+ placeholder="Add suffixes to the generator, one per line (e.g. dancing, flying, summoning...)"
371
+ class="p-3 border-2 rounded-md shadow-sm placeholder:p-0 placeholder:text-center border-fublu-800 focus-visible:border-fublu-900 shadow-fublu-200"
372
+ ></textarea>
373
+ </section>
374
+ </div>
375
+ <!-- End of hidden inputs -->
376
+ <!-- Generate prompts button -->
377
+ <div class="flex justify-center mb-8">
378
+ <button
379
+ class="p-4 text-white border-2 rounded-md w-60 bg-fublu-600 hover:bg-fublu-500 border-fublu-800"
380
+ id="generatePromptsButton"
381
+ aria-label="Generate prompts"
382
+ >Generate prompts</button
383
+ >
384
+ </div>
385
+ <!-- End of generate prompts button -->
386
+ </div>
387
+ <!-- End of user's inputs -->
388
+ <!-- Prompts -->
389
+ <div class="relative w-11/12 max-w-6xl p-3 mx-auto mb-10 text-center border-2 rounded-md shadow-sm py-9 bg-fublu-100 border-fublu-800 shadow-fublu-200">
390
+ <button class="absolute text-xs top-2 right-2 md:text-sm" id="promptsCopyButton" aria-label="Copy Prompts"
391
+ ><img src="assets/icons/copypaste.png" alt="Copy" title="Copy prompts" class="w-5 h-5 md:h-8 md:w-8" width="32px" height="32px"
392
+ /></button>
393
+ <div class="w-full text-xs md:text-sm lg:text-base text-fublu-800" id="prompts"></div>
394
+ </div>
395
+ <!-- End of prompts -->
396
+ <!-- Credits -->
397
+ <div class="flex flex-col items-center justify-center">
398
+ <p class=""
399
+ >Made by <span class="font-bold">Kevin Mulier</span> | <a href="https://github.com/kevinmulier" class="font-bold">GitHub</a> |
400
+ <a href="https://twitter.com/KevinMulierDev" class="font-bold">Twitter</a></p
401
+ >
402
+ </div>
403
+ <!-- End of credits -->
404
+ <script src="js/main.js"></script>
405
+ </body>
406
+ </html>
js/main.js ADDED
@@ -0,0 +1,1834 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class PromptGenerator {
2
+ constructor() {
3
+ this.currentPrompts = [];
4
+ this.promptsDiv = document.querySelector("#prompts");
5
+ this.textArea = document.createElement("textarea");
6
+ this.portraitDiv = document.querySelector("#portraitDiv");
7
+ this.landscapesDiv = document.querySelector("#landscapesDiv");
8
+ this.randomDiv = document.querySelector("#randomDiv");
9
+ this.generatorOptionsButton = document.querySelector("#generatorOptionsButton");
10
+ this.generatorOptionsDiv = document.querySelector("#generatorOptionsDiv");
11
+ this.inputsDisclaimer = document.querySelector("#inputsDisclaimer");
12
+ this.charactersInputDiv = document.querySelector("#charactersInputDiv");
13
+ this.objectsInputDiv = document.querySelector("#objectsInputDiv");
14
+ this.shownOptions = 0;
15
+ this.currentGenerator = "random";
16
+ this.currentCharacters = [];
17
+ this.currentObjects = [];
18
+ this.currentPlaces = [];
19
+ this.currentArtists = [];
20
+ this.currentStyles = [];
21
+ this.currentColors = [];
22
+ this.currentAdjectives = [];
23
+ this.currentElements = [];
24
+ this.currentImprovers = [];
25
+ this.currentPrefixes = [];
26
+ this.currentSuffixes = [];
27
+ }
28
+
29
+ generatePrompt() {
30
+ // Determine if the prompt will have prefix
31
+ const isPrefixePrompt = Math.random() < 0.25;
32
+
33
+ // Determine if the prompt will have suffix
34
+ const isSuffixPrompt = Math.random() < 0.1;
35
+
36
+ // Check if the current generator is for portraits
37
+ const isPortraitPrompt = this.currentGenerator === "portrait";
38
+
39
+ // Get the selected portrait shot from the HTML select element
40
+ const selectedPortraitShot = document.querySelector("#portraitShotSelect").value;
41
+
42
+ // Define options for portrait shot types
43
+ const portraitShotOptions = ["Full-Length Shot", "American Shot", "Medium Shot", "Close-Up Shot", "Extreme Close-Up Shot"];
44
+
45
+ // Randomly select a portrait shot type
46
+ const randomizedPortraitShot = portraitShotOptions[Math.floor(Math.random() * portraitShotOptions.length)];
47
+
48
+ // Check if the current generator is for landscapes
49
+ const isLandscapesPrompt = this.currentGenerator === "landscapes";
50
+
51
+ // Get the selected landscapes shot from the HTML select element
52
+ const selectedLandscapesShot = document.querySelector("#landscapesShotSelect").value;
53
+
54
+ // Define options for landscape shot types
55
+ const landscapesShotOptions = ["Long Shot", "Medium Shot", "Close-Up Shot", "Extreme Close-Up Shot"];
56
+
57
+ // Randomly select a landscape shot type
58
+ const randomizedLandscapesShot = landscapesShotOptions[Math.floor(Math.random() * landscapesShotOptions.length)];
59
+
60
+ // Check whether various types of prompts are active based on checkbox values
61
+ const isObjectsActive = document.querySelector("#objectsActive").checked;
62
+ const isPlacesActive = document.querySelector("#placesActive").checked;
63
+ const isArtistsActive = document.querySelector("#artistsActive").checked;
64
+ const isStylesActive = document.querySelector("#stylesActive").checked;
65
+ const isColorsActive = document.querySelector("#colorsActive").checked;
66
+ const isAdjectivesActive = document.querySelector("#adjectivesActive").checked;
67
+ const isElementsActive = document.querySelector("#elementsActive").checked;
68
+ const isImproversActive = document.querySelector("#improversActive").checked;
69
+ const isPrefixesActive = document.querySelector("#prefixesActive").checked;
70
+ const isSuffixesActive = document.querySelector("#suffixesActive").checked;
71
+
72
+ // Initialize prompt and mainSubject variables
73
+ let prompt = "";
74
+ let mainSubject = "";
75
+
76
+ // Hide the "Places" checkbox if generating a landscapes prompt
77
+ if (isLandscapesPrompt) {
78
+ document.querySelector("#placesActive").classList.add("hidden");
79
+ } else {
80
+ document.querySelector("#placesActive").classList.remove("hidden");
81
+ }
82
+
83
+ // Get value from artists and styles number inputs
84
+ let numArtists = Number(document.querySelector("#numArtists").value);
85
+ let numStyles = Number(document.querySelector("#numStyles").value);
86
+
87
+ // initialize artists prompt & styles prompt parts
88
+ let artistsPrompt = "";
89
+ let stylesPrompt = "";
90
+
91
+ // set content of artists & styles prompts parts depending on user number inputs
92
+ for (let i = 0; i < numArtists; i++) {
93
+ if (i < this.currentArtists.length) {
94
+ artistsPrompt += `${this.randomElement(this.currentArtists.filter((artist) => !artistsPrompt.includes(artist)))}, `;
95
+ }
96
+ }
97
+ artistsPrompt = artistsPrompt.slice(0, -2);
98
+
99
+ for (let i = 0; i < numStyles; i++) {
100
+ if (i < this.currentStyles.length) {
101
+ stylesPrompt += `${this.randomElement(this.currentStyles.filter((style) => !stylesPrompt.includes(style)))}, `;
102
+ }
103
+ }
104
+ stylesPrompt = stylesPrompt.slice(0, -2);
105
+
106
+ if (isPortraitPrompt) {
107
+ if (selectedPortraitShot !== "Random Shot") {
108
+ // if a specific portrait shot is selected, add it to the prompt
109
+ prompt += selectedPortraitShot + " ";
110
+ } else {
111
+ // otherwise, randomly choose whether to add a randomized portrait shot to the prompt
112
+ prompt += Math.random() < 0.33 ? " " : `${randomizedPortraitShot} `;
113
+ }
114
+ } else if (isLandscapesPrompt) {
115
+ if (selectedLandscapesShot !== "Random Shot") {
116
+ // if a specific landscape shot is selected, add it to the prompt
117
+ prompt += selectedLandscapesShot + " ";
118
+ } else {
119
+ // otherwise, randomly choose whether to add a randomized landscape shot to the prompt
120
+ prompt += Math.random() < 0.33 ? " " : `${randomizedLandscapesShot} `;
121
+ }
122
+ }
123
+
124
+ if (prompt.length > 1) {
125
+ // if prompt has content, add "of" to the end of the prompt
126
+ prompt += "of ";
127
+ }
128
+
129
+ if (!isLandscapesPrompt) {
130
+ if ((isPrefixePrompt && isPrefixesActive) || this.currentPrefixes[0] !== prefixes[0]) {
131
+ // if is a prefix prompt, add a random prefix
132
+ prompt += `${this.randomElement(this.currentPrefixes)} `;
133
+ }
134
+
135
+ if (isObjectsActive && Math.random() < 0.1 && this.currentCharacters[0] === characters[0]) {
136
+ // if objects are active, can add a random object as the main subject of the prompt
137
+ mainSubject = this.randomElement(this.currentObjects);
138
+ prompt += `${mainSubject}`;
139
+ } else {
140
+ // otherwise, add a random character as the main subject of the prompt, possibly with a random object
141
+ mainSubject = this.randomElement(this.currentCharacters);
142
+ if (Math.random() < 0.25 || this.currentObjects[0] !== objects[0]) {
143
+ if (isObjectsActive) {
144
+ prompt += `${mainSubject} with ${this.randomElement(this.currentObjects)}`;
145
+ } else {
146
+ prompt += `${mainSubject}`;
147
+ }
148
+ } else {
149
+ prompt += `${mainSubject}`;
150
+ }
151
+ }
152
+
153
+ // adds a random element to the prompt if element prompt is active
154
+ if (isElementsActive) {
155
+ prompt += ` of ${this.randomElement(this.currentElements)}`;
156
+ }
157
+
158
+ if ((isSuffixPrompt && isSuffixesActive) || this.currentSuffixes[0] !== suffixes[0]) {
159
+ // if is a suffix prompt, add a random suffix
160
+ prompt += ` ${this.randomElement(this.currentSuffixes)}`;
161
+ }
162
+ }
163
+
164
+ // adds a random place to the prompt if landscape prompt is active, or a random place after the main subject if place prompt is active
165
+ if (isLandscapesPrompt) {
166
+ prompt += `${this.randomElement(this.currentPlaces)}`;
167
+ } else if (isPlacesActive) {
168
+ prompt += `, ${this.randomElement(this.currentPlaces)}`;
169
+ }
170
+
171
+ // Add a artists and/or styles to the prompt
172
+ if (isArtistsActive && isStylesActive) {
173
+ prompt += `, ${stylesPrompt} in ${artistsPrompt} style`;
174
+ } else if (isArtistsActive) {
175
+ prompt += `, ${artistsPrompt} style`;
176
+ } else if (isStylesActive) {
177
+ prompt += `, ${stylesPrompt}`;
178
+ }
179
+
180
+ // adds random adjectives to the prompt if adjective prompt is active
181
+ if (isAdjectivesActive) {
182
+ const adjective1 = this.randomElement(this.currentAdjectives);
183
+ prompt += `, ${adjective1}`;
184
+ if (this.currentAdjectives.length > 1) {
185
+ prompt += `, ${this.randomElement(this.currentAdjectives.filter((adjective) => adjective !== adjective1))}`;
186
+ }
187
+ }
188
+
189
+ // add improvers to the prompt if improver prompt is active
190
+ if (isImproversActive) {
191
+ prompt += `, ${this.randomElement(this.currentImprovers)}`;
192
+ }
193
+
194
+ // adds a random color palette to the prompt if color prompt is active
195
+ if (isColorsActive) {
196
+ prompt += `, ${this.randomElement(this.currentColors)}`;
197
+ }
198
+
199
+ // add the prompt to the arrays of prompts
200
+ this.currentPrompts.push(prompt);
201
+ }
202
+
203
+ generatePrompts(num) {
204
+ // Clears out any existing prompts in the currentPrompts array and in the promptsDiv element.
205
+ this.currentPrompts = [];
206
+ this.promptsDiv.innerHTML = "";
207
+
208
+ // Replaces the default arrays used for generating prompts with any user-provided input arrays, if available.
209
+ this.replaceArraysWithUserInputs.bind(this);
210
+ this.replaceArraysWithUserInputs();
211
+
212
+ // Generates the prompts by calling the generatePrompt() function a specified number of times.
213
+ for (let i = 0; i < num; i++) {
214
+ this.generatePrompt();
215
+ }
216
+
217
+ // Creates a temporary document fragment and appends each new prompt line to it.
218
+ const tempDocumentFragment = document.createDocumentFragment();
219
+ for (let i = 0; i < this.currentPrompts.length; i++) {
220
+ const newPromptLine = document.createElement("p");
221
+ newPromptLine.classList.add("py-3");
222
+ newPromptLine.textContent = `${this.currentPrompts[i]}`;
223
+ tempDocumentFragment.appendChild(newPromptLine);
224
+ }
225
+
226
+ // Appends the entire temporary document fragment to the promptsDiv element in a single operation, which enhances performance.
227
+ this.promptsDiv.appendChild(tempDocumentFragment);
228
+ }
229
+
230
+ showChosenGenerator() {
231
+ // Hide all generator divs and show input divs
232
+ this.portraitDiv.classList.add("hidden");
233
+ this.landscapesDiv.classList.add("hidden");
234
+ this.randomDiv.classList.add("hidden");
235
+ this.charactersInputDiv.classList.remove("hidden");
236
+ this.objectsInputDiv.classList.remove("hidden");
237
+ document.querySelector("#elementsInputDiv").classList.remove("hidden");
238
+ document.querySelector("#prefixesInputDiv").classList.remove("hidden");
239
+ document.querySelector("#suffixesInputDiv").classList.remove("hidden");
240
+
241
+ // Show places, prefixes and suffixes input divs and hide if current generator is landscapes
242
+ document.querySelector("#placesActive").classList.remove("hidden");
243
+
244
+ // Show the chosen generator div based on current generator variable
245
+ if (this.currentGenerator === "portrait") {
246
+ this.portraitDiv.classList.remove("hidden");
247
+ } else if (this.currentGenerator === "landscapes") {
248
+ this.landscapesDiv.classList.remove("hidden");
249
+ this.charactersInputDiv.classList.add("hidden");
250
+ this.objectsInputDiv.classList.add("hidden");
251
+ document.querySelector("#elementsInputDiv").classList.add("hidden");
252
+ document.querySelector("#prefixesInputDiv").classList.add("hidden");
253
+ document.querySelector("#suffixesInputDiv").classList.add("hidden");
254
+ document.querySelector("#placesActive").classList.add("hidden");
255
+ } else if (this.currentGenerator === "random") {
256
+ this.randomDiv.classList.remove("hidden");
257
+ }
258
+ }
259
+
260
+ // Select a random element inside the array
261
+ randomElement(array) {
262
+ return array[Math.floor(Math.random() * array.length)];
263
+ }
264
+
265
+ // Copy the prompts to clipboard
266
+ copyPromptsToClipboard(promptsArray) {
267
+ this.textArea.textContent = promptsArray.join("\n");
268
+ navigator.clipboard.writeText(this.textArea.textContent);
269
+ }
270
+
271
+ // check if textArea are empty
272
+ checkUserArraysInputs(textArea) {
273
+ return textArea.value !== "";
274
+ }
275
+
276
+ // Check if user has put inputs, and then assign them to their respective arrays
277
+ replaceArraysWithUserInputs() {
278
+ const charactersInput = document.querySelector("#charactersTextArea");
279
+ const objectsInput = document.querySelector("#objectsTextArea");
280
+ const placesInput = document.querySelector("#placesTextArea");
281
+ const artistsInput = document.querySelector("#artistsTextArea");
282
+ const stylesInput = document.querySelector("#stylesTextArea");
283
+ const colorsInput = document.querySelector("#colorsTextArea");
284
+ const adjectivesInput = document.querySelector("#adjectivesTextArea");
285
+ const elementsInput = document.querySelector("#elementsTextArea");
286
+ const improversInput = document.querySelector("#improversTextArea");
287
+ const prefixesInput = document.querySelector("#prefixesTextArea");
288
+ const suffixesInput = document.querySelector("#suffixesTextArea");
289
+
290
+ if (this.checkUserArraysInputs(charactersInput)) {
291
+ this.currentCharacters = charactersInput.value.split(/\r?\n/);
292
+ localStorage.setItem("characters", charactersInput.value);
293
+ } else {
294
+ this.currentCharacters = [...characters];
295
+ localStorage.setItem("characters", "");
296
+ }
297
+
298
+ if (this.checkUserArraysInputs(objectsInput)) {
299
+ this.currentObjects = objectsInput.value.split(/\r?\n/);
300
+ localStorage.setItem("objects", objectsInput.value);
301
+ } else {
302
+ this.currentObjects = [...objects];
303
+ localStorage.setItem("objects", "");
304
+ }
305
+
306
+ if (this.checkUserArraysInputs(placesInput)) {
307
+ this.currentPlaces = placesInput.value.split(/\r?\n/);
308
+ localStorage.setItem("places", placesInput.value);
309
+ } else {
310
+ this.currentPlaces = [...places];
311
+ localStorage.setItem("places", "");
312
+ }
313
+
314
+ if (this.checkUserArraysInputs(artistsInput)) {
315
+ this.currentArtists = artistsInput.value.split(/\r?\n/);
316
+ localStorage.setItem("artists", artistsInput.value);
317
+ } else {
318
+ this.currentArtists = [...artists];
319
+ localStorage.setItem("artists", "");
320
+ }
321
+
322
+ if (this.checkUserArraysInputs(stylesInput)) {
323
+ this.currentStyles = stylesInput.value.split(/\r?\n/);
324
+ localStorage.setItem("styles", stylesInput.value);
325
+ } else {
326
+ this.currentStyles = [...styles];
327
+ localStorage.setItem("styles", "");
328
+ }
329
+
330
+ if (this.checkUserArraysInputs(colorsInput)) {
331
+ this.currentColors = colorsInput.value.split(/\r?\n/);
332
+ localStorage.setItem("colors", colorsInput.value);
333
+ } else {
334
+ this.currentColors = [...colors];
335
+ localStorage.setItem("colors", "");
336
+ }
337
+
338
+ if (this.checkUserArraysInputs(adjectivesInput)) {
339
+ this.currentAdjectives = adjectivesInput.value.split(/\r?\n/);
340
+ localStorage.setItem("adjectives", adjectivesInput.value);
341
+ } else {
342
+ this.currentAdjectives = [...adjectives];
343
+ localStorage.setItem("adjectives", "");
344
+ }
345
+
346
+ if (this.checkUserArraysInputs(elementsInput)) {
347
+ this.currentElements = elementsInput.value.split(/\r?\n/);
348
+ localStorage.setItem("elements", elementsInput.value);
349
+ } else {
350
+ this.currentElements = [...elements];
351
+ localStorage.setItem("elements", "");
352
+ }
353
+
354
+ if (this.checkUserArraysInputs(improversInput)) {
355
+ this.currentImprovers = improversInput.value.split(/\r?\n/);
356
+ localStorage.setItem("improvers", improversInput.value);
357
+ } else {
358
+ this.currentImprovers = [...improvers];
359
+ localStorage.setItem("improvers", "");
360
+ }
361
+
362
+ if (this.checkUserArraysInputs(prefixesInput)) {
363
+ this.currentPrefixes = prefixesInput.value.split(/\r?\n/);
364
+ localStorage.setItem("prefixes", prefixesInput.value);
365
+ } else {
366
+ this.currentPrefixes = [...prefixes];
367
+ localStorage.setItem("prefixes", "");
368
+ }
369
+
370
+ if (this.checkUserArraysInputs(suffixesInput)) {
371
+ this.currentSuffixes = suffixesInput.value.split(/\r?\n/);
372
+ localStorage.setItem("suffixes", suffixesInput.value);
373
+ } else {
374
+ this.currentSuffixes = [...suffixes];
375
+ localStorage.setItem("suffixes", "");
376
+ }
377
+ }
378
+
379
+ // If user entered inputs previously, get them back into the text areas
380
+ addPreviousUserInputs() {
381
+ const charactersInput = document.querySelector("#charactersTextArea");
382
+ const objectsInput = document.querySelector("#objectsTextArea");
383
+ const placesInput = document.querySelector("#placesTextArea");
384
+ const artistsInput = document.querySelector("#artistsTextArea");
385
+ const stylesInput = document.querySelector("#stylesTextArea");
386
+ const colorsInput = document.querySelector("#colorsTextArea");
387
+ const adjectivesInput = document.querySelector("#adjectivesTextArea");
388
+ const elementsInput = document.querySelector("#elementsTextArea");
389
+ const improversInput = document.querySelector("#improversTextArea");
390
+ const prefixesInput = document.querySelector("#prefixesTextArea");
391
+ const suffixesInput = document.querySelector("#suffixesTextArea");
392
+
393
+ charactersInput.value = localStorage.getItem("characters");
394
+ objectsInput.value = localStorage.getItem("objects");
395
+ placesInput.value = localStorage.getItem("places");
396
+ artistsInput.value = localStorage.getItem("artists");
397
+ stylesInput.value = localStorage.getItem("styles");
398
+ colorsInput.value = localStorage.getItem("colors");
399
+ adjectivesInput.value = localStorage.getItem("adjectives");
400
+ elementsInput.value = localStorage.getItem("elements");
401
+ improversInput.value = localStorage.getItem("improvers");
402
+ prefixesInput.value = localStorage.getItem("prefixes");
403
+ suffixesInput.value = localStorage.getItem("suffixes");
404
+ }
405
+
406
+ // Reset all user's inputs
407
+ resetUserInputs() {
408
+ const charactersInput = document.querySelector("#charactersTextArea");
409
+ const objectsInput = document.querySelector("#objectsTextArea");
410
+ const placesInput = document.querySelector("#placesTextArea");
411
+ const artistsInput = document.querySelector("#artistsTextArea");
412
+ const stylesInput = document.querySelector("#stylesTextArea");
413
+ const colorsInput = document.querySelector("#colorsTextArea");
414
+ const adjectivesInput = document.querySelector("#adjectivesTextArea");
415
+ const elementsInput = document.querySelector("#elementsTextArea");
416
+ const improversInput = document.querySelector("#improversTextArea");
417
+ const prefixesInput = document.querySelector("#prefixesTextArea");
418
+ const suffixesInput = document.querySelector("#suffixesTextArea");
419
+
420
+ localStorage.setItem("characters", "");
421
+ localStorage.setItem("objects", "");
422
+ localStorage.setItem("places", "");
423
+ localStorage.setItem("artists", "");
424
+ localStorage.setItem("styles", "");
425
+ localStorage.setItem("colors", "");
426
+ localStorage.setItem("adjectives", "");
427
+ localStorage.setItem("elements", "");
428
+ localStorage.setItem("improvers", "");
429
+ localStorage.setItem("prefixes", "");
430
+ localStorage.setItem("suffixes", "");
431
+
432
+ charactersInput.value = localStorage.getItem("characters");
433
+ objectsInput.value = localStorage.getItem("objects");
434
+ placesInput.value = localStorage.getItem("places");
435
+ artistsInput.value = localStorage.getItem("artists");
436
+ stylesInput.value = localStorage.getItem("styles");
437
+ colorsInput.value = localStorage.getItem("colors");
438
+ adjectivesInput.value = localStorage.getItem("adjectives");
439
+ elementsInput.value = localStorage.getItem("elements");
440
+ improversInput.value = localStorage.getItem("improvers");
441
+ prefixesInput.value = localStorage.getItem("prefixes");
442
+ suffixesInput.value = localStorage.getItem("suffixes");
443
+ }
444
+ }
445
+
446
+ const promptGenerator = new PromptGenerator();
447
+
448
+ // Event listener to copy prompts to clipboard
449
+ document.querySelector("#promptsCopyButton").addEventListener("click", (event) => {
450
+ promptGenerator.copyPromptsToClipboard(promptGenerator.currentPrompts);
451
+ });
452
+
453
+ // Event listener to generate prompts when pressing generate
454
+ document.querySelector("#generatePromptsButton").addEventListener("click", (event) => {
455
+ const promptsNumber = document.querySelector("#promptsNumberInput").value;
456
+ if (!isNaN(promptsNumber) && promptsNumber > 0 && promptsNumber <= 10000) {
457
+ promptGenerator.generatePrompts(promptsNumber);
458
+ } else {
459
+ alert("Please enter a number of prompts to generate between 1 and 10000.");
460
+ }
461
+ });
462
+
463
+ // flag to track whether the menu is open or closed
464
+ let isMenuOpen = false;
465
+
466
+ function mobileMenuClickHandling(event) {
467
+ // retrieve the hamburger button and the mobile menu
468
+ const hamburgerButton = document.getElementById("hamburgerButton");
469
+ const bgMobileMenu = document.getElementById("bgMobileMenu");
470
+ const menuList = document.getElementById("menuList");
471
+
472
+ const isClickOnButton = hamburgerButton.contains(event.target); // check if the clicked element is on the hamburger button
473
+
474
+ if (isClickOnButton) {
475
+ if (isMenuOpen) {
476
+ menuList.classList.add("hidden"); // hide the menu
477
+ bgMobileMenu.classList.add("hidden"); // hide the background filter
478
+ hamburgerButton.blur(); // remove focus from the button
479
+ document.body.style.overflowY = "visible";
480
+ } else {
481
+ menuList.classList.remove("hidden"); // show the menu
482
+ bgMobileMenu.classList.remove("hidden"); // show the background filter
483
+ document.body.style.overflowY = "hidden";
484
+ }
485
+ isMenuOpen = !isMenuOpen; // invert the flag
486
+ } else if (menuList.contains(event.target)) {
487
+ switchGenerator();
488
+ menuList.classList.add("hidden"); // add the "hidden" class to hide the menu
489
+ bgMobileMenu.classList.add("hidden"); // hide the background filter
490
+ isMenuOpen = false; // set the flag to false
491
+ document.body.style.overflowY = "visible";
492
+ } else {
493
+ menuList.classList.add("hidden"); // add the "hidden" class to hide the menu
494
+ bgMobileMenu.classList.add("hidden"); // hide the background filter
495
+ isMenuOpen = false; // set the flag to false
496
+ document.body.style.overflowY = "visible";
497
+ }
498
+ }
499
+
500
+ function mobileMenuFocusBack(event) {
501
+ if (isMenuOpen && !menuList.contains(event.target)) {
502
+ event.stopImmediatePropagation();
503
+ hamburgerButton.focus();
504
+ }
505
+ }
506
+
507
+ // add an event listener for the click on the hamburger button and anywhere except on the button
508
+ document.addEventListener("click", mobileMenuClickHandling);
509
+
510
+ // add an event listener for the focusin event
511
+ document.addEventListener("focusin", mobileMenuFocusBack);
512
+
513
+ // add a function to switch between generators
514
+ function switchGenerator() {
515
+ const isClickOnPortrait = event.target.classList.contains("portraitLink");
516
+ const isClickOnLandscapes = event.target.classList.contains("landscapesLink");
517
+ const isClickOnRandom = event.target.classList.contains("randomLink");
518
+
519
+ if (isClickOnPortrait) {
520
+ promptGenerator.currentGenerator = "portrait";
521
+ } else if (isClickOnLandscapes) {
522
+ promptGenerator.currentGenerator = "landscapes";
523
+ } else if (isClickOnRandom) {
524
+ promptGenerator.currentGenerator = "random";
525
+ }
526
+
527
+ promptGenerator.showChosenGenerator();
528
+ }
529
+
530
+ // add an event listener to handle generator switching
531
+ document.querySelector("nav").addEventListener("click", switchGenerator);
532
+
533
+ // add a function to show generator options
534
+ function showGeneratorOptions() {
535
+ if (promptGenerator.shownOptions == 0) {
536
+ promptGenerator.generatorOptionsButton.textContent = promptGenerator.generatorOptionsButton.textContent.replace("Show", "Hide");
537
+ promptGenerator.shownOptions++;
538
+ } else {
539
+ promptGenerator.generatorOptionsButton.textContent = promptGenerator.generatorOptionsButton.innerHTML.replace("Hide", "Show");
540
+ promptGenerator.shownOptions--;
541
+ }
542
+ promptGenerator.inputsDisclaimer.classList.toggle("hidden");
543
+ promptGenerator.generatorOptionsDiv.classList.toggle("hidden");
544
+ }
545
+
546
+ // add an event listener to show/hide the generator options
547
+ document.querySelector("#generatorOptionsButton").addEventListener("click", showGeneratorOptions);
548
+
549
+ // add an event listener to reset generators options
550
+ document.querySelector("#resetInputsButton").addEventListener("click", promptGenerator.resetUserInputs);
551
+
552
+ // add an event listener to number of artists input that revert to min or max value if user input is out of range
553
+ document.querySelector("#numArtists").addEventListener("change", () => {
554
+ let numArtists = document.querySelector("#numArtists");
555
+ let v = Number(numArtists.value);
556
+ if (v < 1) {
557
+ numArtists.value = 1;
558
+ }
559
+ if (v > 5) {
560
+ numArtists.value = 5;
561
+ }
562
+ });
563
+
564
+ // add an event listener to number of styles & mediums input that revert to min or max value if user input is out of range
565
+ document.querySelector("#numStyles").addEventListener("change", () => {
566
+ let numStyles = document.querySelector("#numStyles");
567
+ let v = Number(numStyles.value);
568
+ if (v < 1) {
569
+ numStyles.value = 1;
570
+ }
571
+ if (v > 3) {
572
+ numStyles.value = 3;
573
+ }
574
+ });
575
+
576
+ // Arrays of randomness
577
+ const characters = [
578
+ "Mermaid",
579
+ "Fairy",
580
+ "Wizard",
581
+ "Warrior",
582
+ "Vampire",
583
+ "Dragon",
584
+ "Goddess",
585
+ "Cyborg",
586
+ "Robot",
587
+ "Angel",
588
+ "Demon",
589
+ "Alien",
590
+ "Ghost",
591
+ "Ninja",
592
+ "Samurai",
593
+ "Pirate",
594
+ "Knight",
595
+ "Bard",
596
+ "Werewolf",
597
+ "Zombie",
598
+ "Giant",
599
+ "Golem",
600
+ "Sphinx",
601
+ "Chimera",
602
+ "Medusa",
603
+ "Minotaur",
604
+ "Harpy",
605
+ "Kraken",
606
+ "Cthulhu",
607
+ "Gorgon",
608
+ "Hydra",
609
+ "Banshee",
610
+ "Satyr",
611
+ "Cyclops",
612
+ "Dwarf",
613
+ "Elf",
614
+ "Centaur",
615
+ "Manticore",
616
+ "Frost Giant",
617
+ "Sandworm",
618
+ "Kelpie",
619
+ "Thunderbird",
620
+ "Leviathan",
621
+ "Thundercats",
622
+ "Gargantua",
623
+ "Ogre",
624
+ "Goblin",
625
+ "Halfling",
626
+ "Harlequin",
627
+ "Jinn",
628
+ "Kitsune",
629
+ "Lich",
630
+ "Mummy",
631
+ "Naga",
632
+ "Oni",
633
+ "Pixie",
634
+ "Siren",
635
+ "Sylph",
636
+ "Treant",
637
+ "Unicorn",
638
+ "Wendigo",
639
+ "Wraith",
640
+ "Xenomorph",
641
+ "Yokai",
642
+ "Zephyr",
643
+ "Zombie Dragon",
644
+ "Abomination",
645
+ "Aasimar",
646
+ "Arachne",
647
+ "Cambion",
648
+ "Cerberus",
649
+ "Changeling",
650
+ "Djinn",
651
+ "Dryad",
652
+ "Gargoyle",
653
+ "Gnoll",
654
+ "Grim Reaper",
655
+ "Half-Demon",
656
+ "Hobgoblin",
657
+ "Ifrit",
658
+ "Incubus",
659
+ "Kappa",
660
+ "Lizardfolk",
661
+ "Mind Flayer",
662
+ "Mongrelfolk",
663
+ "Myconid",
664
+ "Orc",
665
+ "Sahuagin",
666
+ "Shapeshifter",
667
+ "Spectre",
668
+ "Tengu",
669
+ "Titan",
670
+ "Witch",
671
+ "Yeti",
672
+ "Yuan-Ti",
673
+ "Archer",
674
+ "Barbarian",
675
+ "Beastmaster",
676
+ "Cleric",
677
+ "Druid",
678
+ "Enchanter",
679
+ "Executioner",
680
+ "Gladiator",
681
+ "Gunslinger",
682
+ "Healer",
683
+ "Hunter",
684
+ "Illusionist",
685
+ "Infernal",
686
+ "Inventor",
687
+ "Jester",
688
+ "Knight Errant",
689
+ "Mage Hunter",
690
+ "Marauder",
691
+ "Necromancer",
692
+ "Ninja Assassin",
693
+ "Paladin",
694
+ "Psionicist",
695
+ "Ranger",
696
+ "Rogue",
697
+ "Runemaster",
698
+ "Savage",
699
+ "Scout",
700
+ "Shaman",
701
+ "Sniper",
702
+ "Soldier",
703
+ "Sorcerer",
704
+ "Spellblade",
705
+ "Spymaster",
706
+ "Swashbuckler",
707
+ "Templar",
708
+ "Thief",
709
+ "Time Traveler",
710
+ "Tracker",
711
+ "Trickster",
712
+ "Vampire Hunter",
713
+ "Warlock",
714
+ "Warrior Monk",
715
+ "Witch Doctor",
716
+ "Wizard Hunter",
717
+ "Zealot",
718
+ "Arcanist",
719
+ "Demon Hunter",
720
+ "Dragon Slayer",
721
+ "Elementalist",
722
+ "Basilisk",
723
+ "Cockatrice",
724
+ "Cryptid",
725
+ "Darkling",
726
+ "Dracolich",
727
+ "Elemental",
728
+ "Enchantress",
729
+ "Fenrir",
730
+ "Gryphon",
731
+ "Harpie",
732
+ "Imp",
733
+ "Jotun",
734
+ "Lindworm",
735
+ "Merfolk",
736
+ "Nephilim",
737
+ "Phoenix",
738
+ "Roc",
739
+ "Sasquatch",
740
+ "Spriggan",
741
+ "Troll",
742
+ "Ursine",
743
+ "Valkyrie",
744
+ "Vargr",
745
+ "Will-o'-the-wisp",
746
+ "Wyvern",
747
+ "Xorn",
748
+ "Yeth Hound",
749
+ "Zilant",
750
+ "Ankheg",
751
+ "Barghest",
752
+ "Catoblepas",
753
+ "Direwolf",
754
+ "Empusa",
755
+ "Frost Worm",
756
+ "Giant Scorpion",
757
+ "Homunculus",
758
+ "Illithid",
759
+ "Juggernaut",
760
+ "Kobold",
761
+ "Lamia",
762
+ "Megafauna",
763
+ "Nightmare",
764
+ "Ophidian",
765
+ "Peryton",
766
+ "Quetzalcoatlus",
767
+ "Rat King",
768
+ "Salamander",
769
+ "Alchemist",
770
+ "Fire Elemental",
771
+ "Water Elemental",
772
+ "Earth Elemental",
773
+ "Air Elemental",
774
+ "Meteor Elemental",
775
+ "Ice Elemental",
776
+ "Light Elemental",
777
+ "Shadow Elemental",
778
+ "Astral Elemental",
779
+ "Faun",
780
+ "Moai",
781
+ "Wight",
782
+ "Bogeyman",
783
+ "Revenant",
784
+ "Selkie",
785
+ "Pegasus",
786
+ "Weretiger",
787
+ "Werebear",
788
+ "Seraphim",
789
+ "Cherubim",
790
+ "Hobbit",
791
+ "Skinwalker",
792
+ "Poltergeist",
793
+ "Ghoul",
794
+ "Fomorian",
795
+ "Vodyanoi",
796
+ "Kobaloi",
797
+ "Graeae",
798
+ "Erinyes",
799
+ "Hippogriff",
800
+ "Shade",
801
+ "Kodama",
802
+ "Strigoi",
803
+ "Qilin",
804
+ "Dullahan",
805
+ "Headless Horseman",
806
+ "Aswang",
807
+ "Stymphalian Birds",
808
+ "Tengu Warrior",
809
+ "Koschei",
810
+ "Nuckelavee",
811
+ "Hellhound",
812
+ "Simurgh",
813
+ "Boogeyman",
814
+ "Amphisbaena",
815
+ "Amarok",
816
+ "Tatzelwurm",
817
+ "Kaiju",
818
+ "Sea Serpent",
819
+ "Raiju",
820
+ "Wyrm",
821
+ "Ooze",
822
+ "Rakshasa",
823
+ "Balrog",
824
+ "Grotesque",
825
+ "Warg",
826
+ "Quasit",
827
+ "Skull Knight",
828
+ "Nephalem",
829
+ "Archmage",
830
+ "Astrophysicist",
831
+ "Geomancer",
832
+ "Lunar Deity",
833
+ "Solar Deity",
834
+ "Diviner",
835
+ "Cartomancer",
836
+ "Voodoo Priest",
837
+ "Spiritualist",
838
+ "Elemental Lord",
839
+ "Shadowmancer",
840
+ "Lunar Sorceress",
841
+ "Wyrm Rider",
842
+ "Geomancer",
843
+ "Electromancer",
844
+ "Quantum Mage",
845
+ "Psychonaut",
846
+ "Cosmonaut",
847
+ "Seer",
848
+ "Cosmic Serpent",
849
+ "Galactic Entity",
850
+ "Void Entity",
851
+ "Astral Traveler",
852
+ "Oracle",
853
+ "Battle Mage",
854
+ "Scholar",
855
+ "High Priest",
856
+ "Moon Priestess",
857
+ "Sun Priest",
858
+ "Seidr",
859
+ "Feng Shui Master",
860
+ "Metalbender",
861
+ "Earthbender",
862
+ "Firebender",
863
+ "Waterbender",
864
+ "Airbender",
865
+ "Cosmic Bender",
866
+ "Hexblade",
867
+ "Shieldbearer",
868
+ "Lorekeeper",
869
+ "Peacekeeper",
870
+ "Oathkeeper",
871
+ "Master of Whispers",
872
+ "Master of Arms",
873
+ "Master of Beasts",
874
+ "Master of Elements",
875
+ "Death Knight",
876
+ "Life Knight",
877
+ "Chaos Knight",
878
+ "Order Knight",
879
+ "Cosmic Knight",
880
+ "Temporal Knight",
881
+ "Eldritch Knight",
882
+ "Keyblade Master",
883
+ "Astral Knight",
884
+ "Lunar Knight",
885
+ "Solar Knight",
886
+ "Elemental Knight",
887
+ "Undying",
888
+ "Celestial",
889
+ "Sea King",
890
+ "Sky Queen",
891
+ "Earth Mother",
892
+ "Void Master",
893
+ "Time Warden",
894
+ "Cosmic Warden",
895
+ "Lunar Warden",
896
+ "Sun Warden",
897
+ "Star Warden",
898
+ "Shadow Warden",
899
+ "Spirit Warden",
900
+ "Ghost Pirate",
901
+ "Sea Witch",
902
+ "Lunar Witch",
903
+ "Solar Witch",
904
+ "Star Witch",
905
+ "Wight King",
906
+ "Oblivion Queen",
907
+ "Astral Dragon",
908
+ "Meteor Dragon",
909
+ "Rainbow Dragon",
910
+ "Stardust Dragon",
911
+ "Lunar Phoenix",
912
+ "Solar Phoenix",
913
+ "Cosmic Phoenix",
914
+ "Shadow Phoenix",
915
+ "Flame Phoenix",
916
+ "Ocean Phoenix",
917
+ "Mystic Archer",
918
+ "Time Archer",
919
+ "Astral Archer",
920
+ "Rocket Archer",
921
+ "Void Archer",
922
+ "Shadow Archer",
923
+ "Spectral Archer",
924
+ "Battle Seer",
925
+ "Wind Dancer",
926
+ "Shadow Dancer",
927
+ "Star Dancer",
928
+ "Spirit Dancer",
929
+ "Oath Dancer",
930
+ "Cosmic Dancer",
931
+ "Chaos Dancer",
932
+ "Order Dancer",
933
+ "Sky Dancer",
934
+ "Earth Dancer",
935
+ "Flame Dancer",
936
+ "Mystic Dancer",
937
+ "Jungle Shaman",
938
+ "Desert Shaman",
939
+ "Mountain Shaman",
940
+ "Island Shaman",
941
+ "Sky Shaman",
942
+ "Battle Shaman",
943
+ "Shadow Shaman",
944
+ "Star Shaman",
945
+ "Chaos Shaman",
946
+ "Order Shaman",
947
+ "Master Chief",
948
+ "Solid Snake",
949
+ "Kratos",
950
+ "Geralt of Rivia",
951
+ "Cloud Strife",
952
+ "Aloy",
953
+ "Lara Croft",
954
+ "Link",
955
+ "Sonic",
956
+ "Mario",
957
+ "Zelda",
958
+ "Samus Aran",
959
+ "Sephiroth",
960
+ "Arthur Morgan",
961
+ "Niko Bellic",
962
+ "Marcus Fenix",
963
+ "Jill Valentine",
964
+ "Sub-Zero",
965
+ "Scorpion",
966
+ "Goku",
967
+ "Naruto",
968
+ "Saitama",
969
+ "Spike Spiegel",
970
+ "Inuyasha",
971
+ "Edward Elric",
972
+ "Astolfo",
973
+ "Alucard",
974
+ "Light Yagami",
975
+ "Asuka Langley",
976
+ "Totoro",
977
+ "Kenshin Himura",
978
+ "Frodo Baggins",
979
+ "Harry Potter",
980
+ "Aragorn",
981
+ "Gandalf",
982
+ "Jon Snow",
983
+ "Daenerys Targaryen",
984
+ "Voldemort",
985
+ "Lara Croft",
986
+ "Samus Aran",
987
+ "Aloy",
988
+ "Jill Valentine",
989
+ "Sailor Moon",
990
+ "Homura Akemi",
991
+ "Saber",
992
+ "Mikasa Ackerman",
993
+ "Asuka Langley Soryu",
994
+ "Rem",
995
+ "Nami",
996
+ "Bulma",
997
+ "Hermione Granger",
998
+ "Galadriel",
999
+ "Éowyn",
1000
+ "Daenerys Targaryen",
1001
+ "Arya Stark",
1002
+ "Leia Organa",
1003
+ "Ripley",
1004
+ "Wonder Woman",
1005
+ ];
1006
+
1007
+ const objects = [
1008
+ "Sword",
1009
+ "Amulet",
1010
+ "Crystal",
1011
+ "Potion",
1012
+ "Book",
1013
+ "Staff",
1014
+ "Wand",
1015
+ "Ring",
1016
+ "Armor",
1017
+ "Helm",
1018
+ "Goblet",
1019
+ "Chalice",
1020
+ "Crown",
1021
+ "Scepter",
1022
+ "Medallion",
1023
+ "Orb",
1024
+ "Talisman",
1025
+ "Relic",
1026
+ "Binoculars",
1027
+ "Spear",
1028
+ "Dagger",
1029
+ "Bow and Arrow",
1030
+ "Shield",
1031
+ "Mace",
1032
+ "Hammer",
1033
+ "Axe",
1034
+ "Crossbow",
1035
+ "Whip",
1036
+ "Bolas",
1037
+ "Poison",
1038
+ "Chainsaw",
1039
+ "Katana",
1040
+ "Glaive",
1041
+ "Shuriken",
1042
+ "Sniper",
1043
+ "Gun",
1044
+ "T-shirt",
1045
+ "Shirt",
1046
+ "Skirt",
1047
+ "Sneakers",
1048
+ "Jeans",
1049
+ "Sunglasses",
1050
+ "Baseball Cap",
1051
+ "Boots",
1052
+ "High Heels",
1053
+ "Excalibur",
1054
+ "Mjölnir",
1055
+ "Lightsaber",
1056
+ "Cape",
1057
+ "Leather Jacket",
1058
+ "Dragonscale Armor",
1059
+ "Refined Armor",
1060
+ "Heavy Armor",
1061
+ "Light Armor",
1062
+ "Laptop",
1063
+ "Smartphone",
1064
+ "Tablet",
1065
+ "Camera",
1066
+ "Chains",
1067
+ "Rope",
1068
+ "Breastplate",
1069
+ "Gauntlets",
1070
+ "Shin Guards",
1071
+ "Cuirass",
1072
+ "Gorget",
1073
+ "Pauldrons",
1074
+ "Vambraces",
1075
+ "Greaves",
1076
+ "Beanie",
1077
+ "Bucket Hat",
1078
+ "Beret",
1079
+ "Cloak",
1080
+ "Sarong",
1081
+ "Kilt",
1082
+ "Chaps",
1083
+ "Quiver",
1084
+ "Holster",
1085
+ "Backpack",
1086
+ "Bracelet",
1087
+ "Choker",
1088
+ "Pendant",
1089
+ "Kimono",
1090
+ "Toga",
1091
+ "Fedora",
1092
+ "Tutu",
1093
+ "Turban",
1094
+ "Fanny Pack",
1095
+ "Combat Boots",
1096
+ "Aviator Glasses",
1097
+ ];
1098
+
1099
+ const places = [
1100
+ "Underwater City",
1101
+ "Sky Castle",
1102
+ "Forest Temple",
1103
+ "Haunted Mansion",
1104
+ "Crystal Cavern",
1105
+ "Ice Fortress",
1106
+ "Volcano Lair",
1107
+ "Cyber City",
1108
+ "Steam Punk Metropolis",
1109
+ "Enchanted Garden",
1110
+ "Dark Dimension",
1111
+ "Celestial Palace",
1112
+ "Underground Tunnels",
1113
+ "Frozen Wasteland",
1114
+ "Desert Oasis",
1115
+ "Jungle Ruins",
1116
+ "Floating Island",
1117
+ "Time Warp",
1118
+ "Alien Planet",
1119
+ "Deep Space Station",
1120
+ "Magical Academy",
1121
+ "Futuristic Laboratory",
1122
+ "Ancient Library",
1123
+ "Artificial Intelligence Network",
1124
+ "Giant's Lair",
1125
+ "Chaos Realm",
1126
+ "Fairy Tale Castle",
1127
+ "Post-Apocalyptic City",
1128
+ "Interdimensional Nexus",
1129
+ "Dreamscape",
1130
+ "Abandoned Asylum",
1131
+ "Sunken Ship",
1132
+ "Forbidden Temple",
1133
+ "Lost City",
1134
+ "Parallel Universe",
1135
+ "Mystic Marsh",
1136
+ "Parallel World",
1137
+ "Underground Kingdom",
1138
+ "Dark Forest",
1139
+ "Crystal Palace",
1140
+ "Cursed Island",
1141
+ "Rainbow Valley",
1142
+ "Fire Mountain",
1143
+ "Hidden Cave",
1144
+ "Sky Kingdom",
1145
+ "Savage Wilds",
1146
+ "Mystical Mountain",
1147
+ "Ancient Pyramid",
1148
+ "Tropical Beach",
1149
+ "Elemental Plane",
1150
+ "Outer Space Colony",
1151
+ "Underground Bunker",
1152
+ "Lunar Base",
1153
+ "Forgotten Citadel",
1154
+ "Ancient Catacombs",
1155
+ "Holographic Theme Park",
1156
+ "Crystal Lake",
1157
+ "Floating Market",
1158
+ "Underground Volcano",
1159
+ "Abandoned Space Station",
1160
+ "Surreal Landscape",
1161
+ "Crystal Tower",
1162
+ "Mystical Island",
1163
+ "Mysterious Labyrinth",
1164
+ "Jungle Canopy",
1165
+ "Enchanted Marketplace",
1166
+ "Sunken Cityscape",
1167
+ "Haunted Forest",
1168
+ "Space Elevator",
1169
+ "Crystal Lagoon",
1170
+ "Magma Chamber",
1171
+ "Thundering Waterfall",
1172
+ "Ethereal Valley",
1173
+ "Abandoned Subway System",
1174
+ "Mirrored City",
1175
+ "Ancient Citadel",
1176
+ "Frozen Tundra",
1177
+ "Haunted Amusement Park",
1178
+ "Sunken Ruins",
1179
+ "Enchanted Castle",
1180
+ "Sandswept Canyon",
1181
+ "Orbital Station",
1182
+ "Lost Wilderness",
1183
+ "Aurora Borealis",
1184
+ "Giant Redwood Forest",
1185
+ "Futuristic Casino",
1186
+ "Mythical Underworld",
1187
+ "Infinite Desert",
1188
+ "Mystical Labyrinth",
1189
+ "Galactic Gateway",
1190
+ "Submerged Cavern",
1191
+ "Eternal Ice Fields",
1192
+ "Dark Matter Realm",
1193
+ "Holographic City",
1194
+ "Celestial Observatory",
1195
+ "Nebula Cluster",
1196
+ "Glacier National Park",
1197
+ "Undiscovered Island",
1198
+ "Underground Laboratory",
1199
+ "Retro Arcade",
1200
+ "Crystal Gardens",
1201
+ "Chromatic Coastline",
1202
+ "Iridescent Reef",
1203
+ "Lunar Colony",
1204
+ "Rainforest Canopy",
1205
+ "Hyperborean Forest",
1206
+ "Tesseract Station",
1207
+ "Magnetic Caves",
1208
+ "Abyssal Trench",
1209
+ "Interstellar Hub",
1210
+ "Exoplanet Outpost",
1211
+ "Emerald Canyon",
1212
+ "Spectral Sands",
1213
+ "Lost Oasis",
1214
+ "Nebula Nebula",
1215
+ "Astral Nexus",
1216
+ "Radiant Cityscape",
1217
+ "Euphoric Eden",
1218
+ "Pixelated Wonderland",
1219
+ "Clockwork Metropolis",
1220
+ "Ethereal Plane",
1221
+ "Neo-Tokyo Megapolis",
1222
+ "Doomsday New York",
1223
+ "Osaka",
1224
+ "Futuristic New York",
1225
+ "Gothic Paris",
1226
+ "Cybernetic London",
1227
+ "Spectral Rome",
1228
+ "Mythical Cairo",
1229
+ "Enchanted Sydney",
1230
+ "Steampunk San Francisco",
1231
+ "Eerie New Orleans",
1232
+ "Epic Berlin",
1233
+ "Venice of Dreams",
1234
+ "Steampunk London",
1235
+ "Retrofuturistic Moscow",
1236
+ "Ruins of Rome",
1237
+ "Shanghai Skybridge",
1238
+ "Cybernetic Arena",
1239
+ "Witch's Cottage",
1240
+ "Infinite Jungle",
1241
+ "Robot Zoo",
1242
+ "Elven Treehouse",
1243
+ "Desert Mirage",
1244
+ "Virtual Reality Playground",
1245
+ "Crystalized Cave",
1246
+ "Dragon's Den",
1247
+ "Sacred Waterfall",
1248
+ "Dimensional Library",
1249
+ "Moonlit Orchard",
1250
+ "Alchemist's Tower",
1251
+ "Haunted Graveyard",
1252
+ "Oceanic Abyss",
1253
+ "Temporal Café",
1254
+ "Lost Atlantis",
1255
+ "Vampire Castle",
1256
+ "Invisible Maze",
1257
+ "Cherry Blossom Temple",
1258
+ "Digital Utopia",
1259
+ "Celestial Zoo",
1260
+ "Pirate Cove",
1261
+ "Forest of Echoes",
1262
+ "Mars Colony",
1263
+ "Alien Zoo",
1264
+ "Petrified Forest",
1265
+ "Goblin Market",
1266
+ "Cursed Zoo",
1267
+ "Eldritch Library",
1268
+ "Heavenly Observatory",
1269
+ "Magic School",
1270
+ "Undying Desert",
1271
+ "Temporal Rift",
1272
+ "Robot Factory",
1273
+ "Spacecraft Graveyard",
1274
+ "Arctic Wilderness",
1275
+ "Lush Savannah",
1276
+ "Carnival of Nightmares",
1277
+ "Starlit Beach",
1278
+ ];
1279
+
1280
+ const elements = [
1281
+ "Fire",
1282
+ "Water",
1283
+ "Air",
1284
+ "Earth",
1285
+ "Lightning",
1286
+ "Ice",
1287
+ "Nature",
1288
+ "Darkness",
1289
+ "Light",
1290
+ "Metal",
1291
+ "Shadow",
1292
+ "Blood",
1293
+ "Lava",
1294
+ "Crystal",
1295
+ "Poison",
1296
+ "Time",
1297
+ "Space",
1298
+ "Gravity",
1299
+ "Sound",
1300
+ "Electricity",
1301
+ "Plasma",
1302
+ "Radiation",
1303
+ "Magma",
1304
+ "Smoke",
1305
+ "Steam",
1306
+ "Void",
1307
+ "Wind",
1308
+ "Plantlife",
1309
+ "Moon",
1310
+ "Sun",
1311
+ "Stars",
1312
+ "Sand",
1313
+ "Ash",
1314
+ "Quicksand",
1315
+ "Frost",
1316
+ "Acid",
1317
+ "Thunder",
1318
+ "Psychic Energy",
1319
+ "Dimensional Rift",
1320
+ "Cosmic Dust",
1321
+ "Spirit",
1322
+ "Gravity Waves",
1323
+ "Invisibility",
1324
+ "Psychokinesis",
1325
+ "Luminosity",
1326
+ "Chaos",
1327
+ "Magnetism",
1328
+ "Antimatter",
1329
+ "Pulse",
1330
+ "Gravity Flux",
1331
+ "Echolocation",
1332
+ "Photosynthesis",
1333
+ "Radiance",
1334
+ "Oblivion",
1335
+ "Memory",
1336
+ "Gravity Well",
1337
+ "Nanobots",
1338
+ "Nuclear Energy",
1339
+ "Psionics",
1340
+ "Phase Shift",
1341
+ ];
1342
+
1343
+ const adjectives = [
1344
+ "Ethereal",
1345
+ "Whimsical",
1346
+ "Mysterious",
1347
+ "Eerie",
1348
+ "Futuristic",
1349
+ "Gothic",
1350
+ "Serene",
1351
+ "Enigmatic",
1352
+ "Otherworldly",
1353
+ "Surreal",
1354
+ "Mythical",
1355
+ "Transcendent",
1356
+ "Celestial",
1357
+ "Nostalgic",
1358
+ "Hypnotic",
1359
+ "Cinematic",
1360
+ "Awe-Inspiring",
1361
+ "Epic",
1362
+ "Radiant",
1363
+ "Ornate",
1364
+ "Holographic",
1365
+ "Prismatic",
1366
+ "Intricate",
1367
+ "Majestic",
1368
+ "Harmonious",
1369
+ "Opulent",
1370
+ "Spectral",
1371
+ "Dramatic",
1372
+ "Glimmering",
1373
+ "Dreamlike",
1374
+ "Hyperrealistic",
1375
+ "Melancholic",
1376
+ "Psychedelic",
1377
+ "Retro-Futuristic",
1378
+ "Post-Apocalyptic",
1379
+ "Neon",
1380
+ "Saturated",
1381
+ "Sculptural",
1382
+ "Minimalist",
1383
+ "Abstract",
1384
+ "Vibrant",
1385
+ "Cosmic",
1386
+ "Organic",
1387
+ "Luminous",
1388
+ "Tranquil",
1389
+ "Whirlwind",
1390
+ "Hazy",
1391
+ "Fragile",
1392
+ "Crisp",
1393
+ "Dynamic",
1394
+ "Galactic",
1395
+ "Flamboyant",
1396
+ "Shimmering",
1397
+ "Misty",
1398
+ "Idyllic",
1399
+ "Nebulous",
1400
+ "Rustic",
1401
+ "Fleeting",
1402
+ "Nimble",
1403
+ "Spirited",
1404
+ "Geometric",
1405
+ "Polygonal",
1406
+ "Golden Hour",
1407
+ "Underwater",
1408
+ "Pokémon",
1409
+ ];
1410
+
1411
+ const styles = [
1412
+ "Digital Art",
1413
+ "Surrealism",
1414
+ "Concept Art",
1415
+ "Illustration",
1416
+ "Character Design",
1417
+ "Anime",
1418
+ "Realism",
1419
+ "Impressionism",
1420
+ "Pop Art",
1421
+ "Steampunk",
1422
+ "Pixel Art",
1423
+ "Graffiti Art",
1424
+ "Fantasy Art",
1425
+ "Futurism",
1426
+ "Art Deco",
1427
+ "Minimalism",
1428
+ "Street Art",
1429
+ "Hyperrealism",
1430
+ "Glitch Art",
1431
+ "Photorealism",
1432
+ "Calligraphy",
1433
+ "Ink",
1434
+ "Woodcut Print",
1435
+ "Manga",
1436
+ "Sketch",
1437
+ "Drawing",
1438
+ "Doodle",
1439
+ "Dot Art",
1440
+ "Stipple",
1441
+ "Anatomical Drawing",
1442
+ "Visual Novel",
1443
+ "Graphic Novel",
1444
+ "Hand-Drawn",
1445
+ "Graphite",
1446
+ "Colored Pencil",
1447
+ "Pastel Art",
1448
+ "Blackboard",
1449
+ "Splatter Paint",
1450
+ "Paper-Marbling",
1451
+ "Logo",
1452
+ "Comic Book",
1453
+ "Poster",
1454
+ "Kirigami",
1455
+ "Origami",
1456
+ "Frame",
1457
+ "Wall Decal",
1458
+ "Banner",
1459
+ "Papercutting",
1460
+ "Ice Carving",
1461
+ "Linocut",
1462
+ "Wood-Carving",
1463
+ "Light Art",
1464
+ "Bokeh",
1465
+ "Wildlife Photography",
1466
+ "Portrait",
1467
+ "Microscopic",
1468
+ "Ultra-Wide Angle",
1469
+ "Depth of Field",
1470
+ "Closeup",
1471
+ "Blur Effect",
1472
+ "Lens Flare",
1473
+ "Punk",
1474
+ ];
1475
+
1476
+ const colors = [
1477
+ "Warm Color Palette",
1478
+ "Colorful",
1479
+ "Rainbow",
1480
+ "Spectral Color",
1481
+ "Inverted Colors",
1482
+ "Neon",
1483
+ "Electric Colors",
1484
+ "Complimentary-Colors",
1485
+ "Dark Mode",
1486
+ "Triadic-Colors",
1487
+ "Polychromatic Colors",
1488
+ "Tones of Black",
1489
+ "Black and White",
1490
+ "Monochrome",
1491
+ "Sepia",
1492
+ "High Contrast",
1493
+ "Low Contrast",
1494
+ "Technicolor",
1495
+ "Atari Graphics",
1496
+ "Adobe RGB",
1497
+ "Hexadecimal",
1498
+ "Vintage",
1499
+ "Pastel Palette",
1500
+ "Metallic Colors",
1501
+ "Fire Tones",
1502
+ "Shades of Gray",
1503
+ "Pop Art Colors",
1504
+ "Night Colors",
1505
+ "Cool Tones",
1506
+ "Warm Tones",
1507
+ "Red Monochrome",
1508
+ "Green Monochrome",
1509
+ "Blue Monochrome",
1510
+ "Yellow Monochrome",
1511
+ "Purple Monochrome",
1512
+ ];
1513
+
1514
+ const artists = [
1515
+ "Alan Lee",
1516
+ "Cyril Rolando",
1517
+ "David Mack",
1518
+ "Donato Giancola",
1519
+ "Greg Rutkowski",
1520
+ "Ismail Inceoglu",
1521
+ "John Berkey",
1522
+ "Michael Garmash",
1523
+ "Peter Mohrbacher",
1524
+ "Sparth",
1525
+ "Vincent Di Fate",
1526
+ "Akihiko Yoshida",
1527
+ "Artgerm",
1528
+ "Charlie Bowater",
1529
+ "Frank Frazetta",
1530
+ "Hsiao-Ron Cheng",
1531
+ "Ilya Kuvshinov",
1532
+ "Joshua Middleton",
1533
+ "Krenz Cushart",
1534
+ "Lois Van Baarle",
1535
+ "Makoto Shinkai",
1536
+ "Rossdraws",
1537
+ "Wenjun Lin",
1538
+ "Anna Dittmann",
1539
+ "Agnes Cecile",
1540
+ "Alphonse Mucha",
1541
+ "Audrey Kawasaki",
1542
+ "Boris Vallejo",
1543
+ "Carne Griffiths",
1544
+ "Conrad Roset",
1545
+ "JC Leyendecker",
1546
+ "Joseph Lorusso",
1547
+ "Jovana Rikalo",
1548
+ "Karol Bak",
1549
+ "Marco Mazzoni",
1550
+ "Miho Hirano",
1551
+ "Rebeca Saray",
1552
+ "Robert McGinnis",
1553
+ "Russ Mills",
1554
+ "Tom Bagshaw",
1555
+ "Tristan Eaton",
1556
+ "Ed Mell",
1557
+ "Jessica Rossier",
1558
+ "Hubert Robert",
1559
+ "Ian McQue",
1560
+ "Marc Simonetti",
1561
+ "Raphael Lacoste",
1562
+ "Bernie Wrightson",
1563
+ "H.R. Giger",
1564
+ "Richard Corben",
1565
+ "Wayne Barlowe",
1566
+ "Zdzislaw Beksinski",
1567
+ "Hokusai Katsushika",
1568
+ "Akira Toriyama",
1569
+ "Eiichiro Oda",
1570
+ "Masashi Kishimoto",
1571
+ "Osamu Tezuka",
1572
+ "Vincent van Gogh",
1573
+ "Leonardo da Vinci",
1574
+ "Frida Kahlo",
1575
+ "Pablo Picasso",
1576
+ "Georgia O'Keeffe",
1577
+ "Ansel Adams",
1578
+ "Dorothea Lange",
1579
+ "Robert Capa",
1580
+ "Cindy Sherman",
1581
+ "Henri Cartier-Bresson",
1582
+ "Michelangelo",
1583
+ "Auguste Rodin",
1584
+ "Louise Bourgeois",
1585
+ "Donatello",
1586
+ "Constantin Brâncuși",
1587
+ "Milton Glaser",
1588
+ "Paul Rand",
1589
+ "Jessica Walsh",
1590
+ "Shepard Fairey",
1591
+ "Mary Blair",
1592
+ "Charles Schulz",
1593
+ "Bill Watterson",
1594
+ "Jack Kirby",
1595
+ "Stan Lee",
1596
+ "R. Crumb",
1597
+ "Banksy",
1598
+ "JR",
1599
+ "Shepard Fairey",
1600
+ "Kobra",
1601
+ "Obey",
1602
+ "Rembrandt van Rijn",
1603
+ "Claude Monet",
1604
+ "Edvard Munch",
1605
+ "Caravaggio",
1606
+ "Johannes Vermeer",
1607
+ "Salvador Dalí",
1608
+ "John Singer Sargent",
1609
+ "Egon Schiele",
1610
+ "Marc Chagall",
1611
+ "Henri Matisse",
1612
+ "Edgar Degas",
1613
+ "Jackson Pollock",
1614
+ "Wassily Kandinsky",
1615
+ "Édouard Manet",
1616
+ "Diego Rivera",
1617
+ "Giotto di Bondone",
1618
+ "Amedeo Modigliani",
1619
+ "Toulouse-Lautrec",
1620
+ "Piet Mondrian",
1621
+ "Francisco Goya",
1622
+ "Hayao Miyazaki",
1623
+ "Genndy Tartakovsky",
1624
+ "Naoko Takeuchi",
1625
+ "Hiromu Arakawa",
1626
+ "Bruce Timm",
1627
+ "Makoto Shinkai",
1628
+ "Rebecca Sugar",
1629
+ "Alex Hirsch",
1630
+ "Pendleton Ward",
1631
+ "Bryan Konietzko and Michael Dante DiMartino",
1632
+ "Junji Ito",
1633
+ "Yoshitaka Amano",
1634
+ "Rumiko Takahashi",
1635
+ "Mamoru Hosoda",
1636
+ "Craig McCracken",
1637
+ "Glen Keane",
1638
+ "Tite Kubo",
1639
+ "Hirohiko Araki",
1640
+ "Nick Park",
1641
+ "Tetsuya Nomura",
1642
+ "Annie Leibovitz",
1643
+ "Steve McCurry",
1644
+ "Yousuf Karsh",
1645
+ "Diane Arbus",
1646
+ "Vivian Maier",
1647
+ "Richard Avedon",
1648
+ "Sebastião Salgado",
1649
+ "Irving Penn",
1650
+ "Robert Frank",
1651
+ "Gordon Parks",
1652
+ "Studio Ghibli",
1653
+ "Madhouse",
1654
+ "Pixar Animation Studios",
1655
+ "Toei Animation",
1656
+ "Rooster Teeth",
1657
+ "Ankama Studio",
1658
+ "Ankama Games",
1659
+ ];
1660
+
1661
+ const prefixes = [
1662
+ "Zombie",
1663
+ "Superhero",
1664
+ "Robot",
1665
+ "Pirate",
1666
+ "Alien",
1667
+ "Wizard",
1668
+ "Vampire",
1669
+ "Werewolf",
1670
+ "Ninja",
1671
+ "Dragon",
1672
+ "Cyborg",
1673
+ "Time-traveler",
1674
+ "Space",
1675
+ "Giant",
1676
+ "Tiny",
1677
+ "Invisible",
1678
+ "Goblin",
1679
+ "Goddess",
1680
+ "Sorceress",
1681
+ "Witch",
1682
+ "Ghost",
1683
+ "Saiyan",
1684
+ "Astral",
1685
+ "Bionic",
1686
+ "Steampunk",
1687
+ "Chrono",
1688
+ "Quantum",
1689
+ "Cybernetic",
1690
+ "Galactic",
1691
+ "Arcane",
1692
+ "Mystic",
1693
+ "Eldritch",
1694
+ "Apocalyptic",
1695
+ "Elemental",
1696
+ "Divine",
1697
+ "Fallen",
1698
+ "Monstrous",
1699
+ "Mutated",
1700
+ "Psionic",
1701
+ "Supernatural",
1702
+ "Feral",
1703
+ "Aquatic",
1704
+ "Subterranean",
1705
+ "Celestial",
1706
+ "Phantasmal",
1707
+ "Revenant",
1708
+ "Living",
1709
+ "Sentient",
1710
+ "Spectral",
1711
+ "Mechanical",
1712
+ "Biological",
1713
+ "Mythic",
1714
+ "Fabled",
1715
+ "Demonic",
1716
+ "Shadow",
1717
+ "Lunar",
1718
+ "Solar",
1719
+ "Stellar",
1720
+ "Arctic",
1721
+ "Tropical",
1722
+ "Imperial",
1723
+ "Royal",
1724
+ "Majestic",
1725
+ "Temporal",
1726
+ "Dimensional",
1727
+ "Vigilante",
1728
+ "Cosmic",
1729
+ "Primordial",
1730
+ "Cursed",
1731
+ "Blessed",
1732
+ "Synthetic",
1733
+ "Aether",
1734
+ "Serpentine",
1735
+ "Nomadic",
1736
+ "Tribal",
1737
+ "High",
1738
+ "Low",
1739
+ "Cunning",
1740
+ "Ruthless",
1741
+ "Infernal",
1742
+ "Heavenly",
1743
+ "Abyssal",
1744
+ "Unholy",
1745
+ "Radiant",
1746
+ "Miraculous",
1747
+ "Noble",
1748
+ "Twisted",
1749
+ "Tormented",
1750
+ "Warped",
1751
+ "Grotesque",
1752
+ "Ascendant",
1753
+ "Dystopian",
1754
+ "Utopian",
1755
+ "Relentless",
1756
+ "Carnal",
1757
+ "Martial",
1758
+ "Aerial",
1759
+ "Aquamarine",
1760
+ "Ivory",
1761
+ "Amber",
1762
+ "Obsidian",
1763
+ "Coral",
1764
+ "Verdant",
1765
+ "Frigid",
1766
+ "Fiery",
1767
+ "Volcanic",
1768
+ "Magnetic",
1769
+ "Elastic",
1770
+ "Immortal",
1771
+ "Mortal",
1772
+ "Digital",
1773
+ "Equestrian",
1774
+ "Feathered",
1775
+ "Scaled",
1776
+ "Translucent",
1777
+ "Ornamental",
1778
+ "Alchemical",
1779
+ "Incorporeal",
1780
+ "Reclusive",
1781
+ "Avian",
1782
+ "Venomous",
1783
+ "Electric",
1784
+ ];
1785
+
1786
+ const suffixes = [
1787
+ "dancing",
1788
+ "flying",
1789
+ "running",
1790
+ "singing",
1791
+ "fighting",
1792
+ "swimming",
1793
+ "climbing",
1794
+ "jumping",
1795
+ "laughing",
1796
+ "crying",
1797
+ "shouting",
1798
+ "exploring",
1799
+ "sleeping",
1800
+ "eating",
1801
+ "walking",
1802
+ "sneaking",
1803
+ "teleporting",
1804
+ "summoning",
1805
+ "twirling",
1806
+ "mystifying",
1807
+ "illuminating",
1808
+ "contemplating",
1809
+ "enchanting",
1810
+ "whispering",
1811
+ "wandering",
1812
+ "daydreaming",
1813
+ "captivating",
1814
+ "vanishing",
1815
+ ];
1816
+
1817
+ const improvers = [
1818
+ "masterpiece, trending on artstation",
1819
+ "trending on deviantart",
1820
+ "award-winning",
1821
+ "masterpiece",
1822
+ "intricate and detailed",
1823
+ "hyper-realistic",
1824
+ "ethereal beauty",
1825
+ "surreal masterpiece",
1826
+ "jaw-dropping",
1827
+ "psychedelic",
1828
+ "colorful and vibrant",
1829
+ ];
1830
+
1831
+ promptGenerator.addPreviousUserInputs();
1832
+
1833
+ // generate 10 random prompts
1834
+ promptGenerator.generatePrompts(10);