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, viewport-fit=cover">
6 <title>MSK Pro Audio • Ultra Wireless Headphones</title>
7 <style>
8 /* =========================================
9 DESIGN TOKENS (Scoped Product Architecture)
10 ========================================= */
11 :root {
12 /* Dynamic Variant Token (Default: Midnight Navy) */
13 --variant-color: #2563eb;
14 --variant-soft: rgba(37, 99, 235, 0.12);
15 --variant-border: rgba(37, 99, 235, 0.3);
16
17 --bg-canvas: #0f172a;
18 --bg-surface: #1e293b;
19 --bg-elevated: #334155;
20
21 --text-main: #f8fafc;
22 --text-muted: #94a3b8;
23 --border-subtle: #334155;
24
25 --card-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.5);
26 }
27
28 * {
29 box-sizing: border-box;
30 margin: 0;
31 padding: 0;
32 font-family: system-ui, -apple-system, sans-serif;
33 }
34
35 body {
36 background-color: var(--bg-canvas);
37 color: var(--text-main);
38 min-height: 100vh;
39 display: flex;
40 flex-direction: column;
41 align-items: center;
42 padding-bottom: 90px; /* Reserves clearance for mobile dock */
43 }
44
45 .container {
46 width: 100%;
47 max-width: 1100px;
48 padding: 2.5rem 1.5rem;
49 }
50
51 /* Simulation Toolbar */
52 .sim-bar {
53 display: flex;
54 justify-content: space-between;
55 align-items: center;
56 background: var(--bg-surface);
57 border: 1px solid var(--border-subtle);
58 border-radius: 0.75rem;
59 padding: 0.75rem 1.25rem;
60 margin-bottom: 2rem;
61 flex-wrap: wrap;
62 gap: 1rem;
63 }
64
65 .sim-btn {
66 background: #4f46e5;
67 color: #ffffff;
68 border: none;
69 padding: 0.5rem 1rem;
70 border-radius: 0.4rem;
71 font-weight: 600;
72 cursor: pointer;
73 font-size: 0.85rem;
74 }
75
76 /* =========================================
77 MACRO LAYOUT: 2-COLUMN PRODUCT STAGE
78 ========================================= */
79 .product-stage {
80 display: grid;
81 grid-template-columns: 1fr 1fr;
82 gap: 3.5rem;
83 align-items: start;
84 }
85
86 /* LEFT: STICKY MEDIA GALLERY */
87 .media-gallery {
88 position: sticky;
89 top: 2rem;
90 display: flex;
91 flex-direction: column;
92 gap: 1rem;
93 }
94
95 /* Hero Showcase Frame with Lens Zoom */
96 .showcase-frame {
97 width: 100%;
98 aspect-ratio: 1 / 1;
99 background: var(--bg-surface);
100 border: 1px solid var(--border-subtle);
101 border-radius: 1.5rem;
102 overflow: hidden;
103 display: flex;
104 align-items: center;
105 justify-content: center;
106 position: relative;
107 box-shadow: var(--card-shadow);
108 cursor: crosshair;
109 }
110
111 .showcase-visual {
112 font-size: 8rem;
113 transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);
114 user-select: none;
115 }
116
117 /* Hardware Zoom on Hover */
118 .showcase-frame:hover .showcase-visual {
119 transform: scale(1.35) rotate(5deg);
120 }
121
122 .gallery-thumbs {
123 display: flex;
124 gap: 1rem;
125 }
126
127 .thumb-btn {
128 flex: 1;
129 aspect-ratio: 1 / 1;
130 background: var(--bg-surface);
131 border: 2px solid var(--border-subtle);
132 border-radius: 0.75rem;
133 display: flex;
134 align-items: center;
135 justify-content: center;
136 font-size: 1.75rem;
137 cursor: pointer;
138 transition: border-color 0.2s ease;
139 }
140
141 .thumb-btn.is-active {
142 border-color: var(--variant-color);
143 background: var(--variant-soft);
144 }
145
146 /* RIGHT: CONFIGURATOR & DETAILS */
147 .configurator {
148 display: flex;
149 flex-direction: column;
150 gap: 1.5rem;
151 }
152
153 .breadcrumb {
154 font-size: 0.85rem;
155 color: var(--text-muted);
156 }
157
158 .product-badge {
159 align-self: flex-start;
160 background: var(--variant-soft);
161 color: var(--variant-color);
162 border: 1px solid var(--variant-border);
163 padding: 0.35rem 0.85rem;
164 border-radius: 999px;
165 font-size: 0.8rem;
166 font-weight: 700;
167 text-transform: uppercase;
168 letter-spacing: 0.05em;
169 }
170
171 .product-title {
172 font-size: clamp(1.75rem, 1.2rem + 2vw, 2.75rem);
173 font-weight: 900;
174 line-height: 1.2;
175 }
176
177 .price-row {
178 display: flex;
179 align-items: baseline;
180 gap: 1rem;
181 }
182
183 .current-price {
184 font-size: 2.25rem;
185 font-weight: 900;
186 color: #ffffff;
187 }
188
189 .original-price {
190 font-size: 1.25rem;
191 color: var(--text-muted);
192 text-decoration: line-through;
193 }
194
195 .discount-pill {
196 background: rgba(16, 185, 129, 0.15);
197 color: #34d399;
198 font-weight: 700;
199 padding: 0.25rem 0.6rem;
200 border-radius: 4px;
201 font-size: 0.8rem;
202 }
203
204 /* Scoped Color Swatches */
205 .swatch-group {
206 display: flex;
207 flex-direction: column;
208 gap: 0.5rem;
209 }
210
211 .swatch-label {
212 font-size: 0.9rem;
213 font-weight: 600;
214 color: var(--text-muted);
215 }
216
217 .swatch-row {
218 display: flex;
219 gap: 0.75rem;
220 }
221
222 .swatch-dot {
223 width: 36px;
224 height: 36px;
225 border-radius: 50%;
226 cursor: pointer;
227 border: 3px solid var(--bg-surface);
228 outline: 2px solid transparent;
229 transition: all 0.2s ease;
230 }
231
232 .swatch-dot.is-selected {
233 outline-color: var(--variant-color);
234 transform: scale(1.1);
235 }
236
237 /* Primary Action Buttons */
238 .actions-row {
239 display: flex;
240 gap: 1rem;
241 margin-top: 1rem;
242 }
243
244 .btn-buy {
245 flex: 2;
246 background: var(--variant-color);
247 color: #ffffff;
248 border: none;
249 padding: 1rem 1.5rem;
250 border-radius: 0.75rem;
251 font-size: 1rem;
252 font-weight: 700;
253 cursor: pointer;
254 box-shadow: 0 10px 20px -5px var(--variant-border);
255 transition: opacity 0.2s ease, transform 0.15s ease;
256 }
257
258 .btn-buy:hover {
259 opacity: 0.95;
260 transform: translateY(-2px);
261 }
262
263 .btn-wishlist {
264 flex: 1;
265 background: var(--bg-surface);
266 color: var(--text-main);
267 border: 1px solid var(--border-subtle);
268 border-radius: 0.75rem;
269 font-weight: 600;
270 cursor: pointer;
271 }
272
273 /* =========================================
274 SHIMMER SKELETON STATE (ZERO CLS)
275 ========================================= */
276 @keyframes shimmer {
277 0% { background-position: -200% 0; }
278 100% { background-position: 200% 0; }
279 }
280
281 .skeleton {
282 background-color: #334155;
283 background-image: linear-gradient(
284 90deg,
285 rgba(255, 255, 255, 0) 0%,
286 rgba(255, 255, 255, 0.08) 50%,
287 rgba(255, 255, 255, 0) 100%
288 );
289 background-size: 200% 100%;
290 animation: shimmer 1.5s infinite linear;
291 border-radius: 0.5rem;
292 }
293
294 .skeleton-view {
295 display: none;
296 }
297
298 body.is-loading .live-view {
299 display: none;
300 }
301
302 body.is-loading .skeleton-view {
303 display: grid;
304 }
305
306 /* =========================================
307 MOBILE PERSISTENT CHECKOUT DOCK
308 ========================================= */
309 .mobile-dock {
310 display: none;
311 position: fixed;
312 bottom: 0;
313 left: 0;
314 right: 0;
315 background: rgba(15, 23, 42, 0.95);
316 backdrop-filter: blur(16px);
317 border-top: 1px solid var(--border-subtle);
318 padding: 0.75rem 1.5rem;
319 /* SAFE-AREA CLEARANCE */
320 padding-bottom: calc(0.75rem + env(safe-area-inset-bottom, 0px));
321 z-index: 1000;
322 justify-content: space-between;
323 align-items: center;
324 }
325
326 .dock-price {
327 font-size: 1.35rem;
328 font-weight: 800;
329 }
330
331 .dock-btn {
332 background: var(--variant-color);
333 color: #ffffff;
334 border: none;
335 padding: 0.75rem 1.5rem;
336 border-radius: 0.5rem;
337 font-weight: 700;
338 font-size: 0.95rem;
339 }
340
341 @media (max-width: 820px) {
342 .product-stage {
343 grid-template-columns: 1fr;
344 gap: 2rem;
345 }
346 .media-gallery {
347 position: static;
348 }
349 .mobile-dock {
350 display: flex;
351 }
352 }
353 </style>
354</head>
355<body>
356
357 <div class="container">
358 <!-- Simulation Controller -->
359 <div class="sim-bar">
360 <div>
361 <strong>E-Commerce Telemetry:</strong>
362 <span id="loadStateText" style="color: #34d399; margin-left: 0.5rem;">Live Payload Active</span>
363 </div>
364 <button class="sim-btn" id="btnSimulateLoad">Toggle Shimmer Placeholder</button>
365 </div>
366
367 <!-- =========================================
368 1. LIVE LOADED VIEW
369 ========================================= -->
370 <main class="product-stage live-view">
371 <!-- Media Showcase -->
372 <section class="media-gallery">
373 <div class="showcase-frame" id="zoomFrame">
374 <div class="showcase-visual" id="productVisual">🎧</div>
375 </div>
376 <div class="gallery-thumbs">
377 <button class="thumb-btn is-active" data-icon="🎧">🎧</button>
378 <button class="thumb-btn" data-icon="📦">📦</button>
379 <button class="thumb-btn" data-icon="🔌">🔌</button>
380 <button class="thumb-btn" data-icon="🎙️">🎙️</button>
381 </div>
382 </section>
383
384 <!-- Purchase Configurator -->
385 <section class="configurator">
386 <div class="breadcrumb">Home / Audio / Noise-Cancelling Headphones</div>
387 <span class="product-badge">Flagship Audio 2026</span>
388 <h1 class="product-title">MSK Studio Pro Wireless ANC</h1>
389
390 <div class="price-row">
391 <span class="current-price">₹14,999</span>
392 <span class="original-price">₹21,999</span>
393 <span class="discount-pill">32% OFF</span>
394 </div>
395
396 <p style="color: var(--text-muted); line-height: 1.6; font-size: 0.95rem;">
397 Featuring 40mm beryllium drivers, 55-hour battery life, hybrid active noise cancellation, and spatial audio with dynamic head tracking.
398 </p>
399
400 <!-- Scoped Color Swatches -->
401 <div class="swatch-group">
402 <span class="swatch-label">Select Finish: <strong id="swatchName" style="color: var(--text-main);">Midnight Cobalt</strong></span>
403 <div class="swatch-row">
404 <div class="swatch-dot is-selected" style="background: #2563eb;" data-color="#2563eb" data-name="Midnight Cobalt"></div>
405 <div class="swatch-dot" style="background: #059669;" data-color="#059669" data-name="Peacock Emerald"></div>
406 <div class="swatch-dot" style="background: #d97706;" data-color="#d97706" data-name="Amber Saffron"></div>
407 <div class="swatch-dot" style="background: #475569;" data-color="#475569" data-name="Charcoal Titanium"></div>
408 </div>
409 </div>
410
411 <div class="actions-row">
412 <button class="btn-buy">Add to Bag • Instant Dispatch</button>
413 <button class="btn-wishlist">♡ Save</button>
414 </div>
415 </section>
416 </main>
417
418 <!-- =========================================
419 2. SKELETON WIREFRAME (EXACT SAME DIMENSIONS FOR ZERO CLS)
420 ========================================= -->
421 <div class="product-stage skeleton-view">
422 <div class="media-gallery">
423 <div class="skeleton" style="width: 100%; aspect-ratio: 1/1; border-radius: 1.5rem;"></div>
424 <div class="gallery-thumbs">
425 <div class="skeleton" style="flex: 1; aspect-ratio: 1/1; border-radius: 0.75rem;"></div>
426 <div class="skeleton" style="flex: 1; aspect-ratio: 1/1; border-radius: 0.75rem;"></div>
427 <div class="skeleton" style="flex: 1; aspect-ratio: 1/1; border-radius: 0.75rem;"></div>
428 <div class="skeleton" style="flex: 1; aspect-ratio: 1/1; border-radius: 0.75rem;"></div>
429 </div>
430 </div>
431
432 <div class="configurator">
433 <div class="skeleton" style="height: 16px; width: 40%;"></div>
434 <div class="skeleton" style="height: 28px; width: 30%; border-radius: 999px;"></div>
435 <div class="skeleton" style="height: 52px; width: 85%;"></div>
436 <div class="skeleton" style="height: 38px; width: 50%;"></div>
437 <div class="skeleton" style="height: 80px; width: 100%;"></div>
438 <div class="skeleton" style="height: 48px; width: 100%; margin-top: 1rem;"></div>
439 </div>
440 </div>
441 </div>
442
443 <!-- Mobile Persistent Bottom Dock with Safe Area Clearance -->
444 <aside class="mobile-dock">
445 <div>
446 <div style="font-size: 0.75rem; color: var(--text-muted);">Total Price</div>
447 <div class="dock-price">₹14,999</div>
448 </div>
449 <button class="dock-btn">Add to Bag</button>
450 </aside>
451
452 <script>
453 // Color Swatch Switcher (Scoped CSS Variable Mutation)
454 const swatches = document.querySelectorAll('.swatch-dot');
455 const swatchName = document.getElementById('swatchName');
456
457 swatches.forEach(swatch => {
458 swatch.addEventListener('click', () => {
459 swatches.forEach(s => s.classList.remove('is-selected'));
460 swatch.classList.add('is-selected');
461
462 const color = swatch.getAttribute('data-color');
463 const name = swatch.getAttribute('data-name');
464
465 document.documentElement.style.setProperty('--variant-color', color);
466 document.documentElement.style.setProperty('--variant-soft', `${color}1f`);
467 document.documentElement.style.setProperty('--variant-border', `${color}4d`);
468 swatchName.textContent = name;
469 });
470 });
471
472 // Gallery Thumbnail Switcher
473 const thumbBtns = document.querySelectorAll('.thumb-btn');
474 const visual = document.getElementById('productVisual');
475
476 thumbBtns.forEach(btn => {
477 btn.addEventListener('click', () => {
478 thumbBtns.forEach(b => b.classList.remove('is-active'));
479 btn.classList.add('is-active');
480 visual.textContent = btn.getAttribute('data-icon');
481 });
482 });
483
484 // Skeleton Simulator Toggle
485 const btnSimulate = document.getElementById('btnSimulateLoad');
486 const loadStateText = document.getElementById('loadStateText');
487
488 btnSimulate.addEventListener('click', () => {
489 document.body.classList.toggle('is-loading');
490 if (document.body.classList.contains('is-loading')) {
491 loadStateText.textContent = 'Simulated Shimmer Skeleton Active';
492 loadStateText.style.color = '#f59e0b';
493 btnSimulate.textContent = 'Hydrate Real Content';
494 } else {
495 loadStateText.textContent = 'Live Payload Active';
496 loadStateText.style.color = '#34d399';
497 btnSimulate.textContent = 'Toggle Shimmer Placeholder';
498 }
499 });
500 </script>
501</body>
502</html>