BikoToday commited on
Commit
809647e
·
verified ·
1 Parent(s): 7093c92

## ✅ 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

Files changed (2) hide show
  1. README.md +8 -5
  2. index.html +485 -19
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Acumullit Sa Launch Landing
3
- emoji: 📊
4
- colorFrom: yellow
5
- colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
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).
index.html CHANGED
@@ -1,19 +1,485 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>