api-ix commited on
Commit
ed4c116
Β·
verified Β·
1 Parent(s): a2def7f

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +1130 -126
index.html CHANGED
@@ -1,137 +1,1141 @@
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>BLUE DEMON API v2</title>
7
-
8
- <!-- page icon -->
9
- <link rel="icon" href="./media/logo.svg" type="image/svg+xml">
10
-
11
- <!-- fonts -->
12
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
13
- <!-- icons -->
14
- <script src="https://kit.fontawesome.com/64d58efce2.js" crossorigin="anonymous"></script>
15
- <!-- custom font + styles -->
16
- <link rel="stylesheet" href="styles.css"/>
17
- <link rel="preload" href="./media/music.mp3" as="audio" />
18
- <audio id="bgm" src="./media/music.mp3" loop muted playsinline></audio>
19
- </head>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  <body>
22
- <!-- music widget -->
23
- <div id="music-widget">
24
- <button id="music-toggle" aria-label="Play / Pause music">
25
- <!-- default = OFF state -->
26
- <img src="./media/speaker-off.svg" id="speaker-icon" width="20" height="20" alt="speaker">
27
- </button>
28
- <span id="music-text">sound off</span>
29
- </div>
30
-
31
- <!-- Liquid BG -->
32
- <div class="liquid-bg">
33
- <div class="orb orb-1"></div>
34
- <div class="orb orb-2"></div>
35
- <div class="orb orb-3"></div>
36
- </div>
37
-
38
- <!-- Header -->
39
- <header class="header">
40
- <div class="logo">
41
- <!-- inline SVG logo -->
42
- <img src="./media/logo.svg" alt="Blue Demon" width="28" height="28" style="filter: drop-shadow(0 0 4px #ffb347);">
43
- <span>BLUE DEMON</span>
44
- </div>
45
- <nav>
46
- <a href="#apis">APIs</a>
47
- <a href="#docs">Docs</a>
48
- <a href="#status">Status</a>
49
- </nav>
50
- </header>
51
-
52
- <!-- Hero -->
53
- <section class="hero">
54
- <h1 class="hero-title">
55
- <span class="accent">BLUE</span> DEMON API
56
- </h1>
57
- <p class="hero-sub">Lightning-fast endpoints for everything you need.</p>
58
- <button class="cta" onclick="scrollToSection('apis')">
59
- <i class="fas fa-rocket"></i> Explore APIs
60
- </button>
61
- </section>
62
-
63
- <!-- Live Stats -->
64
- <section id="status" class="stats">
65
- <div class="stat-card">
66
- <i class="fas fa-chart-bar"></i>
67
- <span id="req-count">--</span>
68
- <small>requests served</small>
69
- </div>
70
- <div class="stat-card">
71
- <i class="fas fa-server"></i>
72
- <span>50</span>
73
- <small>endpoints</small>
74
- </div>
75
- <div class="stat-card">
76
- <i class="fas fa-shield-alt"></i>
77
- <span>99.9%</span>
78
- <small>uptime</small>
79
- </div>
80
- </section>
81
-
82
- <!-- Filter + Search -->
83
- <section id="apis" class="api-section">
84
- <div class="controls">
85
- <input id="search" placeholder="Search endpoints…"/>
86
- <div class="pills" id="pills">
87
- <button class="pill active" data-cat="All">All</button>
88
- </div>
89
  </div>
90
- <div class="grid" id="grid"></div>
91
- <button class="load-more" id="loadMore">Load more</button>
92
- </section>
93
-
94
- <!-- Docs -->
95
- <section id="docs" class="docs">
96
- <h2>Quick Start</h2>
97
- <div class="steps">
98
- <article>
99
- <div class="step-icon icon-1"></div>
100
- <h3>1. Copy endpoint</h3>
101
- <p>No keys needed for 90 % of endpoints.</p>
102
- </article>
103
- <article>
104
- <div class="step-icon icon-2"></div>
105
- <h3>2. Paste & Run</h3>
106
- <p>Works in browser, curl, fetch, you name it.</p>
107
- </article>
108
- <article>
109
- <div class="step-icon icon-3"></div>
110
- <h3>3. Scale</h3>
111
- <p>Built for high load & rapid prototyping.</p>
112
- </article>
113
- </div>
114
- </section>
115
 
116
- <!-- Footer -->
117
- <footer>
118
- <div class="social">
119
- <a href="https://wa.me/2347041039367" title="Support"><i class="fab fa-whatsapp"></i></a>
120
- <a href="#"><i class="fab fa-github"></i></a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  </div>
122
- <small>&copy; 2024 BLUE DEMON API</small>
123
- </footer>
124
-
125
- <!-- Modal -->
126
- <div class="modal" id="modal">
127
- <div class="modal-backdrop"></div>
128
- <div class="modal-card">
129
- <button class="modal-close">&times;</button>
130
- <h3 id="mTitle"></h3>
131
- <div id="mBody"></div>
132
  </div>
133
- </div>
134
 
