CompactAI commited on
Commit
a759e31
·
verified ·
1 Parent(s): 812487b

Upload 3 files

Browse files
Files changed (2) hide show
  1. compact.webp +0 -0
  2. index.html +759 -219
compact.webp ADDED
index.html CHANGED
@@ -3,7 +3,7 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Model Golf | FMN-GPT</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono&display=swap" rel="stylesheet">
@@ -29,7 +29,7 @@
29
  --gold-gradient: linear-gradient(135deg, #ffd633 0%, #c8960c 50%, #a0760a 100%);
30
  --font-sans: 'Geist', -apple-system, BlinkMacSystemFont, sans-serif;
31
  --font-mono: 'Geist Mono', 'SF Mono', 'Fira Code', monospace;
32
- --container-max: 1100px;
33
  }
34
  * { box-sizing: border-box; margin: 0; padding: 0; }
35
  html { font-size: 16px; scroll-behavior: smooth; }
@@ -39,7 +39,6 @@
39
  color: var(--white-muted);
40
  line-height: 1.7;
41
  -webkit-font-smoothing: antialiased;
42
- position: relative;
43
  }
44
  body::before {
45
  content: '';
@@ -65,70 +64,216 @@
65
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
66
  background-size: 256px 256px;
67
  }
68
- a { color: var(--white); text-decoration: none; transition: color 0.15s ease; }
69
  a:hover { color: var(--accent); }
70
- .container { max-width: var(--container-max); margin: 0 auto; padding: 0 24px; position: relative; z-index: 1; }
 
 
 
 
 
71
 
72
- @keyframes fadeSlideUp {
73
- from { opacity: 0; transform: translateY(24px); }
74
- to { opacity: 1; transform: translateY(0); }
 
 
 
 
75
  }
76
- @keyframes fadeSlideUpScroll {
77
- from { opacity: 0; transform: translateY(30px); }
78
- to { opacity: 1; transform: translateY(0); }
 
 
 
 
 
 
 
 
79
  }
80
- @keyframes pulse {
81
- 0%, 100% { opacity: 1; transform: scale(1); }
82
- 50% { opacity: 0.4; transform: scale(0.9); }
83
  }
84
- @keyframes goldShimmer {
85
- 0% { background-position: -200% center; }
86
- 100% { background-position: 200% center; }
 
 
 
 
 
 
87
  }
88
- @keyframes borderGlow {
89
- 0%, 100% { border-color: rgba(200, 150, 12, 0.2); box-shadow: 0 0 20px rgba(200, 150, 12, 0.02); }
90
- 50% { border-color: rgba(200, 150, 12, 0.5); box-shadow: 0 0 40px rgba(200, 150, 12, 0.08); }
 
 
 
 
 
 
91
  }
92
- @keyframes shimmerSweep {
93
- 0% { transform: translateX(-100%); }
94
- 100% { transform: translateX(100%); }
 
 
95
  }
96
- .reveal {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  opacity: 0;
98
- transform: translateY(30px);
99
- transition: all 0.7s cubic-bezier(0.22, 1, 0.36, 1);
100
  }
101
- .reveal.visible {
102
  opacity: 1;
103
- transform: translateY(0);
104
  }
105
- .reveal-delay-1 { transition-delay: 0.1s; }
106
- .reveal-delay-2 { transition-delay: 0.2s; }
107
- .reveal-delay-3 { transition-delay: 0.3s; }
108
- .reveal-delay-4 { transition-delay: 0.4s; }
109
 
110
- nav {
111
  position: fixed;
112
- top: 0; left: 0; right: 0;
113
- z-index: 100;
114
- background: rgba(0, 0, 0, 0.85);
115
- backdrop-filter: blur(12px);
116
- border-bottom: 1px solid var(--blue-600);
117
- padding: 16px 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  }
119
- nav .container { display: flex; justify-content: space-between; align-items: center; }
120
- .nav-brand { font-size: 18px; font-weight: 600; color: var(--white); display: flex; align-items: center; gap: 8px; }
121
- .nav-brand span { color: var(--accent); }
122
- .nav-links { display: flex; gap: 32px; }
123
- .nav-links a { font-size: 14px; font-weight: 500; color: var(--blue-200); }
124
- .nav-links a:hover { color: var(--white); }
125
 
126
  .hero {
127
  min-height: 100vh;
128
  display: flex;
129
  flex-direction: column;
130
  justify-content: center;
131
- padding: 140px 0 80px;
132
  position: relative;
133
  overflow: hidden;
134
  }
@@ -140,8 +285,38 @@
140
  radial-gradient(ellipse 100% 60% at 50% -20%, rgba(200, 150, 12, 0.08), transparent),
141
  radial-gradient(ellipse 60% 50% at 80% 80%, rgba(200, 150, 12, 0.04), transparent);
142
  pointer-events: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  }
144
- .hero-content { position: relative; z-index: 1; }
 
 
 
 
 
 
 
 
 
 
 
 
145
  .hero-badge {
146
  display: inline-flex;
147
  align-items: center;
@@ -156,13 +331,13 @@
156
  letter-spacing: 0.08em;
157
  margin-bottom: 32px;
158
  opacity: 0;
159
- animation: fadeSlideUp 0.8s ease 0.1s forwards;
160
  }
161
  .hero-badge .dot {
162
  width: 6px; height: 6px;
163
  background: var(--accent-bright);
164
  border-radius: 50%;
165
- animation: pulse 2s infinite;
166
  }
167
  .hero h1 {
168
  font-size: clamp(64px, 12vw, 120px);
@@ -171,7 +346,7 @@
171
  letter-spacing: -0.04em;
172
  margin-bottom: 16px;
173
  opacity: 0;
174
- animation: fadeSlideUp 0.8s ease 0.2s forwards;
175
  }
