Koperization commited on
Commit
13ee131
·
verified ·
1 Parent(s): 6ff26c6

Page Title: Junior A Boys – Volleyball

Browse files

Design Style:
- Theme: Dark mode (#121212)
- Accent Color: #008080 (teal)
- Text Color: White (#FFFFFF)/Light Grey (#CCCCCC)
- Font: Montserrat
- Animations: Smooth transitions and carousel effects

Header:
- Existing NAGAS header

Layout:
1. Back Button (→ /volleyball)
2. Search Bar (filters players by name)
3. Player Grid:
- 3-column responsive grid (2-col tablet, 1-col mobile)
- Cards with hover animations (scale + glow)
- Staggered fade-in on load

4. Player Profile Modal:
- Slide-up animation
- Carousel gallery with:
* Main image display
* Thumbnail navigation
* Smooth transition between images
* Swipe support for mobile

CSS Additions:
/* Carousel Container */
.carousel-container {
position: relative;
max-width: 100%;
margin: 20px auto;
overflow: hidden;
border-radius: 6px;
}

/* Main Image */
.carousel-main {
width: 100%;
height: 300px;
background: #1E1E1E;
border-radius: 6px;
overflow: hidden;
position: relative;
}
.carousel-main img {
width: 100%;
height: 100%;
object-fit: cover;
transition: opacity 0.5s ease;
}

/* Thumbnails */
.carousel-thumbs {
display: flex;
gap: 8px;
margin-top: 10px;
justify-content: center;
}
.carousel-thumbs img {
width: 60px;
height: 60px;
object-fit: cover;
border-radius: 4px;
cursor: pointer;
opacity: 0.7;
transition: all 0.3s;
}
.carousel-thumbs img.active {
opacity: 1;
border: 2px solid #008080;
}

/* Navigation Arrows */
.carousel-arrow {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
color: white;
border: none;
padding: 10px;
cursor: pointer;
font-size: 18px;
z-index: 10;
border-radius: 50%;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
}
.carousel-arrow:hover {
background: #008080;
}
.carousel-arrow.prev { left: 10px; }
.carousel-arrow.next { right: 10px; }

/* Animation for image transition */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}

/* JavaScript for Carousel */
<script>
document.querySelectorAll('.player-card').forEach(card => {
card.addEventListener('click', () => {
const modal = document.getElementById('profile-modal');
const mainImg = modal.querySelector('.carousel-main img');
const thumbs = modal.querySelectorAll('.carousel-thumbs img');
let currentIndex = 0;

// Set up carousel
thumbs.forEach((thumb, index) => {
thumb.addEventListener('click', () => {
currentIndex = index;
updateCarousel();
});
});

// Navigation arrows
modal.querySelector('.carousel-arrow.prev').addEventListener('click', () => {
currentIndex = (currentIndex > 0) ? currentIndex - 1 : thumbs.length - 1;
updateCarousel();
});

modal.querySelector('.carousel-arrow.next').addEventListener('click', () => {
currentIndex = (currentIndex < thumbs.length - 1) ? currentIndex + 1 : 0;
updateCarousel();
});

// Swipe support for mobile
let touchStartX = 0;
mainImg.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
});

mainImg.addEventListener('touchend', (e) => {
const touchEndX = e.changedTouches[0].screenX;
if (touchStartX - touchEndX > 50) { // Swipe left
currentIndex = (currentIndex < thumbs.length - 1) ? currentIndex + 1 : 0;
} else if (touchEndX - touchStartX > 50) { // Swipe right
currentIndex = (currentIndex > 0) ? currentIndex - 1 : thumbs.length - 1;
}
updateCarousel();
});

function updateCarousel() {
// Fade out current image
mainImg.style.opacity = 0;

setTimeout(() => {
// Update main image
mainImg.src = thumbs[currentIndex].src;
mainImg.style.opacity = 1;

// Update active thumbnail
thumbs.forEach((thumb, index) => {
thumb.classList.toggle('active', index === currentIndex);
});
}, 300);
}

// Initialize
updateCarousel();
});
});
</script>