135
- <script src="script.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  </body>
137
- </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>Anime-duo API Documentation</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ :root {
15
+ --primary: #58cc02;
16
+ --primary-dark: #46a302;
17
+ --secondary: #1cb0f6;
18
+ --accent: #ff4b4b;
19
+ --bg-start: #0f172a;
20
+ --bg-end: #1e293b;
21
+ --glass-bg: rgba(255, 255, 255, 0.05);
22
+ --glass-border: rgba(255, 255, 255, 0.1);
23
+ --text-primary: #ffffff;
24
+ --text-secondary: #cbd5e1;
25
+ --shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
26
+ }
27
+
28
+ body {
29
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
30
+ background: linear-gradient(135deg, var(--bg-start) 0%, var(--bg-end) 100%);
31
+ color: var(--text-primary);
32
+ line-height: 1.6;
33
+ overflow-x: hidden;
34
+ min-height: 100vh;
35
+ }
36
+
37
+ .floating-shapes {
38
+ position: fixed;
39
+ width: 100%;
40
+ height: 100%;
41
+ overflow: hidden;
42
+ z-index: 0;
43
+ pointer-events: none;
44
+ }
45
+
46
+ .shape {
47
+ position: absolute;
48
+ opacity: 0.1;
49
+ animation: float 20s infinite ease-in-out;
50
+ }
51
+
52
+ .shape:nth-child(1) {
53
+ top: 10%;
54
+ left: 10%;
55
+ width: 80px;
56
+ height: 80px;
57
+ background: var(--primary);
58
+ border-radius: 50%;
59
+ animation-delay: 0s;
60
+ }
61
+
62
+ .shape:nth-child(2) {
63
+ top: 60%;
64
+ right: 10%;
65
+ width: 120px;
66
+ height: 120px;
67
+ background: var(--secondary);
68
+ border-radius: 30%;
69
+ animation-delay: 2s;
70
+ }
71
+
72
+ .shape:nth-child(3) {
73
+ bottom: 20%;
74
+ left: 20%;
75
+ width: 100px;
76
+ height: 100px;
77
+ background: var(--accent);
78
+ border-radius: 20%;
79
+ animation-delay: 4s;
80
+ }
81
+
82
+ @keyframes float {
83
+ 0%, 100% {
84
+ transform: translateY(0) rotate(0deg);
85
+ }
86
+ 50% {
87
+ transform: translateY(-30px) rotate(180deg);
88
+ }
89
+ }
90
+
91
+ .container {
92
+ max-width: 1200px;
93
+ margin: 0 auto;
94
+ padding: 20px;
95
+ position: relative;
96
+ z-index: 1;
97
+ }
98
+
99
+ header {
100
+ text-align: center;
101
+ padding: 60px 20px;
102
+ animation: fadeInDown 0.8s ease;
103
+ }
104
+
105
+ .logo {
106
+ font-size: 3.5rem;
107
+ font-weight: 800;
108
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
109
+ -webkit-background-clip: text;
110
+ -webkit-text-fill-color: transparent;
111
+ background-clip: text;
112
+ margin-bottom: 20px;
113
+ animation: bounce 2s infinite;
114
+ }
115
+
116
+ @keyframes bounce {
117
+ 0%, 100% {
118
+ transform: translateY(0);
119
+ }
120
+ 50% {
121
+ transform: translateY(-10px);
122
+ }
123
+ }
124
+
125
+ .subtitle {
126
+ font-size: 1.2rem;
127
+ color: var(--text-secondary);
128
+ margin-bottom: 30px;
129
+ }
130
+
131
+ .badges {
132
+ display: flex;
133
+ gap: 10px;
134
+ justify-content: center;
135
+ flex-wrap: wrap;
136
+ margin-bottom: 30px;
137
+ }
138
+
139
+ .badge {
140
+ background: var(--glass-bg);
141
+ backdrop-filter: blur(10px);
142
+ border: 1px solid var(--glass-border);
143
+ padding: 8px 16px;
144
+ border-radius: 20px;
145
+ font-size: 0.85rem;
146
+ transition: all 0.3s ease;
147
+ }
148
+
149
+ .badge:hover {
150
+ transform: translateY(-2px);
151
+ box-shadow: var(--shadow);
152
+ }
153
+
154
+ .disclaimer {
155
+ background: var(--glass-bg);
156
+ backdrop-filter: blur(10px);
157
+ border: 1px solid var(--glass-border);
158
+ border-radius: 20px;
159
+ padding: 30px;
160
+ margin: 40px 0;
161
+ box-shadow: var(--shadow);
162
+ animation: fadeInUp 0.8s ease;
163
+ }
164
+
165
+ .disclaimer h2 {
166
+ color: var(--accent);
167
+ margin-bottom: 15px;
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 10px;
171
+ }
172
+
173
+ .disclaimer li {
174
+ margin-left: 30px;
175
+ margin-bottom: 10px;
176
+ }
177
+
178
+ .nav {
179
+ background: var(--glass-bg);
180
+ backdrop-filter: blur(10px);
181
+ border: 1px solid var(--glass-border);
182
+ border-radius: 20px;
183
+ padding: 20px;
184
+ margin: 40px 0;
185
+ position: sticky;
186
+ top: 20px;
187
+ z-index: 100;
188
+ box-shadow: var(--shadow);
189
+ animation: slideInRight 0.8s ease;
190
+ }
191
+
192
+ .nav h3 {
193
+ margin-bottom: 15px;
194
+ color: var(--primary);
195
+ }
196
+
197
+ .nav-links {
198
+ display: grid;
199
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
200
+ gap: 10px;
201
+ }
202
+
203
+ .nav-link {
204
+ color: var(--text-secondary);
205
+ text-decoration: none;
206
+ padding: 10px 15px;
207
+ border-radius: 10px;
208
+ transition: all 0.3s ease;
209
+ display: block;
210
+ background: rgba(255, 255, 255, 0.02);
211
+ }
212
+
213
+ .nav-link:hover {
214
+ background: var(--primary);
215
+ color: white;
216
+ transform: translateX(5px);
217
+ }
218
+
219
+ .section {
220
+ background: var(--glass-bg);
221
+ backdrop-filter: blur(10px);
222
+ border: 1px solid var(--glass-border);
223
+ border-radius: 20px;
224
+ padding: 40px;
225
+ margin: 40px 0;
226
+ box-shadow: var(--shadow);
227
+ animation: fadeInUp 0.8s ease;
228
+ transition: all 0.3s ease;
229
+ }
230
+
231
+ .section:hover {
232
+ transform: translateY(-5px);
233
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
234
+ }
235
+
236
+ .section h2 {
237
+ color: var(--primary);
238
+ margin-bottom: 20px;
239
+ font-size: 2rem;
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 10px;
243
+ }
244
+
245
+ .section h3 {
246
+ color: var(--secondary);
247
+ margin: 25px 0 15px;
248
+ font-size: 1.5rem;
249
+ }
250
+
251
+ .endpoint {
252
+ background: rgba(88, 204, 2, 0.1);
253
+ border-left: 4px solid var(--primary);
254
+ padding: 15px;
255
+ border-radius: 10px;
256
+ margin: 15px 0;
257
+ font-family: 'Courier New', monospace;
258
+ overflow-x: auto;
259
+ }
260
+
261
+ .code-block {
262
+ background: rgba(0, 0, 0, 0.3);
263
+ border-radius: 10px;
264
+ padding: 20px;
265
+ margin: 15px 0;
266
+ overflow-x: auto;
267
+ position: relative;
268
+ }
269
+
270
+ .code-block pre {
271
+ margin: 0;
272
+ color: var(--text-secondary);
273
+ font-family: 'Courier New', monospace;
274
+ font-size: 0.9rem;
275
+ }
276
+
277
+ .copy-btn {
278
+ position: absolute;
279
+ top: 10px;
280
+ right: 10px;
281
+ background: var(--primary);
282
+ border: none;
283
+ color: white;
284
+ padding: 8px 16px;
285
+ border-radius: 8px;
286
+ cursor: pointer;
287
+ transition: all 0.3s ease;
288
+ font-size: 0.85rem;
289
+ }
290
 
