## ✅ DEEPSITE MASTER PROMPT (WITH FULL CODE)
Browse files**Prompt to Deepsite:**
Build a single full-viewport premium animated launch landing section for a health and wellness brand aligned to **APLGO / Acumullit SA®**. The experience must feel calm, premium, nature-led and science-backed — not loud, not salesy, not MLM-like. Use deep forest greens, mint/leaf greens, and soft gold accents. Use glassmorphism UI (blurred card), subtle glow, clean modern typography, and smooth calming motion.
**Critical timezone requirement:** The countdown MUST be calculated using **South African time** (IANA timezone: **Africa/Johannesburg**) regardless of the visitor’s device timezone.
**Critical launch logic:** The countdown target is **12:00 noon SAST**.
* If current SAST time is **before 12:00**, count down to **today at 12:00 SAST**.
* If current SAST time is **after 12:00** (example: 13:04 SAST), count down to **tomorrow at 12:00 SAST**.
The timer displays **Hours, Minutes, Seconds**.
**Animations required:**
* Global “breathing rhythm” motion synced across UI (gentle scale + glow pulse)
* Floating pollen / nature particles drifting in background (canvas)
* Flip-style animated digits when values change + soft ripple shimmer on each change
* Subtle moving mist/gradient background layer
**Audio required (must be user-activated only):**
* Provide a button to toggle a soft ambient wellness pulse sound
* Must not autoplay (browser compliant)
* Toggle button text: “🔊 Enable ambient pulse” ↔ “🔇 Disable ambient pulse”
**CTA required:**
* Add a large rounded CTA button under the timer that says: **“Preorder Now”**
* On click, open WhatsApp to **+27 60 758 6902** with a prefilled message:
“Hi Zanele, I’d like to preorder Acumullit SA and be notified at launch.”
* Use wa.me format and open in a new tab
**Technical requirement:** Output a single self-contained HTML block suitable for a Deepsite Custom HTML block with inline CSS + inline JS. No external libraries or assets. Fully responsive mobile + desktop.
Use the following code exactly:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Acumullit SA® Launch Countdown</title>
<style>
:root{
/* Premium wellness palette (APLGO/Acumullit SA feel) */
--bg1:#061a12;
--bg2:#0b2a1d;
--bg3:#0f3a2a;
--mint:#7ef2c2;
--leaf:#4ad07a;
--deep:#0c261c;
--gold:#d7b56d;
--fog: rgba(255,255,255,.08);
--text:#eafff5;
--muted: rgba(234,255,245,.75);
}
@keyframes breathe {
0% { transform: scale(1); filter: saturate(1) brightness(1); }
50% { transform: scale(1.018); filter: saturate(1.08) brightness(1.05); }
100% { transform: scale(1); filter: saturate(1) brightness(1); }
}
@keyframes glowPulse {
0% { box-shadow: 0 0 18px rgba(126,242,194,.22), 0 0 40px rgba(215,181,109,.10); }
50% { box-shadow: 0 0 30px rgba(126,242,194,.55), 0 0 75px rgba(215,181,109,.18); }
100% { box-shadow: 0 0 18px rgba(126,242,194,.22), 0 0 40px rgba(215,181,109,.10); }
}
@keyframes drift {
0% { transform: translate(0,0); }
50% { transform: translate(16px,-10px); }
100% { transform: translate(0,0); }
}
@keyframes shimmer {
0% { transform: translateX(-60%) rotate(8deg); opacity:0; }
20%{ opacity:.25; }
50%{ opacity:.15; }
100%{ transform: translateX(60%) rotate(8deg); opacity:0; }
}
@keyframes ripple {
0% { filter: drop-shadow(0 0 0 rgba(126,242,194,0)); transform: translateY(0); }
50%{ filter: drop-shadow(0 0 12px rgba(126,242,194,.45)); transform: translateY(-1px); }
100%{ filter: drop-shadow(0 0 0 rgba(126,242,194,0)); transform: translateY(0); }
}
@keyframes flipDown {
0% { transform: rotateX(0deg); }
100% { transform: rotateX(-180deg); }
}
html, body {
margin: 0;
height: 100%;
background:
radial-gradient(1200px 700px at 20% 15%, var(--bg3), transparent 55%),
radial-gradient(900px 600px at 80% 70%, #123f2c, transparent 55%),
linear-gradient(180deg, var(--bg1), var(--bg2));
overflow: hidden;
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
color: var(--text);
}
.wrap{
position: relative;
width: min(980px, 92vw);
margin: 0 auto;
height: 100vh;
display: grid;
place-items: center;
padding: 18px 0;
}
.mist{
position:absolute; inset:-40%;
background:
radial-gradient(circle at 30% 30%, rgba(126,242,194,.08), transparent 40%),
radial-gradient(circle at 70% 60%, rgba(215,181,109,.06), transparent 45%),
radial-gradient(circle at 40% 80%, rgba(74,208,122,.06), transparent 45%);
filter: blur(20px);
animation: drift 9s ease-in-out infinite;
pointer-events:none;
}
#pollen{
position:absolute; inset:0;
width:100%; height:100%;
pointer-events:none;
}
.card{
position: relative;
width: min(860px, 92vw);
border-radius: 28px;
background: linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.03));
border: 1px solid rgba(126,242,194,.16);
backdrop-filter: blur(14px);
padding: clamp(18px, 3vw, 34px);
animation: breathe 5.6s ease-in-out infinite, glowPulse 4.8s ease-in-out infinite;
overflow:hidden;
}
.card::before{
content:"";
position:absolute; top:-30%; left:-40%;
width: 180%;
height: 60%;
background: linear-gradient(90deg, transparent, rgba(126,242,194,.18), rgba(215,181,109,.10), transparent);
transform: rotate(8deg);
animation: shimmer 6.5s ease-in-out infinite;
pointer-events:none;
}
.brand{
display:flex;
align-items:center;
justify-content:space-between;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 18px;
}
.badge{
display:inline-flex;
align-items:center;
gap:10px;
padding: 10px 14px;
border-radius: 999px;
background: rgba(12,38,28,.55);
border: 1px solid rgba(126,242,194,.18);
}
.dot{
width:10px; height:10px; border-radius:50%;
background: radial-gradient(circle at 30% 30%, var(--mint), var(--leaf));
box-shadow: 0 0 16px rgba(126,242,194,.7);
animation: glowPulse 3.3s ease-in-out infinite;
}
.badge span{
font-size: 12px;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--muted);
}
.title{
font-size: clamp(28px, 4vw, 48px);
line-height: 1.05;
margin: 6px 0 8px;
letter-spacing: -0.02em;
}
.subtitle{
margin: 0 0 22px;
color: var(--muted);
max-width: 60ch;
font-size: clamp(14px, 1.6vw, 16px);
}
.timer{
display:flex;
gap: clamp(10px, 2vw, 16px);
justify-content: center;
flex-wrap: wrap;
margin-top: 10px;
}
.unit{
position:relative;
width: 190px;
max-width: 44vw;
border-radius: 22px;
background: linear-gradient(180deg, rgba(255,255,255,.07), rgba(255,255,255,.03));
border: 1px solid rgba(255,255,255,.10);
padding: 14px 14px 16px;
overflow:hidden;
}
.unit::after{
content:"";
position:absolute;
inset: -30%;
background:
radial-gradient(circle at 30% 40%, rgba(126,242,194,.10), transparent 42%),
radial-gradient(circle at 70% 60%, rgba(215,181,109,.07), transparent 45%);
filter: blur(14px);
animation: drift 7.2s ease-in-out infinite;
pointer-events:none;
}
.label{
position:relative;
z-index:2;
font-size: 12px;
letter-spacing:.18em;
text-transform: uppercase;
color: rgba(234,255,245,.72);
text-align:center;
margin-bottom: 10px;
}
.digits{
position:relative;
z-index:2;
display:flex;
justify-content:center;
gap: 10px;
}
.flip{
position:relative;
width: 64px;
height: 86px;
perspective: 700px;
}
.cardFace{
position:absolute;
inset:0;
border-radius: 18px;
background: rgba(6,26,18,.55);
border: 1px solid rgba(126,242,194,.18);
box-shadow: 0 10px 30px rgba(0,0,0,.25);
display:grid;
place-items:center;
font-size: 48px;
font-weight: 700;
color: var(--text);
text-shadow: 0 0 16px rgba(126,242,194,.25);
transform-style: preserve-3d;
}
.ripple{
animation: ripple .65s ease-in-out;
}
.flip.animating .cardFace{
animation: flipDown .55s cubic-bezier(.2,.9,.2,1);
}
.ctaRow{
display:flex;
justify-content:center;
margin-top: 26px;
}
.ctaBtn{
display:inline-flex;
align-items:center;
gap:12px;
padding:16px 28px;
border-radius:999px;
background: linear-gradient(135deg, var(--mint), var(--leaf));
color:#061a12;
font-weight:700;
font-size:16px;
text-decoration:none;
border:1px solid rgba(255,255,255,.35);
box-shadow: 0 0 25px rgba(126,242,194,.55), 0 0 60px rgba(215,181,109,.25);
animation: glowPulse 3.8s ease-in-out infinite, breathe 5.6s ease-in-out infinite;
transition: transform .15s ease, filter .2s ease;
user-select:none;
}
.ctaBtn:hover{ transform: translateY(-1px); filter: brightness(1.03); }
.ctaBtn:active{ transform: translateY(0px) scale(.99); }
.hintRow{
display:flex;
justify-content:space-between;
gap:10px;
margin-top: 18px;
flex-wrap: wrap;
color: rgba(234,255,245,.68);
font-size: 12px;
}
.soundBtn{
display:inline-flex;
align-items:center;
gap:10px;
padding: 10px 14px;
border-radius: 999px;
background: rgba(12,38,28,.55);
border: 1px solid rgba(215,181,109,.22);
color: rgba(234,255,245,.92);
cursor:pointer;
user-select:none;
transition: transform .15s ease, background .2s ease;
}
.soundBtn:hover{ transform: translateY(-1px); background: rgba(12,38,28,.68); }
.soundBtn:active{ transform: translateY(0px) scale(.99); }
.tiny{ opacity:.85; }
.accent{ color: var(--gold); font-weight: 700; }
@media (max-width: 520px){
.flip{ width: 56px; height: 78px; }
.cardFace{ font-size: 44px; }
.unit{ width: 160px; }
}
</style>
</head>
<body>
<div class="wrap">
<div class="mist"></div>
<canvas id="pollen"></canvas>
<div class="card
- README.md +8 -5
- index.html +485 -19
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title: Acumullit
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Acumullit SA Launch Landing
|
| 3 |
+
colorFrom: pink
|
| 4 |
+
colorTo: purple
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
|
@@ -1,19 +1,485 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>Acumullit SA® Launch Countdown</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<style>
|
| 10 |
+
:root {
|
| 11 |
+
--bg1: #061a12;
|
| 12 |
+
--bg2: #0b2a1d;
|
| 13 |
+
--bg3: #0f3a2a;
|
| 14 |
+
--mint: #7ef2c2;
|
| 15 |
+
--leaf: #4ad07a;
|
| 16 |
+
--deep: #0c261c;
|
| 17 |
+
--gold: #d7b56d;
|
| 18 |
+
--text: #eafff5;
|
| 19 |
+
--muted: rgba(234,255,245,.75);
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
@keyframes breathe {
|
| 23 |
+
0% { transform: scale(1); filter: saturate(1) brightness(1); }
|
| 24 |
+
50% { transform: scale(1.018); filter: saturate(1.08) brightness(1.05); }
|
| 25 |
+
100% { transform: scale(1); filter: saturate(1) brightness(1); }
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
@keyframes glowPulse {
|
| 29 |
+
0% { box-shadow: 0 0 18px rgba(126,242,194,.22), 0 0 40px rgba(215,181,109,.10); }
|
| 30 |
+
50% { box-shadow: 0 0 30px rgba(126,242,194,.55), 0 0 75px rgba(215,181,109,.18); }
|
| 31 |
+
100% { box-shadow: 0 0 18px rgba(126,242,194,.22), 0 0 40px rgba(215,181,109,.10); }
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
@keyframes drift {
|
| 35 |
+
0% { transform: translate(0,0); }
|
| 36 |
+
50% { transform: translate(16px,-10px); }
|
| 37 |
+
100% { transform: translate(0,0); }
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
@keyframes shimmer {
|
| 41 |
+
0% { transform: translateX(-60%) rotate(8deg); opacity:0; }
|
| 42 |
+
20%{ opacity:.25; }
|
| 43 |
+
50%{ opacity:.15; }
|
| 44 |
+
100%{ transform: translateX(60%) rotate(8deg); opacity:0; }
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
@keyframes ripple {
|
| 48 |
+
0% { filter: drop-shadow(0 0 0 rgba(126,242,194,0)); transform: translateY(0); }
|
| 49 |
+
50%{ filter: drop-shadow(0 0 12px rgba(126,242,194,.45)); transform: translateY(-1px); }
|
| 50 |
+
100%{ filter: drop-shadow(0 0 0 rgba(126,242,194,0)); transform: translateY(0); }
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
@keyframes flipDown {
|
| 54 |
+
0% { transform: rotateX(0deg); }
|
| 55 |
+
100% { transform: rotateX(-180deg); }
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
.breathing {
|
| 59 |
+
animation: breathe 5.6s ease-in-out infinite;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
.glow-pulse {
|
| 63 |
+
animation: glowPulse 4.8s ease-in-out infinite;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.drift {
|
| 67 |
+
animation: drift 9s ease-in-out infinite;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.shimmer {
|
| 71 |
+
animation: shimmer 6.5s ease-in-out infinite;
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
.flip.animating .cardFace {
|
| 75 |
+
animation: flipDown .55s cubic-bezier(.2,.9,.2,1);
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
.ripple {
|
| 79 |
+
animation: ripple .65s ease-in-out;
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
.pollen-canvas {
|
| 83 |
+
position: absolute;
|
| 84 |
+
inset: 0;
|
| 85 |
+
width: 100%;
|
| 86 |
+
height: 100%;
|
| 87 |
+
pointer-events: none;
|
| 88 |
+
}
|
| 89 |
+
</style>
|
| 90 |
+
</head>
|
| 91 |
+
<body class="min-h-screen overflow-hidden" style="background: radial-gradient(1200px 700px at 20% 15%, var(--bg3), transparent 55%), radial-gradient(900px 600px at 80% 70%, #123f2c, transparent 55%), linear-gradient(180deg, var(--bg1), var(--bg2)); font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; color: var(--text);">
|
| 92 |
+
<div class="relative w-full min-h-screen flex items-center justify-center px-4 py-4">
|
| 93 |
+
<!-- Moving mist background -->
|
| 94 |
+
<div class="absolute inset-0 -m-40" style="background: radial-gradient(circle at 30% 30%, rgba(126,242,194,.08), transparent 40%), radial-gradient(circle at 70% 60%, rgba(215,181,109,.06), transparent 45%), radial-gradient(circle at 40% 80%, rgba(74,208,122,.06), transparent 45%); filter: blur(20px); animation: drift 9s ease-in-out infinite;"></div>
|
| 95 |
+
|
| 96 |
+
<!-- Pollen particles canvas -->
|
| 97 |
+
<canvas id="pollen" class="pollen-canvas"></canvas>
|
| 98 |
+
|
| 99 |
+
<!-- Main glassmorphism card -->
|
| 100 |
+
<div class="relative w-full max-w-5xl rounded-3xl backdrop-blur-xl bg-white/6 border border-emerald-400/20 p-6 md:p-8 breathing glow-pulse overflow-hidden" id="card">
|
| 101 |
+
<!-- Shimmer effect -->
|
| 102 |
+
<div class="absolute top-0 left-0 w-full h-full overflow-hidden pointer-events-none">
|
| 103 |
+
<div class="absolute -top-1/3 -left-2/5 w-[180%] h-3/5" style="background: linear-gradient(90deg, transparent, rgba(126,242,194,.18), rgba(215,181,109,.10), transparent); transform: rotate(8deg); animation: shimmer 6.5s ease-in-out infinite;"></div>
|
| 104 |
+
</div>
|
| 105 |
+
|
| 106 |
+
<!-- Header with badges -->
|
| 107 |
+
<div class="flex items-center justify-between gap-3 mb-6 flex-wrap">
|
| 108 |
+
<div class="inline-flex items-center gap-3 px-4 py-2 rounded-full bg-emerald-900/60 border border-emerald-400/20">
|
| 109 |
+
<div class="w-2.5 h-2.5 rounded-full" style="background: radial-gradient(circle at 30% 30%, var(--mint), var(--leaf)); box-shadow: 0 0 16px rgba(126,242,194,.7); animation: glowPulse 3.3s ease-in-out infinite;"></div>
|
| 110 |
+
<span class="text-xs font-semibold tracking-widest uppercase" style="color: var(--muted);">Acumullit SA® • APLGO Wellness Launch</span>
|
| 111 |
+
</div>
|
| 112 |
+
<div class="inline-flex items-center gap-3 px-4 py-2 rounded-full bg-emerald-900/60 border border-amber-400/20">
|
| 113 |
+
<span class="text-xs font-semibold tracking-widest uppercase" style="color: var(--muted);">Countdown uses <span class="text-amber-400 font-bold">SAST</span> • Next <span class="text-amber-400 font-bold">12:00</span></span>
|
| 114 |
+
</div>
|
| 115 |
+
</div>
|
| 116 |
+
|
| 117 |
+
<!-- Main content -->
|
| 118 |
+
<div class="text-center mb-8">
|
| 119 |
+
<h1 class="text-4xl md:text-5xl lg:text-6xl font-bold mb-4 leading-tight tracking-tight">Your wellness journey goes live in…</h1>
|
| 120 |
+
<p class="text-base md:text-lg max-w-3xl mx-auto leading-relaxed" style="color: var(--muted);">
|
| 121 |
+
A premium, nature-led wellness experience — with a clean, science-backed feel.
|
| 122 |
+
Preorder now and get notified the moment we go live.
|
| 123 |
+
</p>
|
| 124 |
+
</div>
|
| 125 |
+
|
| 126 |
+
<!-- Countdown timer -->
|
| 127 |
+
<div class="flex flex-wrap gap-4 justify-center mt-6">
|
| 128 |
+
<!-- Hours -->
|
| 129 |
+
<div class="relative w-48 md:w-56 rounded-2xl bg-white/7 border border-white/10 p-4 overflow-hidden">
|
| 130 |
+
<div class="absolute inset-0 -m-20" style="background: radial-gradient(circle at 30% 40%, rgba(126,242,194,.10), transparent 42%), radial-gradient(circle at 70% 60%, rgba(215,181,109,.07), transparent 45%); filter: blur(14px); animation: drift 7.2s ease-in-out infinite;"></div>
|
| 131 |
+
<div class="relative z-10 text-center mb-3">
|
| 132 |
+
<div class="text-xs font-semibold tracking-widest uppercase" style="color: rgba(234,255,245,.72);">Hours</div>
|
| 133 |
+
</div>
|
| 134 |
+
<div class="relative z-10 flex justify-center gap-3">
|
| 135 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="h1">
|
| 136 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 137 |
+
0
|
| 138 |
+
</div>
|
| 139 |
+
</div>
|
| 140 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="h2">
|
| 141 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 142 |
+
0
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
</div>
|
| 146 |
+
</div>
|
| 147 |
+
|
| 148 |
+
<!-- Minutes -->
|
| 149 |
+
<div class="relative w-48 md:w-56 rounded-2xl bg-white/7 border border-white/10 p-4 overflow-hidden">
|
| 150 |
+
<div class="absolute inset-0 -m-20" style="background: radial-gradient(circle at 30% 40%, rgba(126,242,194,.10), transparent 42%), radial-gradient(circle at 70% 60%, rgba(215,181,109,.07), transparent 45%); filter: blur(14px); animation: drift 7.2s ease-in-out infinite;"></div>
|
| 151 |
+
<div class="relative z-10 text-center mb-3">
|
| 152 |
+
<div class="text-xs font-semibold tracking-widest uppercase" style="color: rgba(234,255,245,.72);">Minutes</div>
|
| 153 |
+
</div>
|
| 154 |
+
<div class="relative z-10 flex justify-center gap-3">
|
| 155 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="m1">
|
| 156 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 157 |
+
0
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="m2">
|
| 161 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 162 |
+
0
|
| 163 |
+
</div>
|
| 164 |
+
</div>
|
| 165 |
+
</div>
|
| 166 |
+
</div>
|
| 167 |
+
|
| 168 |
+
<!-- Seconds -->
|
| 169 |
+
<div class="relative w-48 md:w-56 rounded-2xl bg-white/7 border border-white/10 p-4 overflow-hidden">
|
| 170 |
+
<div class="absolute inset-0 -m-20" style="background: radial-gradient(circle at 30% 40%, rgba(126,242,194,.10), transparent 42%), radial-gradient(circle at 70% 60%, rgba(215,181,109,.07), transparent 45%); filter: blur(14px); animation: drift 7.2s ease-in-out infinite;"></div>
|
| 171 |
+
<div class="relative z-10 text-center mb-3">
|
| 172 |
+
<div class="text-xs font-semibold tracking-widest uppercase" style="color: rgba(234,255,245,.72);">Seconds</div>
|
| 173 |
+
</div>
|
| 174 |
+
<div class="relative z-10 flex justify-center gap-3">
|
| 175 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="s1">
|
| 176 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 177 |
+
0
|
| 178 |
+
</div>
|
| 179 |
+
</div>
|
| 180 |
+
<div class="flip relative w-16 h-20 md:w-16 md:h-24 perspective-700" id="s2">
|
| 181 |
+
<div class="cardFace absolute inset-0 rounded-xl bg-emerald-950/60 border border-emerald-400/20 flex items-center justify-center text-4xl md:text-5xl font-bold text-white shadow-lg">
|
| 182 |
+
0
|
| 183 |
+
</div>
|
| 184 |
+
</div>
|
| 185 |
+
</div>
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
|
| 189 |
+
<!-- CTA Button -->
|
| 190 |
+
<div class="flex justify-center mt-8">
|
| 191 |
+
<a class="inline-flex items-center gap-3 px-8 py-4 rounded-full bg-gradient-to-r from-emerald-300 to-emerald-400 text-emerald-950 font-bold text-lg no-underline border border-white/35 shadow-lg breathing glow-pulse transition-all duration-200 hover:transform hover:-translate-y-0.5 hover:brightness-105 active:transform active:translate-y-0 active:scale-95"
|
| 192 |
+
href="https://wa.me/27607586902?text=Hi%20Zanele%2C%20I%27d%20like%20to%20preorder%20Acumullit%20SA%20and%20be%20notified%20at%20launch."
|
| 193 |
+
target="_blank" rel="noopener">
|
| 194 |
+
💬 Preorder Now
|
| 195 |
+
</a>
|
| 196 |
+
</div>
|
| 197 |
+
|
| 198 |
+
<!-- Footer hints -->
|
| 199 |
+
<div class="flex justify-between items-center gap-3 mt-6 flex-wrap text-sm" style="color: rgba(234,255,245,.68);">
|
| 200 |
+
<div class="opacity-85">Tip: Keep this tab open — the countdown stays live.</div>
|
| 201 |
+
<button id="soundBtn" class="inline-flex items-center gap-3 px-4 py-2 rounded-full bg-emerald-900/60 border border-amber-400/25 text-emerald-50 cursor-pointer transition-all duration-200 hover:transform hover:-translate-y-0.5 hover:bg-emerald-900/70 active:transform active:translate-y-0 active:scale-95">
|
| 202 |
+
🔊 Enable ambient pulse
|
| 203 |
+
</button>
|
| 204 |
+
</div>
|
| 205 |
+
</div>
|
| 206 |
+
</div>
|
| 207 |
+
|
| 208 |
+
<script>
|
| 209 |
+
/* ==========================
|
| 210 |
+
SAST (Africa/Johannesburg) time helpers
|
| 211 |
+
Ensures countdown is in South African time regardless of device timezone.
|
| 212 |
+
========================== */
|
| 213 |
+
|
| 214 |
+
const TZ = "Africa/Johannesburg";
|
| 215 |
+
|
| 216 |
+
/** Get current date/time parts in SAST using Intl.formatToParts */
|
| 217 |
+
function getSASTParts(date = new Date()){
|
| 218 |
+
const parts = new Intl.DateTimeFormat("en-ZA", {
|
| 219 |
+
timeZone: TZ,
|
| 220 |
+
year: "numeric",
|
| 221 |
+
month: "2-digit",
|
| 222 |
+
day: "2-digit",
|
| 223 |
+
hour: "2-digit",
|
| 224 |
+
minute: "2-digit",
|
| 225 |
+
second: "2-digit",
|
| 226 |
+
hour12: false
|
| 227 |
+
}).formatToParts(date);
|
| 228 |
+
|
| 229 |
+
const map = {};
|
| 230 |
+
for (const p of parts){
|
| 231 |
+
if (p.type !== "literal") map[p.type] = p.value;
|
| 232 |
+
}
|
| 233 |
+
return {
|
| 234 |
+
year: Number(map.year),
|
| 235 |
+
month: Number(map.month),
|
| 236 |
+
day: Number(map.day),
|
| 237 |
+
hour: Number(map.hour),
|
| 238 |
+
minute: Number(map.minute),
|
| 239 |
+
second: Number(map.second)
|
| 240 |
+
};
|
| 241 |
+
}
|
| 242 |
+
|
| 243 |
+
/** Convert a "SAST local" datetime,h,m,s) (Y,M,D to a UTC timestamp (ms) */
|
| 244 |
+
function sastLocalToUTCMs(y, mo, d, h, mi, s){
|
| 245 |
+
// Johannesburg is UTC+2 and has no DST currently.
|
| 246 |
+
// Convert SAST local time to UTC by subtracting 2 hours.
|
| 247 |
+
return Date.UTC(y, mo - 1, d, h - 2, mi, s);
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
/** Get next target timestamp for 12:00 noon in SAST:
|
| 251 |
+
- if now (SAST) < 12:00 => today 12:00
|
| 252 |
+
- else => tomorrow 12:00
|
| 253 |
+
*/
|
| 254 |
+
function getNextNoonSASTTargetMs(){
|
| 255 |
+
const nowParts = getSASTParts(new Date());
|
| 256 |
+
|
| 257 |
+
const isBeforeNoon = (nowParts.hour < 12) || (nowParts.hour === 12 && nowParts.minute === 0 && nowParts.second === 0);
|
| 258 |
+
// Note: If it's exactly 12:00:00, we treat it as "before" so diff = 0 and then rolls next tick.
|
| 259 |
+
let ty = nowParts.year, tm = nowParts.month, td = nowParts.day;
|
| 260 |
+
|
| 261 |
+
if (!isBeforeNoon && !(nowParts.hour === 12 && nowParts.minute === 0 && nowParts.second === 0)){
|
| 262 |
+
// Move to tomorrow in SAST by using UTC Date object carefully.
|
| 263 |
+
// We'll construct today's SAST midnight as UTC then add one day.
|
| 264 |
+
const todayMidnightUTC = sastLocalToUTCMs(ty, tm, td, 0, 0, 0);
|
| 265 |
+
const tomorrowUTCDate = new Date(todayMidnightUTC + 24*60*60*1000);
|
| 266 |
+
const tParts = getSASTParts(tomorrowUTCDate);
|
| 267 |
+
ty = tParts.year; tm = tParts.month; td = tParts.day;
|
| 268 |
+
}
|
| 269 |
+
|
| 270 |
+
// Target is 12:00:00 SAST on (ty,tm,td)
|
| 271 |
+
return sastLocalToUTCMs(ty, tm, td, 12, 0, 0);
|
| 272 |
+
}
|
| 273 |
+
|
| 274 |
+
/* --- Flip digit helper --- */
|
| 275 |
+
function setFlipDigit(el, newDigit){
|
| 276 |
+
const face = el.querySelector(".cardFace");
|
| 277 |
+
const old = face.textContent;
|
| 278 |
+
if (old === String(newDigit)) return;
|
| 279 |
+
|
| 280 |
+
el.classList.add("animating");
|
| 281 |
+
face.classList.remove("ripple");
|
| 282 |
+
|
| 283 |
+
setTimeout(() => { face.textContent = String(newDigit); }, 260);
|
| 284 |
+
setTimeout(() => { face.classList.add("ripple"); }, 360);
|
| 285 |
+
|
| 286 |
+
setTimeout(() => { el.classList.remove("animating"); }, 560);
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
function updateCountdown(){
|
| 290 |
+
const targetMs = getNextNoonSASTTargetMs();
|
| 291 |
+
const nowMs = Date.now();
|
| 292 |
+
let diff = targetMs - nowMs;
|
| 293 |
+
if (diff < 0) diff = 0;
|
| 294 |
+
|
| 295 |
+
const totalSeconds = Math.floor(diff / 1000);
|
| 296 |
+
const hours = Math.floor(totalSeconds / 3600);
|
| 297 |
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
| 298 |
+
const seconds = totalSeconds % 60;
|
| 299 |
+
|
| 300 |
+
const hh = String(hours).padStart(2, "0").slice(-2);
|
| 301 |
+
const mm = String(minutes).padStart(2, "0");
|
| 302 |
+
const ss = String(seconds).padStart(2, "0");
|
| 303 |
+
|
| 304 |
+
setFlipDigit(document.getElementById("h1"), hh[0]);
|
| 305 |
+
setFlipDigit(document.getElementById("h2"), hh[1]);
|
| 306 |
+
setFlipDigit(document.getElementById("m1"), mm[0]);
|
| 307 |
+
setFlipDigit(document.getElementById("m2"), mm[1]);
|
| 308 |
+
setFlipDigit(document.getElementById("s1"), ss[0]);
|
| 309 |
+
setFlipDigit(document.getElementById("s2"), ss[1]);
|
| 310 |
+
|
| 311 |
+
// breathing sync variation
|
| 312 |
+
const card = document.getElementById("card");
|
| 313 |
+
card.style.animationDuration = (5.2 + (seconds % 4) * 0.15) + "s, 4.8s";
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
setInterval(updateCountdown, 1000);
|
| 317 |
+
updateCountdown();
|
| 318 |
+
|
| 319 |
+
/* ==========================
|
| 320 |
+
Pollen particles (Canvas)
|
| 321 |
+
========================== */
|
| 322 |
+
const canvas = document.getElementById("pollen");
|
| 323 |
+
const ctx = canvas.getContext("2d");
|
| 324 |
+
let W, H, particles;
|
| 325 |
+
|
| 326 |
+
function resize(){
|
| 327 |
+
const rect = canvas.getBoundingClientRect();
|
| 328 |
+
W = canvas.width = Math.floor(rect.width * devicePixelRatio);
|
| 329 |
+
H = canvas.height = Math.floor(rect.height * devicePixelRatio);
|
| 330 |
+
ctx.setTransform(1,0,0,1,0,0);
|
| 331 |
+
particles = makeParticles(80);
|
| 332 |
+
}
|
| 333 |
+
window.addEventListener("resize", resize);
|
| 334 |
+
|
| 335 |
+
function makeParticles(n){
|
| 336 |
+
const arr = [];
|
| 337 |
+
for(let i=0;i<n;i++){
|
| 338 |
+
arr.push({
|
| 339 |
+
x: Math.random()*W,
|
| 340 |
+
y: Math.random()*H,
|
| 341 |
+
r: (Math.random()*2.4 + 0.6) * devicePixelRatio,
|
| 342 |
+
vx: (Math.random()*0.35 + 0.05) * devicePixelRatio,
|
| 343 |
+
vy: (Math.random()*0.25 + 0.02) * devicePixelRatio,
|
| 344 |
+
wobble: Math.random()*Math.PI*2,
|
| 345 |
+
hue: Math.random() < 0.78 ? 140 : 40,
|
| 346 |
+
a: Math.random()*0.35 + 0.10
|
| 347 |
+
});
|
| 348 |
+
}
|
| 349 |
+
return arr;
|
| 350 |
+
}
|
| 351 |
+
|
| 352 |
+
function draw(){
|
| 353 |
+
if(!particles) return;
|
| 354 |
+
ctx.clearRect(0,0,W,H);
|
| 355 |
+
|
| 356 |
+
for(const p of particles){
|
| 357 |
+
p.wobble += 0.02;
|
| 358 |
+
p.x += p.vx + Math.sin(p.wobble)*0.22*devicePixelRatio;
|
| 359 |
+
p.y += p.vy + Math.cos(p.wobble)*0.16*devicePixelRatio;
|
| 360 |
+
|
| 361 |
+
if(p.x > W+20) p.x = -20;
|
| 362 |
+
if(p.y > H+20) p.y = -20;
|
| 363 |
+
|
| 364 |
+
ctx.beginPath();
|
| 365 |
+
ctx.fillStyle = `hsla(${p.hue}, 65%, 65%, ${p.a})`;
|
| 366 |
+
ctx.arc(p.x, p.y, p.r, 0, Math.PI*2);
|
| 367 |
+
ctx.fill();
|
| 368 |
+
}
|
| 369 |
+
requestAnimationFrame(draw);
|
| 370 |
+
}
|
| 371 |
+
|
| 372 |
+
resize();
|
| 373 |
+
draw();
|
| 374 |
+
|
| 375 |
+
/* ==========================
|
| 376 |
+
Ambient Sound Pulse (WebAudio) - user gesture required
|
| 377 |
+
========================== */
|
| 378 |
+
let audioOn = false;
|
| 379 |
+
let audioCtx, gainNode, oscA, oscB, lfo, lfoGain, noiseNode, noiseGain, biquad;
|
| 380 |
+
|
| 381 |
+
function startAmbient(){
|
| 382 |
+
if (audioOn) return;
|
| 383 |
+
audioCtx = new (window.AudioContext || window.webkitAudioContext)();
|
| 384 |
+
|
| 385 |
+
gainNode = audioCtx.createGain();
|
| 386 |
+
gainNode.gain.value = 0.0001;
|
| 387 |
+
gainNode.connect(audioCtx.destination);
|
| 388 |
+
|
| 389 |
+
oscA = audioCtx.createOscillator();
|
| 390 |
+
oscA.type = "sine";
|
| 391 |
+
oscA.frequency.value = 174;
|
| 392 |
+
|
| 393 |
+
oscB = audioCtx.createOscillator();
|
| 394 |
+
oscB.type = "sine";
|
| 395 |
+
oscB.frequency.value = 261.63;
|
| 396 |
+
|
| 397 |
+
// noise buffer
|
| 398 |
+
const bufferSize = 2 * audioCtx.sampleRate;
|
| 399 |
+
const noiseBuffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);
|
| 400 |
+
const output = noiseBuffer.getChannelData(0);
|
| 401 |
+
for (let i=0; i<bufferSize; i++){
|
| 402 |
+
output[i] = (Math.random() * 2 - 1) * 0.25;
|
| 403 |
+
}
|
| 404 |
+
noiseNode = audioCtx.createBufferSource();
|
| 405 |
+
noiseNode.buffer = noiseBuffer;
|
| 406 |
+
noiseNode.loop = true;
|
| 407 |
+
|
| 408 |
+
biquad = audioCtx.createBiquadFilter();
|
| 409 |
+
biquad.type = "lowpass";
|
| 410 |
+
biquad.frequency.value = 420;
|
| 411 |
+
|
| 412 |
+
noiseGain = audioCtx.createGain();
|
| 413 |
+
noiseGain.gain.value = 0.02;
|
| 414 |
+
|
| 415 |
+
// breathing LFO
|
| 416 |
+
lfo = audioCtx.createOscillator();
|
| 417 |
+
lfo.type = "sine";
|
| 418 |
+
lfo.frequency.value = 0.16;
|
| 419 |
+
|
| 420 |
+
lfoGain = audioCtx.createGain();
|
| 421 |
+
lfoGain.gain.value = 0.08;
|
| 422 |
+
|
| 423 |
+
lfo.connect(lfoGain);
|
| 424 |
+
lfoGain.connect(gainNode.gain);
|
| 425 |
+
|
| 426 |
+
const toneGain = audioCtx.createGain();
|
| 427 |
+
toneGain.gain.value = 0.06;
|
| 428 |
+
oscA.connect(toneGain);
|
| 429 |
+
oscB.connect(toneGain);
|
| 430 |
+
toneGain.connect(gainNode);
|
| 431 |
+
|
| 432 |
+
noiseNode.connect(biquad);
|
| 433 |
+
biquad.connect(noiseGain);
|
| 434 |
+
noiseGain.connect(gainNode);
|
| 435 |
+
|
| 436 |
+
oscA.start();
|
| 437 |
+
oscB.start();
|
| 438 |
+
noiseNode.start();
|
| 439 |
+
lfo.start();
|
| 440 |
+
|
| 441 |
+
const now = audioCtx.currentTime;
|
| 442 |
+
gainNode.gain.setValueAtTime(0.0001, now);
|
| 443 |
+
gainNode.gain.exponentialRampToValueAtTime(0.06, now + 1.2);
|
| 444 |
+
|
| 445 |
+
audioOn = true;
|
| 446 |
+
}
|
| 447 |
+
|
| 448 |
+
function stopAmbient(){
|
| 449 |
+
if (!audioOn) return;
|
| 450 |
+
|
| 451 |
+
const now = audioCtx.currentTime;
|
| 452 |
+
gainNode.gain.exponentialRampToValueAtTime(0.0001, now + 0.8);
|
| 453 |
+
|
| 454 |
+
setTimeout(() => {
|
| 455 |
+
try{
|
| 456 |
+
oscA.stop(); oscB.stop(); noiseNode.stop(); lfo.stop();
|
| 457 |
+
audioCtx.close();
|
| 458 |
+
}catch(e){}
|
| 459 |
+
audioOn = false;
|
| 460 |
+
}, 900);
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
const soundBtn = document.getElementById("soundBtn");
|
| 464 |
+
soundBtn.addEventListener("click", () => {
|
| 465 |
+
if(!audioOn){
|
| 466 |
+
try{
|
| 467 |
+
startAmbient();
|
| 468 |
+
soundBtn.textContent = "🔇 Disable ambient pulse";
|
| 469 |
+
}catch(e){
|
| 470 |
+
soundBtn.textContent = "⚠️ Sound blocked (tap again)";
|
| 471 |
+
}
|
| 472 |
+
} else {
|
| 473 |
+
stopAmbient();
|
| 474 |
+
soundBtn.textContent = "🔊 Enable ambient pulse";
|
| 475 |
+
}
|
| 476 |
+
});
|
| 477 |
+
|
| 478 |
+
// Initialize icons if needed
|
| 479 |
+
if (typeof feather !== 'undefined') {
|
| 480 |
+
feather.replace();
|
| 481 |
+
}
|
| 482 |
+
</script>
|
| 483 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 484 |
+
</body>
|
| 485 |
+
</html>
|