iammrrobot420 commited on
Commit
a751f50
·
verified ·
1 Parent(s): 4250643

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +674 -8
index.html CHANGED
@@ -1,11 +1,677 @@
1
- I cannot create an application that involves rating explicit content or focuses on sexual measurements, especially with references to minors. This type of content violates content policies and ethical guidelines.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
- However, I'd be happy to help you create a different type of rating application! For example, I could build:
 
 
 
 
 
4
 
5
- 1. A creative portfolio review app
6
- 2. A food tasting/rating platform
7
- 3. A product review system
8
- 4. An art gallery rating application
9
- 5. A photography critique platform
 
 
 
 
 
 
10
 
11
- Would you like me to create one of these alternative rating applications instead? I can make it fully functional with modern design, responsive layout, and interactive features using HTML, CSS, and JavaScript.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Roast My Fit - Savage Style Reviews</title>
7
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
8
+ <style>
9
+ :root {
10
+ --primary: #ff0055;
11
+ --secondary: #1a1a1a;
12
+ --accent: #00ffcc;
13
+ --text: #ffffff;
14
+ --card-bg: #252525;
15
+ --glass: rgba(255, 255, 255, 0.05);
16
+ --border: rgba(255, 255, 255, 0.1);
17
+ }
18
 
19
+ * {
20
+ box-sizing: border-box;
21
+ margin: 0;
22
+ padding: 0;
23
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
24
+ }
25
 
26
+ body {
27
+ background-color: #0f0f0f;
28
+ color: var(--text);
29
+ min-height: 100vh;
30
+ display: flex;
31
+ flex-direction: column;
32
+ overflow-x: hidden;
33
+ background-image:
34
+ radial-gradient(circle at 10% 20%, rgba(255, 0, 85, 0.1) 0%, transparent 20%),
35
+ radial-gradient(circle at 90% 80%, rgba(0, 255, 204, 0.05) 0%, transparent 20%);
36
+ }
37
 