291
+ .copy-btn:hover {
292
+ background: var(--primary-dark);
293
+ transform: scale(1.05);
294
+ }
295
+
296
+ table {
297
+ width: 100%;
298
+ border-collapse: collapse;
299
+ margin: 20px 0;
300
+ overflow: hidden;
301
+ border-radius: 10px;
302
+ }
303
+
304
+ th, td {
305
+ padding: 15px;
306
+ text-align: left;
307
+ border-bottom: 1px solid var(--glass-border);
308
+ }
309
+
310
+ th {
311
+ background: rgba(88, 204, 2, 0.2);
312
+ color: var(--primary);
313
+ font-weight: 600;
314
+ }
315
+
316
+ tr {
317
+ transition: all 0.3s ease;
318
+ }
319
+
320
+ tr:hover {
321
+ background: rgba(255, 255, 255, 0.05);
322
+ }
323
+
324
+ .category-grid {
325
+ display: grid;
326
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
327
+ gap: 15px;
328
+ margin: 20px 0;
329
+ }
330
+
331
+ .category-item {
332
+ background: rgba(28, 176, 246, 0.1);
333
+ padding: 15px;
334
+ border-radius: 10px;
335
+ border: 1px solid var(--secondary);
336
+ transition: all 0.3s ease;
337
+ text-align: center;
338
+ }
339
+
340
+ .category-item:hover {
341
+ background: rgba(28, 176, 246, 0.2);
342
+ transform: scale(1.05);
343
+ }
344
+
345
+ .btn {
346
+ background: var(--primary);
347
+ color: white;
348
+ padding: 12px 30px;
349
+ border: none;
350
+ border-radius: 30px;
351
+ font-size: 1rem;
352
+ font-weight: 600;
353
+ cursor: pointer;
354
+ transition: all 0.3s ease;
355
+ display: inline-block;
356
+ text-decoration: none;
357
+ margin: 10px;
358
+ }
359
+
360
+ .btn:hover {
361
+ background: var(--primary-dark);
362
+ transform: translateY(-2px);
363
+ box-shadow: 0 8px 20px rgba(88, 204, 2, 0.3);
364
+ }
365
+
366
+ .btn-secondary {
367
+ background: var(--secondary);
368
+ }
369
+
370
+ .btn-secondary:hover {
371
+ background: #1890c6;
372
+ box-shadow: 0 8px 20px rgba(28, 176, 246, 0.3);
373
+ }
374
+
375
+ footer {
376
+ text-align: center;
377
+ padding: 40px 20px;
378
+ margin-top: 60px;
379
+ border-top: 1px solid var(--glass-border);
380
+ }
381
+
382
+ footer a {
383
+ color: var(--primary);
384
+ text-decoration: none;
385
+ transition: all 0.3s ease;
386
+ }
387
+
388
+ footer a:hover {
389
+ color: var(--secondary);
390
+ }
391
+
392
+ .method-badge {
393
+ display: inline-block;
394
+ padding: 4px 12px;
395
+ border-radius: 15px;
396
+ font-size: 0.8rem;
397
+ font-weight: 600;
398
+ margin-right: 10px;
399
+ }
400
+
401
+ .method-get {
402
+ background: rgba(88, 204, 2, 0.2);
403
+ color: var(--primary);
404
+ }
405
+
406
+ @keyframes fadeInDown {
407
+ from {
408
+ opacity: 0;
409
+ transform: translateY(-30px);
410
+ }
411
+ to {
412
+ opacity: 1;
413
+ transform: translateY(0);
414
+ }
415
+ }
416
+
417
+ @keyframes fadeInUp {
418
+ from {
419
+ opacity: 0;
420
+ transform: translateY(30px);
421
+ }
422
+ to {
423
+ opacity: 1;
424
+ transform: translateY(0);
425
+ }
426
+ }
427
+
428
+ @keyframes slideInRight {
429
+ from {
430
+ opacity: 0;
431
+ transform: translateX(30px);
432
+ }
433
+ to {
434
+ opacity: 1;
435
+ transform: translateX(0);
436
+ }
437
+ }
438
+
439
+ @media (max-width: 768px) {
440
+ .logo {
441
+ font-size: 2.5rem;
442
+ }
443
+
444
+ .section {
445
+ padding: 20px;
446
+ }
447
+
448
+ .nav-links {
449
+ grid-template-columns: 1fr;
450
+ }
451
+
452
+ table {
453
+ font-size: 0.85rem;
454
+ }
455
+
456
+ th, td {
457
+ padding: 10px;
458
+ }
459
+ }
460
+
461
+ .scroll-top {
462
+ position: fixed;
463
+ bottom: 30px;
464
+ right: 30px;
465
+ background: var(--primary);
466
+ color: white;
467
+ width: 50px;
468
+ height: 50px;
469
+ border-radius: 50%;
470
+ display: flex;
471
+ align-items: center;
472
+ justify-content: center;
473
+ cursor: pointer;
474
+ opacity: 0;
475
+ transition: all 0.3s ease;
476
+ z-index: 1000;
477
+ box-shadow: var(--shadow);
478
+ }
479
+
480
+ .scroll-top.visible {
481
+ opacity: 1;
482
+ }
483
+
484
+ .scroll-top:hover {
485
+ background: var(--primary-dark);
486
+ transform: translateY(-5px);
487
+ }
488
+ </style>
489
+ </head>
490
  <body>
