Meneman commited on
Commit
e4e2cd7
·
verified ·
1 Parent(s): 1c3acec

undefined - Follow Up Deployment

Browse files
Files changed (1) hide show
  1. index.html +322 -231
index.html CHANGED
@@ -1,237 +1,328 @@
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>Belly Dance 24/7 (Global UTC)</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <style>
9
- body {
10
- background: radial-gradient(circle at top left, #1a1a2e, #16213e 40%, #0f3460 100%);
11
- min-height: 100vh;
12
- color: #f8f8f8;
13
- font-family: 'Segoe UI', sans-serif;
14
- overflow-x: hidden;
15
- position: relative;
16
- }
17
- /* Baloncuklar */
18
- .bubble {
19
- position: absolute;
20
- bottom: -100px;
21
- border-radius: 50%;
22
- background: rgba(255, 255, 255, 0.08);
23
- animation: rise linear infinite;
24
- }
25
- @keyframes rise {
26
- 0% {
27
- transform: translateY(0) scale(1);
28
- opacity: 0.4;
29
- }
30
- 50% {
31
- opacity: 0.7;
32
- }
33
- 100% {
34
- transform: translateY(-110vh) scale(1.2);
35
- opacity: 0;
36
- }
37
- }
38
-
39
- .video-container {
40
- aspect-ratio: 16/9;
41
- width: 100%;
42
- max-width: 960px;
43
- margin: 0 auto;
44
- backdrop-filter: blur(12px) saturate(120%);
45
- background: rgba(255, 255, 255, 0.05);
46
- box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5);
47
- border: 1px solid rgba(255, 255, 255, 0.15);
48
- border-radius: 20px;
49
- overflow: hidden;
50
- transition: transform 0.3s ease;
51
- z-index: 10;
52
- position: relative;
53
- }
54
- .video-container:hover {
55
- transform: scale(1.01);
56
- }
57
- .user-time-display {
58
- position: absolute;
59
- bottom: 12px;
60
- right: 12px;
61
- background: rgba(0,0,0,0.6);
62
- padding: 6px 10px;
63
- border-radius: 6px;
64
- font-size: 12px;
65
- font-family: monospace;
66
- }
67
- .schedule-item {
68
- padding: 8px 12px;
69
- border-radius: 10px;
70
- transition: all 0.3s ease;
71
- }
72
- .schedule-item.active {
73
- background: linear-gradient(90deg, rgba(255,215,0,0.15), rgba(255,255,255,0.05));
74
- border-left: 4px solid #facc15;
75
- }
76
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  </head>
78
- <body class="flex flex-col min-h-screen">
79
-
80
- <!-- Baloncuklar -->
81
- <div id="bubbles"></div>
82
-
83
- <!-- Header -->
84
- <header class="py-8 text-center relative z-10">
85
- <h1 class="text-5xl font-extrabold bg-gradient-to-r from-yellow-300 to-yellow-500 bg-clip-text text-transparent">
86
- Belly Dance 24/7
87
- </h1>
88
- <p class="mt-2 text-lg text-yellow-200 opacity-90">Global synchronized performances</p>
89
- <div id="header-time-display" class="mt-2 text-sm text-yellow-400"></div>
90
- <div class="mt-4 h-1 w-28 mx-auto bg-gradient-to-r from-purple-400 to-yellow-400 rounded-full"></div>
91
- </header>
92
-
93
- <!-- Main -->
94
- <main class="flex-grow px-4 pb-10 relative z-10">
95
- <div class="video-container relative">
96
- <video id="bellydance-video" autoplay muted playsinline class="w-full h-full"></video>
97
- <div id="user-time-display" class="user-time-display"></div>
98
- </div>
99
-
100
- <!-- Video Info -->
101
- <div class="mt-6 text-center">
102
- <h2 id="video-title" class="text-2xl md:text-3xl font-semibold bg-gradient-to-r from-yellow-200 to-yellow-400 bg-clip-text text-transparent"></h2>
103
- <p id="video-time" class="text-sm text-yellow-300 opacity-90"></p>
104
- </div>
105
-
106
- <!-- Schedule -->
107
- <div id="schedule" class="mt-10 max-w-lg mx-auto bg-black/40 backdrop-blur-md p-6 rounded-2xl shadow-lg">
108
- <h3 class="text-xl font-bold mb-4 text-yellow-300">✨ Global Schedule (UTC) ✨</h3>
109
- <div id="schedule-times" class="space-y-2 text-sm">
110
- <div class="schedule-item flex items-start">
111
- <div class="w-28 font-mono text-yellow-400">21:00 – 23:35</div>
112
- <div class="flex-1">Dance in Front of the Library of Alexandria</div>
113
- </div>
114
- <div class="schedule-item flex items-start">
115
- <div class="w-28 font-mono text-yellow-400">23:3501:28</div>
116
- <div class="flex-1">✨ Belly Dance ✨ - Sensual Dance</div>
117
- </div>
118
- <div class="schedule-item flex items-start">
119
- <div class="w-28 font-mono text-yellow-400">01:28 – 06:09</div>
120
- <div class="flex-1">✨ Belly Dance ✨ Let My Dance and My Magic Work on You</div>
121
- </div>
122
- <div class="schedule-item flex items-start">
123
- <div class="w-28 font-mono text-yellow-400">06:09 – 21:00</div>
124
- <div class="flex-1">Feast of Hathor</div>
125
  </div>
