|
| 1 | +--- |
| 2 | +# No layout: standalone product page. Empty front matter only so Jekyll |
| 3 | +# runs this through Liquid and the analytics include resolves. |
| 4 | +--- |
| 5 | +<!DOCTYPE html> |
| 6 | +<html lang="en"> |
| 7 | +<head> |
| 8 | +<meta charset="utf-8"> |
| 9 | +<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> |
| 10 | +<title>Griffin P1 — the handheld built to outrun the pack</title> |
| 11 | +<meta name="description" content="Griffin P1: a 120Hz OLED handheld with custom Griffin G1 silicon, Hall-effect sticks and GriffinOS. Concept product page demo built with Three.js."> |
| 12 | +<meta name="theme-color" content="#0b0906" media="(prefers-color-scheme: dark)"> |
| 13 | +<meta name="theme-color" content="#f6efe4" media="(prefers-color-scheme: light)"> |
| 14 | +<link rel="preconnect" href="https://fonts.googleapis.com"> |
| 15 | +<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 16 | +<link href="https://fonts.googleapis.com/css2?family=Unbounded:wght@200;400;600;700;900&family=Manrope:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"> |
| 17 | +<link rel="stylesheet" href="styles.css"> |
| 18 | +{% include analytics.html %} |
| 19 | +</head> |
| 20 | +<body data-theme="dark"> |
| 21 | + |
| 22 | +<canvas id="orbit-field" aria-hidden="true"></canvas> |
| 23 | + |
| 24 | +<a class="skip-link" href="#main">Skip to content</a> |
| 25 | + |
| 26 | +<header class="nav" id="top"> |
| 27 | + <a class="nav-mark" href="#top"> |
| 28 | + GRIFFIN <span class="nav-mark-p1">P1</span> |
| 29 | + </a> |
| 30 | + <nav class="nav-links" aria-label="Primary"> |
| 31 | + <a href="#design">Design</a> |
| 32 | + <a href="#griffinos">GriffinOS</a> |
| 33 | + <a href="#library">Library</a> |
| 34 | + <a href="#reserve">Reserve</a> |
| 35 | + </nav> |
| 36 | + <div class="nav-actions"> |
| 37 | + <button class="theme-toggle" id="themeToggle" type="button" aria-pressed="false" aria-label="Switch to light mode"> |
| 38 | + <span class="theme-toggle-track"> |
| 39 | + <span class="theme-toggle-thumb" aria-hidden="true"> |
| 40 | + <svg class="icon-sun" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="4.2"/><path d="M12 2v3M12 19v3M4.2 4.2l2.1 2.1M17.7 17.7l2.1 2.1M2 12h3M19 12h3M4.2 19.8l2.1-2.1M17.7 6.3l2.1-2.1"/></svg> |
| 41 | + <svg class="icon-moon" viewBox="0 0 24 24" aria-hidden="true"><path d="M20 14.5A8.5 8.5 0 1 1 9.5 4a6.8 6.8 0 0 0 10.5 10.5Z"/></svg> |
| 42 | + </span> |
| 43 | + </span> |
| 44 | + </button> |
| 45 | + <a class="btn btn-ember" href="#reserve">Reserve</a> |
| 46 | + </div> |
| 47 | +</header> |
| 48 | + |
| 49 | +<main id="main"> |
| 50 | + |
| 51 | + <!-- ============================== HERO ============================== --> |
| 52 | + <section class="hero" id="hero"> |
| 53 | + <div class="hero-inner"> |
| 54 | + <p class="eyebrow">HANDHELD · GRIFFIN P1 · FIRST FLIGHT 2026</p> |
| 55 | + <h1 class="hero-title"> |
| 56 | + <span class="hero-title-line">Talons out</span> |
| 57 | + <span class="hero-title-line hero-title-accent">Gamers First</span> |
| 58 | + </h1> |
| 59 | + <p class="hero-sub">A handheld built around one obsession, nothing between your thumb and the game.</p> |
| 60 | + <div class="hero-cta"> |
| 61 | + <a class="btn btn-ember btn-lg" href="#reserve">Reserve yours</a> |
| 62 | + <a class="btn btn-ghost btn-lg" href="#griffinos">See it fly ↓</a> |
| 63 | + </div> |
| 64 | + </div> |
| 65 | + |
| 66 | + <div class="hero-device-wrap"> |
| 67 | + <div class="device" id="heroDevice"> |
| 68 | + <span class="shoulder shoulder-l" aria-hidden="true"></span> |
| 69 | + <span class="shoulder shoulder-r" aria-hidden="true"></span> |
| 70 | + <div class="device-body"> |
| 71 | + <div class="device-controls device-controls-left" aria-hidden="true"> |
| 72 | + <span class="stick"></span> |
| 73 | + <span class="dpad"></span> |
| 74 | + <span class="touchpad"></span> |
| 75 | + </div> |
| 76 | + |
| 77 | + <div class="device-screen-bezel"> |
| 78 | + <div class="device-vents" aria-hidden="true"></div> |
| 79 | + <div class="device-screen" id="deviceScreen"> |
| 80 | + <canvas id="gameCanvas" width="480" height="300"></canvas> |
| 81 | + <p class="device-now-playing" id="deviceNowPlaying">Ember Run</p> |
| 82 | + </div> |
| 83 | + </div> |
| 84 | + |
| 85 | + <div class="device-controls device-controls-right" aria-hidden="true"> |
| 86 | + <span class="face-buttons"><i></i><i></i><i></i><i></i></span> |
| 87 | + <span class="stick"></span> |
| 88 | + <span class="touchpad"></span> |
| 89 | + </div> |
| 90 | + </div> |
| 91 | + <div class="device-glow" aria-hidden="true"></div> |
| 92 | + </div> |
| 93 | + </div> |
| 94 | + |
| 95 | + <ul class="spec-ticker" aria-label="Key specifications"> |
| 96 | + <li>30Hz - 120Hz</li> |
| 97 | + <li>9 hr flight time</li> |
| 98 | + <li>Hall-effect sticks</li> |
| 99 | + <li>512GB storage</li> |
| 100 | + <li>Cartridge + cloud</li> |
| 101 | + <li>Griffin G1 chip</li> |
| 102 | + <li>289g</li> |
| 103 | + </ul> |
| 104 | + </section> |
| 105 | + |
| 106 | + <p class="hero-sub" style="max-width: 50rem;text-align: center;">Custom silicon, a 7″ OLED panel, and a shell milled to disappear in your hands.</p> |
| 107 | + |
| 108 | + <!-- ============================ FEATURES ============================ --> |
| 109 | + <section class="features" id="design"> |
| 110 | + <div class="section-head"> |
| 111 | + <p class="eyebrow">DESIGN</p> |
| 112 | + <h2 class="section-title">By Gamers, For Gamers.</h2> |
| 113 | + </div> |
| 114 | + |
| 115 | + <div class="carousel" id="carousel"> |
| 116 | + <button class="carousel-nav carousel-nav-prev" id="carPrev" type="button" aria-label="Previous feature">‹</button> |
| 117 | + <div class="carousel-track" id="carTrack" tabindex="0" aria-label="Feature carousel"> |
| 118 | + |
| 119 | + <article class="feature-card"> |
| 120 | + <span class="feature-icon" aria-hidden="true"> |
| 121 | + <svg viewBox="0 0 48 48"><rect x="8" y="6" width="32" height="36" rx="4"/><path d="M16 38h16"/></svg> |
| 122 | + </span> |
| 123 | + <h3>Display</h3> |
| 124 | + <p>7″ 120Hz OLED Gorilla Glass Victus panel, cranked to 1200 nits, so you can continue playing outdoors.</p> |
| 125 | + </article> |
| 126 | + |
| 127 | + <article class="feature-card"> |
| 128 | + <span class="feature-icon" aria-hidden="true"> |
| 129 | + <svg viewBox="0 0 48 48"><rect x="14" y="14" width="20" height="20" rx="2"/><path d="M20 6v8M28 6v8M20 34v8M28 34v8M6 20h8M6 28h8M34 20h8M34 28h8"/></svg> |
| 130 | + </span> |
| 131 | + <h3>Griffin G1 silicon</h3> |
| 132 | + <p>Custom 8-core chip with hardware ray tracing, tuned for performance and efficiency.</p> |
| 133 | + </article> |
| 134 | + |
| 135 | + <article class="feature-card"> |
| 136 | + <span class="feature-icon" aria-hidden="true"> |
| 137 | + <svg viewBox="0 0 48 48"><circle cx="24" cy="24" r="11"/><circle cx="24" cy="24" r="3" fill="currentColor" stroke="none"/></svg> |
| 138 | + </span> |
| 139 | + <h3>Hall-effect sticks</h3> |
| 140 | + <p>Magnetic hall-effect, zero mechanical wear. No drift by design, not a promise we patch in later.</p> |
| 141 | + </article> |
| 142 | + |
| 143 | + <article class="feature-card"> |
| 144 | + <span class="feature-icon" aria-hidden="true"> |
| 145 | + <svg viewBox="0 0 48 48"><rect x="14" y="6" width="20" height="36" rx="3"/><path d="M19 14h10"/></svg> |
| 146 | + </span> |
| 147 | + <h3>Battery</h3> |
| 148 | + <p>9 hours at full tilt, 80W fast charge, and a pack that swaps in seconds when you're between flights.</p> |
| 149 | + </article> |
| 150 | + |
| 151 | + <article class="feature-card"> |
| 152 | + <span class="feature-icon" aria-hidden="true"> |
| 153 | + <svg viewBox="0 0 48 48"><path d="M10 30c4-14 24-14 28 0"/><path d="M6 34c6-18 30-18 36 0"/></svg> |
| 154 | + </span> |
| 155 | + <h3>Thermals</h3> |
| 156 | + <p>Vapor-chamber cooling and dual fans quiet enough that headphones aren't a requirement, just a preference.</p> |
| 157 | + </article> |
| 158 | + |
| 159 | + <article class="feature-card"> |
| 160 | + <span class="feature-icon" aria-hidden="true"> |
| 161 | + <svg viewBox="0 0 48 48"><path d="M6 20v8h6l10 8V12l-10 8Z"/><path d="M30 18c3 3 3 9 0 12M35 13c6 6 6 16 0 22"/></svg> |
| 162 | + </span> |
| 163 | + <h3>Sound</h3> |
| 164 | + <p>Dual 3W drivers tuned by ear, spatial audio over Bluetooth 5.3, built to be deliver immersion.</p> |
| 165 | + </article> |
| 166 | + |
| 167 | + </div> |
| 168 | + <button class="carousel-nav carousel-nav-next" id="carNext" type="button" aria-label="Next feature">›</button> |
| 169 | + </div> |
| 170 | + <div class="carousel-dots" id="carDots" role="tablist" aria-label="Feature slide"></div> |
| 171 | + </section> |
| 172 | + |
| 173 | + <!-- ============================ GRIFFINOS ============================ --> |
| 174 | + <section class="griffinos" id="griffinos"> |
| 175 | + <div class="section-head"> |
| 176 | + <p class="eyebrow">SOFTWARE</p> |
| 177 | + <h2 class="section-title">GriffinOS. Built for Gaming.</h2> |
| 178 | + </div> |
| 179 | + |
| 180 | + <div class="os-panel"> |
| 181 | + <ul class="os-features" id="osFeatures" role="tablist" aria-label="GriffinOS features"> |
| 182 | + <li> |
| 183 | + <button class="os-feature active" data-screen="home" role="tab" aria-selected="true" type="button"> |
| 184 | + <span class="os-feature-icon" aria-hidden="true">⌂</span> |
| 185 | + <span class="os-feature-copy"> |
| 186 | + <span class="os-feature-title">Home</span> |
| 187 | + <span class="os-feature-desc">One shelf for everything you're playing right now.</span> |
| 188 | + </span> |
| 189 | + </button> |
| 190 | + </li> |
| 191 | + <li> |
| 192 | + <button class="os-feature" data-screen="resume" role="tab" aria-selected="false" type="button"> |
| 193 | + <span class="os-feature-icon" aria-hidden="true">⏵</span> |
| 194 | + <span class="os-feature-copy"> |
| 195 | + <span class="os-feature-title">Quick Resume</span> |
| 196 | + <span class="os-feature-desc">Jump back into any of upto four suspended games, instantly.</span> |
| 197 | + </span> |
| 198 | + </button> |
| 199 | + </li> |
| 200 | + <li> |
| 201 | + <button class="os-feature" data-screen="library" role="tab" aria-selected="false" type="button"> |
| 202 | + <span class="os-feature-icon" aria-hidden="true">▦</span> |
| 203 | + <span class="os-feature-copy"> |
| 204 | + <span class="os-feature-title">Universal Library</span> |
| 205 | + <span class="os-feature-desc">Cartridges, downloads and streamed titles, one shelf.</span> |
| 206 | + </span> |
| 207 | + </button> |
| 208 | + </li> |
| 209 | + <li> |
| 210 | + <button class="os-feature" data-screen="perf" role="tab" aria-selected="false" type="button"> |
| 211 | + <span class="os-feature-icon" aria-hidden="true">◐</span> |
| 212 | + <span class="os-feature-copy"> |
| 213 | + <span class="os-feature-title">Performance Modes</span> |
| 214 | + <span class="os-feature-desc">Silent, Balanced or Unleashed, switch mid-game.</span> |
| 215 | + </span> |
| 216 | + </button> |
| 217 | + </li> |
| 218 | + <li> |
| 219 | + <button class="os-feature" data-screen="sync" role="tab" aria-selected="false" type="button"> |
| 220 | + <span class="os-feature-icon" aria-hidden="true">⇅</span> |
| 221 | + <span class="os-feature-copy"> |
| 222 | + <span class="os-feature-title">Cloud Sync</span> |
| 223 | + <span class="os-feature-desc">Saves follow you between the handheld and your devices.</span> |
| 224 | + </span> |
| 225 | + </button> |
| 226 | + </li> |
| 227 | + </ul> |
| 228 | + |
| 229 | + <div class="os-device"> |
| 230 | + <div class="os-frame"> |
| 231 | + <div class="os-screen" id="osScreen" data-screen="home"> |
| 232 | + |
| 233 | + <div class="os-view os-view-home" data-view="home"> |
| 234 | + <div class="os-statusbar"><span>GRIFFINOS</span><span>19:41 · 82%</span></div> |
| 235 | + <p class="os-view-label">Continue playing</p> |
| 236 | + <div class="os-tile os-tile-wide"><span>Ember Run</span><i>▶</i></div> |
| 237 | + <div class="os-tile-row"> |
| 238 | + <div class="os-tile"><span>Talon Trials</span></div> |
| 239 | + <div class="os-tile"><span>Canyon Drift</span></div> |
| 240 | + </div> |
| 241 | + </div> |
| 242 | + |
| 243 | + <div class="os-view os-view-resume" data-view="resume"> |
| 244 | + <div class="os-statusbar"><span>QUICK RESUME</span><span>4 suspended</span></div> |
| 245 | + <div class="os-resume-row"><span>Ember Run</span><em>62% zone 3</em></div> |
| 246 | + <div class="os-resume-row"><span>Talon Trials</span><em>paused · boss</em></div> |
| 247 | + <div class="os-resume-row"><span>Canyon Drift</span><em>lap 4 of 6</em></div> |
| 248 | + <div class="os-resume-row"><span>Nightglass</span><em>chapter 2</em></div> |
| 249 | + </div> |
| 250 | + |
| 251 | + <div class="os-view os-view-library" data-view="library"> |
| 252 | + <div class="os-statusbar"><span>LIBRARY</span><span>128 titles</span></div> |
| 253 | + <div class="os-lib-tabs"><span class="on">All</span><span>Cartridge</span><span>Cloud</span></div> |
| 254 | + <div class="os-lib-grid" id="osLibGrid"></div> |
| 255 | + </div> |
| 256 | + |
| 257 | + <div class="os-view os-view-perf" data-view="perf"> |
| 258 | + <div class="os-statusbar"><span>PERFORMANCE</span><span>Live</span></div> |
| 259 | + <div class="os-perf-modes"> |
| 260 | + <button class="os-perf-mode" data-mode="silent">Silent<em>18W</em></button> |
| 261 | + <button class="os-perf-mode active" data-mode="balanced">Balanced<em>28W</em></button> |
| 262 | + <button class="os-perf-mode" data-mode="unleashed">Unleashed<em>42W</em></button> |
| 263 | + </div> |
| 264 | + <div class="os-perf-meter"><span id="osPerfFill"></span></div> |
| 265 | + <p class="os-perf-readout"><span id="osPerfFps">60</span> fps target</p> |
| 266 | + </div> |
| 267 | + |
| 268 | + <div class="os-view os-view-sync" data-view="sync"> |
| 269 | + <div class="os-statusbar"><span>CLOUD SYNC</span><span>Up to date</span></div> |
| 270 | + <div class="os-sync-row"><span>Ember Run</span><i class="os-sync-ok">✓ synced</i></div> |
| 271 | + <div class="os-sync-row"><span>Talon Trials</span><i class="os-sync-ok">✓ synced</i></div> |
| 272 | + <div class="os-sync-row"><span>Canyon Drift</span><i class="os-sync-busy">syncing…</i></div> |
| 273 | + </div> |
| 274 | + |
| 275 | + </div> |
| 276 | + </div> |
| 277 | + </div> |
| 278 | + </div> |
| 279 | + </section> |
| 280 | + |
| 281 | + <!-- ============================ LIBRARY ============================ --> |
| 282 | + <section class="library" id="library"> |
| 283 | + <div class="section-head"> |
| 284 | + <p class="eyebrow">LIBRARY</p> |
| 285 | + <h2 class="section-title">Everything you already play.</h2> |
| 286 | + <p class="section-sub">128 titles at launch — cartridge, download or streamed, one shelf either way.</p> |
| 287 | + </div> |
| 288 | + |
| 289 | + <div class="library-panel"> |
| 290 | + <div class="icon-row"> |
| 291 | + <div class="icon-track" id="libraryRowA"></div> |
| 292 | + </div> |
| 293 | + <div class="icon-row icon-row-reverse"> |
| 294 | + <div class="icon-track" id="libraryRowB"></div> |
| 295 | + </div> |
| 296 | + <div class="icon-row"> |
| 297 | + <div class="icon-track" id="libraryRowC"></div> |
| 298 | + </div> |
| 299 | + </div> |
| 300 | + </section> |
| 301 | + |
| 302 | + <!-- ============================ RESERVE ============================ --> |
| 303 | + <section class="reserve" id="reserve"> |
| 304 | + <div class="section-head"> |
| 305 | + <p class="eyebrow">RESERVE</p> |
| 306 | + <h2 class="section-title">Join the flight line.</h2> |
| 307 | + <p class="section-sub">Griffin P1 ships first to the flight line. Reserve a unit, no payment now.</p> |
| 308 | + </div> |
| 309 | + |
| 310 | + <div class="reserve-panel"> |
| 311 | + <form class="reserve-form" id="reserveForm" novalidate> |
| 312 | + <div class="field"> |
| 313 | + <label for="rName">Name</label> |
| 314 | + <input id="rName" name="name" type="text" autocomplete="name" placeholder="Your name" required> |
| 315 | + <p class="field-error" id="rNameError" role="alert"></p> |
| 316 | + </div> |
| 317 | + <div class="field"> |
| 318 | + <label for="rEmail">Email</label> |
| 319 | + <input id="rEmail" name="email" type="email" autocomplete="email" placeholder="you@domain.com" required> |
| 320 | + <p class="field-error" id="rEmailError" role="alert"></p> |
| 321 | + </div> |
| 322 | + <div class="field"> |
| 323 | + <label for="rRegion">Region</label> |
| 324 | + <select id="rRegion" name="region"> |
| 325 | + <option selected>India</option> |
| 326 | + <option>Asia</option> |
| 327 | + <option>Rest of world</option> |
| 328 | + </select> |
| 329 | + </div> |
| 330 | + <label class="field-check"> |
| 331 | + <input class="field-check-input" type="checkbox" id="rBeta" name="beta"> |
| 332 | + <span class="field-check-box" aria-hidden="true"> |
| 333 | + <svg viewBox="0 0 16 16"><path d="M3 8.3l3.2 3L13 4.3"/></svg> |
| 334 | + </span> |
| 335 | + <span class="field-check-label">Count me in as a beta tester too</span> |
| 336 | + </label> |
| 337 | + <button class="btn btn-ember btn-lg reserve-submit" type="submit">Reserve my P1</button> |
| 338 | + <p class="reserve-fine">Submit the form to view the invitation card</p> |
| 339 | + <p class="reserve-fine">This is a portfolio project, not a real store. Nothing is stored beyond this page.</p> |
| 340 | + </form> |
| 341 | + |
| 342 | + <div class="boarding-pass" id="boardingPass" hidden> |
| 343 | + <div class="boarding-pass-claws" aria-hidden="true"><span></span><span></span><span></span></div> |
| 344 | + <div class="boarding-pass-top"> |
| 345 | + <span class="boarding-pass-mark">GRIFFIN P1</span> |
| 346 | + <span class="boarding-pass-status">CONFIRMED</span> |
| 347 | + </div> |
| 348 | + <p class="boarding-pass-headline">You're on the manifest.</p> |
| 349 | + <dl class="boarding-pass-grid"> |
| 350 | + <div><dt>Flyer</dt><dd id="bpName">—</dd></div> |
| 351 | + <div><dt>Position</dt><dd id="bpNumber">—</dd></div> |
| 352 | + <div><dt>Route</dt><dd id="bpRegion">—</dd></div> |
| 353 | + <div><dt>Class</dt><dd id="bpClass">—</dd></div> |
| 354 | + </dl> |
| 355 | + <div class="boarding-pass-barcode" aria-hidden="true"></div> |
| 356 | + <button class="btn btn-ghost" id="bpReset" type="button">Reserve another</button> |
| 357 | + </div> |
| 358 | + </div> |
| 359 | + </section> |
| 360 | + |
| 361 | +</main> |
| 362 | + |
| 363 | +<footer class="footer"> |
| 364 | + <div class="footer-inner"> |
| 365 | + <span class="footer-mark">GRIFFIN P1</span> |
| 366 | + <p class="footer-note">Concept product page | a design & Three.js demo, not a real device or store. Built by <a href="/">Piyush Swain</a>.</p> |
| 367 | + <a class="footer-back" href="/">← Back to piyushswain.github.io</a> |
| 368 | + </div> |
| 369 | +</footer> |
| 370 | + |
| 371 | +<script type="module" src="main.js"></script> |
| 372 | +</body> |
| 373 | +</html> |
0 commit comments