491
+ <div class="floating-shapes">
492
+ <div class="shape"></div>
493
+ <div class="shape"></div>
494
+ <div class="shape"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
495
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
 
497
+ <div class="container">
498
+ <header>
499
+ <h1 class="logo">🎌 Anime-duo</h1>
500
+ <p class="subtitle">RESTful API for Anime Streaming - Educational Purposes Only</p>
501
+ <div class="badges">
502
+ <span class="badge">Node.js</span>
503
+ <span class="badge">Version 1.0.0</span>
504
+ <span class="badge">REST API</span>
505
+ <span class="badge">Open Source</span>
506
+ </div>
507
+ <div>
508
+ <a href="https://zenime.site" target="_blank" class="btn">🌐 Live Demo</a>
509
+ <a href="https://github.com/itzzzme/anime-api" target="_blank" class="btn btn-secondary">⭐ GitHub</a>
510
+ </div>
511
+ </header>
512
+
513
+ <div class="disclaimer">
514
+ <h2>⚠️ Disclaimer</h2>
515
+ <ol>
516
+ <li>This API does not store any files, it only links to media hosted on 3rd party services.</li>
517
+ <li>This API is explicitly made for educational purposes only and not for commercial usage. This repo will not be responsible for any misuse of it.</li>
518
+ </ol>
519
+ </div>
520
+
521
+ <nav class="nav" id="nav">
522
+ <h3>πŸ“š Quick Navigation</h3>
523
+ <div class="nav-links">
524
+ <a href="#installation" class="nav-link">Installation</a>
525
+ <a href="#deployment" class="nav-link">Deployment</a>
526
+ <a href="#home-info" class="nav-link">Home Info</a>
527
+ <a href="#top-ten" class="nav-link">Top 10 Anime</a>
528
+ <a href="#anime-info" class="nav-link">Anime Info</a>
529
+ <a href="#search" class="nav-link">Search</a>
530
+ <a href="#categories" class="nav-link">Categories</a>
531
+ <a href="#episodes" class="nav-link">Episodes</a>
532
+ <a href="#streaming" class="nav-link">Streaming</a>
533
+ <a href="#characters" class="nav-link">Characters</a>
534
+ </div>
535
+ </nav>
536
+
537
+ <section class="section" id="installation">
538
+ <h2>πŸ’» Installation</h2>
539
+ <h3>Local Installation</h3>
540
+ <p>Make sure you have Node.js installed on your device.</p>
541
+
542
+ <div class="code-block">
543
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
544
+ <pre>git clone https://github.com/itzzzme/anime-api.git
545
+ cd anime-api
546
+ npm install</pre>
547
+ </div>
548
+
549
+ <h3>Setup Environment Variables</h3>
550
+ <p>Create a <code>.env</code> file based on <code>.env.example</code>:</p>
551
+
552
+ <div class="code-block">
553
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
554
+ <pre>ALLOWED_ORIGIN=&lt;https://site1.com&gt;,&lt;https://site2.com&gt;,...</pre>
555
+ </div>
556
+
557
+ <h3>Start the Server</h3>
558
+ <div class="code-block">
559
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
560
+ <pre>npm start
561
+ # or
562
+ npm run devStart</pre>
563
+ </div>
564
+ </section>
565
+
566
+ <section class="section" id="deployment">
567
+ <h2>πŸš€ Deployment</h2>
568
+ <p>Deploy your own instance easily:</p>
569
+ <div>
570
+ <a href="https://vercel.com/new/clone?repository-url=https://github.com/itzzzme/anime-api" target="_blank" class="btn">Deploy to Vercel</a>
571
+ <a href="https://render.com/deploy?repo=https://github.com/itzzzme/anime-api" target="_blank" class="btn btn-secondary">Deploy to Render</a>
572
+ </div>
573
+ </section>
574
+
575
+ <section class="section" id="home-info">
576
+ <h2>🏠 GET Home Info</h2>
577
+ <div class="endpoint">
578
+ <span class="method-badge method-get">GET</span> /api/
579
+ </div>
580
+ <p>Retrieve comprehensive home page information including spotlights, trending anime, schedules, and more.</p>
581
+
582
+ <h3>Example Request</h3>
583
+ <div class="code-block">
584
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
585
+ <pre>import axios from "axios";
586
+ const resp = await axios.get("/api/");
587
+ console.log(resp.data);</pre>
588
+ </div>
589
+
590
+ <h3>Response Structure</h3>
591
+ <p>Returns: spotlights, trending, today's schedule, topAiring, mostPopular, mostFavorite, latestCompleted, latestEpisode, and genres.</p>
592
+ </section>
593
+
594
+ <section class="section" id="top-ten">
595
+ <h2>πŸ”₯ GET Top 10 Anime</h2>
596
+ <div class="endpoint">
597
+ <span class="method-badge method-get">GET</span> /api/top-ten
598
+ </div>
599
+ <p>Get the top 10 anime for today, this week, and this month.</p>
600
+
601
+ <h3>Example Request</h3>
602
+ <div class="code-block">
603
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
604
+ <pre>import axios from "axios";
605
+ const resp = await axios.get("/api/top-ten");
606
+ console.log(resp.data);</pre>
607
+ </div>
608
+ </section>
609
+
610
+ <section class="section" id="top-search">
611
+ <h2>πŸ” GET Top Search</h2>
612
+ <div class="endpoint">
613
+ <span class="method-badge method-get">GET</span> /api/top-search
614
+ </div>
615
+ <p>Retrieve the most searched anime titles.</p>
616
+
617
+ <h3>Example Request</h3>
618
+ <div class="code-block">
619
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
620
+ <pre>import axios from "axios";
621
+ const resp = await axios.get("/api/top-search");
622
+ console.log(resp.data);</pre>
623
+ </div>
624
+ </section>
625
+
626
+ <section class="section" id="anime-info">
627
+ <h2>πŸ“Ί GET Anime Info</h2>
628
+ <div class="endpoint">
629
+ <span class="method-badge method-get">GET</span> /api/info?id={anime-id}
630
+ </div>
631
+
632
+ <h3>Parameters</h3>
633
+ <table>
634
+ <thead>
635
+ <tr>
636
+ <th>Parameter</th>
637
+ <th>Type</th>
638
+ <th>Description</th>
639
+ <th>Required</th>
640
+ </tr>
641
+ </thead>
642
+ <tbody>
643
+ <tr>
644
+ <td>id</td>
645
+ <td>string</td>
646
+ <td>Anime ID</td>
647
+ <td>βœ… Yes</td>
648
+ </tr>
649
+ </tbody>
650
+ </table>
651
+
652
+ <h3>Example Request</h3>
653
+ <div class="code-block">
654
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
655
+ <pre>import axios from "axios";
656
+ const resp = await axios.get("/api/info?id=one-piece-100");
657
+ console.log(resp.data);</pre>
658
+ </div>
659
+ </section>
660
+
661
+ <section class="section" id="random">
662
+ <h2>🎲 GET Random Anime</h2>
663
+ <div class="endpoint">
664
+ <span class="method-badge method-get">GET</span> /api/random
665
+ </div>
666
+ <p>Get information about a random anime with related and recommended data.</p>
667
+
668
+ <h3>Example Request</h3>
669
+ <div class="code-block">
670
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
671
+ <pre>import axios from "axios";
672
+ const resp = await axios.get("/api/random");
673
+ console.log(resp.data);</pre>
674
+ </div>
675
+ </section>
676
+
677
+ <section class="section" id="categories">
678
+ <h2>πŸ“‚ GET Categories</h2>
679
+ <div class="endpoint">
680
+ <span class="method-badge method-get">GET</span> /api/{category}?page={number}
681
+ </div>
682
+
683
+ <h3>Parameters</h3>
684
+ <table>
685
+ <thead>
686
+ <tr>
687
+ <th>Parameter</th>
688
+ <th>Type</th>
689
+ <th>Description</th>
690
+ <th>Required</th>
691
+ <th>Default</th>
692
+ </tr>
693
+ </thead>
694
+ <tbody>
695
+ <tr>
696
+ <td>category</td>
697
+ <td>string</td>
698
+ <td>Category name</td>
699
+ <td>βœ… Yes</td>
700
+ <td>-</td>
701
+ </tr>
702
+ <tr>
703
+ <td>page</td>
704
+ <td>number</td>
705
+ <td>Page number</td>
706
+ <td>❌ No</td>
707
+ <td>1</td>
708
+ </tr>
709
+ </tbody>
710
+ </table>
711
+
712
+ <h3>Available Categories</h3>
713
+ <div class="category-grid">
714
+ <div class="category-item">top-airing</div>
715
+ <div class="category-item">most-popular</div>
716
+ <div class="category-item">most-favorite</div>
717
+ <div class="category-item">completed</div>
718
+ <div class="category-item">recently-updated</div>
719
+ <div class="category-item">recently-added</div>
720
+ <div class="category-item">top-upcoming</div>
721
+ <div class="category-item">subbed-anime</div>
722
+ <div class="category-item">dubbed-anime</div>
723
+ <div class="category-item">movie</div>
724
+ <div class="category-item">tv</div>
725
+ <div class="category-item">ova</div>
726
+ <div class="category-item">ona</div>
727
+ <div class="category-item">special</div>
728
+ </div>
729
+
730
+ <h3>Genres</h3>
731
+ <div class="category-grid">
732
+ <div class="category-item">genre/action</div>
733
+ <div class="category-item">genre/adventure</div>
734
+ <div class="category-item">genre/comedy</div>
735
+ <div class="category-item">genre/drama</div>
736
+ <div class="category-item">genre/fantasy</div>
737
+ <div class="category-item">genre/horror</div>
738
+ <div class="category-item">genre/isekai</div>
739
+ <div class="category-item">genre/romance</div>
740
+ <div class="category-item">genre/sci-fi</div>
741
+ <div class="category-item">genre/sports</div>
742
+ <div class="category-item">genre/supernatural</div>
743
+ <div class="category-item">And many more...</div>
744
+ </div>
745
+
746
+ <h3>Example Request</h3>
747
+ <div class="code-block">
748
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
749
+ <pre>import axios from "axios";
750
+ const resp = await axios.get("/api/most-popular?page=1");
751
+ console.log(resp.data);</pre>
752
+ </div>
753
+ </section>
754
+
755
+ <section class="section" id="producer">
756
+ <h2>🎬 GET Producer/Studio Anime</h2>
757
+ <div class="endpoint">
758
+ <span class="method-badge method-get">GET</span> /api/producer/{producer-name}?page={number}
759
+ </div>
760
+
761
+ <h3>Example Request</h3>
762
+ <div class="code-block">
763
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
764
+ <pre>import axios from "axios";
765
+ const resp = await axios.get("/api/producer/ufotable?page=1");
766
+ console.log(resp.data);</pre>
767
+ </div>
768
+ </section>
769
+
770
+ <section class="section" id="search">
771
+ <h2>πŸ”Ž GET Search Results</h2>
772
+ <div class="endpoint">
773
+ <span class="method-badge method-get">GET</span> /api/search?keyword={search-term}
774
+ </div>
775
+
776
+ <h3>Parameters</h3>
777
+ <table>
778
+ <thead>
779
+ <tr>
780
+ <th>Parameter</th>
781
+ <th>Type</th>
782
+ <th>Description</th>
783
+ <th>Required</th>
784
+ </tr>
785
+ </thead>
786
+ <tbody>
787
+ <tr>
788
+ <td>keyword</td>
789
+ <td>string</td>
790
+ <td>Search keyword</td>
791
+ <td>βœ… Yes</td>
792
+ </tr>
793
+ </tbody>
794
+ </table>
795
+
796
+ <h3>Example Request</h3>
797
+ <div class="code-block">
798
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
799
+ <pre>import axios from "axios";
800
+ const resp = await axios.get("/api/search?keyword=one%20punch%20man");
801
+ console.log(resp.data);</pre>
802
+ </div>
803
+
804
+ <h3>Search Suggestions</h3>
805
+ <div class="endpoint">
806
+ <span class="method-badge method-get">GET</span> /api/search/suggest?keyword={search-term}
807
+ </div>
808
+ <p>Get autocomplete suggestions for search queries.</p>
809
+ </section>
810
+
811
+ <section class="section" id="filter">
812
+ <h2>🎯 GET Filter Anime</h2>
813
+ <div class="endpoint">
814
+ <span class="method-badge method-get">GET</span> /api/filter
815
+ </div>
816
+
817
+ <h3>Parameters</h3>
818
+ <table>
819
+ <thead>
820
+ <tr>
821
+ <th>Parameter</th>
822
+ <th>Type</th>
823
+ <th>Description</th>
824
+ <th>Default</th>
825
+ </tr>
826
+ </thead>
827
+ <tbody>
828
+ <tr>
829
+ <td>type</td>
830
+ <td>string</td>
831
+ <td>Type (movie, tv, etc.)</td>
832
+ <td>ALL</td>
833
+ </tr>
834
+ <tr>
835
+ <td>status</td>
836
+ <td>string</td>
837
+ <td>Status (finished, currently_airing)</td>
838
+ <td>ALL</td>
839
+ </tr>
840
+ <tr>
841
+ <td>rated</td>
842
+ <td>string</td>
843
+ <td>Rating (G, PG, etc.)</td>
844
+ <td>ALL</td>
845
+ </tr>
846
+ <tr>
847
+ <td>score</td>
848
+ <td>string</td>
849
+ <td>Score (1-10)</td>
850
+ <td>ALL</td>
851
+ </tr>
852
+ <tr>
853
+ <td>season</td>
854
+ <td>string</td>
855
+ <td>Season (spring, summer, etc.)</td>
856
+ <td>ALL</td>
857
+ </tr>
858
+ <tr>
859
+ <td>language</td>
860
+ <td>string</td>
861
+ <td>Language (sub, dub)</td>
862
+ <td>ALL</td>
863
+ </tr>
864
+ <tr>
865
+ <td>genres</td>
866
+ <td>string</td>
867
+ <td>Comma-separated genres</td>
868
+ <td>ALL</td>
869
+ </tr>
870
+ <tr>
871
+ <td>sort</td>
872
+ <td>string</td>
873
+ <td>Sort method</td>
874
+ <td>DEFAULT</td>
875
+ </tr>
876
+ <tr>
877
+ <td>page</td>
878
+ <td>number</td>
879
+ <td>Page number</td>
880
+ <td>1</td>
881
+ </tr>
882
+ </tbody>
883
+ </table>
884
+
885
+ <h3>Example Request</h3>
886
+ <div class="code-block">
887
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
888
+ <pre>import axios from "axios";
889
+ const resp = await axios.get("/api/filter?type=2&status=1&page=1");
890
+ console.log(resp.data);</pre>
891
+ </div>
892
+ </section>
893
+
894
+ <section class="section" id="schedule">
895
+ <h2>πŸ“… GET Schedule</h2>
896
+ <div class="endpoint">
897
+ <span class="method-badge method-get">GET</span> /api/schedule?date={YYYY-MM-DD}
898
+ </div>
899
+ <p>Get the schedule of upcoming anime for a specific date.</p>
900
+
901
+ <h3>Example Request</h3>
902
+ <div class="code-block">
903
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
904
+ <pre>import axios from "axios";
905
+ const resp = await axios.get("/api/schedule?date=2024-09-23");
906
+ console.log(resp.data);</pre>
907
+ </div>
908
+
909
+ <h3>Next Episode Schedule</h3>
910
+ <div class="endpoint">
911
+ <span class="method-badge method-get">GET</span> /api/schedule/{anime-id}
912
+ </div>
913
+ <p>Get the schedule for the next episode of a specific anime.</p>
914
+ </section>
915
+
916
+ <section class="section" id="episodes">
917
+ <h2>πŸ“Ί GET Episodes</h2>
918
+ <div class="endpoint">
919
+ <span class="method-badge method-get">GET</span> /api/episodes/{anime-id}
920
+ </div>
921
+ <p>Retrieve the complete episode list for an anime.</p>
922
+
923
+ <h3>Example Request</h3>
924
+ <div class="code-block">
925
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
926
+ <pre>import axios from "axios";
927
+ const resp = await axios.get("/api/episodes/one-piece-100");
928
+ console.log(resp.data);</pre>
929
+ </div>
930
+ </section>
931
+
932
+ <section class="section" id="servers">
933
+ <h2>πŸ–₯️ GET Available Servers</h2>
934
+ <div class="endpoint">
935
+ <span class="method-badge method-get">GET</span> /api/servers/{anime-id}?ep={episode-id}
936
+ </div>
937
+ <p>Get all available streaming servers for an anime episode.</p>
938
+
939
+ <h3>Example Request</h3>
940
+ <div class="code-block">
941
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
942
+ <pre>import axios from "axios";
943
+ const resp = await axios.get("/api/servers/one-piece-100?ep=12345");
944
+ console.log(resp.data);</pre>
945
+ </div>
946
+ </section>
947
+
948
+ <section class="section" id="streaming">
949
+ <h2>▢️ GET Streaming Info</h2>
950
+ <div class="endpoint">
951
+ <span class="method-badge method-get">GET</span> /api/stream?id={episode-id}&server={server-name}&type={sub/dub}
952
+ </div>
953
+
954
+ <h3>Parameters</h3>
955
+ <table>
956
+ <thead>
957
+ <tr>
958
+ <th>Parameter</th>
959
+ <th>Type</th>
960
+ <th>Description</th>
961
+ <th>Required</th>
962
+ </tr>
963
+ </thead>
964
+ <tbody>
965
+ <tr>
966
+ <td>id</td>
967
+ <td>string</td>
968
+ <td>Episode ID</td>
969
+ <td>βœ… Yes</td>
970
+ </tr>
971
+ <tr>
972
+ <td>server</td>
973
+ <td>string</td>
974
+ <td>Server name</td>
975
+ <td>βœ… Yes</td>
976
+ </tr>
977
+ <tr>
978
+ <td>type</td>
979
+ <td>string</td>
980
+ <td>sub or dub</td>
981
+ <td>βœ… Yes</td>
982
+ </tr>
983
+ </tbody>
984
+ </table>
985
+
986
+ <h3>Example Request</h3>
987
+ <div class="code-block">
988
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
989
+ <pre>import axios from "axios";
990
+ const resp = await axios.get("/api/stream?id=one-piece-100?ep=107257&server=hd-1&type=sub");
991
+ console.log(resp.data);</pre>
992
+ </div>
993
+
994
+ <h3>Fallback Streaming</h3>
995
+ <div class="endpoint">
996
+ <span class="method-badge method-get">GET</span> /api/stream/fallback?id={episode-id}&server={server-name}&type={sub/dub}
997
+ </div>
998
+ <p>Alternative streaming source if primary fails.</p>
999
+ </section>
1000
+
1001
+ <section class="section" id="characters">
1002
+ <h2>πŸ‘₯ GET Characters</h2>
1003
+ <div class="endpoint">
1004
+ <span class="method-badge method-get">GET</span> /api/character/list/{anime-id}
1005
+ </div>
1006
+ <p>Get the list of characters and voice actors for an anime.</p>
1007
+
1008
+ <h3>Example Request</h3>
1009
+ <div class="code-block">
1010
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
1011
+ <pre>import axios from "axios";
1012
+ const resp = await axios.get("/api/character/list/one-piece-100");
1013
+ console.log(resp.data);</pre>
1014
+ </div>
1015
+
1016
+ <h3>Character Details</h3>
1017
+ <div class="endpoint">
1018
+ <span class="method-badge method-get">GET</span> /api/character/{character-id}
1019
+ </div>
1020
+ <p>Get detailed information about a specific character.</p>
1021
+
1022
+ <h3>Voice Actor Details</h3>
1023
+ <div class="endpoint">
1024
+ <span class="method-badge method-get">GET</span> /api/actors/{actor-id}
1025
+ </div>
1026
+ <p>Get detailed information about a voice actor.</p>
1027
+ </section>
1028
+
1029
+ <section class="section" id="qtip">
1030
+ <h2>πŸ’‘ GET Qtip Info</h2>
1031
+ <div class="endpoint">
1032
+ <span class="method-badge method-get">GET</span> /api/qtip/{anime-data-id}
1033
+ </div>
1034
+ <p>Get quick tooltip information for an anime.</p>
1035
+
1036
+ <h3>Example Request</h3>
1037
+ <div class="code-block">
1038
+ <button class="copy-btn" onclick="copyCode(this)">Copy</button>
1039
+ <pre>import axios from "axios";
1040
+ const resp = await axios.get("/api/qtip/3365");
1041
+ console.log(resp.data);</pre>
1042
+ </div>
1043
+ </section>
1044
+
1045
+ <section class="section" id="contribute">
1046
+ <h2>🀝 Contributing</h2>
1047
+ <h3>Pull Requests</h3>
1048
+ <p>Pull requests are welcomed that address bug fixes, improvements, or new features.</p>
1049
+ <ul>
1050
+ <li>Fork the repository and create a new branch for your changes</li>
1051
+ <li>Ensure your code follows our coding standards</li>
1052
+ <li>Include tests if applicable</li>
1053
+ <li>Describe your changes clearly in the pull request</li>
1054
+ </ul>
1055
+
1056
+ <h3>Reporting Issues</h3>
1057
+ <p>If you discover any issues or have suggestions for improvement, please open an issue on GitHub.</p>
1058
+
1059
+ <h3>Support</h3>
1060
+ <p>If you like the project, feel free to drop a star ✨. Your appreciation means a lot!</p>
1061
+ </section>
1062
+
1063
+ <footer>
1064
+ <p>Made with πŸ’š by <a href="https://github.com/itzzzme" target="_blank">itzzzme</a></p>
1065
+ <p style="margin-top: 10px; color: var(--text-secondary);">
1066
+ <a href="https://github.com/itzzzme/anime-api" target="_blank">GitHub Repository</a> |
1067
+ <a href="https://zenime.site" target="_blank">Live Demo</a>
1068
+ </p>
1069
+ </footer>
1070
  </div>
