tunecamp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/.env.local +2 -0
  2. package/.vercel/README.txt +11 -0
  3. package/.vercel/project.json +1 -0
  4. package/LICENSE +22 -0
  5. package/README.md +554 -0
  6. package/dist/cli.d.ts +6 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +172 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/generator/embedGenerator.d.ts +38 -0
  11. package/dist/generator/embedGenerator.d.ts.map +1 -0
  12. package/dist/generator/embedGenerator.js +92 -0
  13. package/dist/generator/embedGenerator.js.map +1 -0
  14. package/dist/generator/feedGenerator.d.ts +50 -0
  15. package/dist/generator/feedGenerator.d.ts.map +1 -0
  16. package/dist/generator/feedGenerator.js +167 -0
  17. package/dist/generator/feedGenerator.js.map +1 -0
  18. package/dist/generator/podcastFeedGenerator.d.ts +54 -0
  19. package/dist/generator/podcastFeedGenerator.d.ts.map +1 -0
  20. package/dist/generator/podcastFeedGenerator.js +173 -0
  21. package/dist/generator/podcastFeedGenerator.js.map +1 -0
  22. package/dist/generator/proceduralCoverGenerator.d.ts +51 -0
  23. package/dist/generator/proceduralCoverGenerator.d.ts.map +1 -0
  24. package/dist/generator/proceduralCoverGenerator.js +228 -0
  25. package/dist/generator/proceduralCoverGenerator.js.map +1 -0
  26. package/dist/generator/siteGenerator.d.ts +55 -0
  27. package/dist/generator/siteGenerator.d.ts.map +1 -0
  28. package/dist/generator/siteGenerator.js +539 -0
  29. package/dist/generator/siteGenerator.js.map +1 -0
  30. package/dist/generator/templateEngine.d.ts +13 -0
  31. package/dist/generator/templateEngine.d.ts.map +1 -0
  32. package/dist/generator/templateEngine.js +146 -0
  33. package/dist/generator/templateEngine.js.map +1 -0
  34. package/dist/index.d.ts +12 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +32 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parser/catalogParser.d.ts +13 -0
  39. package/dist/parser/catalogParser.d.ts.map +1 -0
  40. package/dist/parser/catalogParser.js +120 -0
  41. package/dist/parser/catalogParser.js.map +1 -0
  42. package/dist/tools/generate-codes.d.ts +14 -0
  43. package/dist/tools/generate-codes.d.ts.map +1 -0
  44. package/dist/tools/generate-codes.js +274 -0
  45. package/dist/tools/generate-codes.js.map +1 -0
  46. package/dist/tools/generate-sea-pair.d.ts +14 -0
  47. package/dist/tools/generate-sea-pair.d.ts.map +1 -0
  48. package/dist/tools/generate-sea-pair.js +111 -0
  49. package/dist/tools/generate-sea-pair.js.map +1 -0
  50. package/dist/types/index.d.ts +117 -0
  51. package/dist/types/index.d.ts.map +1 -0
  52. package/dist/types/index.js +5 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/utils/audioUtils.d.ts +9 -0
  55. package/dist/utils/audioUtils.d.ts.map +1 -0
  56. package/dist/utils/audioUtils.js +67 -0
  57. package/dist/utils/audioUtils.js.map +1 -0
  58. package/dist/utils/configUtils.d.ts +11 -0
  59. package/dist/utils/configUtils.d.ts.map +1 -0
  60. package/dist/utils/configUtils.js +50 -0
  61. package/dist/utils/configUtils.js.map +1 -0
  62. package/dist/utils/fileUtils.d.ts +14 -0
  63. package/dist/utils/fileUtils.d.ts.map +1 -0
  64. package/dist/utils/fileUtils.js +73 -0
  65. package/dist/utils/fileUtils.js.map +1 -0
  66. package/examples/artist-free/README.md +36 -0
  67. package/examples/artist-paycurtain/README.md +49 -0
  68. package/examples/label/README.md +33 -0
  69. package/gundb-keypair.json +8 -0
  70. package/logo.svg +30 -0
  71. package/package-lock.json +1176 -0
  72. package/package.json +42 -0
  73. package/public/assets/community-registry.js +291 -0
  74. package/public/assets/download-stats.js +263 -0
  75. package/public/assets/player.js +219 -0
  76. package/public/assets/style.css +1170 -0
  77. package/public/assets/theme-widget.js +353 -0
  78. package/public/assets/unlock-codes.js +225 -0
  79. package/public/atom.xml +22 -0
  80. package/public/catalog.m3u +3 -0
  81. package/public/feed.xml +22 -0
  82. package/public/image.png +0 -0
  83. package/public/index.html +249 -0
  84. package/public/logo.svg +30 -0
  85. package/public/releases/chirichetto/Homologo - Chirichetto.wav +0 -0
  86. package/public/releases/chirichetto/cover.png +0 -0
  87. package/public/releases/chirichetto/embed-code.txt +16 -0
  88. package/public/releases/chirichetto/embed-compact.txt +8 -0
  89. package/public/releases/chirichetto/embed.html +39 -0
  90. package/public/releases/chirichetto/index.html +389 -0
  91. package/public/releases/chirichetto/playlist.m3u +3 -0
  92. package/templates/dark/assets/community-registry.js +291 -0
  93. package/templates/dark/assets/download-stats.js +263 -0
  94. package/templates/dark/assets/player.js +219 -0
  95. package/templates/dark/assets/style.css +740 -0
  96. package/templates/dark/index.hbs +73 -0
  97. package/templates/dark/layout.hbs +84 -0
  98. package/templates/dark/release.hbs +212 -0
  99. package/templates/default/assets/community-registry.js +291 -0
  100. package/templates/default/assets/download-stats.js +263 -0
  101. package/templates/default/assets/player.js +219 -0
  102. package/templates/default/assets/style.css +1170 -0
  103. package/templates/default/assets/theme-widget.js +353 -0
  104. package/templates/default/assets/unlock-codes.js +225 -0
  105. package/templates/default/index.hbs +188 -0
  106. package/templates/default/layout.hbs +117 -0
  107. package/templates/default/release.hbs +553 -0
  108. package/templates/minimal/assets/community-registry.js +291 -0
  109. package/templates/minimal/assets/download-stats.js +263 -0
  110. package/templates/minimal/assets/player.js +219 -0
  111. package/templates/minimal/assets/style.css +796 -0
  112. package/templates/minimal/index.hbs +73 -0
  113. package/templates/minimal/layout.hbs +84 -0
  114. package/templates/minimal/release.hbs +212 -0
  115. package/templates/retro/assets/community-registry.js +291 -0
  116. package/templates/retro/assets/download-stats.js +263 -0
  117. package/templates/retro/assets/player.js +219 -0
  118. package/templates/retro/assets/style.css +872 -0
  119. package/templates/retro/index.hbs +73 -0
  120. package/templates/retro/layout.hbs +84 -0
  121. package/templates/retro/release.hbs +212 -0
  122. package/templates/translucent/assets/community-registry.js +291 -0
  123. package/templates/translucent/assets/download-stats.js +263 -0
  124. package/templates/translucent/assets/player.js +219 -0
  125. package/templates/translucent/assets/style.css +1352 -0
  126. package/templates/translucent/index.hbs +73 -0
  127. package/templates/translucent/layout.hbs +84 -0
  128. package/templates/translucent/release.hbs +212 -0
  129. package/website/community.html +492 -0
  130. package/website/index.html +195 -0
  131. package/website/styles.css +396 -0
  132. package/website/tunecamp.svg +30 -0