176
  .hero h1 .highlight {
177
  background: linear-gradient(135deg, #ffd633, #c8960c, #ffd633);
@@ -179,42 +354,52 @@
179
  -webkit-background-clip: text;
180
  -webkit-text-fill-color: transparent;
181
  background-clip: text;
182
- animation: goldShimmer 4s linear infinite;
183
- }
184
- .hero h1 {
185
- perspective: 800px;
186
- }
187
- .hero h1 .highlight {
188
- display: inline-block;
189
  }
190
  .hero-subtitle {
191
- font-size: clamp(18px, 2.5vw, 24px);
192
  color: var(--blue-200);
193
- max-width: 640px;
194
  margin-bottom: 48px;
195
- line-height: 1.5;
196
  opacity: 0;
197
- animation: fadeSlideUp 0.8s ease 0.3s forwards;
198
  }
 
199
  .hero-cta {
200
  display: flex;
201
  gap: 16px;
202
  flex-wrap: wrap;
203
  margin-bottom: 80px;
204
  opacity: 0;
205
- animation: fadeSlideUp 0.8s ease 0.4s forwards;
206
  }
207
  .btn {
208
  display: inline-flex;
209
  align-items: center;
210
  justify-content: center;
211
- padding: 14px 28px;
212
  font-size: 15px;
213
  font-weight: 500;
214
  border-radius: 8px;
215
- transition: all 0.15s ease;
216
  cursor: pointer;
217
  font-family: var(--font-sans);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  }
219
  .btn-primary {
220
  background: linear-gradient(135deg, #ffd633, #c8960c, #ffd633);
@@ -222,12 +407,11 @@
222
  color: var(--blue-900);
223
  border: none;
224
  font-weight: 600;
225
- animation: goldShimmer 4s linear infinite;
226
- transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
227
  }
228
  .btn-primary:hover {
229
- transform: translateY(-3px) scale(1.02);
230
- box-shadow: 0 12px 40px rgba(200, 150, 12, 0.35);
231
  }
232
  .btn-secondary {
233
  background: transparent;
@@ -237,7 +421,7 @@
237
  .btn-secondary:hover {
238
  border-color: var(--accent);
239
  color: var(--white);
240
- transform: translateY(-2px);
241
  }
242
 
243
  .hero-stats {
@@ -245,7 +429,7 @@
245
  grid-template-columns: repeat(4, 1fr);
246
  gap: 16px;
247
  opacity: 0;
248
- animation: fadeSlideUp 0.8s ease 0.5s forwards;
249
  }
250
  .hero-stat {
251
  background: rgba(10, 10, 10, 0.8);
@@ -253,25 +437,25 @@
253
  border-radius: 12px;
254
  padding: 28px 16px;
255
  text-align: center;
256
- transition: all 0.3s ease;
257
  position: relative;
258
  overflow: hidden;
259
  }
260
- .hero-stat:hover {
261
- border-color: rgba(200, 150, 12, 0.4);
262
- transform: translateY(-4px);
263
- box-shadow: 0 8px 30px rgba(200, 150, 12, 0.08);
264
- }
265
  .hero-stat::before {
266
  content: '';
267
  position: absolute;
268
- top: 0; left: 0; right: 0;
269
- height: 2px;
270
- background: var(--gold-gradient);
271
  opacity: 0;
272
- transition: opacity 0.3s ease;
 
273
  }
274
  .hero-stat:hover::before { opacity: 1; }
 
 
 
 
 
275
  .hero-stat .number {
276
  font-size: clamp(32px, 4vw, 48px);
277
  font-weight: 700;
@@ -283,15 +467,17 @@
283
  font-family: var(--font-mono);
284
  line-height: 1.1;
285
  margin-bottom: 6px;
286
- animation: goldShimmer 5s linear infinite;
 
 
287
  }
288
- .hero-stat .label { font-size: 13px; color: var(--blue-200); font-weight: 500; }
289
- .hero-stat .sublabel { font-size: 11px; color: var(--blue-300); margin-top: 4px; }
290
 
291
  .section {
292
- padding: 80px 0;
293
  position: relative;
294
- z-index: 1;
295
  }
296
  .section.alt {
297
  background: var(--blue-800);
@@ -300,7 +486,7 @@
300
  }
301
  .section-header {
302
  text-align: center;
303
- margin-bottom: 48px;
304
  }
305
  .section-header h2 {
306
  font-size: 36px;
@@ -316,7 +502,7 @@
316
  margin: 0 auto;
317
  }
318
  .section-body {
319
- max-width: 720px;
320
  margin: 0 auto;
321
  }
322
  .section-body p {
@@ -329,35 +515,43 @@
329
  .two-col {
330
  display: grid;
331
  grid-template-columns: 1fr 1fr;
332
- gap: 24px;
 
333
  margin: 0 auto;
334
- max-width: 900px;
335
  }
336
  .col-card {
337
  background: var(--blue-800);
338
  border: 1px solid var(--blue-600);
339
  border-radius: 12px;
340
  padding: 32px;
341
- transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
342
  position: relative;
343
  overflow: hidden;
344
  }
 
 
 
 
 
 
 
 
 
 
345
  .col-card::after {
346
  content: '';
347
  position: absolute;
348
  top: 0; left: -100%;
349
  width: 100%; height: 100%;
350
- background: linear-gradient(90deg, transparent, rgba(200, 150, 12, 0.03), transparent);
351
- transition: left 0.6s ease;
352
  pointer-events: none;
353
  }
354
- .col-card:hover::after {
355
- left: 100%;
356
- }
357
  .col-card:hover {
358
  border-color: rgba(200, 150, 12, 0.35);
359
- transform: translateY(-3px);
360
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
361
  }
362
  .col-card h3 {
363
  font-size: 20px;
@@ -367,18 +561,10 @@
367
  display: flex;
368
  align-items: center;
369
  gap: 10px;
 
 
370
  }
371
- .col-card h3 .icon {
372
- width: 32px; height: 32px;
373
- display: flex;
374
- align-items: center;
375
- justify-content: center;
376
- font-size: 18px;
377
- }
378
- .col-card ul {
379
- list-style: none;
380
- padding: 0;
381
- }
382
  .col-card li {
383
  padding: 10px 0;
384
  border-bottom: 1px solid var(--blue-600);
@@ -391,12 +577,66 @@
391
  .col-card li:last-child { border-bottom: none; }
392
  .col-card li .check { color: var(--accent); font-weight: 700; flex-shrink: 0; }
393
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
394
  .rules-card {
395
  background: var(--blue-800);
396
  border: 1px solid var(--blue-600);
397
  border-radius: 12px;
398
  padding: 32px;
399
- max-width: 720px;
400
  margin: 0 auto;
401
  transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
402
  animation: borderGlow 4s ease-in-out infinite;
@@ -408,6 +648,8 @@
408
  padding: 14px 0;
409
  border-bottom: 1px solid var(--blue-600);
410
  gap: 12px;
 
 
411
  }
412
  .rules-card .rule-row:last-child { border-bottom: none; }
413
  .rules-card .rule-icon { color: var(--accent); font-weight: 700; width: 20px; text-align: center; flex-shrink: 0; }
@@ -421,46 +663,46 @@
421
  margin-top: 16px;
422
  padding-top: 16px;
423
  border-top: 1px solid var(--blue-600);
 
 
424
  }
425
 
426
  .how-grid {
427
  display: grid;
428
  grid-template-columns: repeat(3, 1fr);
429
- gap: 20px;
430
- max-width: 900px;
431
  margin: 0 auto;
432
  }
433
  .how-step {
434
  background: var(--blue-800);
435
  border: 1px solid var(--blue-600);
436
  border-radius: 12px;
437
- padding: 32px 24px;
438
  text-align: center;
439
- transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
440
  position: relative;
441
  overflow: hidden;
442
  }
443
- .how-step::after {
444
  content: '';
445
  position: absolute;
446
- top: 0; left: -100%;
447
- width: 100%; height: 100%;
448
- background: linear-gradient(90deg, transparent, rgba(200, 150, 12, 0.03), transparent);
449
- transition: left 0.6s ease;
450
  pointer-events: none;
451
  }
452
- .how-step:hover::after {
453
- left: 100%;
454
- }
455
  .how-step:hover {
456
  border-color: rgba(200, 150, 12, 0.35);
457
- transform: translateY(-4px);
458
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
459
  }
460
  .how-step .step-num {
461
- width: 40px; height: 40px;
462
  border-radius: 50%;
463
- background: var(--gold-gradient);
464
  color: var(--blue-900);
465
  font-weight: 700;
466
  font-size: 16px;
@@ -468,15 +710,89 @@
468
  align-items: center;
469
  justify-content: center;
470
  margin: 0 auto 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
  }
472
- .how-step h4 { font-size: 16px; font-weight: 600; color: var(--white); margin-bottom: 10px; }
473
- .how-step p { font-size: 14px; color: var(--blue-200); line-height: 1.6; margin: 0; }
474
 
475
  .cta-section {
476
- padding: 100px 0;
477
  text-align: center;
478
  position: relative;
479
  overflow: hidden;
 
480
  }
481
  .cta-section::before {
482
  content: '';
@@ -494,9 +810,11 @@
494
  }
495
  .cta-section h2 .highlight {
496
  background: var(--gold-gradient);
 
497
  -webkit-background-clip: text;
498
  -webkit-text-fill-color: transparent;
499
  background-clip: text;
 
500
  }
501
  .cta-section p {
502
  font-size: 18px;
@@ -511,23 +829,38 @@
511
  flex-wrap: wrap;
512
  }
513
 
 
 
514
  footer {
515
  padding: 60px 0;
516
  background: var(--blue-800);
517
  border-top: 1px solid var(--blue-600);
518
  text-align: center;
519
  position: relative;
520
- z-index: 1;
521
  }
522
  footer p { color: var(--blue-200); font-size: 14px; margin-bottom: 8px; }
523
  footer a { color: var(--blue-200); }
524
  footer a:hover { color: var(--accent); }
525
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
  @media (max-width: 768px) {
527
  .hero-stats { grid-template-columns: repeat(2, 1fr); }
528
  .two-col { grid-template-columns: 1fr; }
 
529
  .how-grid { grid-template-columns: 1fr; }
530
- .nav-links { display: none; }
531
  .hero h1 { font-size: clamp(40px, 15vw, 64px); }
532
  .cta-section h2 { font-size: 32px; }
533
  .rules-card .rule-row { flex-wrap: wrap; gap: 4px; }
@@ -537,148 +870,161 @@
537
  </head>
538
  <body>
539
 
540
- <nav>
541
- <div class="container">
542
- <a href="https://compactai-o-homepage.static.hf.space/" class="nav-brand"><span>/</span>FMN-GPT</a>
543
- <div class="nav-links">
544
- <a href="https://compactai-o-homepage.static.hf.space/blog.html">Blog</a>
545
- <a href="https://compactai-o-homepage.static.hf.space/status.html">Model Status</a>
546
- <a href="https://huggingface.co/CompactAI-O" target="_blank">HuggingFace Org</a>
547
- </div>
548
- </div>
549
- </nav>
 
550
 
551
- <main>
552
- <section class="hero">
 
 
 
 
 
 
 
 
553
  <div class="container hero-content">
554
- <div class="hero-badge">
555
- <span class="dot"></span>
 
 
 
 
556
  Monthly Competition &mdash; Open To Everyone
557
  </div>
558
- <h1>Model <span class="highlight">Golf</span></h1>
559
- <p class="hero-subtitle">Build the best language model under 100 million parameters. Minimum 1028-token context. Winner receives $50 in RunPod credits. Open source only. Monthly rounds.</p>
560
- <div class="hero-cta">
561
  <a href="#rules" class="btn btn-primary">View Rules</a>
562
  <a href="#participate" class="btn btn-secondary">How To Join</a>
563
- <a href="https://discord.gg/y2jTct6Cxv" target="_blank" class="btn btn-secondary">Join Discord</a>
564
  </div>
565
- <div class="hero-stats">
566
- <div class="hero-stat">
567
- <div class="number">&lt;100M</div>
568
  <div class="label">Parameter Limit</div>
569
  <div class="sublabel">Strict upper bound</div>
570
  </div>
571
- <div class="hero-stat">
572
- <div class="number">1028+</div>
573
  <div class="label">Context Window</div>
574
  <div class="sublabel">Minimum tokens</div>
575
  </div>
576
- <div class="hero-stat">
577
- <div class="number">$50</div>
578
  <div class="label">RunPod Credits</div>
579
  <div class="sublabel">Monthly prize</div>
580
  </div>
581
- <div class="hero-stat">
582
- <div class="number">30d</div>
583
- <div class="label">Competition Cycle</div>
584
- <div class="sublabel">Monthly rounds</div>
585
  </div>
586
  </div>
587
  </div>
588
  </section>
589
 
590
- <section class="section reveal" id="what">
591
  <div class="container">
592
  <div class="section-header">
593
- <h2>What It Is</h2>
594
  </div>
595
  <div class="two-col">
596
- <div class="col-card">
597
- <h3><span class="icon">&#x2713;</span>What Model Golf <em style="font-style: normal; color: var(--white);">Is</em></h3>
598
- <ul>
599
- <li><span class="check">&#x2713;</span> A monthly parameter-efficiency competition</li>
600
- <li><span class="check">&#x2713;</span> Open to anyone, anywhere</li>
601
- <li><span class="check">&#x2713;</span> Fully custom architectures allowed</li>
602
- <li><span class="check">&#x2713;</span> Novel tokenization &amp; training schemes welcome</li>
603
- <li><span class="check">&#x2713;</span> Open source by design</li>
604
- <li><span class="check">&#x2713;</span> $50 RunPod credits to the winner</li>
605
  </ul>
606
  </div>
607
- <div class="col-card">
608
- <h3><span class="icon" style="color: var(--blue-400);">&#x2717;</span>What It Is <em style="font-style: normal; color: var(--blue-400);">Not</em></h3>
609
- <ul>
610
- <li><span class="check" style="color: var(--blue-400);">&#x2717;</span> Not a Kaggle-style dataset contest</li>
611
- <li><span class="check" style="color: var(--blue-400);">&#x2717;</span> Not restricted to existing architectures</li>
612
- <li><span class="check" style="color: var(--blue-400);">&#x2717;</span> Not limited by llama.cpp compatibility</li>
613
- <li><span class="check" style="color: var(--blue-400);">&#x2717;</span> Not a fixed-benchmark leaderboard</li>
614
- <li><span class="check" style="color: var(--blue-400);">&#x2717;</span> Not for closed-source submissions</li>
615
  </ul>
616
  </div>
617
  </div>
618
  </div>
619
  </section>
620
 
621
- <section class="section reveal reveal-delay-1" id="rules">
622
  <div class="container">
623
  <div class="section-header">
624
- <h2>The Rules</h2>
625
  <p>Simple and clear. Complexity discourages participation.</p>
626
  </div>
627
- <div class="rules-card">
628
  <div class="rule-row">
629
- <span class="rule-icon">&#x2713;</span>
630
  <span class="rule-label">License</span>
631
  <span class="rule-desc">MIT, GPL, Apache, or AGPL (any version)</span>
632
  </div>
633
  <div class="rule-row">
634
- <span class="rule-icon">&#x2713;</span>
635
  <span class="rule-label">Parameters</span>
636
  <span class="rule-desc">Must be smaller than 100 million</span>
637
  </div>
638
  <div class="rule-row">
639
- <span class="rule-icon">&#x2713;</span>
640
  <span class="rule-label">Context</span>
641
  <span class="rule-desc">Minimum 1028 tokens</span>
642
  </div>
643
  <div class="rule-row">
644
- <span class="rule-icon">&#x2713;</span>
645
  <span class="rule-label">Platform</span>
646
  <span class="rule-desc">No requirement for llama.cpp compatibility</span>
647
  </div>
648
  <div class="rule-row">
649
- <span class="rule-icon">&#x2713;</span>
650
  <span class="rule-label">AI Assistance</span>
651
  <span class="rule-desc">Up to 45% of work can be AI-generated</span>
652
  </div>
653
  <div class="rule-row">
654
- <span class="rule-icon">&#x2713;</span>
655
  <span class="rule-label">Submission</span>
656
  <span class="rule-desc">Open source repository with documentation</span>
657
  </div>
658
- <div class="rules-tagline"># Simple. Clear. Enforceable.</div>
659
  </div>
660
  </div>
661
  </section>
662
 
663
- <section class="section alt reveal reveal-delay-2" id="participate">
664
  <div class="container">
665
  <div class="section-header">
666
- <h2>How To Join</h2>
667
- <p>The first competition launches soon. Here is how it will work.</p>
668
  </div>
669
  <div class="how-grid">
670
- <div class="how-step">
671
- <div class="step-num">1</div>
672
  <h4>Build</h4>
673
  <p>Create a language model under 100M parameters with at least 1028-token context. Any architecture. Any approach.</p>
674
  </div>
675
- <div class="how-step">
676
- <div class="step-num">2</div>
677
  <h4>Document</h4>
678
  <p>Open source your repository with full documentation. Include parameter count, context window, and approach summary.</p>
679
  </div>
680
- <div class="how-step">
681
- <div class="step-num">3</div>
682
  <h4>Submit</h4>
683
  <p>Submit your repo link when the competition opens. Submissions are evaluated monthly. Winner gets $50 in RunPod credits.</p>
684
  </div>
@@ -686,10 +1032,83 @@
686
  </div>
687
  </section>
688
 
689
- <section class="section reveal reveal-delay-1">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
690
  <div class="container">
691
  <div class="section-header">
692
- <h2>Why Small Models?</h2>
693
  <p>Parameter efficiency is the path to democratized AI.</p>
694
  </div>
695
  <div class="section-body">
@@ -701,39 +1120,160 @@
701
 
702
  <section class="cta-section">
703
  <div class="container">
704
- <h2>Ready To <span class="highlight">Compete</span>?</h2>
705
- <p>The first Model Golf competition launches soon. Join the Discord for updates.</p>
706
  <div class="cta-links">
707
- <a href="https://discord.gg/y2jTct6Cxv" target="_blank" class="btn btn-primary">Join Discord</a>
708
- <a href="https://compactai-o-homepage.static.hf.space/blog.html" class="btn btn-secondary">Read The Blog</a>
709
  </div>
710
  </div>
711
  </section>
712
  </main>
713
 
714
- <footer>
715
  <div class="container">
716
  <p>Built with curiosity over compute</p>
717
- <p>FMN-GPT by <a href="https://huggingface.co/CompactAI-O" target="_blank">CompactAI-O</a> | 2026</p>
718
  </div>
719
  </footer>
720
 
721
  <script>
722
- (function() {
723
- var reveal = document.querySelectorAll('.reveal');
724
- if ('IntersectionObserver' in window) {
725
- var observer = new IntersectionObserver(function(entries) {
726
- entries.forEach(function(entry) {
727
- if (entry.isIntersecting) {
728
- entry.target.classList.add('visible');
729
- }
730
- });
731
- }, { threshold: 0.15 });
732
- reveal.forEach(function(el) { observer.observe(el); });
733
- } else {
734
- reveal.forEach(function(el) { el.classList.add('visible'); });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
735
  }
736
- })();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
737
  </script>
738
  </body>
739
  </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Model Golf Monthly Parameter-Efficiency Competition</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono&display=swap" rel="stylesheet">
 
29
  --gold-gradient: linear-gradient(135deg, #ffd633 0%, #c8960c 50%, #a0760a 100%);
30
  --font-sans: 'Geist', -apple-system, BlinkMacSystemFont, sans-serif;
31
  --font-mono: 'Geist Mono', 'SF Mono', 'Fira Code', monospace;
32
+ --container-max: 1400px;
33
  }
34
  * { box-sizing: border-box; margin: 0; padding: 0; }
35
  html { font-size: 16px; scroll-behavior: smooth; }
 
39
  color: var(--white-muted);
40
  line-height: 1.7;
41
  -webkit-font-smoothing: antialiased;
 
42
  }
43
  body::before {
44
  content: '';
 
64
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
65
  background-size: 256px 256px;
66
  }
67
+ a { color: var(--white); text-decoration: none; }
68
  a:hover { color: var(--accent); }
69
+ a:focus-visible {
70
+ outline: 2px solid var(--accent-bright);
71
+ outline-offset: 3px;
72
+ border-radius: 2px;
73
+ }
74
+ .container { max-width: var(--container-max); margin: 0 auto; padding: 0 24px; position: relative; z-index: 2; }
75
 
76
+ .sr-only {
77
+ position: absolute;
78
+ width: 1px; height: 1px;
79
+ margin: -1px; padding: 0;
80
+ overflow: hidden;
81
+ clip: rect(0,0,0,0);
82
+ border: 0;
83
  }
84
+ .skip-link {
85
+ position: absolute;
86
+ top: -100%;
87
+ left: 16px;
88
+ padding: 12px 24px;
89
+ background: var(--accent);
90
+ color: var(--blue-900);
91
+ font-weight: 600;
92
+ border-radius: 0 0 8px 8px;
93
+ z-index: 999;
94
+ transition: top 0.2s;
95
  }
96
+ .skip-link:focus {
97
+ top: 0;
 
98
  }
99
+
100
+ #bg-canvas {
101
+ position: fixed;
102
+ top: 0; left: 0;
103
+ width: 100vw;
104
+ height: 100vh;
105
+ z-index: 0;
106
+ pointer-events: none;
107
+ opacity: 0.45;
108
  }
109
+
110
+ .scroll-track {
111
+ position: fixed;
112
+ right: 24px;
113
+ top: 100px;
114
+ bottom: 100px;
115
+ width: 3px;
116
+ z-index: 3;
117
+ pointer-events: none;
118
  }
119
+ .scroll-track .track-bg {
120
+ position: absolute;
121
+ inset: 0;
122
+ background: var(--blue-500);
123
+ border-radius: 2px;
124
  }
125
+ .scroll-track .track-fill {
126
+ position: absolute;
127
+ top: 0; left: 0;
128
+ width: 100%;
129
+ height: 0%;
130
+ background: linear-gradient(to bottom, var(--accent-bright), var(--accent));
131
+ border-radius: 2px;
132
+ transition: height 0.1s linear;
133
+ }
134
+ .scroll-track .track-label {
135
+ position: absolute;
136
+ right: 14px;
137
+ font-size: 10px;
138
+ font-weight: 600;
139
+ letter-spacing: 0.12em;
140
+ text-transform: uppercase;
141
+ color: var(--blue-300);
142
+ white-space: nowrap;
143
+ }
144
+ .scroll-track .track-label.top {
145
+ top: 0;
146
+ transform: translateY(-50%);
147
+ }
148
+ .scroll-track .track-label.bottom {
149
+ bottom: 0;
150
+ transform: translateY(50%);
151
+ }
152
+ .scroll-track .track-pct {
153
+ position: absolute;
154
+ right: 16px;
155
+ top: 50%;
156
+ transform: translateY(-50%);
157
+ font-size: 10px;
158
+ font-weight: 600;
159
+ font-family: var(--font-mono);
160
+ color: var(--blue-300);
161
  opacity: 0;
162
+ transition: opacity 0.3s ease;
 
163
  }
164
+ .scroll-track:hover .track-pct {
165
  opacity: 1;
 
166
  }
 
 
 
 
167
 
168
+ .side-ghost {
169
  position: fixed;
170
+ z-index: 1;
171
+ pointer-events: none;
172
+ font-weight: 800;
173
+ line-height: 1;
174
+ letter-spacing: -0.06em;
175
+ font-family: var(--font-sans);
176
+ user-select: none;
177
+ writing-mode: vertical-lr;
178
+ text-orientation: mixed;
179
+ background: linear-gradient(to bottom, rgba(200,150,12,0.15), rgba(200,150,12,0.05));
180
+ -webkit-background-clip: text;
181
+ -webkit-text-fill-color: transparent;
182
+ background-clip: text;
183
+ }
184
+ .side-ghost.left {
185
+ left: 16px;
186
+ top: 50%;
187
+ transform: translateY(-50%);
188
+ font-size: clamp(120px, 20vw, 300px);
189
+ }
190
+ .side-ghost.right {
191
+ right: 16px;
192
+ top: 50%;
193
+ transform: translateY(-50%);
194
+ font-size: clamp(80px, 14vw, 200px);
195
+ background: linear-gradient(to bottom, rgba(255,214,51,0.15), rgba(200,150,12,0.05));
196
+ -webkit-background-clip: text;
197
+ -webkit-text-fill-color: transparent;
198
+ background-clip: text;
199
+ }
200
+
201
+ .corner-accent {
202
+ position: fixed;
203
+ z-index: 1;
204
+ pointer-events: none;
205
+ }
206
+ .corner-accent.tl {
207
+ top: 32px; left: 32px;
208
+ width: 48px; height: 48px;
209
+ border-top: 1px solid rgba(200, 150, 12, 0.12);
210
+ border-left: 1px solid rgba(200, 150, 12, 0.12);
211
+ }
212
+ .corner-accent.tr {
213
+ top: 32px; right: 32px;
214
+ width: 48px; height: 48px;
215
+ border-top: 1px solid rgba(200, 150, 12, 0.12);
216
+ border-right: 1px solid rgba(200, 150, 12, 0.12);
217
+ }
218
+ .corner-accent.bl {
219
+ bottom: 32px; left: 32px;
220
+ width: 48px; height: 48px;
221
+ border-bottom: 1px solid rgba(200, 150, 12, 0.12);
222
+ border-left: 1px solid rgba(200, 150, 12, 0.12);
223
+ }
224
+ .corner-accent.br {
225
+ bottom: 32px; right: 32px;
226
+ width: 48px; height: 48px;
227
+ border-bottom: 1px solid rgba(200, 150, 12, 0.12);
228
+ border-right: 1px solid rgba(200, 150, 12, 0.12);
229
+ }
230
+
231
+ @media (max-width: 1024px) {
232
+ .side-ghost { display: none; }
233
+ .corner-accent { display: none; }
234
+ }
235
+ @media (max-width: 768px) {
236
+ .scroll-track { display: none; }
237
+ }
238
+
239
+ @keyframes fadeUp {
240
+ from { opacity: 0; transform: translateY(40px) scale(0.96); }
241
+ to { opacity: 1; transform: translateY(0) scale(1); }
242
+ }
243
+ @keyframes float {
244
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
245
+ 33% { transform: translateY(-8px) rotate(1deg); }
246
+ 66% { transform: translateY(4px) rotate(-0.5deg); }
247
+ }
248
+ @keyframes borderGlow {
249
+ 0%, 100% { border-color: rgba(200, 150, 12, 0.2); box-shadow: 0 0 20px rgba(200, 150, 12, 0.02); }
250
+ 50% { border-color: rgba(200, 150, 12, 0.5); box-shadow: 0 0 40px rgba(200, 150, 12, 0.08); }
251
+ }
252
+ @keyframes shimmer {
253
+ 0% { background-position: -200% center; }
254
+ 100% { background-position: 200% center; }
255
+ }
256
+ @keyframes accordionOpen {
257
+ from { opacity: 0; max-height: 0; }
258
+ to { opacity: 1; max-height: 300px; }
259
+ }
260
+
261
+ @media (prefers-reduced-motion: reduce) {
262
+ *, *::before, *::after {
263
+ animation-duration: 0.01ms !important;
264
+ animation-iteration-count: 1 !important;
265
+ transition-duration: 0.01ms !important;
266
+ }
267
+ html { scroll-behavior: auto; }
268
+ #bg-canvas { display: none; }
269
  }
 
 
 
 
 
 
270
 
271
  .hero {
272
  min-height: 100vh;
273
  display: flex;
274
  flex-direction: column;
275
  justify-content: center;
276
+ padding: 80px 0;
277
  position: relative;
278
  overflow: hidden;
279
  }
 
285
  radial-gradient(ellipse 100% 60% at 50% -20%, rgba(200, 150, 12, 0.08), transparent),
286
  radial-gradient(ellipse 60% 50% at 80% 80%, rgba(200, 150, 12, 0.04), transparent);
287
  pointer-events: none;
288
+ z-index: 1;
289
+ }
290
+ .hero-content { position: relative; z-index: 2; }
291
+
292
+ .logo-wrap {
293
+ display: flex;
294
+ align-items: center;
295
+ gap: 14px;
296
+ margin-bottom: 36px;
297
+ opacity: 0;
298
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards;
299
+ }
300
+ .logo-wrap img {
301
+ width: 44px;
302
+ height: 44px;
303
+ border-radius: 10px;
304
+ border: 1px solid var(--blue-600);
305
+ transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
306
  }
307
+ .logo-wrap img:hover {
308
+ transform: scale(1.1) rotate(-4deg);
309
+ border-color: var(--accent);
310
+ box-shadow: 0 0 40px rgba(200, 150, 12, 0.2);
311
+ }
312
+ .logo-wrap .logo-text {
313
+ font-size: 14px;
314
+ font-weight: 500;
315
+ color: var(--blue-300);
316
+ letter-spacing: 0.02em;
317
+ }
318
+ .logo-wrap .logo-text span { color: var(--accent); }
319
+
320
  .hero-badge {
321
  display: inline-flex;
322
  align-items: center;
 
331
  letter-spacing: 0.08em;
332
  margin-bottom: 32px;
333
  opacity: 0;
334
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.2s forwards;
335
  }
336
  .hero-badge .dot {
337
  width: 6px; height: 6px;
338
  background: var(--accent-bright);
339
  border-radius: 50%;
340
+ animation: float 3s ease-in-out infinite;
341
  }
342
  .hero h1 {
343
  font-size: clamp(64px, 12vw, 120px);
 
346
  letter-spacing: -0.04em;
347
  margin-bottom: 16px;
348
  opacity: 0;
349
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.3s forwards;
350
  }
351
  .hero h1 .highlight {
352
  background: linear-gradient(135deg, #ffd633, #c8960c, #ffd633);
 
354
  -webkit-background-clip: text;
355
  -webkit-text-fill-color: transparent;
356
  background-clip: text;
357
+ animation: shimmer 4s linear infinite;
 
 
 
 
 
 
358
  }
359
  .hero-subtitle {
360
+ font-size: clamp(17px, 2vw, 21px);
361
  color: var(--blue-200);
362
+ max-width: 800px;
363
  margin-bottom: 48px;
364
+ line-height: 1.6;
365
  opacity: 0;
366
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.4s forwards;
367
  }
368
+
369
  .hero-cta {
370
  display: flex;
371
  gap: 16px;
372
  flex-wrap: wrap;
373
  margin-bottom: 80px;
374
  opacity: 0;
375
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.5s forwards;
376
  }
377
  .btn {
378
  display: inline-flex;
379
  align-items: center;
380
  justify-content: center;
381
+ padding: 14px 32px;
382
  font-size: 15px;
383
  font-weight: 500;
384
  border-radius: 8px;
385
+ transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
386
  cursor: pointer;
387
  font-family: var(--font-sans);
388
+ position: relative;
389
+ overflow: hidden;
390
+ }
391
+ .btn::before {
392
+ content: '';
393
+ position: absolute;
394
+ top: 0; left: -100%;
395
+ width: 100%; height: 100%;
396
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.08), transparent);
397
+ transition: left 0.6s ease;
398
+ }
399
+ .btn:hover::before { left: 100%; }
400
+ .btn:focus-visible {
401
+ outline: 2px solid var(--accent-bright);
402
+ outline-offset: 3px;
403
  }
404
  .btn-primary {
405
  background: linear-gradient(135deg, #ffd633, #c8960c, #ffd633);
 
407
  color: var(--blue-900);
408
  border: none;
409
  font-weight: 600;
410
+ animation: shimmer 4s linear infinite;
 
411
  }
412
  .btn-primary:hover {
413
+ transform: translateY(-4px) scale(1.02);
414
+ box-shadow: 0 16px 50px rgba(200, 150, 12, 0.35);
415
  }
416
  .btn-secondary {
417
  background: transparent;
 
421
  .btn-secondary:hover {
422
  border-color: var(--accent);
423
  color: var(--white);
424
+ transform: translateY(-3px);
425
  }
426
 
427
  .hero-stats {
 
429
  grid-template-columns: repeat(4, 1fr);
430
  gap: 16px;
431
  opacity: 0;
432
+ animation: fadeUp 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.6s forwards;
433
  }
434
  .hero-stat {
435
  background: rgba(10, 10, 10, 0.8);
 
437
  border-radius: 12px;
438
  padding: 28px 16px;
439
  text-align: center;
440
+ transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
441
  position: relative;
442
  overflow: hidden;
443
  }
 
 
 
 
 
444
  .hero-stat::before {
445
  content: '';
446
  position: absolute;
447
+ inset: 0;
448
+ background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), rgba(200, 150, 12, 0.12), transparent 70%);
 
449
  opacity: 0;
450
+ transition: opacity 0.4s ease;
451
+ pointer-events: none;
452
  }
453
  .hero-stat:hover::before { opacity: 1; }
454
+ .hero-stat:hover {
455
+ border-color: rgba(200, 150, 12, 0.4);
456
+ transform: translateY(-4px);
457
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
458
+ }
459
  .hero-stat .number {
460
  font-size: clamp(32px, 4vw, 48px);
461
  font-weight: 700;
 
467
  font-family: var(--font-mono);
468
  line-height: 1.1;
469
  margin-bottom: 6px;
470
+ animation: shimmer 5s linear infinite;
471
+ position: relative;
472
+ z-index: 1;
473
  }
474
+ .hero-stat .label { font-size: 13px; color: var(--blue-200); font-weight: 500; position: relative; z-index: 1; }
475
+ .hero-stat .sublabel { font-size: 11px; color: var(--blue-300); margin-top: 4px; position: relative; z-index: 1; }
476
 
477
  .section {
478
+ padding: 100px 0;
479
  position: relative;
480
+ z-index: 2;
481
  }
482
  .section.alt {
483
  background: var(--blue-800);
 
486
  }
487
  .section-header {
488
  text-align: center;
489
+ margin-bottom: 56px;
490
  }
491
  .section-header h2 {
492
  font-size: 36px;
 
502
  margin: 0 auto;
503
  }
504
  .section-body {
505
+ max-width: 900px;
506
  margin: 0 auto;
507
  }
508
  .section-body p {
 
515
  .two-col {
516
  display: grid;
517
  grid-template-columns: 1fr 1fr;
518
+ gap: 28px;
519
+ max-width: 1100px;
520
  margin: 0 auto;
 
521
  }
522
  .col-card {
523
  background: var(--blue-800);
524
  border: 1px solid var(--blue-600);
525
  border-radius: 12px;
526
  padding: 32px;
527
+ transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1);
528
  position: relative;
529
  overflow: hidden;
530
  }
531
+ .col-card::before {
532
+ content: '';
533
+ position: absolute;
534
+ inset: 0;
535
+ background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), rgba(200, 150, 12, 0.08), transparent 70%);
536
+ opacity: 0;
537
+ transition: opacity 0.5s ease;
538
+ pointer-events: none;
539
+ }
540
+ .col-card:hover::before { opacity: 1; }
541
  .col-card::after {
542
  content: '';
543
  position: absolute;
544
  top: 0; left: -100%;
545
  width: 100%; height: 100%;
546
+ background: linear-gradient(90deg, transparent, rgba(200, 150, 12, 0.04), transparent);
547
+ transition: left 0.8s ease;
548
  pointer-events: none;
549
  }