1071
+
1072
+ <div class="scroll-top" id="scrollTop" onclick="scrollToTop()">
1073
+ ↑
 
 
 
 
 
 
 
1074
  </div>
 
1075
 
1076
+ <script>
1077
+ function copyCode(button) {
1078
+ const codeBlock = button.nextElementSibling;
1079
+ const text = codeBlock.textContent;
1080
+
1081
+ navigator.clipboard.writeText(text).then(() => {
1082
+ button.textContent = 'Copied!';
1083
+ setTimeout(() => {
1084
+ button.textContent = 'Copy';
1085
+ }, 2000);
1086
+ });
1087
+ }
1088
+
1089
+ const scrollTopBtn = document.getElementById('scrollTop');
1090
+
1091
+ window.addEventListener('scroll', () => {
1092
+ if (window.pageYOffset > 300) {
1093
+ scrollTopBtn.classList.add('visible');
1094
+ } else {
1095
+ scrollTopBtn.classList.remove('visible');
1096
+ }
1097
+ });
1098
+
1099
+ function scrollToTop() {
1100
+ window.scrollTo({
1101
+ top: 0,
1102
+ behavior: 'smooth'
1103
+ });
1104
+ }
1105
+
1106
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
1107
+ anchor.addEventListener('click', function (e) {
1108
+ e.preventDefault();
1109
+ const target = document.querySelector(this.getAttribute('href'));
1110
+ if (target) {
1111
+ target.scrollIntoView({
1112
+ behavior: 'smooth',
1113
+ block: 'start'
1114
+ });
1115
+ }
1116
+ });
1117
+ });
1118
+
1119
+ const sections = document.querySelectorAll('.section');
1120
+ const observerOptions = {
1121
+ threshold: 0.1,
1122
+ rootMargin: '0px 0px -100px 0px'
1123
+ };
1124
+
1125
+ const observer = new IntersectionObserver((entries) => {
1126
+ entries.forEach(entry => {
1127
+ if (entry.isIntersecting) {
1128
+ entry.target.style.opacity = '1';
1129
+ entry.target.style.transform = 'translateY(0)';
1130
+ }
1131
+ });
1132
+ }, observerOptions);
1133
+
1134
+ sections.forEach(section => {
1135
+ section.style.opacity = '0';
1136
+ section.style.transform = 'translateY(20px)';
1137
+ observer.observe(section);
1138
+ });
1139
+ </script>
1140
  </body>
1141
+ </html>