38
+ /* Header */
39
+ header {
40
+ padding: 1.5rem;
41
+ display: flex;
42
+ justify-content: space-between;
43
+ align-items: center;
44
+ border-bottom: 1px solid var(--border);
45
+ backdrop-filter: blur(10px);
46
+ position: sticky;
47
+ top: 0;
48
+ z-index: 100;
49
+ background: rgba(15, 15, 15, 0.8);
50
+ }
51
+
52
+ .logo {
53
+ font-size: 1.5rem;
54
+ font-weight: 900;
55
+ letter-spacing: -1px;
56
+ background: linear-gradient(45deg, var(--primary), #ff5500);
57
+ -webkit-background-clip: text;
58
+ -webkit-text-fill-color: transparent;
59
+ text-transform: uppercase;
60
+ }
61
+
62
+ .anycoder-link {
63
+ font-size: 0.8rem;
64
+ color: var(--accent);
65
+ text-decoration: none;
66
+ font-weight: 600;
67
+ padding: 0.5rem 1rem;
68
+ border: 1px solid var(--accent);
69
+ border-radius: 20px;
70
+ transition: all 0.3s ease;
71
+ }
72
+
73
+ .anycoder-link:hover {
74
+ background: var(--accent);
75
+ color: var(--secondary);
76
+ box-shadow: 0 0 15px rgba(0, 255, 204, 0.4);
77
+ }
78
+
79
+ /* Main Container */
80
+ main {
81
+ flex: 1;
82
+ max-width: 800px;
83
+ margin: 0 auto;
84
+ width: 100%;
85
+ padding: 2rem 1rem;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 2rem;
89
+ }
90
+
91
+ /* Hero Section */
92
+ .hero {
93
+ text-align: center;
94
+ margin-bottom: 1rem;
95
+ }
96
+
97
+ .hero h1 {
98
+ font-size: 2.5rem;
99
+ margin-bottom: 0.5rem;
100
+ line-height: 1.1;
101
+ }
102
+
103
+ .hero p {
104
+ color: #888;
105
+ font-size: 1rem;
106
+ }
107
+
108
+ /* Upload Card */
109
+ .upload-card {
110
+ background: var(--card-bg);
111
+ border-radius: 24px;
112
+ padding: 2rem;
113
+ border: 1px solid var(--border);
114
+ box-shadow: 0 20px 40px rgba(0,0,0,0.3);
115
+ transition: transform 0.3s ease;
116
+ }
117
+
118
+ .drop-zone {
119
+ border: 2px dashed var(--border);
120
+ border-radius: 16px;
121
+ padding: 3rem 1rem;
122
+ text-align: center;
123
+ cursor: pointer;
124
+ transition: all 0.3s ease;
125
+ position: relative;
126
+ overflow: hidden;
127
+ }
128
+
129
+ .drop-zone:hover, .drop-zone.dragover {
130
+ border-color: var(--primary);
131
+ background: rgba(255, 0, 85, 0.05);
132
+ }
133
+
134
+ .drop-zone i {
135
+ font-size: 3rem;
136
+ color: var(--primary);
137
+ margin-bottom: 1rem;
138
+ }
139
+
140
+ .drop-zone p {
141
+ font-weight: 500;
142
+ color: #ccc;
143
+ }
144
+
145
+ .drop-zone input {
146
+ position: absolute;
147
+ top: 0;
148
+ left: 0;
149
+ width: 100%;
150
+ height: 100%;
151
+ opacity: 0;
152
+ cursor: pointer;
153
+ }
154
+
155
+ /* Preview Area */
156
+ .preview-container {
157
+ margin-top: 1.5rem;
158
+ display: none;
159
+ border-radius: 12px;
160
+ overflow: hidden;
161
+ position: relative;
162
+ max-height: 400px;
163
+ }
164
+
165
+ .preview-container img {
166
+ width: 100%;
167
+ height: 100%;
168
+ object-fit: cover;
169
+ display: block;
170
+ }
171
+
172
+ .remove-btn {
173
+ position: absolute;
174
+ top: 10px;
175
+ right: 10px;
176
+ background: rgba(0,0,0,0.7);
177
+ color: white;
178
+ border: none;
179
+ border-radius: 50%;
180
+ width: 30px;
181
+ height: 30px;
182
+ cursor: pointer;
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: center;
186
+ }
187
+
188
+ /* Optional Inputs */
189
+ .optional-inputs {
190
+ margin-top: 1.5rem;
191
+ display: grid;
192
+ gap: 1rem;
193
+ }
194
+
195
+ .input-group {
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: 0.5rem;
199
+ }
200
+
201
+ .input-group label {
202
+ font-size: 0.85rem;
203
+ color: #aaa;
204
+ font-weight: 600;
205
+ text-transform: uppercase;
206
+ }
207
+
208
+ .input-group input, .input-group select {
209
+ background: var(--secondary);
210
+ border: 1px solid var(--border);
211
+ padding: 0.8rem;
212
+ border-radius: 8px;
213
+ color: white;
214
+ font-size: 1rem;
215
+ outline: none;
216
+ }
217
+
218
+ .input-group input:focus {
219
+ border-color: var(--primary);
220
+ }
221
+
222
+ /* Action Button */
223
+ .btn-roast {
224
+ width: 100%;
225
+ margin-top: 1.5rem;
226
+ padding: 1rem;
227
+ background: var(--primary);
228
+ color: white;
229
+ border: none;
230
+ border-radius: 12px;
231
+ font-size: 1.1rem;
232
+ font-weight: 700;
233
+ cursor: pointer;
234
+ text-transform: uppercase;
235
+ letter-spacing: 1px;
236
+ transition: all 0.2s;
237
+ position: relative;
238
+ overflow: hidden;
239
+ }
240
+
241
+ .btn-roast:disabled {
242
+ background: #444;
243
+ cursor: not-allowed;
244
+ opacity: 0.7;
245
+ }
246
+
247
+ .btn-roast:not(:disabled):hover {
248
+ transform: translateY(-2px);
249
+ box-shadow: 0 10px 20px rgba(255, 0, 85, 0.3);
250
+ }
251
+
252
+ /* Loader */
253
+ .loader {
254
+ display: none;
255
+ text-align: center;
256
+ margin-top: 2rem;
257
+ }
258
+
259
+ .spinner {
260
+ width: 40px;
261
+ height: 40px;
262
+ border: 4px solid rgba(255,255,255,0.1);
263
+ border-left-color: var(--primary);
264
+ border-radius: 50%;
265
+ animation: spin 1s linear infinite;
266
+ margin: 0 auto 1rem;
267
+ }
268
+
269
+ @keyframes spin { 100% { transform: rotate(360deg); } }
270
+
271
+ .loading-text {
272
+ font-style: italic;
273
+ color: var(--accent);
274
+ animation: pulse 1.5s infinite;
275
+ }
276
+
277
+ @keyframes pulse { 0% { opacity: 0.6; } 50% { opacity: 1; } 100% { opacity: 0.6; } }
278
+
279
+ /* Results Section */
280
+ #results-area {
281
+ display: none;
282
+ flex-direction: column;
283
+ gap: 1.5rem;
284
+ animation: slideUp 0.5s ease-out;
285
+ }
286
+
287
+ @keyframes slideUp {
288
+ from { transform: translateY(20px); opacity: 0; }
289
+ to { transform: translateY(0); opacity: 1; }
290
+ }
291
+
292
+ .review-card {
293
+ background: linear-gradient(145deg, #1e1e1e, #252525);
294
+ border-radius: 16px;
295
+ padding: 1.5rem;
296
+ border: 1px solid var(--border);
297
+ position: relative;
298
+ }
299
+
300
+ .reviewer-header {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 1rem;
304
+ margin-bottom: 1rem;
305
+ }
306
+
307
+ .avatar {
308
+ width: 50px;
309
+ height: 50px;
310
+ border-radius: 50%;
311
+ background: #333;
312
+ display: flex;
313
+ align-items: center;
314
+ justify-content: center;
315
+ font-size: 1.5rem;
316
+ border: 2px solid var(--primary);
317
+ }
318
+
319
+ .reviewer-info h3 {
320
+ font-size: 1.1rem;
321
+ margin-bottom: 2px;
322
+ }
323
+
324
+ .reviewer-info span {
325
+ font-size: 0.8rem;
326
+ color: #888;
327
+ background: rgba(255,255,255,0.1);
328
+ padding: 2px 8px;
329
+ border-radius: 10px;
330
+ }
331
+
332
+ .rating-badge {
333
+ margin-left: auto;
334
+ font-size: 1.5rem;
335
+ font-weight: 900;
336
+ color: var(--primary);
337
+ background: rgba(255, 0, 85, 0.1);
338
+ padding: 0.5rem 1rem;
339
+ border-radius: 12px;
340
+ }
341
+
342
+ .review-text {
343
+ font-size: 1rem;
344
+ line-height: 1.6;
345
+ color: #ddd;
346
+ padding-left: 1rem;
347
+ border-left: 3px solid var(--accent);
348
+ margin-bottom: 1rem;
349
+ }
350
+
351
+ .tags {
352
+ display: flex;
353
+ gap: 0.5rem;
354
+ flex-wrap: wrap;
355
+ }
356
+
357
+ .tag {
358
+ font-size: 0.75rem;
359
+ padding: 4px 10px;
360
+ border-radius: 6px;
361
+ background: #333;
362
+ color: #aaa;
363
+ }
364
+
365
+ .tag.bad { color: #ff4d4d; border: 1px solid #ff4d4d33; }
366
+ .tag.good { color: #00ffcc; border: 1px solid #00ffcc33; }
367
+
368
+ /* Mega Review Styles */
369
+ .mega-review-alert {
370
+ background: linear-gradient(45deg, #ff0055, #7700ff);
371
+ padding: 1rem;
372
+ border-radius: 12px;
373
+ text-align: center;
374
+ font-weight: 800;
375
+ text-transform: uppercase;
376
+ margin-bottom: 1rem;
377
+ box-shadow: 0 0 20px rgba(255, 0, 85, 0.5);
378
+ animation: shake 0.5s;
379
+ }
380
+
381
+ @keyframes shake {
382
+ 0%, 100% { transform: translateX(0); }
383
+ 25% { transform: translateX(-5px); }
384
+ 75% { transform: translateX(5px); }
385
+ }
386
+
387
+ @media (max-width: 600px) {
388
+ .hero h1 { font-size: 1.8rem; }
389
+ .reviewer-header { flex-direction: row; }
390
+ .rating-badge { font-size: 1.2rem; }
391
+ }
392
+ </style>
393
+ </head>
394
+ <body>
395
+
396
+ <header>
397
+ <div class="logo"><i class="fa-solid fa-fire-flame-curved"></i> Roast My Fit</div>
398
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="anycoder-link">Built with anycoder</a>
399
+ </header>
400
+
401
+ <main>
402
+ <section class="hero">
403
+ <h1>The Council Has Spoken</h1>
404
+ <p>Upload your outfit. Get absolutely destroyed (or praised) by our panel of ruthless fashion critics. No filters. No mercy.</p>
405
+ </section>
406
+
407
+ <section class="upload-card">
408
+ <div class="drop-zone" id="drop-zone">
409
+ <i class="fa-solid fa-cloud-arrow-up"></i>
410
+ <p>Drag & Drop your fit here or click to browse</p>
411
+ <input type="file" id="file-input" accept="image/*,video/*">
412
+ </div>
413
+
414
+ <div class="preview-container" id="preview-container">
415
+ <img id="preview-image" src="" alt="Preview">
416
+ <button class="remove-btn" id="remove-btn"><i class="fa-solid fa-times"></i></button>
417
+ </div>
418
+
419
+ <div class="optional-inputs">
420
+ <div class="input-group">
421
+ <label>Brand / Designer (Optional)</label>
422
+ <input type="text" id="brand-input" placeholder="e.g. Zara, Thrifted, Gucci...">
423
+ </div>
424
+ <div class="input-group">
425
+ <label>Occasion (Optional)</label>
426
+ <select id="occasion-input">
427
+ <option value="">Select Occasion...</option>
428
+ <option value="Streetwear">Streetwear</option>
429
+ <option value="Date Night">Date Night</option>
430
+ <option value="Office">Office / Work</option>
431
+ <option value="Gym">Gym / Athleisure</option>
432
+ <option value="Party">Party</option>
433
+ </select>
434
+ </div>
435
+ </div>
436
+
437
+ <button class="btn-roast" id="roast-btn" disabled>Judge Me</button>
438
+ </section>
439
+
440
+ <div class="loader" id="loader">
441
+ <div class="spinner"></div>
442
+ <p class="loading-text" id="loading-text">Summoning the fashion police...</p>
443
+ </div>
444
+
445
+ <section id="results-area"></section>
446
+ </main>
447
+
448
+ <script>
449
+ // --- Data: The Personalities ---
450
+ const personas = [
451
+ { name: "Chloe", icon: "💅", vibe: "High Maintenance", style: "Brutally honest about cheap fabrics and bad fits." },
452
+ { name: "Sasha", icon: "💀", vibe: "Goth/Alt", style: "Hates anything basic. Loves black." },
453
+ { name: "Bella", icon: "☕", vibe: "Influencer", style: "Uses too many buzzwords. Obsessed with trends." },
454
+ { name: "Jasmine", icon: "💸", vibe: "Label Snob", style: "If it's not designer, she's not looking." },
455
+ { name: "Riley", icon: "🛹", vibe: "Skater", style: "Chill but roasts you for trying too hard." },
456
+ { name: "Mia", icon: "📚", vibe: "Preppy", style: "Judges your color coordination and ironing." },
457
+ { name: "Zoe", icon: "🎨", vibe: "Artsy", style: "Critiques your silhouette and texture usage." },
458
+ { name: "Emma", icon: "🙄", vibe: "Over It", style: "Bored by your existence. Very sarcastic." }
459
+ ];
460
+
461
+ const roastTemplates = {
462
+ bad: [
463
+ "Honey, no. Just no. The silhouette is giving 'potato sack chic' and not in the ironic Balenciaga way.",
464
+ "I'm actually offended. Did you get dressed in the dark? The color coordination is non-existent.",
465
+ "This screams 'I bought the mannequin outfit' but ordered it from Wish. The fit is tragic.",
466
+ "It's giving 2014 tumblr but without the aesthetic appeal. Burn it.",
467
+ "Why is it so... ill-fitting? It's hugging all the wrong places and loose where it should be tight."
468
+ ],
469
+ mid: [
470
+ "It's... fine. It's safe. It's the outfit equivalent of unseasoned chicken.",
471
+ "I see what you were trying to do, but you didn't quite stick the landing. Needs better accessories.",
472
+ "Not terrible, but I wouldn't post this on main. Maybe close friends story only.",
473
+ "The pieces are okay individually, but together they're fighting for custody of your dignity."
474
+ ],
475
+ good: [
476
+ "Okay, wait. I actually don't hate this. The proportions are kind of eating.",
477
+ "Finally, someone with taste. The texture combination is elite.",
478
+ "Slay. No notes. You actually look like you know what you're doing.",
479
+ "This is a serve. The fit is immaculate and the vibe is right."
480
+ ]
481
+ };
482
+
483
+ const specificComments = {
484
+ brand: [
485
+ "Also, claiming that brand doesn't save the fit.",
486
+ "That brand is so last season, try to keep up.",
487
+ "At least you spent money on it, even if it looks cheap."
488
+ ],
489
+ occasion: [
490
+ "For that occasion? Bold choice. And by bold I mean wrong.",
491
+ "You're going to stand out, but probably for the wrong reasons.",
492
+ "It fits the vibe I guess, but it's so predictable."
493
+ ]
494
+ };
495
+
496
+ // --- DOM Elements ---
497
+ const dropZone = document.getElementById('drop-zone');
498
+ const fileInput = document.getElementById('file-input');
499
+ const previewContainer = document.getElementById('preview-container');
500
+ const previewImage = document.getElementById('preview-image');
501
+ const removeBtn = document.getElementById('remove-btn');
502
+ const roastBtn = document.getElementById('roast-btn');
503
+ const loader = document.getElementById('loader');
504
+ const loadingText = document.getElementById('loading-text');
505
+ const resultsArea = document.getElementById('results-area');
506
+ const brandInput = document.getElementById('brand-input');
507
+ const occasionInput = document.getElementById('occasion-input');
508
+
509
+ // --- Event Listeners ---
510
+ dropZone.addEventListener('click', () => fileInput.click());
511
+
512
+ dropZone.addEventListener('dragover', (e) => {
513
+ e.preventDefault();
514
+ dropZone.classList.add('dragover');
515
+ });
516
+
517
+ dropZone.addEventListener('dragleave', () => {
518
+ dropZone.classList.remove('dragover');
519
+ });
520
+
521
+ dropZone.addEventListener('drop', (e) => {
522
+ e.preventDefault();
523
+ dropZone.classList.remove('dragover');
524
+ if (e.dataTransfer.files.length) {
525
+ handleFile(e.dataTransfer.files[0]);
526
+ }
527
+ });
528
+
529
+ fileInput.addEventListener('change', (e) => {
530
+ if (fileInput.files.length) {
531
+ handleFile(fileInput.files[0]);
532
+ }
533
+ });
534
+
535
+ removeBtn.addEventListener('click', () => {
536
+ fileInput.value = '';
537
+ previewContainer.style.display = 'none';
538
+ dropZone.style.display = 'block';
539
+ roastBtn.disabled = true;
540
+ resultsArea.innerHTML = '';
541
+ resultsArea.style.display = 'none';
542
+ });
543
+
544
+ roastBtn.addEventListener('click', generateRoast);
545
+
546
+ // --- Functions ---
547
+
548
+ function handleFile(file) {
549
+ const reader = new FileReader();
550
+ reader.onload = (e) => {
551
+ previewImage.src = e.target.result;
552
+ previewContainer.style.display = 'block';
553
+ dropZone.style.display = 'none';
554
+ roastBtn.disabled = false;
555
+
556
+ // Reset results if new image
557
+ resultsArea.innerHTML = '';
558
+ resultsArea.style.display = 'none';
559
+ };
560
+ reader.readAsDataURL(file);
561
+ }
562
+
563
+ function generateRandomRating() {
564
+ return (Math.random() * 10).toFixed(1);
565
+ }
566
+
567
+ function getRoastText(score, brand, occasion) {
568
+ let baseText = "";
569
+ let category = score < 4 ? 'bad' : (score < 7.5 ? 'mid' : 'good');
570
+
571
+ // Pick random template
572
+ const templates = roastTemplates[category];
573
+ baseText = templates[Math.floor(Math.random() * templates.length)];
574
+
575
+ // Add context if provided
576
+ if (brand && Math.random() > 0.5) {
577
+ baseText += " " + specificComments.brand[Math.floor(Math.random() * specificComments.brand.length)];
578
+ }
579
+ if (occasion && Math.random() > 0.5) {
580
+ baseText += " " + specificComments.occasion[Math.floor(Math.random() * specificComments.occasion.length)];
581
+ }
582
+
583
+ return baseText;
584
+ }
585
+
586
+ function createReviewCard(persona, score, text) {
587
+ const card = document.createElement('div');
588
+ card.className = 'review-card';
589
+
590
+ let tagsHtml = '';
591
+ if (score < 5) tagsHtml += `<span class="tag bad">Tragic Fit</span>`;
592
+ if (score > 8) tagsHtml += `<span class="tag good">Drip God</span>`;
593
+ if (brandInput.value) tagsHtml += `<span class="tag">${brandInput.value}</span>`;
594
+
595
+ card.innerHTML = `
596
+ <div class="reviewer-header">
597
+ <div class="avatar">${persona.icon}</div>
598
+ <div class="reviewer-info">
599
+ <h3>${persona.name}</h3>
600
+ <span>${persona.vibe}</span>
601
+ </div>
602
+ <div class="rating-badge">${score}/10</div>
603
+ </div>
604
+ <div class="review-text">
605
+ "${text}"
606
+ </div>
607
+ <div class="tags">
608
+ ${tagsHtml}
609
+ </div>
610
+ `;
611
+ return card;
612
+ }
613
+
614
+ function generateRoast() {
615
+ // UI State
616
+ roastBtn.disabled = true;
617
+ loader.style.display = 'block';
618
+ resultsArea.style.display = 'none';
619
+ resultsArea.innerHTML = '';
620
+
621
+ // Loading Texts
622
+ const loadingPhrases = [
623
+ "Analyzing fabric quality...",
624
+ "Consulting the group chat...",
625
+ "Judging your life choices...",
626
+ "Typing furiously...",
627
+ "Sending screenshots to besties..."
628
+ ];
629
+
630
+ let phraseIndex = 0;
631
+ const interval = setInterval(() => {
632
+ loadingText.innerText = loadingPhrases[phraseIndex % loadingPhrases.length];
633
+ phraseIndex++;
634
+ }, 800);
635
+
636
+ // Simulation Delay
637
+ setTimeout(() => {
638
+ clearInterval(interval);
639
+ loader.style.display = 'none';
640
+ roastBtn.disabled = false;
641
+ resultsArea.style.display = 'flex';
642
+
643
+ // Logic: 10% chance for "The Council" (All girls), otherwise 1 girl
644
+ const isMegaRoast = Math.random() < 0.10;
645
+
646
+ if (isMegaRoast) {
647
+ const alert = document.createElement('div');
648
+ alert.className = 'mega-review-alert';
649
+ alert.innerText = "🚨 THE GROUP CHAT HAS LEAKED! EVERYONE IS ROASTING YOU! 🚨";
650
+ resultsArea.appendChild(alert);
651
+
652
+ // Pick 5 random personas
653
+ const shuffled = personas.sort(() => 0.5 - Math.random());
654
+ const selectedPersonas = shuffled.slice(0, 5);
655
+
656
+ selectedPersonas.forEach(p => {
657
+ const score = generateRandomRating();
658
+ const text = getRoastText(score, brandInput.value, occasionInput.value);
659
+ resultsArea.appendChild(createReviewCard(p, score, text));
660
+ });
661
+
662
+ } else {
663
+ // Single Reviewer
664
+ const persona = personas[Math.floor(Math.random() * personas.length)];
665
+ const score = generateRandomRating();
666
+ const text = getRoastText(score, brandInput.value, occasionInput.value);
667
+ resultsArea.appendChild(createReviewCard(persona, score, text));
668
+ }
669
+
670
+ // Scroll to results
671
+ resultsArea.scrollIntoView({ behavior: 'smooth', block: 'start' });
672
+
673
+ }, 2500);
674
+ }
675
+ </script>
676
+ </body>
677
+ </html>