-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
492 lines (438 loc) · 20.3 KB
/
index.html
File metadata and controls
492 lines (438 loc) · 20.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#b8e8ef" />
<title>Tech Roulette: Build With AI | GDG on Campus IE University</title>
<meta
name="description"
content="Tech Roulette: Build With AI 2-week challenge page with roadmap, wildcard format, winners, FAQ, and social links."
/>
<link rel="icon" href="assets/favicon/favicon.ico?v=20260316r4" sizes="any" />
<link rel="shortcut icon" href="assets/favicon/favicon.ico?v=20260316r4" />
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon/favicon-32x32.png?v=20260316r4" />
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon/favicon-16x16.png?v=20260316r4" />
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicon/apple-touch-icon.png?v=20260316r4" />
<link rel="manifest" href="assets/favicon/site.webmanifest?v=20260316r4" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&display=optional"
rel="stylesheet"
/>
<link rel="stylesheet" href="styles.css?v=20260319d" />
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<main id="main" class="page-shell">
<article class="poster">
<div class="color-bar" aria-hidden="true">
<span class="cb-blue"></span>
<span class="cb-red"></span>
<span class="cb-yellow"></span>
<span class="cb-green"></span>
</div>
<header class="poster-header">
<a class="brand" href="#general" aria-label="Tech Roulette: Build With AI">
<img
src="assets/logos/google-developers-icon-downloaded.png"
alt="Google Developers"
width="72"
height="72"
/>
<span>GDG on Campus IE University</span>
</a>
<nav class="nav" aria-label="Main navigation">
<a href="#general">General</a>
<a href="#dates">Dates</a>
<a href="#faq">FAQ</a>
<a href="#social">Social</a>
</nav>
<p class="date-chip">Apr 13-27, 2026</p>
</header>
<section id="general" class="hero" aria-labelledby="general-title">
<div class="hero-copy">
<p class="eyebrow">Build With AI · Spring 2026</p>
<h1 id="general-title" class="hero-title">
<span>Tech</span>
<span class="roulette-title">Roulette</span>
<span>Challenge</span>
</h1>
<p class="lead">
A 2-week build challenge where teams create technically grounded AI projects based on a randomly assigned
wildcard theme.
</p>
</div>
<div class="hero-side">
<section class="hero-summary" aria-label="Event summary">
<div class="brand-lockup">
<div class="brand-mark">
<img
src="assets/logos/gdg-on-campus-full-white-filled.png"
alt="GDG on Campus IE University"
width="260"
height="112"
/>
</div>
<div class="summary-copy">
<p class="mini-title">Event flow</p>
<ul class="summary-list">
<li>Spin a wildcard topic at kickoff.</li>
<li>Build something strange but technically real.</li>
<li>Present it live on final demo day.</li>
</ul>
</div>
</div>
</section>
</div>
<ul class="facts" aria-label="General event info">
<li>
<span class="fact-label">Dates</span>
<strong>April 13-27</strong>
</li>
<li>
<span class="fact-label">Format</span>
<strong>2-week challenge</strong>
</li>
<li>
<span class="fact-label">Team size</span>
<strong>3-5 participants</strong>
</li>
<li>
<span class="fact-label">Participants</span>
<strong>50-100 expected</strong>
</li>
</ul>
</section>
<section id="format" class="panel format-panel" aria-labelledby="format-title">
<div class="section-head">
<p class="section-kicker">Challenge format</p>
<h2 id="format-title">Wildcard format details</h2>
<p class="section-copy">How teams get their prompt, how winners are judged, and how solo builders are placed.</p>
</div>
<div class="format-layout">
<article class="format-feature format-blue">
<div class="format-card-top">
<p class="format-chip">Kickoff mechanic</p>
<p class="format-index" aria-hidden="true">01</p>
</div>
<div class="format-heading">
<h3>Every team gets one random theme, then builds their own interpretation.</h3>
</div>
<p class="format-intro">
The wheel decides the creative constraint, not the stack. Teams can still choose the tools, technical scope,
and level of ambition that fits their idea.
</p>
<ul class="format-list format-list-split" aria-label="Wildcard wheel details">
<li>
<strong>Spin once</strong>
<span>Each team gets a single live draw at kickoff.</span>
</li>
<li>
<strong>Build freely</strong>
<span>The topic is a theme only, not a product or architecture prescription.</span>
</li>
</ul>
</article>
<div class="format-stack">
<article class="format-card format-yellow">
<div class="format-card-top">
<p class="format-chip">Judging</p>
<p class="format-index" aria-hidden="true">02</p>
</div>
<div class="format-heading">
<h3>Two ways to win, depending on whether the edge is concept or execution.</h3>
</div>
<ol class="format-list" aria-label="Winner categories">
<li>
<strong>Best Presentation and Idea</strong>
<span>Creative concept, polished absurdity, and a memorable pitch.</span>
</li>
<li>
<strong>Best Developed Solution</strong>
<span>Strong build quality, clean execution, and technical mastery.</span>
</li>
</ol>
</article>
</div>
<article class="format-card format-green format-wide">
<div class="format-card-top">
<p class="format-chip">Team setup</p>
<p class="format-index" aria-hidden="true">03</p>
</div>
<div class="format-heading">
<h3>Mixed-skill teams are encouraged, and solo participants are matched at kickoff.</h3>
</div>
<ul class="format-list format-list-split" aria-label="Team composition rules">
<li>
<strong>Balanced teams</strong>
<span>Best mix: CS, business, design, and beginner talent in the same group.</span>
</li>
<li>
<strong>Solo participants</strong>
<span>Anyone joining alone is grouped into a team during the opening session.</span>
</li>
</ul>
</article>
</div>
</section>
<section id="dates" class="panel schedule-panel" aria-labelledby="dates-title">
<div class="section-head">
<h2 id="dates-title">Roadmap: April 13-27</h2>
<p class="section-copy">Five checkpoints across the kickoff, sprint weeks, mid-point review, and final demo.</p>
</div>
<div class="roadmap-vertical" aria-label="Hackathon roadmap timeline">
<article class="roadmap-day node-blue" aria-labelledby="day1-title">
<div class="roadmap-date-block">
<p class="day-label">Monday</p>
<p class="day-date">Apr 13</p>
</div>
<div class="roadmap-content">
<div class="event-head">
<time class="time-chip" datetime="2026-04-13">Kickoff Event · 12:30-13:30</time>
<h3 id="day1-title">Team formation, wheel spinning and workshops</h3>
</div>
<p><strong>Venue:</strong> Rooms 8.02-8.04, followed by food & networking.</p>
</div>
</article>
<article class="roadmap-day node-green" aria-labelledby="day2-title">
<div class="roadmap-date-block">
<p class="day-label">Week 1</p>
<p class="day-date">Apr 14-19</p>
</div>
<div class="roadmap-content">
<div class="event-head">
<time class="time-chip" datetime="2026-04-14/2026-04-19">Build Sprint 1</time>
<h3 id="day2-title">Optional evening workshops, mentor office hours and async building</h3>
</div>
<p><strong>Venue:</strong> Distributed / async.</p>
</div>
</article>
<article class="roadmap-day node-yellow" aria-labelledby="day3-title">
<div class="roadmap-date-block">
<p class="day-label">Monday</p>
<p class="day-date">Apr 20</p>
</div>
<div class="roadmap-content">
<div class="event-head">
<time class="time-chip" datetime="2026-04-20">Mid-Point Check-In</time>
<h3 id="day3-title">Progress demos, feedback and blockers session</h3>
</div>
<p><strong>Venue:</strong> IE venue or online.</p>
</div>
</article>
<article class="roadmap-day node-blue" aria-labelledby="day4-title">
<div class="roadmap-date-block">
<p class="day-label">Week 2</p>
<p class="day-date">Apr 21-26</p>
</div>
<div class="roadmap-content">
<div class="event-head">
<time class="time-chip" datetime="2026-04-21/2026-04-26">Build Sprint 2</time>
<h3 id="day4-title">Final sprint with continued workshops</h3>
</div>
<p><strong>Milestone:</strong> Code freeze at 12:00 on Apr 27.</p>
</div>
</article>
<article class="roadmap-day node-red" aria-labelledby="day5-title">
<div class="roadmap-date-block">
<p class="day-label">Monday</p>
<p class="day-date">Apr 27</p>
</div>
<div class="roadmap-content">
<div class="event-head">
<time class="time-chip" datetime="2026-04-27">Final Demo Day · 18:30-20:30</time>
<h3 id="day5-title">Presentations, judging and awards ceremony</h3>
</div>
<p><strong>Venue:</strong> Google Office. Followed by food.</p>
</div>
</article>
</div>
</section>
<div class="lower-grid">
<section id="faq" class="panel" aria-labelledby="faq-title">
<div class="section-head">
<h2 id="faq-title">Frequently asked questions</h2>
</div>
<div class="faq-list">
<details>
<summary>Do I need a team before kickoff?</summary>
<p>No. Solo participants are matched with others at the Day 1 kickoff.</p>
</details>
<details>
<summary>Can we pick any tech stack?</summary>
<p>Yes. The wildcard is a theme, not a technical requirement, so teams choose their own stack.</p>
</details>
<details>
<summary>Who should participate?</summary>
<p>Mixed teams work best: CS, business, design, and curious beginners are all welcome.</p>
</details>
<details>
<summary>What does "winning" mean here?</summary>
<p>
Teams can win for creative presentation and idea quality, or for strongest technical execution and code
quality.
</p>
</details>
</div>
</section>
<section id="social" class="panel" aria-labelledby="social-title">
<div class="section-head">
<h2 id="social-title">Stay connected</h2>
</div>
<p class="section-copy">Follow updates, ask questions, and coordinate with mentors and teams in real time.</p>
<div class="social-links" aria-label="Social media and community links">
<a class="social-card social-green" href="https://discord.gg/EyeBsmchYZ" rel="noreferrer">
<span>Discord</span>
<small>Join server</small>
</a>
<a class="social-card social-red" href="https://www.instagram.com/gdg_ieuniversity/" rel="noreferrer">
<span>Instagram</span>
<small>@gdg_ie</small>
</a>
<a class="social-card social-blue" href="https://www.linkedin.com/company/google-developers-group-ie-university/" rel="noreferrer">
<span>LinkedIn</span>
<small>GDG IE University</small>
</a>
</div>
</section>
<section id="apply" class="panel apply-panel" aria-label="Apply for Tech Roulette">
<a
class="apply-btn apply-btn-large apply-panel-button"
href="https://docs.google.com/forms/d/e/1FAIpQLSde60O7PaBOo9sXh-u4qX9mjioX3gI3gm-5z7YdC5pEMZ3ehA/viewform"
target="_blank"
rel="noreferrer noopener"
>
Apply now
<span aria-hidden="true" class="apply-arrow"></span>
</a>
</section>
</div>
<footer class="poster-footer">
<p>Tech Roulette · IE University · Wildcard topics are assigned live at kickoff</p>
</footer>
</article>
</main>
<aside class="apply-overlay" aria-label="Apply for Tech Roulette">
<p class="apply-overlay-title">Ready to spin your idea?</p>
<a
class="apply-btn apply-overlay-button"
href="https://docs.google.com/forms/d/e/1FAIpQLSde60O7PaBOo9sXh-u4qX9mjioX3gI3gm-5z7YdC5pEMZ3ehA/viewform"
target="_blank"
rel="noreferrer noopener"
>
Apply now
<span aria-hidden="true" class="apply-arrow"></span>
</a>
</aside>
<script>
(() => {
const faqItems = document.querySelectorAll("#faq .faq-list details");
const applyButtons = document.querySelectorAll(".apply-btn, .roulette-title");
const applyPanelButton = document.querySelector(".apply-panel-button");
const floatingApplyOverlay = document.querySelector(".apply-overlay");
const applySection = document.querySelector("#apply");
const applyPanel = document.querySelector(".apply-panel");
faqItems.forEach((item) => {
item.addEventListener("toggle", () => {
if (!item.open) return;
faqItems.forEach((otherItem) => {
if (otherItem !== item) {
otherItem.open = false;
}
});
});
});
applyButtons.forEach((button) => {
button.addEventListener("mousemove", (event) => {
const bounds = button.getBoundingClientRect();
const x = ((event.clientX - bounds.left) / bounds.width) * 100;
const y = ((event.clientY - bounds.top) / bounds.height) * 100;
button.style.setProperty("--mouse-x", `${x}%`);
button.style.setProperty("--mouse-y", `${y}%`);
});
button.addEventListener("mouseleave", () => {
button.style.setProperty("--mouse-x", "50%");
button.style.setProperty("--mouse-y", "50%");
});
});
if (applySection && applyPanelButton && floatingApplyOverlay) {
let isDocked = false;
let pendingReveal = null;
let rafId = 0;
let observer = null;
const resetOverlayPose = () => {
floatingApplyOverlay.classList.remove("apply-overlay--docked");
floatingApplyOverlay.style.setProperty("--morph-translate-x", "0px");
floatingApplyOverlay.style.setProperty("--morph-translate-y", "0px");
floatingApplyOverlay.style.setProperty("--morph-scale-x", "1");
floatingApplyOverlay.style.setProperty("--morph-scale-y", "1");
};
const computeTargetSize = () => {
const computedStyle = window.getComputedStyle(applyPanelButton);
const rect = applyPanelButton.getBoundingClientRect();
const styleWidth = parseFloat(computedStyle.width) || 0;
const styleHeight = parseFloat(computedStyle.minHeight) || 78;
return {
width: Math.max(rect.width, styleWidth, 1),
height: Math.max(rect.height, styleHeight, 1),
};
};
const syncDockTransform = () => {
if (!isDocked) return;
const overlayRect = floatingApplyOverlay.getBoundingClientRect();
const buttonRect = applyPanelButton.getBoundingClientRect();
const size = computeTargetSize();
floatingApplyOverlay.style.setProperty("--morph-translate-x", `${buttonRect.left - overlayRect.left}px`);
floatingApplyOverlay.style.setProperty("--morph-translate-y", `${buttonRect.top - overlayRect.top}px`);
floatingApplyOverlay.style.setProperty("--morph-scale-x", `${size.width / overlayRect.width}`);
floatingApplyOverlay.style.setProperty("--morph-scale-y", `${size.height / overlayRect.height}`);
};
const setDockState = (shouldDock) => {
if (shouldDock === isDocked) return;
isDocked = shouldDock;
if (pendingReveal) {
window.clearTimeout(pendingReveal);
pendingReveal = null;
}
if (!shouldDock) {
applyPanelButton.classList.remove("apply-panel-button--visible");
if (applyPanel) applyPanel.classList.remove("apply-panel--visible");
resetOverlayPose();
return;
}
syncDockTransform();
floatingApplyOverlay.classList.add("apply-overlay--docked");
pendingReveal = window.setTimeout(() => {
applyPanelButton.classList.add("apply-panel-button--visible");
if (applyPanel) applyPanel.classList.add("apply-panel--visible");
}, 110);
};
const handleDockMotion = () => {
if (!isDocked) return;
if (rafId) window.cancelAnimationFrame(rafId);
rafId = window.requestAnimationFrame(syncDockTransform);
};
const initialButtonVisible = applySection.getBoundingClientRect().top < window.innerHeight && applySection.getBoundingClientRect().bottom > 0;
setDockState(initialButtonVisible);
observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.target !== applySection) return;
setDockState(entry.isIntersecting);
});
},
{
threshold: 0,
},
);
observer.observe(applySection);
window.addEventListener("scroll", handleDockMotion, { passive: true });
window.addEventListener("resize", handleDockMotion, { passive: true });
window.addEventListener("load", handleDockMotion, { passive: true });
}
})();
</script>
</body>
</html>