126
- </div>
127
- </div>
128
- </main>
129
-
130
- <!-- Footer -->
131
- <footer class="py-6 text-center text-yellow-300 text-sm opacity-70 relative z-10">
132
- Pre-recorded performances looped 24/7 (Global UTC)
133
- </footer>
134
-
135
- <script>
136
- const videoElement = document.getElementById('bellydance-video');
137
- const videoTitle = document.getElementById('video-title');
138
- const videoTime = document.getElementById('video-time');
139
-
140
- const videos = [
141
- {
142
- title: "Dance in Front of the Library of Alexandria",
143
- url: "https://www.dropbox.com/scl/fi/cdla6akuljge32vgy07ym/A-dance-in-front-of-the-Library-of-Alexandria.mp4?dl=1",
144
- duration: 155, // 2:35
145
- start: 21, end: 23.5833
146
- },
147
- {
148
- title: "✨ Belly Dance ✨ - Sensual Dance",
149
- url: "https://www.dropbox.com/scl/fi/5y9pie14fgq9h87lqcfgb/Belly-dance-sensual-dance.mp4?dl=1",
150
- duration: 113, // 1:53
151
- start: 23.5833, end: 1.4667
152
- },
153
- {
154
- title: "✨ Belly Dance ✨ Let My Dance and My Magic Work on You",
155
- url: "https://www.dropbox.com/scl/fi/guaawrmicatbah76ot22m/Belly-dance-Let-my-dance-and-my-magic-work-on-you.mp4?dl=1",
156
- duration: 281, // 4:41
157
- start: 1.4667, end: 6.15
158
- },
159
- {
160
- title: "Feast of Hathor",
161
- url: "https://www.dropbox.com/scl/fi/re9c5joysr8vhvqvhll4p/Feast-of-Hathor.mp4?dl=1",
162
- duration: 208, // 3:28
163
- start: 6.15, end: 21
164
- }
165
- ];
166
-
167
- function updateTimeDisplays() {
168
- const now = new Date();
169
- document.getElementById('header-time-display').textContent =
170
- now.toDateString() + " | Local: " + now.toLocaleTimeString() +
171
- " | UTC: " + now.toUTCString().split(' ')[4];
172
- document.getElementById('user-time-display').textContent =
173
- "Local: " + now.toLocaleTimeString();
174
- }
175
- setInterval(updateTimeDisplays, 1000);
176
- updateTimeDisplays();
177
-
178
- function getCurrentVideo() {
179
- const now = new Date();
180
- const hour = now.getUTCHours() + now.getUTCMinutes() / 60; // UTC saat
181
- for (let v of videos) {
182
- if (v.start < v.end) {
183
- if (hour >= v.start && hour < v.end) return v;
184
- } else {
185
- if (hour >= v.start || hour < v.end) return v;
186
- }
187
- }
188
- return videos[0];
189
- }
190
-
191
- function playVideo() {
192
- const now = new Date();
193
- const hour = now.getUTCHours() + now.getUTCMinutes() / 60;
194
- const video = getCurrentVideo();
195
-
196
- const elapsed = ((hour - video.start + 24) % 24) * 3600;
197
- const position = elapsed % video.duration;
198
-
199
- videoElement.src = video.url;
200
- videoElement.load();
201
- videoElement.currentTime = position;
202
- videoElement.loop = true;
203
- videoElement.play().catch(()=>{ videoElement.muted = true; videoElement.play(); });
204
-
205
- videoTitle.textContent = video.title;
206
- videoTime.textContent = "Duration: " + Math.floor(video.duration/60) + ":" +
207
- (video.duration%60).toString().padStart(2,'0');
208
-
209
- // aktif satırı highlight et
210
- document.querySelectorAll(".schedule-item").forEach((el, i) => {
211
- el.classList.remove("active");
212
- if (videos[i] === video) el.classList.add("active");
213
- });
214
-
215
- const msUntilNext = ((video.end - hour + 24) % 24) * 3600 * 1000;
216
- setTimeout(playVideo, msUntilNext);
217
- }
218
-
219
- playVideo();
220
-
221
- // Baloncuk oluşturma
222
- function createBubble() {
223
- const bubble = document.createElement("div");
224
- const size = Math.random() * 60 + 20;
225
- bubble.classList.add("bubble");
226
- bubble.style.width = `${size}px`;
227
- bubble.style.height = `${size}px`;
228
- bubble.style.left = `${Math.random() * 100}vw`;
229
- bubble.style.animationDuration = `${Math.random() * 20 + 15}s`;
230
- document.getElementById("bubbles").appendChild(bubble);
231
-
232
- setTimeout(()=> bubble.remove(), 40000);
233
- }
234
- setInterval(createBubble, 1000);
235
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Meneman/livedance" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
237
  </html>
 