HTML Structure for Carousel:
<div class="carousel-container">
<div class="carousel-main">
<img src="player-main.jpg" alt="Main photo">
<button class="carousel-arrow prev">‹</button>
<button class="carousel-arrow next">›</button>
</div>
<div class="carousel-thumbs">
<img src="player-1.jpg" class="active" alt="Thumbnail 1">
<img src="player-2.jpg" alt="Thumbnail 2">
<img src="player-3.jpg" alt="Thumbnail 3">
</div>
</div>

Files changed (2) hide show
  1. junior-a-boys.html +594 -0
  2. volleyball.html +2 -2
junior-a-boys.html ADDED
@@ -0,0 +1,594 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Junior A Boys – Volleyball | NAGAS</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://unpkg.com/feather-icons"></script>
10
+ <script>
11
+ tailwind.config = {
12
+ theme: {
13
+ extend: {
14
+ colors: {
15
+ primary: '#008080',
16
+ dark: '#121212',
17
+ darker: '#0a0a0a',
18
+ lightGrey: '#CCCCCC'
19
+ }
20
+ }
21
+ }
22
+ }
23
+ </script>
24
+ <style>
25
+ body {
26
+ font-family: 'Montserrat', sans-serif;
27
+ background-color: #121212;
28
+ color: #ffffff;
29
+ }
30
+ h1, h2, h3, h4, h5, h6 {
31
+ font-weight: 700;
32
+ }
33
+ /* Shared card styles */
34
+ .player-card {
35
+ transition: all 0.3s ease;
36
+ border: 1px solid #008080;
37
+ border-radius: 6px;
38
+ background-color: #1E1E1E;
39
+ padding: 20px;
40
+ text-align: center;
41
+ color: white;
42
+ opacity: 0;
43
+ transform: translateY(20px);
44
+ }
45
+
46
+ /* Hover effects */
47
+ .player-card:hover {
48
+ transform: translateY(-5px);
49
+ box-shadow: 0 6px 12px rgba(0, 128, 128, 0.3);
50
+ }
51
+
52
+ /* Section titles */
53
+ .section-title {
54
+ margin-bottom: 20px;
55
+ }
56
+
57
+ /* Preserve existing header/footer styles */
58
+ header, footer {
59
+ width: 100%;
60
+ padding: 20px;
61
+ }
62
+
63
+ /* Carousel Container */
64
+ .carousel-container {
65
+ position: relative;
66
+ max-width: 100%;
67
+ margin: 20px auto;
68
+ overflow: hidden;
69
+ border-radius: 6px;
70
+ }
71
+
72
+ /* Main Image */
73
+ .carousel-main {
74
+ width: 100%;
75
+ height: 300px;
76
+ background: #1E1E1E;
77
+ border-radius: 6px;
78
+ overflow: hidden;
79
+ position: relative;
80
+ }
81
+ .carousel-main img {
82
+ width: 100%;
83
+ height: 100%;
84
+ object-fit: cover;
85
+ transition: opacity 0.5s ease;
86
+ }
87
+
88
+ /* Thumbnails */
89
+ .carousel-thumbs {
90
+ display: flex;
91
+ gap: 8px;
92
+ margin-top: 10px;
93
+ justify-content: center;
94
+ }
95
+ .carousel-thumbs img {
96
+ width: 60px;
97
+ height: 60px;
98
+ object-fit: cover;
99
+ border-radius: 4px;
100
+ cursor: pointer;
101
+ opacity: 0.7;
102
+ transition: all 0.3s;
103
+ }
104
+ .carousel-thumbs img.active {
105
+ opacity: 1;
106
+ border: 2px solid #008080;
107
+ }
108
+
109
+ /* Navigation Arrows */
110
+ .carousel-arrow {
111
+ position: absolute;
112
+ top: 50%;
113
+ transform: translateY(-50%);
114
+ background: rgba(0,0,0,0.5);
115
+ color: white;
116
+ border: none;
117
+ padding: 10px;
118
+ cursor: pointer;
119
+ font-size: 18px;
120
+ z-index: 10;
121
+ border-radius: 50%;
122
+ width: 40px;
123
+ height: 40px;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ }
128
+ .carousel-arrow:hover {
129
+ background: #008080;
130
+ }
131
+ .carousel-arrow.prev { left: 10px; }
132
+ .carousel-arrow.next { right: 10px; }
133
+
134
+ /* Animation for image transition */
135
+ @keyframes fadeIn {
136
+ from { opacity: 0; }
137
+ to { opacity: 1; }
138
+ }
139
+
140
+ /* Modal Styles */
141
+ .modal {
142
+ display: none;
143
+ position: fixed;
144
+ top: 0;
145
+ left: 0;
146
+ width: 100%;
147
+ height: 100%;
148
+ background: rgba(0, 0, 0, 0.8);
149
+ z-index: 1000;
150
+ justify-content: center;
151
+ align-items: center;
152
+ }
153
+
154
+ .modal-content {
155
+ background: #1E1E1E;
156
+ border-radius: 8px;
157
+ width: 90%;
158
+ max-width: 600px;
159
+ padding: 20px;
160
+ position: relative;
161
+ transform: translateY(100%);
162
+ animation: slideUp 0.4s forwards;
163
+ }
164
+
165
+ @keyframes slideUp {
166
+ to {
167
+ transform: translateY(0);
168
+ }
169
+ }
170
+
171
+ .close-modal {
172
+ position: absolute;
173
+ top: 10px;
174
+ right: 15px;
175
+ font-size: 24px;
176
+ cursor: pointer;
177
+ }
178
+ </style>
179
+ </head>
180
+ <body class="bg-dark text-white">
181
+ <!-- Navigation -->
182
+ <header class="fixed w-full z-50 bg-dark border-b border-primary">
183
+ <div class="container mx-auto px-4 py-3 flex justify-between items-center">
184
+ <div class="flex items-center">
185
+ <div class="w-10 h-10 bg-primary rounded-full mr-3"></div>
186
+ <a href="index.html" class="text-xl font-extrabold"><span class="text-[#008080]">NAGAS</span><span class="text-white">ATHLETICS</span></a>
187
+ </div>
188
+ <nav class="hidden md:flex space-x-6">
189
+ <a href="index.html" class="hover:text-primary">Home</a>
190
+ <a href="about.html" class="hover:text-primary">About</a>
191
+ <a href="teams.html" class="hover:text-primary">Teams</a>
192
+ <a href="schedule.html" class="hover:text-primary">Schedule</a>
193
+ <a href="council.html" class="hover:text-primary">Council</a>
194
+ <a href="news.html" class="hover:text-primary">News</a>
195
+ <a href="get-involved.html" class="hover:text-primary">Get Involved</a>
196
+ </nav>
197
+ <button id="menu-toggle" class="md:hidden text-white">
198
+ <i data-feather="menu"></i>
199
+ </button>
200
+ </div>
201
+ </header>
202
+
203
+ <!-- Mobile Menu -->
204
+ <div id="mobile-menu" class="fixed inset-0 bg-dark z-50 hidden">
205
+ <div class="flex justify-between items-center p-4 border-b border-primary">
206
+ <div class="flex items-center">
207
+ <div class="w-10 h-10 bg-primary rounded-full mr-3"></div>
208
+ <span class="text-xl font-extrabold"><span class="text-[#008080]">NAGAS</span><span class="text-white">ATHLETICS</span></span>
209
+ </div>
210
+ <button id="menu-close" class="text-white">
211
+ <i data-feather="x"></i>
212
+ </button>
213
+ </div>
214
+ <nav class="p-4">
215
+ <a href="index.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">Home</a>
216
+ <a href="about.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">About</a>
217
+ <a href="teams.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">Teams</a>
218
+ <a href="schedule.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">Schedule</a>
219
+ <a href="council.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">Council</a>
220
+ <a href="news.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">News</a>
221
+ <a href="get-involved.html" class="block py-3 hover:text-primary border-b border-[#2e2e2e]">Get Involved</a>
222
+ </nav>
223
+ </div>
224
+
225
+ <!-- Breadcrumb -->
226
+ <div class="pt-20 pb-4 bg-darker border-b border-[#2e2e2e]">
227
+ <div class="container mx-auto px-4">
228
+ <nav class="text-sm">
229
+ <a href="index.html" class="text-primary hover:underline">Home</a> >
230
+ <a href="teams.html" class="text-primary hover:underline">Teams</a> >
231
+ <a href="volleyball.html" class="text-primary hover:underline">Volleyball</a> >
232
+ <span class="text-white">Junior A Boys</span>
233
+ </nav>
234
+ </div>
235
+ </div>
236
+
237
+ <!-- Back Button -->
238
+ <div class="container mx-auto px-4 py-6">
239
+ <a href="volleyball.html" class="inline-flex items-center text-primary hover:text-white transition">
240
+ <i data-feather="arrow-left" class="mr-2"></i> Back to Volleyball Teams
241
+ </a>
242
+ </div>
243
+
244
+ <!-- Team Header -->
245
+ <section class="py-8 text-center px-4">
246
+ <h1 class="text-4xl md:text-5xl font-bold mb-2">Junior A Boys Volleyball</h1>
247
+ <p class="text-lightGrey text-base mb-6">Northbridge Athletic Groups and Sports</p>
248
+ </section>
249
+
250
+ <!-- Search Bar -->
251
+ <div class="container mx-auto px-4 mb-8">
252
+ <div class="max-w-md mx-auto">
253
+ <input type="text" id="search-players" placeholder="Search players..." class="w-full px-4 py-2 rounded bg-[#1E1E1E] border border-[#008080] text-white focus:outline-none focus:ring-2 focus:ring-[#008080]">
254
+ </div>
255
+ </div>
256
+
257
+ <!-- Player Grid -->
258
+ <section class="py-8 px-4">
259
+ <div class="container mx-auto">
260
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6" id="player-grid">
261
+ <!-- Player cards will be populated by JavaScript -->
262
+ </div>
263
+ </div>
264
+ </section>
265
+
266
+ <!-- Player Profile Modal -->
267
+ <div id="profile-modal" class="modal">
268
+ <div class="modal-content">
269
+ <span class="close-modal">&times;</span>
270
+ <h2 id="modal-player-name" class="text-2xl font-bold mb-2"></h2>
271
+ <p id="modal-player-position" class="text-primary mb-4"></p>
272
+
273
+ <!-- Carousel Container -->
274
+ <div class="carousel-container">
275
+ <div class="carousel-main">
276
+ <img id="carousel-main-img" src="" alt="Main photo">
277
+ <button class="carousel-arrow prev">‹</button>
278
+ <button class="carousel-arrow next">›</button>
279
+ </div>
280
+ <div class="carousel-thumbs" id="carousel-thumbs">
281
+ <!-- Thumbnails will be populated by JavaScript -->
282
+ </div>
283
+ </div>
284
+
285
+ <div class="mt-4">
286
+ <h3 class="text-xl font-bold mb-2">Player Stats</h3>
287
+ <ul id="player-stats" class="text-lightGrey">
288
+ <!-- Stats will be populated by JavaScript -->
289
+ </ul>
290
+ </div>
291
+ </div>
292
+ </div>
293
+
294
+ <!-- Footer -->
295
+ <footer class="bg-darker py-12 border-t border-[#2e2e2e]">
296
+ <div class="container mx-auto px-4">
297
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
298
+ <div>
299
+ <h3 class="text-xl font-bold mb-4">Contact Info</h3>
300
+ <p>Northbridge International School Cambodia</p>
301
+ <p>#98C, Street 169, Phnom Penh</p>
302
+ <p>Email: info@nagas.edu.kh</p>
303
+ <p>Phone: +855 12 345 678</p>
304
+ </div>
305
+ <div>
306
+ <h3 class="text-xl font-bold mb-4">Follow Us</h3>
307
+ <div class="flex space-x-4">
308
+ <a href="#" class="text-primary hover:text-lightGrey">
309
+ <i data-feather="facebook"></i>
310
+ </a>
311
+ <a href="#" class="text-primary hover:text-lightGrey">
312
+ <i data-feather="instagram"></i>
313
+ </a>
314
+ </div>
315
+ <p class="mt-2">@NAGAS_NISC</p>
316
+ </div>
317
+ <div>
318
+ <h3 class="text-xl font-bold mb-4">Quick Links</h3>
319
+ <ul class="space-y-2">
320
+ <li><a href="teams.html" class="hover:text-primary">Teams</a></li>
321
+ <li><a href="schedule.html" class="hover:text-primary">Schedule</a></li>
322
+ <li><a href="news.html" class="hover:text-primary">News</a></li>
323
+ <li><a href="#" class="hover:text-primary">Athlete Portal</a></li>
324
+ </ul>
325
+ </div>
326
+ </div>
327
+ <div class="border-t border-[#2e2e2e] mt-8 pt-8 text-center">
328
+ <p>&copy; 2023 NAGAS - Northbridge Athletic Groups and Sports. All rights reserved.</p>
329
+ </div>
330
+ </div>
331
+ </footer>
332
+
333
+ <script>
334
+ feather.replace();
335
+
336
+ // Mobile menu toggle
337
+ document.getElementById('menu-toggle').addEventListener('click', function() {
338
+ document.getElementById('mobile-menu').classList.remove('hidden');
339
+ });
340
+
341
+ document.getElementById('menu-close').addEventListener('click', function() {
342
+ document.getElementById('mobile-menu').classList.add('hidden');
343
+ });
344
+
345
+ // Sample player data (in a real app, this would come from an API)
346
+ const players = [
347
+ {
348
+ id: 1,
349
+ name: "David Martinez",
350
+ position: "Setter",
351
+ images: [
352
+ "http://static.photos/people/320x240/1",
353
+ "http://static.photos/people/320x240/2",
354
+ "http://static.photos/people/320x240/3"
355
+ ],
356
+ stats: {
357
+ "Height": "175 cm",
358
+ "Age": "16",
359
+ "Hometown": "Phnom Penh",
360
+ "Matches Played": "24",
361
+ "Sets Won": "89"
362
+ }
363
+ },
364
+ {
365
+ id: 2,
366
+ name: "Michael Chen",
367
+ position: "Outside Hitter",
368
+ images: [
369
+ "http://static.photos/people/320x240/4",
370
+ "http://static.photos/people/320x240/5",
371
+ "http://static.photos/people/320x240/6"
372
+ ],
373
+ stats: {
374
+ "Height": "182 cm",
375
+ "Age": "17",
376
+ "Hometown": "Siem Reap",
377
+ "Matches Played": "22",
378
+ "Points Scored": "156"
379
+ }
380
+ },
381
+ {
382
+ id: 3,
383
+ name: "James Wilson",
384
+ position: "Middle Blocker",
385
+ images: [
386
+ "http://static.photos/people/320x240/7",
387
+ "http://static.photos/people/320x240/8",
388
+ "http://static.photos/people/320x240/9"
389
+ ],
390
+ stats: {
391
+ "Height": "188 cm",
392
+ "Age": "16",
393
+ "Hometown": "Sihanoukville",
394
+ "Matches Played": "20",
395
+ "Blocks": "42"
396
+ }
397
+ },
398
+ {
399
+ id: 4,
400
+ name: "Robert Johnson",
401
+ position: "Libero",
402
+ images: [
403
+ "http://static.photos/people/320x240/10",
404
+ "http://static.photos/people/320x240/11",
405
+ "http://static.photos/people/320x240/12"
406
+ ],
407
+ stats: {
408
+ "Height": "170 cm",
409
+ "Age": "17",
410
+ "Hometown": "Battambang",
411
+ "Matches Played": "25",
412
+ "Digs": "128"
413
+ }
414
+ },
415
+ {
416
+ id: 5,
417
+ name: "Thomas Brown",
418
+ position: "Opposite Hitter",
419
+ images: [
420
+ "http://static.photos/people/320x240/13",
421
+ "http://static.photos/people/320x240/14",
422
+ "http://static.photos/people/320x240/15"
423
+ ],
424
+ stats: {
425
+ "Height": "185 cm",
426
+ "Age": "16",
427
+ "Hometown": "Kampot",
428
+ "Matches Played": "21",
429
+ "Points Scored": "134"
430
+ }
431
+ },
432
+ {
433
+ id: 6,
434
+ name: "Daniel Davis",
435
+ position: "Outside Hitter",
436
+ images: [
437
+ "http://static.photos/people/320x240/16",
438
+ "http://static.photos/people/320x240/17",
439
+ "http://static.photos/people/320x240/18"
440
+ ],
441
+ stats: {
442
+ "Height": "180 cm",
443
+ "Age": "17",
444
+ "Hometown": "Kep",
445
+ "Matches Played": "19",
446
+ "Points Scored": "112"
447
+ }
448
+ }
449
+ ];
450
+
451
+ // Populate player grid
452
+ const playerGrid = document.getElementById('player-grid');
453
+ const searchInput = document.getElementById('search-players');
454
+
455
+ function renderPlayers(playerList) {
456
+ playerGrid.innerHTML = '';
457
+ playerList.forEach((player, index) => {
458
+ const playerCard = document.createElement('div');
459
+ playerCard.className = 'player-card';
460
+ playerCard.innerHTML = `
461
+ <img src="${player.images[0]}" alt="${player.name}" class="w-full h-48 object-cover rounded mb-4">
462
+ <h3 class="text-xl font-bold">${player.name}</h3>
463
+ <p class="text-primary">${player.position}</p>
464
+ `;
465
+
466
+ // Add staggered animation delay
467
+ playerCard.style.animation = `fadeIn 0.5s ease forwards ${index * 0.1}s`;
468
+
469
+ playerCard.addEventListener('click', () => openPlayerModal(player));
470
+ playerGrid.appendChild(playerCard);
471
+ });
472
+ }
473
+
474
+ // Search functionality
475
+ searchInput.addEventListener('input', function() {
476
+ const searchTerm = this.value.toLowerCase();
477
+ const filteredPlayers = players.filter(player =>
478
+ player.name.toLowerCase().includes(searchTerm)
479
+ );
480
+ renderPlayers(filteredPlayers);
481
+ });
482
+
483
+ // Initial render
484
+ renderPlayers(players);
485
+
486
+ // Player modal functionality
487
+ const modal = document.getElementById('profile-modal');
488
+ const closeModalBtn = document.querySelector('.close-modal');
489
+
490
+ function openPlayerModal(player) {
491
+ document.getElementById('modal-player-name').textContent = player.name;
492
+ document.getElementById('modal-player-position').textContent = player.position;
493
+
494
+ // Set main image
495
+ const mainImg = document.getElementById('carousel-main-img');
496
+ mainImg.src = player.images[0];
497
+ mainImg.alt = player.name;
498
+
499
+ // Populate thumbnails
500
+ const thumbsContainer = document.getElementById('carousel-thumbs');
501
+ thumbsContainer.innerHTML = '';
502
+ player.images.forEach((img, index) => {
503
+ const thumb = document.createElement('img');
504
+ thumb.src = img;
505
+ thumb.alt = `${player.name} ${index + 1}`;
506
+ if (index === 0) thumb.classList.add('active');
507
+ thumbsContainer.appendChild(thumb);
508
+ });
509
+
510
+ // Populate stats
511
+ const statsList = document.getElementById('player-stats');
512
+ statsList.innerHTML = '';
513
+ for (const [key, value] of Object.entries(player.stats)) {
514
+ const li = document.createElement('li');
515
+ li.innerHTML = `<strong>${key}:</strong> ${value}`;
516
+ statsList.appendChild(li);
517
+ }
518
+
519
+ modal.style.display = 'flex';
520
+
521
+ // Initialize carousel for this player
522
+ initializeCarousel(player.images);
523
+ }
524
+
525
+ closeModalBtn.addEventListener('click', () => {
526
+ modal.style.display = 'none';
527
+ });
528
+
529
+ window.addEventListener('click', (e) => {
530
+ if (e.target === modal) {
531
+ modal.style.display = 'none';
532
+ }
533
+ });
534
+
535
+ // Carousel functionality
536
+ function initializeCarousel(images) {
537
+ const mainImg = document.getElementById('carousel-main-img');
538
+ const thumbs = document.querySelectorAll('.carousel-thumbs img');
539
+ let currentIndex = 0;
540
+
541
+ // Set up thumbnail click events
542
+ thumbs.forEach((thumb, index) => {
543
+ thumb.addEventListener('click', () => {
544
+ currentIndex = index;
545
+ updateCarousel();
546
+ });
547
+ });
548
+
549
+ // Navigation arrows
550
+ document.querySelector('.carousel-arrow.prev').addEventListener('click', () => {
551
+ currentIndex = (currentIndex > 0) ? currentIndex - 1 : thumbs.length - 1;
552
+ updateCarousel();
553
+ });
554
+
555
+ document.querySelector('.carousel-arrow.next').addEventListener('click', () => {
556
+ currentIndex = (currentIndex < thumbs.length - 1) ? currentIndex + 1 : 0;
557
+ updateCarousel();
558
+ });
559
+
560
+ // Swipe support for mobile
561
+ let touchStartX = 0;
562
+ mainImg.addEventListener('touchstart', (e) => {
563
+ touchStartX = e.changedTouches[0].screenX;
564
+ });
565
+
566
+ mainImg.addEventListener('touchend', (e) => {
567
+ const touchEndX = e.changedTouches[0].screenX;
568
+ if (touchStartX - touchEndX > 50) { // Swipe left
569
+ currentIndex = (currentIndex < thumbs.length - 1) ? currentIndex + 1 : 0;
570
+ } else if (touchEndX - touchStartX > 50) { // Swipe right
571
+ currentIndex = (currentIndex > 0) ? currentIndex - 1 : thumbs.length - 1;
572
+ }
573
+ updateCarousel();
574
+ });
575
+
576
+ function updateCarousel() {
577
+ // Fade out current image
578
+ mainImg.style.opacity = 0;
579
+
580
+ setTimeout(() => {
581
+ // Update main image
582
+ mainImg.src = images[currentIndex];
583
+ mainImg.style.opacity = 1;
584
+
585
+ // Update active thumbnail
586
+ thumbs.forEach((thumb, index) => {
587
+ thumb.classList.toggle('active', index === currentIndex);
588
+ });
589
+ }, 300);
590
+ }
591
+ }
592
+ </script>
593
+ </body>
594
+ </html>
volleyball.html CHANGED
@@ -158,7 +158,7 @@
158
  <h2 class="text-3xl md:text-4xl font-bold text-center mb-4 section-title">Our Volleyball Teams</h2>
159
  <p class="text-lightGrey text-base text-center mb-8">Select a team to view players</p>
160
  <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
161
- <a href="#" class="team-tile block">
162
  <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mx-auto mb-4">
163
  <path d="M12 2L2 7l10 5 10-5-10-5z"></path>
164
  <path d="M2 17l10 5 10-5"></path>
@@ -223,7 +223,7 @@
223
  <h3 class="text-xl font-bold">Senior B Girls</h3>
224
  </a>
225
  </div>
226
- </div>
227
  </section>
228
 
229
  <!-- Footer -->
 
158
  <h2 class="text-3xl md:text-4xl font-bold text-center mb-4 section-title">Our Volleyball Teams</h2>
159
  <p class="text-lightGrey text-base text-center mb-8">Select a team to view players</p>
160
  <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
161
+ <a href="junior-a-boys.html" class="team-tile block">
162
  <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mx-auto mb-4">
163
  <path d="M12 2L2 7l10 5 10-5-10-5z"></path>
164
  <path d="M2 17l10 5 10-5"></path>
 
223
  <h3 class="text-xl font-bold">Senior B Girls</h3>
224
  </a>
225
  </div>
226
+ </div>
227
  </section>
228
 
229
  <!-- Footer -->