@@ -0,0 +1,872 @@
1
+ /* Tunecamp - Retro Theme (80s Style) */
2
+
3
+ :root {
4
+ --primary-color: #ff1493;
5
+ --secondary-color: #00ffff;
6
+ --accent-color: #ffff00;
7
+ --purple: #9945ff;
8
+ --bg-color: #1a0033;
9
+ --surface-color: #2d0052;
10
+ --text-color: #ffffff;
11
+ --text-muted: #cc99ff;
12
+ --border-color: #ff1493;
13
+ --success-color: #00ff00;
14
+ --grid-color: #ff1493;
15
+ }
16
+
17
+ * {
18
+ margin: 0;
19
+ padding: 0;
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ body {
24
+ font-family: 'Courier New', 'Courier', monospace;
25
+ background: var(--bg-color);
26
+ background-image:
27
+ repeating-linear-gradient(
28
+ 0deg,
29
+ transparent,
30
+ transparent 2px,
31
+ rgba(255, 20, 147, 0.03) 2px,
32
+ rgba(255, 20, 147, 0.03) 4px
33
+ );
34
+ color: var(--text-color);
35
+ line-height: 1.6;
36
+ }
37
+
38
+ .container {
39
+ max-width: 1200px;
40
+ margin: 0 auto;
41
+ padding: 2rem;
42
+ }
43
+
44
+ /* Header */
45
+ .site-header {
46
+ background: linear-gradient(180deg, var(--surface-color) 0%, var(--bg-color) 100%);
47
+ border-bottom: 3px solid var(--border-color);
48
+ box-shadow: 0 0 20px rgba(255, 20, 147, 0.5);
49
+ padding: 3rem 0;
50
+ margin-bottom: 3rem;
51
+ position: relative;
52
+ }
53
+
54
+ .site-header::after {
55
+ content: '';
56
+ position: absolute;
57
+ bottom: -3px;
58
+ left: 0;
59
+ right: 0;
60
+ height: 3px;
61
+ background: linear-gradient(90deg,
62
+ var(--primary-color) 0%,
63
+ var(--secondary-color) 50%,
64
+ var(--accent-color) 100%
65
+ );
66
+ }
67
+
68
+ .site-title {
69
+ font-size: 3.5rem;
70
+ margin-bottom: 0.5rem;
71
+ font-weight: bold;
72
+ text-transform: uppercase;
73
+ letter-spacing: 4px;
74
+ text-shadow:
75
+ 0 0 10px var(--primary-color),
76
+ 0 0 20px var(--primary-color),
77
+ 0 0 30px var(--secondary-color),
78
+ 3px 3px 0 rgba(0, 0, 0, 0.5);
79
+ }
80
+
81
+ .site-title a {
82
+ background: linear-gradient(135deg,
83
+ var(--primary-color) 0%,
84
+ var(--secondary-color) 50%,
85
+ var(--accent-color) 100%
86
+ );
87
+ -webkit-background-clip: text;
88
+ -webkit-text-fill-color: transparent;
89
+ background-clip: text;
90
+ }
91
+
92
+ /* Header Image (Bandcamp-style) */
93
+ .site-header-image {
94
+ margin-bottom: 1.5rem;
95
+ width: 100%;
96
+ text-align: center;
97
+ }
98
+
99
+ .site-header-image a {
100
+ display: block;
101
+ text-decoration: none;
102
+ width: 100%;
103
+ }
104
+
105
+ .header-image {
106
+ width: 100%;
107
+ max-width: 100%;
108
+ height: auto;
109
+ max-height: 400px;
110
+ min-height: 200px;
111
+ display: block;
112
+ margin: 0 auto;
113
+ object-fit: contain;
114
+ object-position: center;
115
+ filter: drop-shadow(0 0 10px var(--primary-color)) drop-shadow(0 0 20px var(--secondary-color));
116
+ }
117
+
118
+ @media (max-width: 768px) {
119
+ .header-image {
120
+ max-height: 250px;
121
+ min-height: 120px;
122
+ }
123
+ }
124
+ animation: neon-pulse 2s ease-in-out infinite alternate;
125
+ }
126
+
127
+ @keyframes neon-pulse {
128
+ from {
129
+ filter: drop-shadow(0 0 10px var(--primary-color));
130
+ }
131
+ to {
132
+ filter: drop-shadow(0 0 20px var(--secondary-color));
133
+ }
134
+ }
135
+
136
+ .site-description {
137
+ color: var(--text-muted);
138
+ font-size: 1.1rem;
139
+ text-transform: uppercase;
140
+ letter-spacing: 3px;
141
+ text-shadow: 0 0 10px var(--secondary-color);
142
+ }
143
+
144
+ /* Artist Section */
145
+ .artist-section {
146
+ margin-bottom: 4rem;
147
+ padding: 2rem;
148
+ background: var(--surface-color);
149
+ border: 3px solid var(--primary-color);
150
+ box-shadow:
151
+ 0 0 20px rgba(255, 20, 147, 0.5),
152
+ inset 0 0 20px rgba(255, 20, 147, 0.1);
153
+ position: relative;
154
+ }
155
+
156
+ .artist-section::before {
157
+ content: '';
158
+ position: absolute;
159
+ top: -3px;
160
+ left: -3px;
161
+ right: -3px;
162
+ bottom: -3px;
163
+ background: linear-gradient(45deg,
164
+ var(--primary-color) 0%,
165
+ var(--secondary-color) 50%,
166
+ var(--primary-color) 100%
167
+ );
168
+ z-index: -1;
169
+ opacity: 0.3;
170
+ }
171
+
172
+ .artist-header {
173
+ display: flex;
174
+ gap: 2rem;
175
+ align-items: center;
176
+ }
177
+
178
+ .artist-photo {
179
+ width: 180px;
180
+ height: 180px;
181
+ border-radius: 50%;
182
+ object-fit: cover;
183
+ border: 4px solid var(--primary-color);
184
+ box-shadow:
185
+ 0 0 30px rgba(255, 20, 147, 0.8),
186
+ 0 0 60px rgba(0, 255, 255, 0.5);
187
+ animation: photo-glow 3s ease-in-out infinite alternate;
188
+ }
189
+
190
+ @keyframes photo-glow {
191
+ from {
192
+ box-shadow:
193
+ 0 0 30px rgba(255, 20, 147, 0.8),
194
+ 0 0 60px rgba(0, 255, 255, 0.5);
195
+ }
196
+ to {
197
+ box-shadow:
198
+ 0 0 40px rgba(0, 255, 255, 0.8),
199
+ 0 0 80px rgba(255, 20, 147, 0.5);
200
+ }
201
+ }
202
+
203
+ .artist-info h2 {
204
+ font-size: 2.5rem;
205
+ margin-bottom: 1rem;
206
+ font-weight: bold;
207
+ text-transform: uppercase;
208
+ letter-spacing: 2px;
209
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
210
+ -webkit-background-clip: text;
211
+ -webkit-text-fill-color: transparent;
212
+ background-clip: text;
213
+ }
214
+
215
+ .artist-bio {
216
+ color: var(--text-muted);
217
+ line-height: 1.8;
218
+ }
219
+
220
+ /* Releases Grid */
221
+ .releases-section h2 {
222
+ font-size: 2.5rem;
223
+ margin-bottom: 2.5rem;
224
+ font-weight: bold;
225
+ text-transform: uppercase;
226
+ letter-spacing: 4px;
227
+ text-shadow:
228
+ 0 0 10px var(--secondary-color),
229
+ 3px 3px 0 rgba(0, 0, 0, 0.5);
230
+ color: var(--secondary-color);
231
+ }
232
+
233
+ .releases-grid {
234
+ display: grid;
235
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
236
+ gap: 2.5rem;
237
+ }
238
+
239
+ .release-card {
240
+ background: var(--surface-color);
241
+ border: 3px solid var(--primary-color);
242
+ overflow: hidden;
243
+ transition: all 0.3s;
244
+ box-shadow: 0 0 20px rgba(255, 20, 147, 0.3);
245
+ }
246
+
247
+ .release-card:hover {
248
+ transform: translateY(-10px) scale(1.02);
249
+ box-shadow:
250
+ 0 0 40px rgba(255, 20, 147, 0.8),
251
+ 0 0 60px rgba(0, 255, 255, 0.5);
252
+ border-color: var(--secondary-color);
253
+ }
254
+
255
+ .release-link {
256
+ text-decoration: none;
257
+ color: inherit;
258
+ display: block;
259
+ }
260
+
261
+ .release-cover {
262
+ aspect-ratio: 1;
263
+ overflow: hidden;
264
+ background: linear-gradient(135deg, var(--surface-color), var(--bg-color));
265
+ position: relative;
266
+ }
267
+
268
+ .release-cover::after {
269
+ content: '';
270
+ position: absolute;
271
+ top: 0;
272
+ left: 0;
273
+ right: 0;
274
+ bottom: 0;
275
+ background: linear-gradient(45deg,
276
+ transparent 40%,
277
+ rgba(255, 20, 147, 0.1) 50%,
278
+ transparent 60%
279
+ );
280
+ background-size: 200% 200%;
281
+ animation: shimmer 3s ease-in-out infinite;
282
+ }
283
+
284
+ @keyframes shimmer {
285
+ 0%, 100% {
286
+ background-position: 0% 0%;
287
+ }
288
+ 50% {
289
+ background-position: 100% 100%;
290
+ }
291
+ }
292
+
293
+ .release-cover img {
294
+ width: 100%;
295
+ height: 100%;
296
+ object-fit: cover;
297
+ display: block;
298
+ filter: saturate(1.3) contrast(1.1);
299
+ }
300
+
301
+ .release-cover-placeholder {
302
+ display: flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ font-size: 4rem;
306
+ color: var(--primary-color);
307
+ text-shadow: 0 0 20px var(--primary-color);
308
+ }
309
+
310
+ .release-info {
311
+ padding: 1.5rem;
312
+ background: var(--surface-color);
313
+ }
314
+
315
+ .release-title {
316
+ font-size: 1.2rem;
317
+ margin-bottom: 0.5rem;
318
+ font-weight: bold;
319
+ text-transform: uppercase;
320
+ letter-spacing: 1px;
321
+ color: var(--accent-color);
322
+ text-shadow: 0 0 10px var(--accent-color);
323
+ }
324
+
325
+ .release-date {
326
+ color: var(--text-muted);
327
+ font-size: 0.9rem;
328
+ margin-bottom: 1rem;
329
+ text-transform: uppercase;
330
+ letter-spacing: 2px;
331
+ }
332
+
333
+ .release-genres {
334
+ display: flex;
335
+ gap: 0.5rem;
336
+ flex-wrap: wrap;
337
+ margin-bottom: 1rem;
338
+ }
339
+
340
+ .genre-tag {
341
+ background: transparent;
342
+ border: 2px solid var(--secondary-color);
343
+ color: var(--secondary-color);
344
+ padding: 0.25rem 0.75rem;
345
+ border-radius: 0;
346
+ font-size: 0.7rem;
347
+ font-weight: bold;
348
+ text-transform: uppercase;
349
+ letter-spacing: 1px;
350
+ box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
351
+ }
352
+
353
+ .release-tracks-count {
354
+ color: var(--text-muted);
355
+ font-size: 0.9rem;
356
+ margin-bottom: 1rem;
357
+ text-transform: uppercase;
358
+ }
359
+
360
+ .release-download-badge {
361
+ background: var(--success-color);
362
+ color: var(--bg-color);
363
+ padding: 0.5rem 1rem;
364
+ border-radius: 0;
365
+ font-size: 0.75rem;
366
+ display: inline-block;
367
+ font-weight: bold;
368
+ text-transform: uppercase;
369
+ letter-spacing: 1px;
370
+ box-shadow: 0 0 15px rgba(0, 255, 0, 0.5);
371
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
372
+ }
373
+
374
+ /* Release Detail */
375
+ .breadcrumb {
376
+ margin-bottom: 2rem;
377
+ }
378
+
379
+ .breadcrumb a {
380
+ color: var(--secondary-color);
381
+ text-decoration: none;
382
+ text-transform: uppercase;
383
+ font-size: 0.9rem;
384
+ font-weight: bold;
385
+ letter-spacing: 2px;
386
+ text-shadow: 0 0 10px var(--secondary-color);
387
+ }
388
+
389
+ .breadcrumb a:hover {
390
+ text-shadow: 0 0 20px var(--secondary-color);
391
+ }
392
+
393
+ .release-header {
394
+ display: grid;
395
+ grid-template-columns: 400px 1fr;
396
+ gap: 3rem;
397
+ margin-bottom: 4rem;
398
+ }
399
+
400
+ .release-cover-large {
401
+ position: relative;
402
+ }
403
+
404
+ .release-cover-large img {
405
+ width: 100%;
406
+ border: 4px solid var(--primary-color);
407
+ box-shadow:
408
+ 0 0 40px rgba(255, 20, 147, 0.8),
409
+ 12px 12px 0 rgba(0, 255, 255, 0.3);
410
+ filter: saturate(1.3) contrast(1.1);
411
+ }
412
+
413
+ .release-metadata h1 {
414
+ font-size: 3rem;
415
+ margin-bottom: 0.5rem;
416
+ font-weight: bold;
417
+ text-transform: uppercase;
418
+ letter-spacing: 2px;
419
+ background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
420
+ -webkit-background-clip: text;
421
+ -webkit-text-fill-color: transparent;
422
+ background-clip: text;
423
+ text-shadow: 0 0 20px var(--primary-color);
424
+ }
425
+
426
+ .release-artist {
427
+ font-size: 1.5rem;
428
+ color: var(--secondary-color);
429
+ margin-bottom: 1rem;
430
+ font-weight: bold;
431
+ text-transform: uppercase;
432
+ text-shadow: 0 0 15px var(--secondary-color);
433
+ }
434
+
435
+ .release-description {
436
+ line-height: 1.8;
437
+ margin: 1.5rem 0;
438
+ color: var(--text-muted);
439
+ }
440
+
441
+ .release-credits {
442
+ margin: 1.5rem 0;
443
+ padding: 1.5rem;
444
+ background: var(--surface-color);
445
+ border: 2px solid var(--secondary-color);
446
+ box-shadow: 0 0 20px rgba(0, 255, 255, 0.3);
447
+ }
448
+
449
+ .release-credits h3 {
450
+ margin-bottom: 0.5rem;
451
+ font-weight: bold;
452
+ text-transform: uppercase;
453
+ letter-spacing: 2px;
454
+ color: var(--accent-color);
455
+ }
456
+
457
+ .release-credits ul {
458
+ list-style: none;
459
+ color: var(--text-muted);
460
+ }
461
+
462
+ .btn {
463
+ padding: 1rem 2rem;
464
+ border: 3px solid var(--primary-color);
465
+ border-radius: 0;
466
+ font-size: 0.9rem;
467
+ cursor: pointer;
468
+ transition: all 0.3s;
469
+ display: inline-flex;
470
+ align-items: center;
471
+ gap: 0.5rem;
472
+ font-weight: bold;
473
+ text-transform: uppercase;
474
+ letter-spacing: 2px;
475
+ position: relative;
476
+ font-family: 'Courier New', 'Courier', monospace;
477
+ }
478
+
479
+ .btn-primary {
480
+ background: var(--primary-color);
481
+ color: var(--bg-color);
482
+ box-shadow: 0 0 20px rgba(255, 20, 147, 0.5);
483
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
484
+ }
485
+
486
+ .btn-primary:hover {
487
+ background: var(--secondary-color);
488
+ border-color: var(--secondary-color);
489
+ box-shadow: 0 0 40px rgba(0, 255, 255, 0.8);
490
+ transform: translateY(-2px);
491
+ }
492
+
493
+ /* Audio Player */
494
+ .audio-player {
495
+ background: var(--surface-color);
496
+ padding: 2.5rem;
497
+ margin-bottom: 3rem;
498
+ border: 3px solid var(--secondary-color);
499
+ box-shadow:
500
+ 0 0 30px rgba(0, 255, 255, 0.5),
501
+ inset 0 0 30px rgba(0, 255, 255, 0.1);
502
+ }
503
+
504
+ .player-track-info {
505
+ display: flex;
506
+ gap: 1.5rem;
507
+ margin-bottom: 2rem;
508
+ align-items: center;
509
+ }
510
+
511
+ .player-cover {
512
+ width: 100px;
513
+ height: 100px;
514
+ overflow: hidden;
515
+ background: var(--bg-color);
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: center;
519
+ font-size: 2.5rem;
520
+ color: var(--primary-color);
521
+ border: 3px solid var(--primary-color);
522
+ box-shadow: 0 0 20px rgba(255, 20, 147, 0.5);
523
+ }
524
+
525
+ .player-cover img {
526
+ width: 100%;
527
+ height: 100%;
528
+ object-fit: cover;
529
+ filter: saturate(1.3) contrast(1.1);
530
+ }
531
+
532
+ .player-title {
533
+ font-size: 1.3rem;
534
+ font-weight: bold;
535
+ text-transform: uppercase;
536
+ letter-spacing: 1px;
537
+ color: var(--accent-color);
538
+ text-shadow: 0 0 10px var(--accent-color);
539
+ }
540
+
541
+ .player-artist {
542
+ color: var(--text-muted);
543
+ font-size: 1rem;
544
+ text-transform: uppercase;
545
+ letter-spacing: 2px;
546
+ }
547
+
548
+ .player-controls {
549
+ display: flex;
550
+ justify-content: center;
551
+ gap: 2rem;
552
+ margin-bottom: 2rem;
553
+ }
554
+
555
+ .player-btn {
556
+ background: var(--bg-color);
557
+ border: 3px solid var(--secondary-color);
558
+ color: var(--secondary-color);
559
+ width: 60px;
560
+ height: 60px;
561
+ border-radius: 50%;
562
+ cursor: pointer;
563
+ transition: all 0.3s;
564
+ font-size: 1.3rem;
565
+ box-shadow: 0 0 15px rgba(0, 255, 255, 0.3);
566
+ }
567
+
568
+ .player-btn-play {
569
+ width: 80px;
570
+ height: 80px;
571
+ background: var(--primary-color);
572
+ color: var(--bg-color);
573
+ border-color: var(--primary-color);
574
+ box-shadow: 0 0 30px rgba(255, 20, 147, 0.8);
575
+ }
576
+
577
+ .player-btn:hover {
578
+ background: var(--secondary-color);
579
+ color: var(--bg-color);
580
+ box-shadow: 0 0 30px rgba(0, 255, 255, 0.8);
581
+ transform: scale(1.1);
582
+ }
583
+
584
+ .player-progress {
585
+ display: flex;
586
+ align-items: center;
587
+ gap: 1.5rem;
588
+ margin-bottom: 1.5rem;
589
+ }
590
+
591
+ .player-time {
592
+ color: var(--text-muted);
593
+ font-size: 1rem;
594
+ min-width: 50px;
595
+ font-variant-numeric: tabular-nums;
596
+ font-weight: bold;
597
+ text-shadow: 0 0 5px var(--secondary-color);
598
+ }
599
+
600
+ .progress-bar {
601
+ flex: 1;
602
+ height: 10px;
603
+ -webkit-appearance: none;
604
+ appearance: none;
605
+ background: var(--bg-color);
606
+ border: 2px solid var(--secondary-color);
607
+ outline: none;
608
+ box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
609
+ }
610
+
611
+ .progress-bar::-webkit-slider-thumb {
612
+ -webkit-appearance: none;
613
+ appearance: none;
614
+ width: 20px;
615
+ height: 20px;
616
+ background: var(--primary-color);
617
+ border-radius: 50%;
618
+ cursor: pointer;
619
+ box-shadow: 0 0 15px rgba(255, 20, 147, 0.8);
620
+ border: 2px solid var(--accent-color);
621
+ }
622
+
623
+ .player-volume {
624
+ display: flex;
625
+ align-items: center;
626
+ gap: 1rem;
627
+ max-width: 250px;
628
+ color: var(--text-muted);
629
+ }
630
+
631
+ .volume-bar {
632
+ flex: 1;
633
+ height: 8px;
634
+ -webkit-appearance: none;
635
+ appearance: none;
636
+ background: var(--bg-color);
637
+ border: 2px solid var(--secondary-color);
638
+ box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
639
+ }
640
+
641
+ .volume-bar::-webkit-slider-thumb {
642
+ -webkit-appearance: none;
643
+ appearance: none;
644
+ width: 16px;
645
+ height: 16px;
646
+ background: var(--primary-color);
647
+ border-radius: 50%;
648
+ cursor: pointer;
649
+ border: 2px solid var(--accent-color);
650
+ }
651
+
652
+ /* Track List */
653
+ .tracklist h2 {
654
+ font-size: 2rem;
655
+ margin-bottom: 2rem;
656
+ font-weight: bold;
657
+ text-transform: uppercase;
658
+ letter-spacing: 2px;
659
+ color: var(--accent-color);
660
+ text-shadow: 0 0 15px var(--accent-color);
661
+ }
662
+
663
+ .track-list {
664
+ list-style: none;
665
+ }
666
+
667
+ .track-item {
668
+ display: flex;
669
+ align-items: center;
670
+ gap: 1.5rem;
671
+ padding: 1rem 1.5rem;
672
+ background: var(--surface-color);
673
+ border: 2px solid var(--border-color);
674
+ margin-bottom: 0.75rem;
675
+ transition: all 0.3s;
676
+ box-shadow: 0 0 10px rgba(255, 20, 147, 0.2);
677
+ }
678
+
679
+ .track-item:hover {
680
+ background: var(--bg-color);
681
+ border-color: var(--secondary-color);
682
+ box-shadow: 0 0 25px rgba(0, 255, 255, 0.5);
683
+ transform: translateX(10px);
684
+ }
685
+
686
+ .track-item.playing {
687
+ border-color: var(--accent-color);
688
+ background: var(--bg-color);
689
+ box-shadow: 0 0 30px rgba(255, 255, 0, 0.5);
690
+ }
691
+
692
+ .track-number {
693
+ width: 40px;
694
+ text-align: center;
695
+ color: var(--text-muted);
696
+ font-size: 1.2rem;
697
+ font-variant-numeric: tabular-nums;
698
+ font-weight: bold;
699
+ text-shadow: 0 0 10px var(--primary-color);
700
+ }
701
+
702
+ .track-info {
703
+ flex: 1;
704
+ }
705
+
706
+ .track-title {
707
+ font-weight: bold;
708
+ margin-bottom: 0.25rem;
709
+ text-transform: uppercase;
710
+ letter-spacing: 1px;
711
+ }
712
+
713
+ .track-meta {
714
+ font-size: 0.8rem;
715
+ color: var(--text-muted);
716
+ text-transform: uppercase;
717
+ }
718
+
719
+ .track-actions {
720
+ display: flex;
721
+ gap: 0.75rem;
722
+ }
723
+
724
+ .track-play-btn,
725
+ .track-download-btn {
726
+ background: var(--bg-color);
727
+ border: 2px solid var(--secondary-color);
728
+ color: var(--secondary-color);
729
+ width: 44px;
730
+ height: 44px;
731
+ border-radius: 50%;
732
+ cursor: pointer;
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: center;
736
+ transition: all 0.3s;
737
+ text-decoration: none;
738
+ font-size: 1rem;
739
+ box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
740
+ }
741
+
742
+ .track-play-btn:hover,
743
+ .track-download-btn:hover {
744
+ background: var(--secondary-color);
745
+ color: var(--bg-color);
746
+ box-shadow: 0 0 25px rgba(0, 255, 255, 0.8);
747
+ transform: scale(1.1);
748
+ }
749
+
750
+ /* Footer */
751
+ .site-footer {
752
+ background: var(--bg-color);
753
+ border-top: 3px solid var(--primary-color);
754
+ box-shadow: 0 0 20px rgba(255, 20, 147, 0.5);
755
+ padding: 3rem 0;
756
+ margin-top: 5rem;
757
+ text-align: center;
758
+ color: var(--text-muted);
759
+ position: relative;
760
+ }
761
+
762
+ .site-footer::before {
763
+ content: '';
764
+ position: absolute;
765
+ top: -3px;
766
+ left: 0;
767
+ right: 0;
768
+ height: 3px;
769
+ background: linear-gradient(90deg,
770
+ var(--primary-color) 0%,
771
+ var(--secondary-color) 50%,
772
+ var(--accent-color) 100%
773
+ );
774
+ }
775
+
776
+ .site-footer a {
777
+ color: var(--secondary-color);
778
+ text-decoration: none;
779
+ font-weight: bold;
780
+ text-shadow: 0 0 10px var(--secondary-color);
781
+ }
782
+
783
+ .social-links {
784
+ margin-top: 2rem;
785
+ display: flex;
786
+ justify-content: center;
787
+ gap: 1.5rem;
788
+ }
789
+
790
+ .social-link {
791
+ width: 50px;
792
+ height: 50px;
793
+ border-radius: 50%;
794
+ border: 3px solid var(--primary-color);
795
+ background: var(--bg-color);
796
+ display: flex;
797
+ align-items: center;
798
+ justify-content: center;
799
+ font-size: 1.3rem;
800
+ transition: all 0.3s;
801
+ color: var(--primary-color);
802
+ box-shadow: 0 0 15px rgba(255, 20, 147, 0.5);
803
+ }
804
+
805
+ .social-link:hover {
806
+ background: var(--secondary-color);
807
+ color: var(--bg-color);
808
+ border-color: var(--secondary-color);
809
+ box-shadow: 0 0 30px rgba(0, 255, 255, 0.8);
810
+ transform: translateY(-5px) scale(1.1);
811
+ }
812
+
813
+ /* Responsive */
814
+ @media (max-width: 768px) {
815
+ .site-title {
816
+ font-size: 2.5rem;
817
+ }
818
+
819
+ .release-header {
820
+ grid-template-columns: 1fr;
821
+ }
822
+
823
+ .release-cover-large img {
824
+ box-shadow:
825
+ 0 0 30px rgba(255, 20, 147, 0.8),
826
+ 8px 8px 0 rgba(0, 255, 255, 0.3);
827
+ }
828
+
829
+ .artist-header {
830
+ flex-direction: column;
831
+ text-align: center;
832
+ }
833
+
834
+ .releases-grid {
835
+ grid-template-columns: 1fr;
836
+ }
837
+ }
838
+
839
+ /* Tunecamp Footer */
840
+ .tunecamp-footer {
841
+ background: #0a0a0a;
842
+ border-top: 2px solid #ff00ff;
843
+ padding: 0.75rem 0;
844
+ margin-top: 2rem;
845
+ text-align: center;
846
+ box-shadow: 0 0 10px rgba(255, 0, 255, 0.3);
847
+ }
848
+
849
+ .footer-content {
850
+ display: flex;
851
+ align-items: center;
852
+ justify-content: center;
853
+ gap: 0.5rem;
854
+ font-size: 0.9rem;
855
+ color: #ccc;
856
+ }
857
+
858
+ .tunecamp-link {
859
+ display: flex;
860
+ align-items: center;
861
+ gap: 0.5rem;
862
+ text-decoration: none;
863
+ color: #00ffff;
864
+ }
865
+
866
+
867
+ .footer-logo {
868
+ width: 20px;
869
+ height: 20px;
870
+ }
871
+
872
+