1
  <!DOCTYPE html>
2
+ <html lang="tr">
3
  <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Belly Dance 24/7 (Global UTC)</title>
7
+ <style>
8
+ :root{
9
+ --bg1:#1a1a2e; --bg2:#16213e; --bg3:#0f3460;
10
+ --gold:#f5d76e; --gold-weak:rgba(245,215,110,.8);
11
+ --panel:rgba(255,255,255,.06); --panel-brd:rgba(255,255,255,.15);
12
+ --shadow:0 8px 40px rgba(0,0,0,.5);
13
+ }
14
+ /* Base */
15
+ html,body{height:100%}
16
+ body{
17
+ margin:0; color:#f8f8f8; font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
18
+ background: radial-gradient(circle at 15% 10%, var(--bg1), var(--bg2) 40%, var(--bg3) 100%);
19
+ overflow-x:hidden; position:relative;
20
+ }
21
+ .wrap{max-width:1080px; margin:0 auto; padding:24px 16px 48px}
22
+
23
+ /* Header */
24
+ header{text-align:center; padding:24px 0 8px}
25
+ .title{
26
+ font-size: clamp(28px, 6vw, 48px);
27
+ font-weight: 900;
28
+ background: linear-gradient(90deg, #ffe08a, #ffd166);
29
+ -webkit-background-clip:text; background-clip:text; color:transparent;
30
+ margin:0;
31
+ }
32
+ .subtitle{margin:6px 0 8px; color:rgba(255,255,255,.85)}
33
+ .divider{height:4px; width:120px; margin:14px auto 0;
34
+ background:linear-gradient(90deg, #a78bfa, #facc15); border-radius:999px; opacity:.8}
35
+
36
+ /* Video panel */
37
+ .panel{
38
+ position:relative; margin:20px auto 0; max-width:960px; aspect-ratio:16/9;
39
+ background:var(--panel); border:1px solid var(--panel-brd);
40
+ border-radius:20px; box-shadow:var(--shadow); backdrop-filter: blur(12px) saturate(120%);
41
+ overflow:hidden; transition:transform .3s ease;
42
+ }
43
+ .panel:hover{transform:scale(1.01)}
44
+ video{display:block; width:100%; height:100%; object-fit:cover; background:#000}
45
+ .chip-time{
46
+ position:absolute; bottom:12px; right:12px; padding:6px 10px; border-radius:6px;
47
+ background:rgba(0,0,0,.6); font:12px/1.2 monospace; color:#fff
48
+ }
49
+
50
+ /* Info */
51
+ .info{text-align:center; margin-top:16px}
52
+ .v-title{
53
+ font-size: clamp(18px, 3.5vw, 28px); margin:0;
54
+ background: linear-gradient(90deg, #fff1a8, #ffd166);
55
+ -webkit-background-clip:text; background-clip:text; color:transparent;
56
+ font-weight:700;
57
+ }
58
+ .v-meta{margin:6px 0 0; color:rgba(255,255,255,.8); font-size:14px}
59
+
60
+ /* Schedule */
61
+ .schedule{
62
+ max-width:640px; margin:22px auto 0; background:rgba(0,0,0,.35);
63
+ border:1px solid rgba(255,255,255,.08); border-radius:16px; padding:18px; backdrop-filter: blur(6px);
64
+ box-shadow:0 6px 24px rgba(0,0,0,.35)
65
+ }
66
+ .schedule h3{margin:0 0 12px; font-size:18px; color:var(--gold)}
67
+ .row{display:flex; gap:12px; align-items:flex-start; padding:8px 10px; border-radius:10px; transition:all .25s}
68
+ .row .time{width:110px; color:#ffd166; font:14px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace}
69
+ .row .name{flex:1}
70
+ .row.active{
71
+ background: linear-gradient(90deg, rgba(255,215,0,.16), rgba(255,255,255,.06));
72
+ border-left:4px solid #facc15;
73
+ }
74
+
75
+ /* Footer */
76
+ footer{color:rgba(255,255,255,.7); text-align:center; font-size:13px; padding:20px 0}
77
+
78
+ /* Live badge */
79
+ .live-badge{
80
+ position:fixed; top:12px; right:12px; z-index:9999;
81
+ display:inline-flex; align-items:center; gap:8px; padding:8px 12px; border-radius:999px;
82
+ background: linear-gradient(135deg, rgba(20,0,35,.75), rgba(75,0,110,.75));
83
+ border:1px solid rgba(255,215,0,.35); color:var(--gold);
84
+ font-weight:600; font-size:14px; letter-spacing:.2px; opacity:.8; backdrop-filter: blur(6px);
85
+ transition:opacity .2s, box-shadow .2s, transform .2s;
86
+ }
87
+ .live-badge:hover{opacity:1; box-shadow:0 0 18px rgba(250,204,21,.45), inset 0 0 10px rgba(250,204,21,.15); transform:translateY(-1px)}
88
+ .dot{width:8px; height:8px; border-radius:50%; background:#ff3b3b; box-shadow:0 0 10px rgba(255,59,59,.8)}
89
+
90
+ /* Bubbles */
91
+ #bubbles{position:fixed; inset:0; overflow:hidden; z-index:0; pointer-events:none}
92
+ .bubble{
93
+ position:absolute; bottom:-100px; border-radius:50%; background:rgba(255,255,255,.08);
94
+ animation:rise linear infinite;
95
+ }
96
+ @keyframes rise{
97
+ 0% {transform:translateY(0) scale(1); opacity:.4}
98
+ 50%{opacity:.7}
99
+ 100%{transform:translateY(-110vh) scale(1.2); opacity:0}
100
+ }
101
+
102
+ /* Utility */
103
+ .muted{color:rgba(255,255,255,.8); font-size:12px; margin-top:6px}
104
+ </style>
105
  </head>
106
+ <body>
107
+ <!-- LIVE viewers badge -->
108
+ <div class="live-badge" aria-live="polite" title="Live viewers (simüle)">
109
+ <span class="dot" aria-hidden="true"></span>
110
+ <span>LIVE:</span>
111
+ <strong id="live-count" style="margin:0 4px;">—</strong>
112
+ <span>Watching</span>
113
+ </div>
114
+
115
+ <!-- Background bubbles -->
116
+ <div id="bubbles" aria-hidden="true"></div>
117
+
118
+ <div class="wrap">
119
+ <header>
120
+ <h1 class="title">Belly Dance 24/7</h1>
121
+ <div class="subtitle">Global synchronized performances</div>
122
+ <div id="header-time" class="muted">—</div>
123
+ <div class="divider"></div>
124
+ </header>
125
+
126
+ <main>
127
+ <section class="panel">
128
+ <video id="player" autoplay muted playsinline></video>
129
+ <div id="chip-time" class="chip-time"></div>
130
+ </section>
131
+
132
+ <section class="info">
133
+ <h2 id="v-title" class="v-title"></h2>
134
+ <p id="v-meta" class="v-meta"></p>
135
+ </section>
136
+
137
+ <section class="schedule" aria-label="Global Schedule (UTC)">
138
+ <h3>✨ Global Schedule (UTC) ✨</h3>
139
+ <div id="rows">
140
+ <div class="row"><div class="time">21:00 – 23:35</div><div class="name">Dance in Front of the Library of Alexandria</div></div>
141
+ <div class="row"><div class="time">23:35 – 01:28</div><div class="name">✨ Belly Dance ✨ - Sensual Dance</div></div>
142
+ <div class="row"><div class="time">01:28 – 06:09</div><div class="name">✨ Belly Dance ✨ Let My Dance and My Magic Work on You</div></div>
143
+ <div class="row"><div class="time">06:0921:00</div><div class="name">Feast of Hathor</div></div>
 
 
 
 
 
 
 
 
 
144
  </div>
145
+ </section>
146
+ </main>
147
+
148
+ <footer>Pre-recorded performances looped 24/7 (Global UTC)</footer>
149
+ </div>
150
+
151
+ <script>
152
+ /* =========================
153
+ AYARLAR (UTC sabit)
154
+ ========================= */
155
+ const USE_UTC = true; // Global senkron için true
156
+ // Videolar (tek dosyada gömülü). videos.json kullanıyorsan fetch ile de doldurabilirsin.
157
+ const VIDEOS = [
158
+ {
159
+ title: "Dance in Front of the Library of Alexandria",
160
+ url: "https://www.dropbox.com/scl/fi/cdla6akuljge32vgy07ym/A-dance-in-front-of-the-Library-of-Alexandria.mp4?dl=1",
161
+ duration: 155, // 2:35
162
+ start: 21, end: 23.5833 // 23:35
163
+ },
164
+ {
165
+ title: "✨ Belly Dance ✨ - Sensual Dance",
166
+ url: "https://www.dropbox.com/scl/fi/5y9pie14fgq9h87lqcfgb/Belly-dance-sensual-dance.mp4?dl=1",
167
+ duration: 113, // 1:53
168
+ start: 23.5833, end: 1.4667 // 01:28
169
+ },
170
+ {
171
+ title: "✨ Belly Dance ✨ Let My Dance and My Magic Work on You",
172
+ url: "https://www.dropbox.com/scl/fi/guaawrmicatbah76ot22m/Belly-dance-Let-my-dance-and-my-magic-work-on-you.mp4?dl=1",
173
+ duration: 281, // 4:41
174
+ start: 1.4667, end: 6.15 // 06:09
175
+ },
176
+ {
177
+ title: "Feast of Hathor",
178
+ url: "https://www.dropbox.com/scl/fi/re9c5joysr8vhvqvhll4p/Feast-of-Hathor.mp4?dl=1",
179
+ duration: 208, // 3:28
180
+ start: 6.15, end: 21 // 21:00
181
+ }
182
+ ];
183
+
184
+ /* =========================
185
+ ZAMAN & SEÇİM YARDIMCILARI
186
+ ========================= */
187
+ function nowHour(){ // float saat
188
+ const n=new Date();
189
+ return USE_UTC ? n.getUTCHours()+n.getUTCMinutes()/60 : n.getHours()+n.getMinutes()/60;
190
+ }
191
+ function fmtClockUTC(){
192
+ const n=new Date();
193
+ const utc = n.toUTCString().split(' ')[4];
194
+ return {local:n.toLocaleTimeString(), utc};
195
+ }
196
+ function inRangeWrap(h, start, end){
197
+ // start<end normal; start>end geceyi aşar
198
+ if (start<end) return h>=start && h<end;
199
+ return (h>=start || h<end);
200
+ }
201
+ function currentVideo(){
202
+ const h=nowHour();
203
+ for(const v of VIDEOS){ if(inRangeWrap(h, v.start, v.end)) return v; }
204
+ return VIDEOS[0];
205
+ }
206
+ function secToMinSec(s){const m=Math.floor(s/60), r=s%60; return `${m}:${String(r).padStart(2,'0')}`}
207
+
208
+ /* =========================
209
+ OYNATICI & ÇİZELGE
210
+ ========================= */
211
+ const $player = document.getElementById('player');
212
+ const $vtitle = document.getElementById('v-title');
213
+ const $vmeta = document.getElementById('v-meta');
214
+ const $chip = document.getElementById('chip-time');
215
+ const $rows = document.querySelectorAll('.schedule .row');
216
+ const $headerTime = document.getElementById('header-time');
217
+
218
+ function updateHeaderTimes(){
219
+ const t = fmtClockUTC();
220
+ $headerTime.textContent = `Local: ${t.local} | UTC: ${t.utc}`;
221
+ document.getElementById('chip-time').textContent = `Local: ${t.local}`;
222
+ }
223
+ setInterval(updateHeaderTimes, 1000); updateHeaderTimes();
224
+
225
+ function highlightRow(activeIndex){
226
+ $rows.forEach((el,i)=>{
227
+ if(i===activeIndex) el.classList.add('active'); else el.classList.remove('active');
228
+ });
229
+ }
230
+
231
+ function indexOfVideo(v){
232
+ return VIDEOS.findIndex(x=>x.title===v.title && x.start===v.start && x.end===v.end);
233
+ }
234
+
235
+ function playScheduled(){
236
+ const h=nowHour();
237
+ const v=currentVideo();
238
+ const idx=indexOfVideo(v);
239
+
240
+ // geçen süre -> videonun kaldığı yeri bul
241
+ const elapsedSec = ((h - v.start + 24) % 24) * 3600;
242
+ const position = Math.floor(elapsedSec % v.duration);
243
+
244
+ // kaynak ve bilgiler
245
+ if ($player.src !== v.url) $player.src = v.url;
246
+ $player.load();
247
+ $player.currentTime = position;
248
+ $player.loop = true;
249
+ $player.play().catch(()=>{ $player.muted=true; $player.play(); });
250
+
251
+ $vtitle.textContent = v.title;
252
+ $vmeta.textContent = `Duration: ${secToMinSec(v.duration)}`;
253
+ highlightRow(idx);
254
+
255
+ // sıradaki geçiş zamanı
256
+ const msToNext = ((v.end - h + 24) % 24) * 3600 * 1000;
257
+ setTimeout(playScheduled, msToNext);
258
+ }
259
+ playScheduled();
260
+
261
+ /* =========================
262
+ BALONCUK ARKA PLAN
263
+ ========================= */
264
+ const $bubbles = document.getElementById('bubbles');
265
+ function createBubble(){
266
+ const b=document.createElement('div');
267
+ const size = 20 + Math.random()*60; // 20..80
268
+ b.className='bubble';
269
+ b.style.width=`${size}px`; b.style.height=`${size}px`;
270
+ b.style.left=`${Math.random()*100}vw`;
271
+ b.style.animationDuration = `${15 + Math.random()*20}s`;
272
+ $bubbles.appendChild(b);
273
+ setTimeout(()=>b.remove(), 40000);
274
+ }
275
+ setInterval(createBubble, 1000);
276
+
277
+ /* =========================
278
+ SAHTE İZLEYİCİ SAYACI (UTC)
279
+ ========================= */
280
+ // Saat dilimi aralıkları ve min-max izleyici
281
+ const BUCKETS = [
282
+ { start:0, end:6, min: 500, max:1500 }, // Gece
283
+ { start:6, end:12, min:1000, max:2500 }, // Sabah
284
+ { start:12,end:18, min:2000, max:4000 }, // Öğlen
285
+ { start:18,end:24, min:3000, max:5000 } // Akşam
286
+ ];
287
+ const $count = document.getElementById('live-count');
288
+ const nf = new Intl.NumberFormat(navigator.language || 'en-US');
289
+ function bucketFor(h){
290
+ for(const b of BUCKETS){ if(h>=b.start && h<b.end) return b; }
291
+ return BUCKETS[0];
292
+ }
293
+ function clamp(n,min,max){return Math.max(min, Math.min(max,n));}
294
+ function randStep(){ // ±10..50
295
+ const mag = 10 + Math.floor(Math.random()*41);
296
+ return (Math.random()<.5?-1:1)*mag;
297
+ }
298
+ function nextDelay(){ return (5 + Math.random()*5)*1000; }
299
+
300
+ let liveCount=null, liveBucket=null, liveTimer=null;
301
+ function initLive(){
302
+ const h=nowHour(); // UTC çünkü USE_UTC=true
303
+ liveBucket = bucketFor(h);
304
+ const span = liveBucket.max - liveBucket.min;
305
+ liveCount = liveBucket.min + Math.floor(span * (0.30 + Math.random()*0.40)); // %30..%70
306
+ $count.textContent = nf.format(liveCount);
307
+ }
308
+ function tickLive(){
309
+ const h=nowHour();
310
+ const b=bucketFor(h);
311
+ if(b!==liveBucket){
312
+ liveBucket=b;
313
+ liveCount = clamp(liveCount + randStep(), b.min, b.max);
314
+ }else{
315
+ liveCount = clamp(liveCount + randStep(), b.min, b.max);
316
+ }
317
+ $count.textContent = nf.format(liveCount);
318
+ liveTimer = setTimeout(tickLive, nextDelay());
319
+ }
320
+ // Sekme görünürlüğü
321
+ document.addEventListener('visibilitychange', ()=>{
322
+ if(document.hidden){ if(liveTimer){clearTimeout(liveTimer); liveTimer=null;} }
323
+ else { if(!liveTimer){ liveTimer=setTimeout(tickLive, nextDelay()); } }
324
+ });
325
+ initLive(); liveTimer=setTimeout(tickLive, nextDelay());
326
+ </script>
327
  <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Meneman/livedance" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
328
  </html>