550
+ .col-card:hover::after { left: 100%; }
 
 
551
  .col-card:hover {
552
  border-color: rgba(200, 150, 12, 0.35);
553
+ transform: translateY(-6px);
554
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
555
  }
556
  .col-card h3 {
557
  font-size: 20px;
 
561
  display: flex;
562
  align-items: center;
563
  gap: 10px;
564
+ position: relative;
565
+ z-index: 1;
566
  }
567
+ .col-card ul { list-style: none; padding: 0; position: relative; z-index: 1; }
 
 
 
 
 
 
 
 
 
 
568
  .col-card li {
569
  padding: 10px 0;
570
  border-bottom: 1px solid var(--blue-600);
 
577
  .col-card li:last-child { border-bottom: none; }
578
  .col-card li .check { color: var(--accent); font-weight: 700; flex-shrink: 0; }
579
 
580
+ .three-col {
581
+ display: grid;
582
+ grid-template-columns: repeat(3, 1fr);
583
+ gap: 24px;
584
+ max-width: 1200px;
585
+ margin: 0 auto;
586
+ }
587
+ .info-card {
588
+ background: var(--blue-800);
589
+ border: 1px solid var(--blue-600);
590
+ border-radius: 12px;
591
+ padding: 32px 24px;
592
+ text-align: center;
593
+ transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1);
594
+ position: relative;
595
+ overflow: hidden;
596
+ }
597
+ .info-card::before {
598
+ content: '';
599
+ position: absolute;
600
+ inset: 0;
601
+ background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), rgba(200, 150, 12, 0.08), transparent 70%);
602
+ opacity: 0;
603
+ transition: opacity 0.5s ease;
604
+ pointer-events: none;
605
+ }
606
+ .info-card:hover::before { opacity: 1; }
607
+ .info-card:hover {
608
+ border-color: rgba(200, 150, 12, 0.35);
609
+ transform: translateY(-6px);
610
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
611
+ }
612
+ .info-card .card-icon {
613
+ width: 48px; height: 48px;
614
+ border-radius: 12px;
615
+ background: linear-gradient(135deg, #ffd633 0%, #c8960c 50%, #a0760a 100%);
616
+ color: var(--blue-900);
617
+ font-weight: 700;
618
+ font-size: 20px;
619
+ display: flex;
620
+ align-items: center;
621
+ justify-content: center;
622
+ margin: 0 auto 16px;
623
+ position: relative;
624
+ z-index: 1;
625
+ transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
626
+ }
627
+ .info-card:hover .card-icon {
628
+ transform: scale(1.1);
629
+ box-shadow: 0 0 40px rgba(200, 150, 12, 0.3);
630
+ }
631
+ .info-card h3 { font-size: 17px; font-weight: 600; color: var(--white); margin-bottom: 10px; position: relative; z-index: 1; }
632
+ .info-card p { font-size: 14px; color: var(--blue-200); line-height: 1.6; margin: 0; position: relative; z-index: 1; }
633
+
634
  .rules-card {
635
  background: var(--blue-800);
636
  border: 1px solid var(--blue-600);
637
  border-radius: 12px;
638
  padding: 32px;
639
+ max-width: 900px;
640
  margin: 0 auto;
641
  transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
642
  animation: borderGlow 4s ease-in-out infinite;
 
648
  padding: 14px 0;
649
  border-bottom: 1px solid var(--blue-600);
650
  gap: 12px;
651
+ position: relative;
652
+ z-index: 1;
653
  }
654
  .rules-card .rule-row:last-child { border-bottom: none; }
655
  .rules-card .rule-icon { color: var(--accent); font-weight: 700; width: 20px; text-align: center; flex-shrink: 0; }
 
663
  margin-top: 16px;
664
  padding-top: 16px;
665
  border-top: 1px solid var(--blue-600);
666
+ position: relative;
667
+ z-index: 1;
668
  }
