NOVA
NOVA Home
const SHOPIFY_HTML = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NOVA — Leap. Create. Risk.</title>
<meta name="description" content="NOVA — Luxury streetwear for those who leap before they look. Wear the coordinates of your ambition.">
<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=Bebas+Neue&family=Inter:wght@300;400;500&family=JetBrains+Mono:wght@300;400&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--ink: #050505;
--bone: #F2F0ED;
--ore: #D4AF37;
--bone-dim: rgba(242,240,237,0.5);
--bone-faint: rgba(242,240,237,0.2);
--bone-ghost: rgba(242,240,237,0.04);
--ore-dim: rgba(212,175,55,0.5);
}
html { scroll-behavior: smooth; }
body { background: var(--ink); color: var(--bone); font-family: 'Inter', sans-serif; overflow-x: hidden; }
.font-display { font-family: 'Bebas Neue', sans-serif; }
.font-mono { font-family: 'JetBrains Mono', monospace; }
.font-body { font-family: 'Inter', sans-serif; }
/* ===== SCROLL PROGRESS ===== */
#scroll-progress {
position: fixed; top: 0; left: 0; height: 2px; background: var(--ore);
z-index: 9999; width: 0%; transition: width 0.1s linear;
}
/* ===== HERO ===== */
.hero { position: relative; height: 100vh; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.hero canvas { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; }
.hero-gradient { position: absolute; inset: 0; background: linear-gradient(to bottom, transparent 70%, var(--ink) 100%); z-index: 1; }
.hero-content { position: relative; z-index: 10; text-align: center; padding: 0 1rem; }
.hero-title { font-family: 'Bebas Neue', sans-serif; font-size: clamp(5rem, 18vw, 16rem); color: var(--bone); line-height: 0.85; letter-spacing: 0.08em;
animation: heroIn 1.2s cubic-bezier(0.16,1,0.3,1) forwards; opacity: 0; }
@keyframes heroIn { from { opacity: 0; transform: translateY(40px); letter-spacing: 0.3em; } to { opacity: 1; transform: translateY(0); letter-spacing: 0.08em; } }
.hero-sub { font-family: 'JetBrains Mono', monospace; font-size: 0.75rem; letter-spacing: 0.3em; text-transform: uppercase; color: var(--ore); margin-top: 1.5rem;
animation: fadeIn 0.8s 0.6s forwards; opacity: 0; }
.hero-cta { display: inline-block; margin-top: 3rem; padding: 0.75rem 2.5rem; border: 1px solid var(--ore); color: var(--ore); font-family: 'Bebas Neue', sans-serif;
font-size: 1.1rem; letter-spacing: 0.2em; text-decoration: none; transition: all 0.4s;
animation: fadeIn 0.6s 1s forwards; opacity: 0; }
.hero-cta:hover { background: var(--ore); color: var(--ink); }
.hero-coord { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.4em; color: var(--bone); opacity: 0; margin-top: 1.5rem;
animation: fadeIn 0.6s 1.4s forwards; }
@keyframes fadeIn { to { opacity: 1; } }
.hero-coord { animation-fill-mode: forwards; }
.hero-coord { opacity: 0; }
@keyframes fadeInDim { to { opacity: 0.3; } }
.hero-coord { animation-name: fadeInDim; }
.scroll-indicator { position: absolute; bottom: 2.5rem; left: 50%; transform: translateX(-50%); z-index: 10; text-align: center; opacity: 0; animation: fadeInDim 0.6s 1.8s forwards; cursor: pointer; }
.scroll-indicator span { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.4em; text-transform: uppercase; color: var(--bone); display: block; margin-bottom: 0.5rem; }
.scroll-arrow { display: inline-block; animation: bounce 1.8s infinite ease-in-out; color: var(--bone); font-size: 1.2rem; }
@keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(6px); } }
/* ===== MANIFESTO ===== */
.manifesto { padding: 8rem 1.5rem; }
@media (min-width: 768px) { .manifesto { padding: 12rem 4rem; } }
.manifesto-line { width: 3rem; height: 1px; background: var(--ore); margin-bottom: 4rem; }
.manifesto h2 { font-family: 'Bebas Neue', sans-serif; font-size: clamp(2rem, 6vw, 5.5rem); line-height: 0.95; color: var(--bone); margin-bottom: 0.25rem; }
.manifesto-coord { display: flex; align-items: center; gap: 1.5rem; margin-top: 4rem; }
.manifesto-coord .line { width: 3rem; height: 1px; background: var(--ore); }
.manifesto-coord span { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; color: var(--ore-dim); }
/* ===== PRODUCTS ===== */
.products { padding: 6rem 1.5rem; }
@media (min-width: 768px) { .products { padding: 10rem 4rem; } }
.section-label { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.5rem; }
.section-label .line { width: 2rem; height: 1px; background: var(--ore); }
.section-label span { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.4em; text-transform: uppercase; color: var(--ore-dim); }
.section-title { font-family: 'Bebas Neue', sans-serif; font-size: clamp(2.5rem, 5vw, 4.5rem); color: var(--bone); letter-spacing: 0.05em; margin-bottom: 3rem; }
.product-grid { display: flex; gap: 1.5rem; overflow-x: auto; padding-bottom: 1rem; scrollbar-width: none; -ms-overflow-style: none; }
.product-grid::-webkit-scrollbar { display: none; }
.product-card { flex-shrink: 0; width: 85vw; max-width: 380px; position: relative; overflow: hidden; border: 1px solid rgba(242,240,237,0.06); transition: all 0.5s; cursor: pointer; }
.product-card:hover { border-color: rgba(212,175,55,0.4); transform: translateY(-4px); box-shadow: 0 0 40px rgba(212,175,55,0.08); }
.product-card img { width: 100%; aspect-ratio: 3/4; object-fit: cover; transition: transform 0.7s; }
.product-card:hover img { transform: scale(1.05); }
.product-overlay { position: absolute; bottom: 0; left: 0; right: 0; padding: 1.5rem; background: linear-gradient(to top, rgba(5,5,5,0.9), transparent); }
.product-coord { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; color: var(--ore-dim); margin-bottom: 0.5rem; opacity: 0; transition: opacity 0.4s; }
.product-card:hover .product-coord { opacity: 1; }
.product-name { font-family: 'Bebas Neue', sans-serif; font-size: 1.4rem; color: var(--bone); letter-spacing: 0.05em; }
.product-bottom { display: flex; align-items: center; justify-content: space-between; margin-top: 0.75rem; }
.product-price { font-family: 'Inter', sans-serif; font-size: 0.875rem; color: var(--bone-dim); }
.product-view { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; text-transform: uppercase; padding: 0.5rem 1rem; border: 1px solid var(--ore); color: var(--ore); text-decoration: none; transition: all 0.3s; opacity: 0; transform: translateY(8px); }
.product-card:hover .product-view { opacity: 1; transform: translateY(0); }
.product-view:hover { background: var(--ore); color: var(--ink); }
/* ===== STORY ===== */
.story { padding: 8rem 1.5rem; position: relative; }
@media (min-width: 768px) { .story { padding: 12rem 4rem; } }
.story-divider { position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--bone-ghost); }
.story-grid { display: grid; grid-template-columns: 1fr; gap: 4rem; }
@media (min-width: 1024px) { .story-grid { grid-template-columns: 1fr 1fr; gap: 6rem; align-items: center; } }
.story-coords { font-family: 'Bebas Neue', sans-serif; line-height: 0.85; color: rgba(212,175,55,0.06); }
.story-coords div { font-size: clamp(3.5rem, 8vw, 10rem); }
.story-coords-label { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; color: var(--bone-faint); margin-top: 1rem; }
.story-text p { font-family: 'Inter', sans-serif; font-size: clamp(1rem, 1.8vw, 1.25rem); line-height: 1.6; color: rgba(242,240,237,0.75); margin-bottom: 0.25rem; }
.story-tagline { font-family: 'Bebas Neue', sans-serif; font-size: 0.875rem; letter-spacing: 0.2em; color: var(--ore); margin-top: 3rem; }
/* ===== SOCIAL ===== */
.social { padding: 5rem 0; overflow: hidden; }
.social-header { padding: 0 1.5rem; margin-bottom: 2.5rem; display: flex; align-items: center; justify-content: space-between; }
@media (min-width: 768px) { .social-header { padding: 0 4rem; margin-bottom: 4rem; } }
.social-cta { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; text-transform: uppercase; padding: 0.5rem 1.25rem; border: 1px solid var(--ore); color: var(--ore); text-decoration: none; transition: all 0.3s; }
.social-cta:hover { background: var(--ore); color: var(--ink); }
.marquee-wrap { overflow: hidden; width: 100%; }
.marquee-track { display: flex; gap: 0.75rem; animation: marquee 40s linear infinite; width: max-content; }
@keyframes marquee { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
.marquee-img { width: 200px; height: 200px; object-fit: cover; filter: grayscale(1); transition: filter 0.5s; flex-shrink: 0; }
@media (min-width: 768px) { .marquee-img { width: 260px; height: 260px; } }
.marquee-img:hover { filter: grayscale(0); }
/* ===== EMAIL ===== */
.email-section { padding: 8rem 1.5rem; text-align: center; position: relative; }
@media (min-width: 768px) { .email-section { padding: 12rem 4rem; } }
.email-section .divider { position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--bone-ghost); }
.email-title { font-family: 'Bebas Neue', sans-serif; font-size: clamp(2.5rem, 5vw, 4.5rem); color: var(--bone); letter-spacing: 0.08em; }
.email-sub { font-family: 'Inter', sans-serif; font-size: 0.875rem; color: var(--bone-dim); margin-top: 1rem; }
.email-form { margin-top: 3rem; max-width: 32rem; margin-left: auto; margin-right: auto; display: flex; flex-direction: column; gap: 1rem; }
@media (min-width: 640px) { .email-form { flex-direction: row; align-items: flex-end; gap: 0; } }
.email-input { flex: 1; background: transparent; border: none; border-bottom: 1px solid var(--bone-faint); padding: 0.75rem 0; font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.2em; color: var(--bone); outline: none; transition: border-color 0.3s; }
.email-input::placeholder { color: rgba(242,240,237,0.3); }
.email-input:focus { border-bottom-color: var(--ore); }
.email-btn { margin-left: 0; padding: 0.75rem 2rem; background: var(--ore); color: var(--ink); border: 1px solid var(--ore); font-family: 'Bebas Neue', sans-serif; font-size: 0.875rem; letter-spacing: 0.2em; cursor: pointer; transition: all 0.3s; }
@media (min-width: 640px) { .email-btn { margin-left: 1.5rem; } }
.email-btn:hover { background: transparent; color: var(--ore); }
.email-coord { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.4em; color: var(--bone); opacity: 0.2; margin-top: 3rem; }
/* ===== FOOTER ===== */
.site-footer { padding: 4rem 1.5rem; position: relative; }
@media (min-width: 768px) { .site-footer { padding: 6rem 4rem; } }
.site-footer .divider { position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--bone-ghost); }
.footer-top { display: flex; flex-direction: column; gap: 2.5rem; }
@media (min-width: 768px) { .footer-top { flex-direction: row; align-items: center; justify-content: space-between; } }
.footer-logo { font-family: 'Bebas Neue', sans-serif; font-size: 2rem; color: var(--bone); letter-spacing: 0.1em; }
.footer-tagline { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; color: var(--bone-faint); margin-top: 0.5rem; }
.footer-nav { display: flex; flex-wrap: wrap; gap: 1.5rem; }
@media (min-width: 768px) { .footer-nav { gap: 2.5rem; } }
.footer-nav a { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--bone-dim); text-decoration: none; transition: color 0.3s; }
.footer-nav a:hover { color: var(--ore); }
.footer-top-btn { display: flex; align-items: center; gap: 0.75rem; cursor: pointer; background: none; border: none; }
.footer-top-btn span { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.3em; text-transform: uppercase; color: rgba(242,240,237,0.3); transition: color 0.3s; }
.footer-top-btn:hover span { color: var(--ore); }
.footer-top-btn .arrow { width: 2rem; height: 2rem; display: flex; align-items: center; justify-content: center; border: 1px solid rgba(242,240,237,0.15); color: rgba(242,240,237,0.3); transition: all 0.3s; font-size: 0.875rem; }
.footer-top-btn:hover .arrow { border-color: var(--ore); color: var(--ore); }
.footer-bottom { margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--bone-ghost); display: flex; flex-direction: column; gap: 1rem; }
@media (min-width: 640px) { .footer-bottom { flex-direction: row; justify-content: space-between; } }
.footer-bottom p { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.2em; }
.footer-copy { color: var(--bone-faint); }
.footer-coord { color: rgba(242,240,237,0.12); }
/* ===== REVEAL ANIMATION ===== */
.reveal { opacity: 0; transform: translateY(30px); transition: opacity 0.8s cubic-bezier(0.16,1,0.3,1), transform 0.8s cubic-bezier(0.16,1,0.3,1); }
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal-blur { opacity: 0; transform: translateY(30px); filter: blur(8px); transition: all 0.8s cubic-bezier(0.16,1,0.3,1); }
.reveal-blur.visible { opacity: 1; transform: translateY(0); filter: blur(0); }
</style>
</head>
<body>
<!-- Scroll Progress -->
<div id="scroll-progress"></div>
<!-- HERO -->
<section class="hero">
<canvas id="hero-canvas"></canvas>
<div class="hero-gradient"></div>
<div class="hero-content">
<h1 class="hero-title">NOVA</h1>
<p class="hero-sub">Wear the coordinates of your ambition.</p>
<a href="/" class="hero-cta">SHOP NOW</a>
<p class="hero-coord">27.9881°N 86.9250°E</p>
</div>
<div class="scroll-indicator" onclick="window.scrollTo({top:window.innerHeight,behavior:'smooth'})">
<span>Scroll</span>
<div class="scroll-arrow">⌄</div>
</div>
</section>
<!-- MANIFESTO -->
<section class="manifesto">
<div class="manifesto-line reveal"></div>
<div style="max-width:72rem">
<h2 class="reveal-blur" style="transition-delay:0s">Built for those who leap</h2>
<h2 class="reveal-blur" style="transition-delay:0.15s">before they look.</h2>
<h2 class="reveal-blur" style="transition-delay:0.3s">Who create before</h2>
<h2 class="reveal-blur" style="transition-delay:0.45s">they're ready.</h2>
<h2 class="reveal-blur" style="transition-delay:0.6s">Who risk everything</h2>
<h2 class="reveal-blur" style="transition-delay:0.75s">for the life they want.</h2>
</div>
<div class="manifesto-coord reveal" style="transition-delay:1.2s">
<div class="line"></div>
<span>27.9881°N 86.9250°E</span>
</div>
</section>
<!-- PRODUCTS -->
<section class="products">
<div class="section-label reveal">
<div class="line"></div>
<span>Collection</span>
</div>
<h2 class="section-title reveal" style="transition-delay:0.2s">THE ARTIFACTS</h2>
<div class="product-grid">
<div class="product-card reveal" style="transition-delay:0s">
<img src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/c1f8cc7cd_NOVABACKS.webp" alt="Leap of Faith Tee" loading="lazy">
<div class="product-overlay">
<p class="product-coord">27.9881°N</p>
<h3 class="product-name">Leap of Faith Tee</h3>
<div class="product-bottom">
<span class="product-price">$28</span>
<a href="/" class="product-view">View</a>
</div>
</div>
</div>
<div class="product-card reveal" style="transition-delay:0.2s">
<img src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/65b77baf2_unisex-garment-dyed-sweatshirt-pepper-back-6a2306ebbf722-removebg-preview.png" alt="Create Your Legacy Crewneck" loading="lazy">
<div class="product-overlay">
<p class="product-coord">27.9881°N</p>
<h3 class="product-name">Create Your Legacy Crewneck</h3>
<div class="product-bottom">
<span class="product-price">$43</span>
<a href="/" class="product-view">View</a>
</div>
</div>
</div>
<div class="product-card reveal" style="transition-delay:0.4s">
<img src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/50babdf57_unisex-garment-dyed-lightweight-fleece-hooded-sweatshirt-i-comfort-colors-1467-black-back-6a230822dff49-removebg-preview.png" alt="Take The Risk Hoodie" loading="lazy">
<div class="product-overlay">
<p class="product-coord">27.9881°N</p>
<h3 class="product-name">Take The Risk Hoodie</h3>
<div class="product-bottom">
<span class="product-price">$44</span>
<a href="/" class="product-view">View</a>
</div>
</div>
</div>
</div>
</section>
<!-- STORY -->
<section class="story">
<div class="story-divider"></div>
<div class="story-grid">
<div class="story-coords reveal">
<div>27.9881°N</div>
<div>86.9250°E</div>
<p class="story-coords-label">EVEREST BASE CAMP — 5,364M</p>
</div>
<div class="story-text">
<div class="section-label reveal">
<div class="line"></div>
<span>The Story</span>
</div>
<div style="margin-top:2.5rem">
<p class="reveal-blur" style="transition-delay:0.3s">NOVA was built on one idea —</p>
<p class="reveal-blur" style="transition-delay:0.42s">that your coordinates define</p>
<p class="reveal-blur" style="transition-delay:0.54s">where you're going,</p>
<p class="reveal-blur" style="transition-delay:0.66s">not where you've been.</p>
<p class="reveal-blur" style="transition-delay:0.78s"> </p>
<p class="reveal-blur" style="transition-delay:0.9s">Every piece carries the elevation</p>
<p class="reveal-blur" style="transition-delay:1.02s">of Everest Base Camp.</p>
<p class="reveal-blur" style="transition-delay:1.14s">Because that's what we're chasing.</p>
</div>
<p class="story-tagline reveal" style="transition-delay:1.6s">LEAP. CREATE. RISK.</p>
</div>
</div>
</section>
<!-- SOCIAL -->
<section class="social">
<div class="social-header">
<div class="section-label" style="margin-bottom:0">
<div class="line"></div>
<span>@novaly.us</span>
</div>
<a href="https://instagram.com/novaly.us" target="_blank" rel="noopener noreferrer" class="social-cta">Follow on Instagram</a>
</div>
<div class="marquee-wrap">
<div class="marquee-track">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/c1f8cc7cd_NOVABACKS.webp" alt="NOVA Leap of Faith Tee">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/65b77baf2_unisex-garment-dyed-sweatshirt-pepper-back-6a2306ebbf722-removebg-preview.png" alt="NOVA Create Your Legacy Crewneck">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/50babdf57_unisex-garment-dyed-lightweight-fleece-hooded-sweatshirt-i-comfort-colors-1467-black-back-6a230822dff49-removebg-preview.png" alt="NOVA Take The Risk Hoodie">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/c1f8cc7cd_NOVABACKS.webp" alt="NOVA Leap of Faith Tee">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/65b77baf2_unisex-garment-dyed-sweatshirt-pepper-back-6a2306ebbf722-removebg-preview.png" alt="NOVA Create Your Legacy Crewneck">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/50babdf57_unisex-garment-dyed-lightweight-fleece-hooded-sweatshirt-i-comfort-colors-1467-black-back-6a230822dff49-removebg-preview.png" alt="NOVA Take The Risk Hoodie">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/c1f8cc7cd_NOVABACKS.webp" alt="NOVA Leap of Faith Tee">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/65b77baf2_unisex-garment-dyed-sweatshirt-pepper-back-6a2306ebbf722-removebg-preview.png" alt="NOVA Create Your Legacy Crewneck">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/50babdf57_unisex-garment-dyed-lightweight-fleece-hooded-sweatshirt-i-comfort-colors-1467-black-back-6a230822dff49-removebg-preview.png" alt="NOVA Take The Risk Hoodie">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/c1f8cc7cd_NOVABACKS.webp" alt="NOVA Leap of Faith Tee">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/65b77baf2_unisex-garment-dyed-sweatshirt-pepper-back-6a2306ebbf722-removebg-preview.png" alt="NOVA Create Your Legacy Crewneck">
<img class="marquee-img" src="https://media.base44.com/images/public/6a35862c76bc45214a5dcd29/50babdf57_unisex-garment-dyed-lightweight-fleece-hooded-sweatshirt-i-comfort-colors-1467-black-back-6a230822dff49-removebg-preview.png" alt="NOVA Take The Risk Hoodie">
</div>
</div>
</section>
<!-- EMAIL CAPTURE -->
<section class="email-section">
<div class="divider"></div>
<h2 class="email-title reveal">JOIN THE MOVEMENT</h2>
<p class="email-sub reveal" style="transition-delay:0.3s">Drop access. New releases. Early discounts.</p>
<form class="email-form reveal" style="transition-delay:0.5s" onsubmit="event.preventDefault(); this.querySelector('input').value=''; alert('Welcome to the movement.');">
<input type="email" class="email-input" placeholder="YOUR EMAIL" required>
<button type="submit" class="email-btn">JOIN</button>
</form>
<p class="email-coord reveal" style="transition-delay:0.8s">27.9881°N 86.9250°E</p>
</section>
<!-- FOOTER -->
<footer class="site-footer">
<div class="divider"></div>
<div class="footer-top">
<div>
<div class="footer-logo">NOVA</div>
<p class="footer-tagline">LEAP. CREATE. RISK.</p>
</div>
<nav class="footer-nav">
<a href="/">Shop</a>
<a href="/pages/about">About</a>
<a href="https://instagram.com/novaly.us" target="_blank" rel="noopener noreferrer">Instagram</a>
<a href="mailto:contact@novaly.us">Contact</a>
</nav>
<button class="footer-top-btn" onclick="window.scrollTo({top:0,behavior:'smooth'})">
<span>Back to Base Camp</span>
<div class="arrow">↑</div>
</button>
</div>
<div class="footer-bottom">
<p class="footer-copy">© 2025 NOVA. All rights reserved.</p>
<p class="footer-coord">27.9881°N 86.9250°E</p>
</div>
</footer>
<script>
// Scroll Progress
window.addEventListener('scroll', function() {
var h = document.documentElement.scrollHeight - window.innerHeight;
var s = window.scrollY;
document.getElementById('scroll-progress').style.width = (s / h * 100) + '%';
});
// Scroll Reveal
var obs = new IntersectionObserver(function(entries) {
entries.forEach(function(e) { if (e.isIntersecting) { e.target.classList.add('visible'); } });
}, { threshold: 0.15, rootMargin: '-50px' });
document.querySelectorAll('.reveal, .reveal-blur').forEach(function(el) { obs.observe(el); });
// WebGL Hero Shader
(function() {
var c = document.getElementById('hero-canvas');
if (!c) return;
var gl = c.getContext('webgl');
if (!gl) return;
function resize() { c.width = window.innerWidth; c.height = window.innerHeight; gl.viewport(0, 0, c.width, c.height); }
resize(); window.addEventListener('resize', resize);
var vs = 'attribute vec2 a;void main(){gl_Position=vec4(a,0,1);}';
var fs = 'precision mediump float;uniform float t;uniform vec2 r;' +
'float n(vec2 p){return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);}' +
'float sn(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.-2.*f);return mix(mix(n(i),n(i+vec2(1,0)),f.x),mix(n(i+vec2(0,1)),n(i+vec2(1,1)),f.x),f.y);}' +
'float fb(vec2 p){float v=0.,a=.5;for(int i=0;i<5;i++){v+=a*sn(p);p*=2.;a*=.5;}return v;}' +
'void main(){vec2 u=gl_FragCoord.xy/r;float T=t*.15;vec2 q=vec2(fb(u*3.+T*.3),fb(u*3.+vec2(1.7,9.2)+T*.2));vec2 R=vec2(fb(u*4.+q+vec2(8.3,2.8)+T*.15),fb(u*4.+q+vec2(5.3,3.1)+T*.1));float f=fb(u*2.+R);vec3 col=mix(vec3(.02),vec3(.08,.02,.12),f*.6);col=mix(col,vec3(.83,.69,.22),pow(f,4.)*.08);col+=vec3(f*f*.03);gl_FragColor=vec4(col,1);}';
function cs(type, src) { var s = gl.createShader(type); gl.shaderSource(s, src); gl.compileShader(s); return s; }
var p = gl.createProgram(); gl.attachShader(p, cs(gl.VERTEX_SHADER, vs)); gl.attachShader(p, cs(gl.FRAGMENT_SHADER, fs)); gl.linkProgram(p); gl.useProgram(p);
var b = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, b); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,1,-1,-1,1,1,1]), gl.STATIC_DRAW);
var al = gl.getAttribLocation(p, 'a'); gl.enableVertexAttribArray(al); gl.vertexAttribPointer(al, 2, gl.FLOAT, false, 0, 0);
var tl = gl.getUniformLocation(p, 't'), rl = gl.getUniformLocation(p, 'r'), s = Date.now();
(function draw() { gl.uniform1f(tl, (Date.now() - s) / 1000); gl.uniform2f(rl, c.width, c.height); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); requestAnimationFrame(draw); })();
})();
</script>
</body>
</html>`;
export default function ShopifyExport() {
const handleDownload = () => {
const blob = new Blob([SHOPIFY_HTML], { type: "text/html" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "nova-landing-page.html";
a.click();
URL.revokeObjectURL(url);
};
return (
<div className="min-h-screen flex items-center justify-center px-6" style={{ background: "#050505" }}>
<div className="text-center max-w-lg">
<h1 className="font-display text-5xl md:text-6xl tracking-[0.08em] mb-4" style={{ color: "#F2F0ED" }}>
NOVA
</h1>
<p className="font-mono text-xs tracking-[0.3em] mb-2" style={{ color: "#D4AF37" }}>
SHOPIFY EXPORT
</p>
<p className="font-body text-sm mt-6 leading-relaxed" style={{ color: "rgba(242,240,237,0.6)" }}>
Download the complete NOVA landing page as a standalone HTML file.
This file includes the WebGL shader, all animations, and responsive styling —
ready to paste into a Shopify custom page or use as a theme section template.
All images are already embedded via direct URLs. Just update the product links to point to your Shopify product pages.
</p>
<button
onClick={handleDownload}
className="mt-10 px-10 py-3 border font-display text-lg tracking-[0.2em] transition-all duration-500 hover:bg-[#D4AF37] hover:text-[#050505] cursor-pointer"
style={{ borderColor: "#D4AF37", color: "#D4AF37" }}
>
DOWNLOAD HTML
</button>
<p className="font-mono text-[10px] tracking-[0.4em] mt-8 opacity-20" style={{ color: "#F2F0ED" }}>
27.9881°N 86.9250°E
</p>
</div>
</div>
);
}