dvilasuero HF Staff commited on
Commit
c2b50e9
·
verified ·
1 Parent(s): c2dc347

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +504 -61
index.html CHANGED
@@ -4,123 +4,515 @@
4
  <meta charset="UTF-8">
5
  <title>Live WebApp Viewer</title>
6
  <style>
7
- body { margin: 0; font-family: Arial, sans-serif; background: #f5f5f5; }
8
- .container { width: 100vw; padding: 10px; box-sizing: border-box; }
9
- .loading { text-align: center; padding: 50px; font-size: 18px; color: #666; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  .main-title {
11
  text-align: center;
12
- margin-bottom: 20px;
13
  padding: 0 20px;
14
  }
 
15
  .main-title h1 {
16
- font-size: 48px;
17
- font-weight: 800;
18
- margin: 0 0 8px 0;
19
- letter-spacing: -1px;
20
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
21
  -webkit-background-clip: text;
22
  -webkit-text-fill-color: transparent;
23
  background-clip: text;
 
24
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  .main-title p {
26
- font-size: 20px;
27
- margin: 0;
28
- color: #666;
29
  font-weight: 400;
30
- line-height: 1.4;
 
 
 
 
 
 
 
 
 
 
31
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  .stats-header {
33
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
34
- color: white;
35
- padding: 30px 20px;
36
  text-align: center;
37
- margin-bottom: 30px;
38
- border-radius: 12px;
39
- box-shadow: 0 8px 32px rgba(0,0,0,0.1);
 
 
40
  }
 
41
  .stats-header p {
42
  font-size: 16px;
43
- margin: 0 0 20px 0;
44
- opacity: 0.9;
45
- font-weight: 400;
46
- line-height: 1.5;
47
  }
 
48
  .win-stats {
49
  display: flex;
50
  justify-content: center;
51
- gap: 50px;
52
- margin-top: 20px;
53
  flex-wrap: wrap;
54
  }
 
55
  .stat {
56
  font-size: 16px;
57
- background: rgba(255,255,255,0.15);
58
- padding: 12px 20px;
59
- border-radius: 8px;
60
- backdrop-filter: blur(10px);
 
 
61
  border: 1px solid rgba(255,255,255,0.2);
62
  }
 
 
 
 
 
 
63
  .stat .model {
64
  font-weight: 600;
65
  display: block;
66
- margin-bottom: 4px;
 
 
67
  }
 
68
  .stat .wins {
69
  color: #4ade80;
70
- font-weight: 700;
71
- font-size: 18px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
73
- .app-section { margin-bottom: 30px; background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); overflow: hidden; }
 
 
 
 
 
74
  .description-header {
75
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
76
  color: white;
77
- padding: 20px 15px;
78
  text-align: center;
79
  font-size: 18px;
80
- font-weight: 600;
81
  letter-spacing: -0.3px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
- .evaluation-section { background: #f8f9fa; border-bottom: 1px solid #eee; padding: 15px; }
84
- .evaluation-result { background: #d4edda; border: 1px solid #c3e6cb; border-radius: 4px; padding: 12px; margin-bottom: 10px; }
85
- .eval-label { font-size: 12px; color: #666; margin-bottom: 5px; }
86
- .winner { color: #155724; font-weight: bold; margin-bottom: 5px; }
87
- .reason { color: #155724; }
88
- .view-eval-btn { background: #007bff; color: white; border: none; padding: 5px 10px; border-radius: 3px; cursor: pointer; margin-top: 10px; font-size: 12px; }
89
- .full-evaluation { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 15px; margin-top: 10px; display: none; }
90
- .thinking-content { max-height: 300px; overflow-y: auto; font-size: 14px; line-height: 1.5; white-space: pre-wrap; text-align: left; color: #495057; }
91
- .implementations { display: grid; grid-template-columns: 1fr 1fr; gap: 0; }
92
- .impl-panel { border-right: 1px solid #eee; }
93
- .impl-panel:last-child { border-right: none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  .impl-header {
95
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
96
  color: white;
97
- padding: 12px 15px;
98
- font-weight: 600;
99
  text-align: center;
100
- font-size: 15px;
101
  letter-spacing: -0.2px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
103
- .iframe-container { height: 600px; }
104
- iframe { width: 100%; height: 100%; border: none; transform: scale(1); transform-origin: top left; }
105
- .error { color: red; text-align: center; padding: 20px; }
106
- /* Large screens - even bigger */
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  @media (min-width: 1400px) {
108
  .iframe-container { height: 700px; }
 
109
  }
110
 
111
- /* Medium screens */
112
  @media (max-width: 1200px) {
113
  .iframe-container { height: 500px; }
 
 
114
  }
115
 
116
- /* Small screens - stack vertically */
117
  @media (max-width: 768px) {
118
  .implementations { grid-template-columns: 1fr; }
119
- .impl-panel { border-right: none; border-bottom: 1px solid #eee; }
120
  .impl-panel:last-child { border-bottom: none; }
121
  .iframe-container { height: 400px; }
122
- .container { padding: 5px; }
123
- .description-header { padding: 10px; font-size: 14px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
  </style>
126
  </head>
@@ -215,6 +607,29 @@
215
  fullEval.style.display = 'block';
216
  }
217
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
 
219
  async function loadAppsFromHuggingFace() {
220
  const container = document.getElementById('apps-container');
@@ -228,7 +643,10 @@
228
  container.innerHTML = `
229
  <div class="main-title">
230
  <h1>JSVibes</h1>
231
- <p>Vibe testing open models for simple but useful code tasks</p>
 
 
 
232
  </div>
233
  <div class="stats-header">
234
  <p style="font-size: 14px; opacity: 0.8;">Automatically evaluated by Kimi K2 as a judge. Judgments are imperfect, test them yourself!</p>
@@ -249,8 +667,32 @@
249
  </div>
250
  </div>
251
  </div>
 
 
 
 
 
 
 
 
252
  `;
253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  data.rows.forEach((row, index) => {
255
  const app = row.row;
256
 
@@ -273,6 +715,7 @@
273
 
274
  const section = document.createElement('div');
275
  section.className = 'app-section';
 
276
  section.innerHTML = `
277
  <div class="description-header">
278
  ${index + 1}. ${app.description || 'No description available'}
 
4
  <meta charset="UTF-8">
5
  <title>Live WebApp Viewer</title>
6
  <style>
7
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
8
+
9
+ :root {
10
+ --primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
11
+ --secondary-gradient: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
12
+ --accent-gradient: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
13
+ --dark-bg: #0a0a0a;
14
+ --card-bg: #ffffff;
15
+ --text-primary: #1a1a1a;
16
+ --text-secondary: #666666;
17
+ --text-muted: #888888;
18
+ --border-color: #e5e7eb;
19
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
20
+ --shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 1px 3px rgba(0,0,0,0.06);
21
+ --shadow-lg: 0 10px 25px rgba(0,0,0,0.1), 0 4px 10px rgba(0,0,0,0.06);
22
+ --shadow-xl: 0 20px 40px rgba(0,0,0,0.1), 0 8px 20px rgba(0,0,0,0.08);
23
+ --border-radius: 16px;
24
+ --border-radius-sm: 12px;
25
+ --border-radius-lg: 24px;
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ body {
33
+ margin: 0;
34
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
35
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
36
+ color: var(--text-primary);
37
+ line-height: 1.6;
38
+ -webkit-font-smoothing: antialiased;
39
+ -moz-osx-font-smoothing: grayscale;
40
+ }
41
+
42
+ .container {
43
+ width: 100vw;
44
+ padding: 20px;
45
+ box-sizing: border-box;
46
+ max-width: 1400px;
47
+ margin: 0 auto;
48
+ }
49
+
50
+ .loading {
51
+ text-align: center;
52
+ padding: 80px 20px;
53
+ font-size: 18px;
54
+ color: var(--text-secondary);
55
+ font-weight: 500;
56
+ }
57
+
58
+ /* Main Title Section */
59
  .main-title {
60
  text-align: center;
61
+ margin-bottom: 40px;
62
  padding: 0 20px;
63
  }
64
+
65
  .main-title h1 {
66
+ font-size: clamp(36px, 8vw, 64px);
67
+ font-weight: 900;
68
+ margin: 0 0 16px 0;
69
+ letter-spacing: -2px;
70
+ background: var(--primary-gradient);
71
  -webkit-background-clip: text;
72
  -webkit-text-fill-color: transparent;
73
  background-clip: text;
74
+ position: relative;
75
  }
76
+
77
+ .main-title h1::after {
78
+ content: '';
79
+ position: absolute;
80
+ bottom: -8px;
81
+ left: 50%;
82
+ transform: translateX(-50%);
83
+ width: 60px;
84
+ height: 4px;
85
+ background: var(--accent-gradient);
86
+ border-radius: 2px;
87
+ }
88
+
89
  .main-title p {
90
+ font-size: clamp(16px, 4vw, 22px);
91
+ margin: 0 0 20px 0;
92
+ color: var(--text-secondary);
93
  font-weight: 400;
94
+ line-height: 1.5;
95
+ max-width: 600px;
96
+ margin-left: auto;
97
+ margin-right: auto;
98
+ }
99
+
100
+ .aisheets-credit {
101
+ font-size: 14px;
102
+ color: var(--text-muted);
103
+ margin-top: 16px;
104
+ font-weight: 500;
105
  }
106
+
107
+ .aisheets-credit a {
108
+ color: #667eea;
109
+ text-decoration: none;
110
+ font-weight: 600;
111
+ transition: all 0.3s ease;
112
+ padding: 4px 8px;
113
+ border-radius: 6px;
114
+ background: rgba(102, 126, 234, 0.1);
115
+ }
116
+
117
+ .aisheets-credit a:hover {
118
+ color: #764ba2;
119
+ background: rgba(118, 75, 162, 0.1);
120
+ transform: translateY(-1px);
121
+ }
122
+
123
+ /* Stats Header */
124
  .stats-header {
125
+ background: var(--card-bg);
126
+ color: var(--text-primary);
127
+ padding: 40px 30px;
128
  text-align: center;
129
+ margin-bottom: 40px;
130
+ border-radius: var(--border-radius-lg);
131
+ box-shadow: var(--shadow-xl);
132
+ border: 1px solid rgba(255,255,255,0.8);
133
+ backdrop-filter: blur(20px);
134
  }
135
+
136
  .stats-header p {
137
  font-size: 16px;
138
+ margin: 0 0 30px 0;
139
+ color: var(--text-secondary);
140
+ font-weight: 500;
141
+ line-height: 1.6;
142
  }
143
+
144
  .win-stats {
145
  display: flex;
146
  justify-content: center;
147
+ gap: 30px;
148
+ margin-top: 30px;
149
  flex-wrap: wrap;
150
  }
151
+
152
  .stat {
153
  font-size: 16px;
154
+ background: var(--primary-gradient);
155
+ padding: 20px 30px;
156
+ border-radius: var(--border-radius-sm);
157
+ color: white;
158
+ box-shadow: var(--shadow-md);
159
+ transition: all 0.3s ease;
160
  border: 1px solid rgba(255,255,255,0.2);
161
  }
162
+
163
+ .stat:hover {
164
+ transform: translateY(-2px);
165
+ box-shadow: var(--shadow-lg);
166
+ }
167
+
168
  .stat .model {
169
  font-weight: 600;
170
  display: block;
171
+ margin-bottom: 8px;
172
+ font-size: 14px;
173
+ opacity: 0.9;
174
  }
175
+
176
  .stat .wins {
177
  color: #4ade80;
178
+ font-weight: 800;
179
+ font-size: 24px;
180
+ text-shadow: 0 1px 2px rgba(0,0,0,0.1);
181
+ }
182
+
183
+ /* TOC Section */
184
+ .toc-container {
185
+ background: var(--card-bg);
186
+ border-radius: var(--border-radius-lg);
187
+ box-shadow: var(--shadow-xl);
188
+ margin-bottom: 40px;
189
+ padding: 30px;
190
+ border: 1px solid rgba(255,255,255,0.8);
191
+ backdrop-filter: blur(20px);
192
+ }
193
+
194
+ .toc-title {
195
+ font-size: 20px;
196
+ font-weight: 700;
197
+ margin-bottom: 20px;
198
+ color: var(--text-primary);
199
+ text-align: center;
200
+ cursor: pointer;
201
+ user-select: none;
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: center;
205
+ gap: 12px;
206
+ padding: 12px;
207
+ border-radius: var(--border-radius-sm);
208
+ transition: all 0.3s ease;
209
+ }
210
+
211
+ .toc-title:hover {
212
+ background: rgba(102, 126, 234, 0.1);
213
+ color: #667eea;
214
+ transform: translateY(-1px);
215
+ }
216
+
217
+ .toc-content {
218
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
219
+ overflow: hidden;
220
+ }
221
+
222
+ .toc-content.collapsed {
223
+ max-height: 0;
224
+ margin-bottom: 0;
225
+ }
226
+
227
+ .toc-content.expanded {
228
+ max-height: none;
229
+ margin-bottom: 20px;
230
+ }
231
+
232
+ .toc-grid {
233
+ display: grid;
234
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
235
+ gap: 16px;
236
+ }
237
+
238
+ .toc-item {
239
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
240
+ border: 1px solid var(--border-color);
241
+ border-radius: var(--border-radius-sm);
242
+ padding: 20px;
243
+ cursor: pointer;
244
+ transition: all 0.3s ease;
245
+ text-decoration: none;
246
+ color: inherit;
247
+ position: relative;
248
+ overflow: hidden;
249
+ }
250
+
251
+ .toc-item::before {
252
+ content: '';
253
+ position: absolute;
254
+ top: 0;
255
+ left: 0;
256
+ right: 0;
257
+ height: 3px;
258
+ background: var(--accent-gradient);
259
+ transform: scaleX(0);
260
+ transition: transform 0.3s ease;
261
+ }
262
+
263
+ .toc-item:hover {
264
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
265
+ border-color: #667eea;
266
+ transform: translateY(-4px);
267
+ box-shadow: var(--shadow-lg);
268
+ }
269
+
270
+ .toc-item:hover::before {
271
+ transform: scaleX(1);
272
+ }
273
+
274
+ .toc-number {
275
+ font-weight: 700;
276
+ color: #667eea;
277
+ margin-right: 12px;
278
+ font-size: 16px;
279
+ }
280
+
281
+ .toc-description {
282
+ font-size: 15px;
283
+ line-height: 1.5;
284
+ display: -webkit-box;
285
+ -webkit-line-clamp: 2;
286
+ -webkit-box-orient: vertical;
287
+ overflow: hidden;
288
+ font-weight: 500;
289
+ }
290
+
291
+ /* App Sections */
292
+ .app-section {
293
+ margin-bottom: 40px;
294
+ background: var(--card-bg);
295
+ border-radius: var(--border-radius-lg);
296
+ box-shadow: var(--shadow-xl);
297
+ overflow: hidden;
298
+ border: 1px solid rgba(255,255,255,0.8);
299
+ backdrop-filter: blur(20px);
300
+ transition: all 0.3s ease;
301
  }
302
+
303
+ .app-section:hover {
304
+ transform: translateY(-2px);
305
+ box-shadow: 0 25px 50px rgba(0,0,0,0.15), 0 10px 25px rgba(0,0,0,0.1);
306
+ }
307
+
308
  .description-header {
309
+ background: var(--primary-gradient);
310
  color: white;
311
+ padding: 25px 20px;
312
  text-align: center;
313
  font-size: 18px;
314
+ font-weight: 700;
315
  letter-spacing: -0.3px;
316
+ position: relative;
317
+ }
318
+
319
+ .description-header::after {
320
+ content: '';
321
+ position: absolute;
322
+ bottom: 0;
323
+ left: 0;
324
+ right: 0;
325
+ height: 1px;
326
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
327
+ }
328
+
329
+ /* Evaluation Section */
330
+ .evaluation-section {
331
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
332
+ border-bottom: 1px solid var(--border-color);
333
+ padding: 20px;
334
+ }
335
+
336
+ .evaluation-result {
337
+ background: linear-gradient(135deg, #dcfce7 0%, #bbf7d0 100%);
338
+ border: 1px solid #86efac;
339
+ border-radius: var(--border-radius-sm);
340
+ padding: 20px;
341
+ margin-bottom: 15px;
342
+ box-shadow: var(--shadow-sm);
343
+ }
344
+
345
+ .eval-label {
346
+ font-size: 12px;
347
+ color: var(--text-muted);
348
+ margin-bottom: 8px;
349
+ font-weight: 600;
350
+ text-transform: uppercase;
351
+ letter-spacing: 0.5px;
352
+ }
353
+
354
+ .winner {
355
+ color: #166534;
356
+ font-weight: 800;
357
+ margin-bottom: 8px;
358
+ font-size: 16px;
359
+ }
360
+
361
+ .reason {
362
+ color: #166534;
363
+ font-weight: 500;
364
  }
365
+
366
+ .view-eval-btn {
367
+ background: var(--primary-gradient);
368
+ color: white;
369
+ border: none;
370
+ padding: 8px 16px;
371
+ border-radius: var(--border-radius-sm);
372
+ cursor: pointer;
373
+ margin-top: 12px;
374
+ font-size: 13px;
375
+ font-weight: 600;
376
+ transition: all 0.3s ease;
377
+ }
378
+
379
+ .view-eval-btn:hover {
380
+ transform: translateY(-1px);
381
+ box-shadow: var(--shadow-md);
382
+ }
383
+
384
+ .full-evaluation {
385
+ background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
386
+ border: 1px solid #fbbf24;
387
+ border-radius: var(--border-radius-sm);
388
+ padding: 20px;
389
+ margin-top: 15px;
390
+ display: none;
391
+ box-shadow: var(--shadow-sm);
392
+ }
393
+
394
+ .thinking-content {
395
+ max-height: 300px;
396
+ overflow-y: auto;
397
+ font-size: 14px;
398
+ line-height: 1.6;
399
+ white-space: pre-wrap;
400
+ text-align: left;
401
+ color: #92400e;
402
+ font-weight: 500;
403
+ }
404
+
405
+ /* Implementation Panels */
406
+ .implementations {
407
+ display: grid;
408
+ grid-template-columns: 1fr 1fr;
409
+ gap: 0;
410
+ }
411
+
412
+ .impl-panel {
413
+ border-right: 1px solid var(--border-color);
414
+ position: relative;
415
+ }
416
+
417
+ .impl-panel:last-child {
418
+ border-right: none;
419
+ }
420
+
421
  .impl-header {
422
+ background: var(--secondary-gradient);
423
  color: white;
424
+ padding: 16px 20px;
425
+ font-weight: 700;
426
  text-align: center;
427
+ font-size: 16px;
428
  letter-spacing: -0.2px;
429
+ position: relative;
430
+ }
431
+
432
+ .impl-header::after {
433
+ content: '';
434
+ position: absolute;
435
+ bottom: 0;
436
+ left: 0;
437
+ right: 0;
438
+ height: 1px;
439
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
440
+ }
441
+
442
+ .iframe-container {
443
+ height: 600px;
444
+ background: #f8fafc;
445
+ position: relative;
446
+ }
447
+
448
+ .iframe-container::before {
449
+ content: '';
450
+ position: absolute;
451
+ top: 0;
452
+ left: 0;
453
+ right: 0;
454
+ height: 1px;
455
+ background: linear-gradient(90deg, transparent, var(--border-color), transparent);
456
  }
457
+
458
+ iframe {
459
+ width: 100%;
460
+ height: 100%;
461
+ border: none;
462
+ transform: scale(1);
463
+ transform-origin: top left;
464
+ }
465
+
466
+ .error {
467
+ color: #ef4444;
468
+ text-align: center;
469
+ padding: 40px 20px;
470
+ font-weight: 600;
471
+ }
472
+
473
+ /* Responsive Design */
474
  @media (min-width: 1400px) {
475
  .iframe-container { height: 700px; }
476
+ .container { padding: 30px; }
477
  }
478
 
 
479
  @media (max-width: 1200px) {
480
  .iframe-container { height: 500px; }
481
+ .win-stats { gap: 20px; }
482
+ .stat { padding: 16px 24px; }
483
  }
484
 
 
485
  @media (max-width: 768px) {
486
  .implementations { grid-template-columns: 1fr; }
487
+ .impl-panel { border-right: none; border-bottom: 1px solid var(--border-color); }
488
  .impl-panel:last-child { border-bottom: none; }
489
  .iframe-container { height: 400px; }
490
+ .container { padding: 15px; }
491
+ .description-header { padding: 20px 15px; font-size: 16px; }
492
+ .toc-grid { grid-template-columns: 1fr; }
493
+ .win-stats { gap: 15px; }
494
+ .stat { padding: 15px 20px; }
495
+ .main-title h1 { font-size: 48px; }
496
+ .main-title p { font-size: 18px; }
497
+ }
498
+
499
+ /* Scrollbar Styling */
500
+ ::-webkit-scrollbar {
501
+ width: 8px;
502
+ }
503
+
504
+ ::-webkit-scrollbar-track {
505
+ background: #f1f5f9;
506
+ border-radius: 4px;
507
+ }
508
+
509
+ ::-webkit-scrollbar-thumb {
510
+ background: var(--primary-gradient);
511
+ border-radius: 4px;
512
+ }
513
+
514
+ ::-webkit-scrollbar-thumb:hover {
515
+ background: var(--secondary-gradient);
516
  }
517
  </style>
518
  </head>
 
607
  fullEval.style.display = 'block';
608
  }
609
  }
610
+
611
+ function scrollToApp(index) {
612
+ const appSection = document.getElementById(`app-${index}`);
613
+ if (appSection) {
614
+ appSection.scrollIntoView({ behavior: 'smooth', block: 'start' });
615
+ }
616
+ }
617
+
618
+ function toggleTOC() {
619
+ const tocContent = document.getElementById('toc-content');
620
+ const tocTitle = document.getElementById('toc-title');
621
+ const isCollapsed = tocContent.classList.contains('collapsed');
622
+
623
+ if (isCollapsed) {
624
+ tocContent.classList.remove('collapsed');
625
+ tocContent.classList.add('expanded');
626
+ tocTitle.innerHTML = '📋 List of Apps ▼';
627
+ } else {
628
+ tocContent.classList.remove('expanded');
629
+ tocContent.classList.add('collapsed');
630
+ tocTitle.innerHTML = '📋 List of Apps ▶';
631
+ }
632
+ }
633
 
634
  async function loadAppsFromHuggingFace() {
635
  const container = document.getElementById('apps-container');
 
643
  container.innerHTML = `
644
  <div class="main-title">
645
  <h1>JSVibes</h1>
646
+ <p>Vibe testing open models for simple but useful (web) code tasks</p>
647
+ <div class="aisheets-credit">
648
+ Built with <a href="https://huggingface.co/spaces/aisheets/sheets" target="_blank">AISheets</a>
649
+ </div>
650
  </div>
651
  <div class="stats-header">
652
  <p style="font-size: 14px; opacity: 0.8;">Automatically evaluated by Kimi K2 as a judge. Judgments are imperfect, test them yourself!</p>
 
667
  </div>
668
  </div>
669
  </div>
670
+ <div class="toc-container">
671
+ <div class="toc-title" id="toc-title" onclick="toggleTOC()">📋 List of Apps ▶</div>
672
+ <div class="toc-content collapsed" id="toc-content">
673
+ <div class="toc-grid" id="toc-grid">
674
+ <!-- TOC items will be populated here -->
675
+ </div>
676
+ </div>
677
+ </div>
678
  `;
679
 
680
+ // Build TOC first
681
+ const tocGrid = document.getElementById('toc-grid');
682
+ data.rows.forEach((row, index) => {
683
+ const app = row.row;
684
+ const tocItem = document.createElement('div');
685
+ tocItem.className = 'toc-item';
686
+ tocItem.onclick = () => scrollToApp(index);
687
+ tocItem.innerHTML = `
688
+ <div>
689
+ <span class="toc-number">#${index + 1}</span>
690
+ <span class="toc-description">${app.description || 'No description available'}</span>
691
+ </div>
692
+ `;
693
+ tocGrid.appendChild(tocItem);
694
+ });
695
+
696
  data.rows.forEach((row, index) => {
697
  const app = row.row;
698
 
 
715
 
716
  const section = document.createElement('div');
717
  section.className = 'app-section';
718
+ section.id = `app-${index}`;
719
  section.innerHTML = `
720
  <div class="description-header">
721
  ${index + 1}. ${app.description || 'No description available'}