669
 
670
  .how-grid {
671
  display: grid;
672
  grid-template-columns: repeat(3, 1fr);
673
+ gap: 24px;
674
+ max-width: 1100px;
675
  margin: 0 auto;
676
  }
677
  .how-step {
678
  background: var(--blue-800);
679
  border: 1px solid var(--blue-600);
680
  border-radius: 12px;
681
+ padding: 36px 24px;
682
  text-align: center;
683
+ transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1);
684
  position: relative;
685
  overflow: hidden;
686
  }
687
+ .how-step::before {
688
  content: '';
689
  position: absolute;
690
+ inset: 0;
691
+ background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), rgba(200, 150, 12, 0.08), transparent 70%);
692
+ opacity: 0;
693
+ transition: opacity 0.5s ease;
694
  pointer-events: none;
695
  }
696
+ .how-step:hover::before { opacity: 1; }
 
 
697
  .how-step:hover {
698
  border-color: rgba(200, 150, 12, 0.35);
699
+ transform: translateY(-6px);
700
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
701
  }
702
  .how-step .step-num {
703
+ width: 44px; height: 44px;
704
  border-radius: 50%;
705
+ background: linear-gradient(135deg, #ffd633 0%, #c8960c 50%, #a0760a 100%);
706
  color: var(--blue-900);
707
  font-weight: 700;
708
  font-size: 16px;
 
710
  align-items: center;
711
  justify-content: center;
712
  margin: 0 auto 16px;
713
+ position: relative;
714
+ z-index: 1;
715
+ transition: all 0.4s cubic-bezier(0.22, 1, 0.36, 1);
716
+ }
717
+ .how-step:hover .step-num {
718
+ transform: scale(1.15);
719
+ box-shadow: 0 0 40px rgba(200, 150, 12, 0.3);
720
+ }
721
+ .how-step h4 { font-size: 17px; font-weight: 600; color: var(--white); margin-bottom: 10px; position: relative; z-index: 1; }
722
+ .how-step p { font-size: 14px; color: var(--blue-200); line-height: 1.6; margin: 0; position: relative; z-index: 1; }
723
+
724
+ .faq-list {
725
+ max-width: 900px;
726
+ margin: 0 auto;
727
+ display: flex;
728
+ flex-direction: column;
729
+ gap: 12px;
730
+ }
731
+ .faq-item {
732
+ background: var(--blue-800);
733
+ border: 1px solid var(--blue-600);
734
+ border-radius: 10px;
735
+ overflow: hidden;
736
+ transition: border-color 0.3s ease;
737
+ }
738
+ .faq-item:hover { border-color: var(--blue-500); }
739
+ .faq-question {
740
+ width: 100%;
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: space-between;
744
+ gap: 12px;
745
+ padding: 18px 24px;
746
+ background: none;
747
+ border: none;
748
+ color: var(--white);
749
+ font-size: 15px;
750
+ font-weight: 500;
751
+ font-family: var(--font-sans);
752
+ cursor: pointer;
753
+ text-align: left;
754
+ transition: color 0.2s ease;
755
+ }
756
+ .faq-question:hover { color: var(--accent); }
757
+ .faq-question:focus-visible {
758
+ outline: 2px solid var(--accent-bright);
759
+ outline-offset: -2px;
760
+ }
761
+ .faq-question .icon {
762
+ width: 20px; height: 20px;
763
+ flex-shrink: 0;
764
+ display: flex;
765
+ align-items: center;
766
+ justify-content: center;
767
+ font-size: 18px;
768
+ color: var(--accent);
769
+ transition: transform 0.3s ease;
770
+ }
771
+ .faq-item.open .faq-question .icon {
772
+ transform: rotate(45deg);
773
+ }
774
+ .faq-answer {
775
+ max-height: 0;
776
+ overflow: hidden;
777
+ transition: max-height 0.35s ease, padding 0.35s ease;
778
+ }
779
+ .faq-item.open .faq-answer {
780
+ max-height: 300px;
781
+ }
782
+ .faq-answer p {
783
+ padding: 0 24px 18px;
784
+ font-size: 14px;
785
+ color: var(--blue-200);
786
+ line-height: 1.7;
787
+ margin: 0;
788
  }
 
 
789
 
790
  .cta-section {
791
+ padding: 120px 0;
792
  text-align: center;
793
  position: relative;
794
  overflow: hidden;
795
+ z-index: 2;
796
  }
797
  .cta-section::before {
798
  content: '';
 
810
  }
811
  .cta-section h2 .highlight {
812
  background: var(--gold-gradient);
813
+ background-size: 200% auto;
814
  -webkit-background-clip: text;
815
  -webkit-text-fill-color: transparent;
816
  background-clip: text;
817
+ animation: shimmer 4s linear infinite;
818
  }
819
  .cta-section p {
820
  font-size: 18px;
 
829
  flex-wrap: wrap;
830
  }
831
 
832
+
833
+
834
  footer {
835
  padding: 60px 0;
836
  background: var(--blue-800);
837
  border-top: 1px solid var(--blue-600);
838
  text-align: center;
839
  position: relative;
840
+ z-index: 2;
841
  }
842
  footer p { color: var(--blue-200); font-size: 14px; margin-bottom: 8px; }
843
  footer a { color: var(--blue-200); }
844
  footer a:hover { color: var(--accent); }
845
 
846
+ .reveal {
847
+ opacity: 0;
848
+ transform: translateY(40px);
849
+ transition: all 0.8s cubic-bezier(0.22, 1, 0.36, 1);
850
+ }
851
+ .reveal.visible {
852
+ opacity: 1;
853
+ transform: translateY(0);
854
+ }
855
+ .reveal-delay-1 { transition-delay: 0.1s; }
856
+ .reveal-delay-2 { transition-delay: 0.2s; }
857
+ .reveal-delay-3 { transition-delay: 0.3s; }
858
+
859
  @media (max-width: 768px) {
860
  .hero-stats { grid-template-columns: repeat(2, 1fr); }
861
  .two-col { grid-template-columns: 1fr; }
862
+ .three-col { grid-template-columns: 1fr; }
863
  .how-grid { grid-template-columns: 1fr; }
 
864
  .hero h1 { font-size: clamp(40px, 15vw, 64px); }
865
  .cta-section h2 { font-size: 32px; }
866
  .rules-card .rule-row { flex-wrap: wrap; gap: 4px; }
 
870
  </head>
871
  <body>
872
 
873
+ <a href="#main-content" class="skip-link">Skip to main content</a>
874
+
875
+ <canvas id="bg-canvas" aria-hidden="true"></canvas>
876
+
877
+ <div class="corner-accent tl" aria-hidden="true"></div>
878
+ <div class="corner-accent tr" aria-hidden="true"></div>
879
+ <div class="corner-accent bl" aria-hidden="true"></div>
880
+ <div class="corner-accent br" aria-hidden="true"></div>
881
+
882
+ <div class="side-ghost left" aria-hidden="true">MODEL GOLF</div>
883
+ <div class="side-ghost right" aria-hidden="true">ROUND ONE</div>
884
 
885
+ <div class="scroll-track" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" aria-label="Scroll progress">
886
+ <div class="track-bg"></div>
887
+ <div class="track-fill"></div>
888
+ <span class="track-label top">Top</span>
889
+ <span class="track-label bottom">Bottom</span>
890
+ <span class="track-pct">0%</span>
891
+ </div>
892
+
893
+ <main id="main-content">
894
+ <section class="hero" id="hero" aria-label="Hero banner" role="region">
895
  <div class="container hero-content">
896
+ <div class="logo-wrap">
897
+ <img src="compact.webp" alt="CompactAI-O organization logo">
898
+ <span class="logo-text">by <span>CompactAI-O</span></span>
899
+ </div>
900
+ <div class="hero-badge" role="status" aria-live="polite">
901
+ <span class="dot" aria-hidden="true"></span>
902
  Monthly Competition &mdash; Open To Everyone
903
  </div>
904
+ <h1>Model <span class="highlight" aria-hidden="true">Golf</span><span class="sr-only">Golf</span></h1>
905
+ <p class="hero-subtitle">Build the best language model under 100 million parameters. Minimum 1028-token context. Winner receives $50 in RunPod credits. Round one: June 1&ndash;30, 2026.</p>
906
+ <div class="hero-cta" role="group" aria-label="Call to action buttons">
907
  <a href="#rules" class="btn btn-primary">View Rules</a>
908
  <a href="#participate" class="btn btn-secondary">How To Join</a>
909
+ <a href="https://discord.gg/y2jTct6Cxv" target="_blank" class="btn btn-secondary" rel="noopener">Join Discord</a>
910
  </div>
911
+ <div class="hero-stats" role="list" aria-label="Competition statistics">
912
+ <div class="hero-stat" data-tilt role="listitem">
913
+ <div class="number" aria-hidden="true">&lt;100M</div>
914
  <div class="label">Parameter Limit</div>
915
  <div class="sublabel">Strict upper bound</div>
916
  </div>
917
+ <div class="hero-stat" data-tilt role="listitem">
918
+ <div class="number" aria-hidden="true">1028+</div>
919
  <div class="label">Context Window</div>
920
  <div class="sublabel">Minimum tokens</div>
921
  </div>
922
+ <div class="hero-stat" data-tilt role="listitem">
923
+ <div class="number" aria-hidden="true">$50</div>
924
  <div class="label">RunPod Credits</div>
925
  <div class="sublabel">Monthly prize</div>
926
  </div>
927
+ <div class="hero-stat" data-tilt role="listitem">
928
+ <div class="number" aria-hidden="true">30d</div>
929
+ <div class="label">Current Round</div>
930
+ <div class="sublabel">June 1&ndash;30, 2026</div>
931
  </div>
932
  </div>
933
  </div>
934
  </section>
935
 
936
+ <section class="section reveal" id="what" aria-labelledby="what-heading">
937
  <div class="container">
938
  <div class="section-header">
939
+ <h2 id="what-heading">What It Is</h2>
940
  </div>
941
  <div class="two-col">
942
+ <div class="col-card" data-tilt>
943
+ <h3><span class="check" aria-hidden="true">&#x2713;</span> What Model <em style="font-style: normal; color: var(--white);">Is</em></h3>
944
+ <ul role="list">
945
+ <li><span class="check" aria-hidden="true">&#x2713;</span> A monthly parameter-efficiency competition</li>
946
+ <li><span class="check" aria-hidden="true">&#x2713;</span> Open to anyone, anywhere</li>
947
+ <li><span class="check" aria-hidden="true">&#x2713;</span> Fully custom architectures allowed</li>
948
+ <li><span class="check" aria-hidden="true">&#x2713;</span> Novel tokenization &amp; training schemes welcome</li>
949
+ <li><span class="check" aria-hidden="true">&#x2713;</span> Open source by design</li>
950
+ <li><span class="check" aria-hidden="true">&#x2713;</span> $50 RunPod credits to the winner</li>
951
  </ul>
952
  </div>
953
+ <div class="col-card" data-tilt>
954
+ <h3><span class="icon" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> What It Is <em style="font-style: normal; color: var(--blue-400);">Not</em></h3>
955
+ <ul role="list">
956
+ <li><span class="check" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> Not a Kaggle-style dataset contest</li>
957
+ <li><span class="check" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> Not restricted to existing architectures</li>
958
+ <li><span class="check" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> Not limited by llama.cpp compatibility</li>
959
+ <li><span class="check" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> Not a fixed-benchmark leaderboard</li>
960
+ <li><span class="check" style="color: var(--blue-400);" aria-hidden="true">&#x2717;</span> Not for closed-source submissions</li>
961
  </ul>
962
  </div>
963
  </div>
964
  </div>
965
  </section>
966
 
967
+ <section class="section reveal reveal-delay-1" id="rules" aria-labelledby="rules-heading">
968
  <div class="container">
969
  <div class="section-header">
970
+ <h2 id="rules-heading">The Rules</h2>
971
  <p>Simple and clear. Complexity discourages participation.</p>
972
  </div>
973
+ <div class="rules-card" aria-label="Competition rules">
974
  <div class="rule-row">
975
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
976
  <span class="rule-label">License</span>
977
  <span class="rule-desc">MIT, GPL, Apache, or AGPL (any version)</span>
978
  </div>
979
  <div class="rule-row">
980
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
981
  <span class="rule-label">Parameters</span>
982
  <span class="rule-desc">Must be smaller than 100 million</span>
983
  </div>
984
  <div class="rule-row">
985
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
986
  <span class="rule-label">Context</span>
987
  <span class="rule-desc">Minimum 1028 tokens</span>
988
  </div>
989
  <div class="rule-row">
990
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
991
  <span class="rule-label">Platform</span>
992
  <span class="rule-desc">No requirement for llama.cpp compatibility</span>
993
  </div>
994
  <div class="rule-row">
995
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
996
  <span class="rule-label">AI Assistance</span>
997
  <span class="rule-desc">Up to 45% of work can be AI-generated</span>
998
  </div>
999
  <div class="rule-row">
1000
+ <span class="rule-icon" aria-hidden="true">&#x2713;</span>
1001
  <span class="rule-label">Submission</span>
1002
  <span class="rule-desc">Open source repository with documentation</span>
1003
  </div>
1004
+ <div class="rules-tagline" aria-label="Tagline: Simple. Clear. Enforceable."># Simple. Clear. Enforceable.</div>
1005
  </div>
1006
  </div>
1007
  </section>
1008
 
1009
+ <section class="section alt reveal reveal-delay-2" id="participate" aria-labelledby="participate-heading">
1010
  <div class="container">
1011
  <div class="section-header">
1012
+ <h2 id="participate-heading">How To Join</h2>
1013
+ <p>Round one runs <strong>June 1&ndash;30, 2026</strong>. Here is how it works.</p>
1014
  </div>
1015
  <div class="how-grid">
1016
+ <div class="how-step" data-tilt>
1017
+ <div class="step-num" aria-hidden="true">1</div>
1018
  <h4>Build</h4>
1019
  <p>Create a language model under 100M parameters with at least 1028-token context. Any architecture. Any approach.</p>
1020
  </div>
1021
+ <div class="how-step" data-tilt>
1022
+ <div class="step-num" aria-hidden="true">2</div>
1023
  <h4>Document</h4>
1024
  <p>Open source your repository with full documentation. Include parameter count, context window, and approach summary.</p>
1025
  </div>
1026
+ <div class="how-step" data-tilt>
1027
+ <div class="step-num" aria-hidden="true">3</div>
1028
  <h4>Submit</h4>
1029
  <p>Submit your repo link when the competition opens. Submissions are evaluated monthly. Winner gets $50 in RunPod credits.</p>
1030
  </div>
 
1032
  </div>
1033
  </section>
1034
 
1035
+ <section class="section reveal reveal-delay-1" id="resources" aria-labelledby="resources-heading">
1036
+ <div class="container">
1037
+ <div class="section-header">
1038
+ <h2 id="resources-heading">Resources &amp; Evaluation</h2>
1039
+ <p>Everything you need to build and submit your model.</p>
1040
+ </div>
1041
+ <div class="three-col">
1042
+ <div class="info-card" data-tilt>
1043
+ <div class="card-icon" aria-hidden="true">B</div>
1044
+ <h3>Benchmark</h3>
1045
+ <p>Models evaluated on a held-out suite of reasoning, coding, and language understanding tasks. Final ranking by aggregate score.</p>
1046
+ </div>
1047
+ <div class="info-card" data-tilt>
1048
+ <div class="card-icon" aria-hidden="true">T</div>
1049
+ <h3>Tools</h3>
1050
+ <p>Use any framework &mdash; PyTorch, JAX, TensorFlow, or custom CUDA. Bring your own tokenizer, architecture, and training pipeline.</p>
1051
+ </div>
1052
+ <div class="info-card" data-tilt>
1053
+ <div class="card-icon" aria-hidden="true">G</div>
1054
+ <h3>Guidelines</h3>
1055
+ <p>Submit via a pull request to the Model Golf repository with your model weights, config, and a short technical report.</p>
1056
+ </div>
1057
+ </div>
1058
+ </div>
1059
+ </section>
1060
+
1061
+ <section class="section alt reveal reveal-delay-1" id="faq" aria-labelledby="faq-heading">
1062
+ <div class="container">
1063
+ <div class="section-header">
1064
+ <h2 id="faq-heading">Frequently Asked Questions</h2>
1065
+ <p>Common questions about Model Golf.</p>
1066
+ </div>
1067
+ <div class="faq-list" role="list">
1068
+ <div class="faq-item" role="listitem">
1069
+ <button class="faq-question" aria-expanded="false" aria-controls="faq1-answer">
1070
+ <span>Can I use a pre-trained model as a starting point?</span>
1071
+ <span class="icon" aria-hidden="true">+</span>
1072
+ </button>
1073
+ <div class="faq-answer" id="faq1-answer" role="region" aria-hidden="true">
1074
+ <p>Yes, you may fine-tune or adapt existing open-source models as long as the final parameter count is under 100 million and all code is open source. You must document your starting point clearly in your submission.</p>
1075
+ </div>
1076
+ </div>
1077
+ <div class="faq-item" role="listitem">
1078
+ <button class="faq-question" aria-expanded="false" aria-controls="faq2-answer">
1079
+ <span>How is the 100M parameter limit enforced?</span>
1080
+ <span class="icon" aria-hidden="true">+</span>
1081
+ </button>
1082
+ <div class="faq-answer" id="faq2-answer" role="region" aria-hidden="true">
1083
+ <p>Submissions must include a parameter count script that counts every trainable parameter. Organizers verify counts and reserve the right to reject submissions that creatively circumvent the limit (e.g., large embedding tables with sparse usage).</p>
1084
+ </div>
1085
+ </div>
1086
+ <div class="faq-item" role="listitem">
1087
+ <button class="faq-question" aria-expanded="false" aria-controls="faq3-answer">
1088
+ <span>What does "open source" mean for Model Golf?</span>
1089
+ <span class="icon" aria-hidden="true">+</span>
1090
+ </button>
1091
+ <div class="faq-answer" id="faq3-answer" role="region" aria-hidden="true">
1092
+ <p>All training code, model weights, configuration, and a technical report must be publicly available under an OSI-approved license. We accept MIT, GPL, Apache 2.0, and AGPL licenses.</p>
1093
+ </div>
1094
+ </div>
1095
+ <div class="faq-item" role="listitem">
1096
+ <button class="faq-question" aria-expanded="false" aria-controls="faq4-answer">
1097
+ <span>When does the first round begin?</span>
1098
+ <span class="icon" aria-hidden="true">+</span>
1099
+ </button>
1100
+ <div class="faq-answer" id="faq4-answer" role="region" aria-hidden="true">
1101
+ <p>Round one runs <strong>June 1&ndash;30, 2026</strong>. Submissions close at 23:59 UTC on June 30. Join the Discord for early-access resources.</p>
1102
+ </div>
1103
+ </div>
1104
+ </div>
1105
+ </div>
1106
+ </section>
1107
+
1108
+ <section class="section reveal reveal-delay-2" aria-labelledby="why-heading">
1109
  <div class="container">
1110
  <div class="section-header">
1111
+ <h2 id="why-heading">Why Small Models?</h2>
1112
  <p>Parameter efficiency is the path to democratized AI.</p>
1113
  </div>
1114
  <div class="section-body">
 
1120
 
1121
  <section class="cta-section">
1122
  <div class="container">
1123
+ <h2>Ready To <span class="highlight" aria-hidden="true">Compete</span><span class="sr-only">Compete</span>?</h2>
1124
+ <p>Round one ends June 30, 2026. Submit your model by 23:59 UTC.</p>
1125
  <div class="cta-links">
1126
+ <a href="https://discord.gg/y2jTct6Cxv" target="_blank" class="btn btn-primary" rel="noopener">Join Discord</a>
1127
+ <a href="https://compactai-o-homepage.static.hf.space/blog.html" class="btn btn-secondary" rel="noopener">Read The Blog</a>
1128
  </div>
1129
  </div>
1130
  </section>
1131
  </main>
1132
 
1133
+ <footer role="contentinfo">
1134
  <div class="container">
1135
  <p>Built with curiosity over compute</p>
1136
+ <p>FMN-GPT by <a href="https://huggingface.co/CompactAI-O" target="_blank" rel="noopener">CompactAI-O</a> | 2026</p>
1137
  </div>
1138
  </footer>
1139
 
1140
  <script>
1141
+ (function() {
1142
+ // --- Scroll reveal ---
1143
+ var reveal = document.querySelectorAll('.reveal');
1144
+ if ('IntersectionObserver' in window) {
1145
+ var observer = new IntersectionObserver(function(entries) {
1146
+ entries.forEach(function(entry) {
1147
+ if (entry.isIntersecting) {
1148
+ entry.target.classList.add('visible');
1149
+ }
1150
+ });
1151
+ }, { threshold: 0.15 });
1152
+ reveal.forEach(function(el) { observer.observe(el); });
1153
+ } else {
1154
+ reveal.forEach(function(el) { el.classList.add('visible'); });
1155
+ }
1156
+
1157
+ // --- FAQ accordion ---
1158
+ var faqButtons = document.querySelectorAll('.faq-question');
1159
+ faqButtons.forEach(function(btn) {
1160
+ btn.addEventListener('click', function() {
1161
+ var item = btn.closest('.faq-item');
1162
+ var isOpen = item.classList.contains('open');
1163
+ var answer = document.getElementById(btn.getAttribute('aria-controls'));
1164
+ if (isOpen) {
1165
+ item.classList.remove('open');
1166
+ btn.setAttribute('aria-expanded', 'false');
1167
+ answer.setAttribute('aria-hidden', 'true');
1168
+ } else {
1169
+ item.classList.add('open');
1170
+ btn.setAttribute('aria-expanded', 'true');
1171
+ answer.setAttribute('aria-hidden', 'false');
1172
+ }
1173
+ });
1174
+ });
1175
+
1176
+ // --- Fluid background canvas ---
1177
+ var prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
1178
+ var canvas = document.getElementById('bg-canvas');
1179
+ if (prefersReduced) { canvas.remove(); }
1180
+ else {
1181
+ var ctx = canvas.getContext('2d');
1182
+ var w, h, time = 0;
1183
+ var mouse = { x: 0.5, y: 0.5 };
1184
+
1185
+ function resize() {
1186
+ w = canvas.width = window.innerWidth;
1187
+ h = canvas.height = window.innerHeight;
1188
+ }
1189
+ resize();
1190
+ window.addEventListener('resize', resize);
1191
+
1192
+ document.addEventListener('mousemove', function(e) {
1193
+ mouse.x = e.clientX / w;
1194
+ mouse.y = e.clientY / h;
1195
+ });
1196
+
1197
+ function drawFluid(time) {
1198
+ ctx.clearRect(0, 0, w, h);
1199
+ var imageData = ctx.createImageData(w, h);
1200
+ var data = imageData.data;
1201
+ var cx = mouse.x * w;
1202
+ var cy = mouse.y * h;
1203
+
1204
+ for (var y = 0; y < h; y += 2) {
1205
+ for (var x = 0; x < w; x += 2) {
1206
+ var dx = x - cx;
1207
+ var dy = y - cy;
1208
+ var dist = Math.sqrt(dx * dx + dy * dy);
1209
+ var angle = Math.atan2(dy, dx);
1210
+
1211
+ var n1 = Math.sin(x * 0.003 + time * 0.4) * Math.cos(y * 0.003 + time * 0.3);
1212
+ var n2 = Math.sin((x - cx) * 0.005 + time * 0.5) * Math.cos((y - cy) * 0.005 + time * 0.4);
1213
+ var n3 = Math.sin(dist * 0.01 - time * 0.6 + angle);
1214
+
1215
+ var val = (n1 * 0.5 + n2 * 0.3 + n3 * 0.2);
1216
+ val = Math.max(-1, Math.min(1, val));
1217
+
1218
+ var push = Math.max(0, 1 - dist / (w * 0.4));
1219
+ val += push * 0.3;
1220
+
1221
+ var intensity = (val * 0.5 + 0.5) * 0.06;
1222
+
1223
+ var idx = (y * w + x) * 4;
1224
+ data[idx] = 200 * intensity;
1225
+ data[idx + 1] = 150 * intensity;
1226
+ data[idx + 2] = 12 * intensity;
1227
+ data[idx + 3] = intensity * 255;
1228
+ }
1229
+ }
1230
+ ctx.putImageData(imageData, 0, 0);
1231
  }
1232
+
1233
+ function animate() {
1234
+ time += 1;
1235
+ drawFluid(time);
1236
+ requestAnimationFrame(animate);
1237
+ }
1238
+ animate();
1239
+ }
1240
+
1241
+ // --- Scroll progress bar ---
1242
+ var track = document.querySelector('.scroll-track');
1243
+ var fill = track.querySelector('.track-fill');
1244
+ var pct = track.querySelector('.track-pct');
1245
+ function updateProgress() {
1246
+ var scrollTop = window.scrollY;
1247
+ var docHeight = document.documentElement.scrollHeight - window.innerHeight;
1248
+ var progress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0;
1249
+ fill.style.height = progress + '%';
1250
+ pct.textContent = Math.round(progress) + '%';
1251
+ track.setAttribute('aria-valuenow', Math.round(progress));
1252
+ }
1253
+ window.addEventListener('scroll', updateProgress);
1254
+ window.addEventListener('resize', updateProgress);
1255
+ updateProgress();
1256
+
1257
+ // --- Tilt effect ---
1258
+ var tiltEls = document.querySelectorAll('[data-tilt]');
1259
+ tiltEls.forEach(function(el) {
1260
+ el.addEventListener('mousemove', function(e) {
1261
+ var rect = el.getBoundingClientRect();
1262
+ var x = e.clientX - rect.left;
1263
+ var y = e.clientY - rect.top;
1264
+ var centerX = rect.width / 2;
1265
+ var centerY = rect.height / 2;
1266
+ var rotateX = (y - centerY) / centerY * -8;
1267
+ var rotateY = (x - centerX) / centerX * 8;
1268
+ el.style.transform = 'perspective(600px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg) translateY(-4px)';
1269
+ el.style.setProperty('--mx', ((x / rect.width) * 100) + '%');
1270
+ el.style.setProperty('--my', ((y / rect.height) * 100) + '%');
1271
+ });
1272
+ el.addEventListener('mouseleave', function() {
1273
+ el.style.transform = 'perspective(600px) rotateX(0deg) rotateY(0deg) translateY(0px)';
1274
+ });
1275
+ });
1276
+ })();
1277
  </script>
1278
  </body>
1279
  </html>