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,1352 @@
1
+ /* Translucent Theme - Glassmorphism Design */
2
+ :root {
3
+ --bg-color: #0a0a0a;
4
+ --surface-color: rgba(255, 255, 255, 0.05);
5
+ --surface-hover: rgba(255, 255, 255, 0.1);
6
+ --border-color: rgba(255, 255, 255, 0.1);
7
+ --text-color: #ffffff;
8
+ --text-muted: rgba(255, 255, 255, 0.7);
9
+ --primary-color: #00d4ff;
10
+ --secondary-color: #ff6b9d;
11
+ --accent-color: #ffd700;
12
+ --success-color: #00ff88;
13
+ --warning-color: #ffaa00;
14
+ --error-color: #ff4444;
15
+ }
16
+
17
+ * {
18
+ margin: 0;
19
+ padding: 0;
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ body {
24
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
+ background: linear-gradient(135deg, #0a0a0a 0%, #1a1a2e 50%, #16213e 100%);
26
+ background-attachment: fixed;
27
+ color: var(--text-color);
28
+ line-height: 1.6;
29
+ min-height: 100vh;
30
+ margin: 0;
31
+ padding: 0;
32
+ }
33
+
34
+ /* Main Content */
35
+ .site-main {
36
+ min-height: calc(100vh - 200px);
37
+ padding-bottom: 2rem;
38
+ }
39
+
40
+ /* Content Sections */
41
+ .content-section {
42
+ margin-bottom: 3rem;
43
+ }
44
+
45
+ .section-title {
46
+ font-size: 2rem;
47
+ margin-bottom: 2rem;
48
+ color: var(--text-color);
49
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
50
+ -webkit-background-clip: text;
51
+ -webkit-text-fill-color: transparent;
52
+ background-clip: text;
53
+ }
54
+
55
+ /* Glassmorphism Background */
56
+ body::before {
57
+ content: '';
58
+ position: fixed;
59
+ top: 0;
60
+ left: 0;
61
+ width: 100%;
62
+ height: 100%;
63
+ background:
64
+ radial-gradient(circle at 20% 80%, rgba(0, 212, 255, 0.1) 0%, transparent 50%),
65
+ radial-gradient(circle at 80% 20%, rgba(255, 107, 157, 0.1) 0%, transparent 50%),
66
+ radial-gradient(circle at 40% 40%, rgba(255, 215, 0, 0.05) 0%, transparent 50%);
67
+ pointer-events: none;
68
+ z-index: -1;
69
+ }
70
+
71
+ .container {
72
+ max-width: 1200px;
73
+ margin: 0 auto;
74
+ padding: 0 2rem;
75
+ }
76
+
77
+ /* Header */
78
+ .site-header {
79
+ background: rgba(255, 255, 255, 0.05);
80
+ backdrop-filter: blur(20px);
81
+ border-bottom: 1px solid var(--border-color);
82
+ padding: 2rem 0;
83
+ margin-bottom: 3rem;
84
+ position: sticky;
85
+ top: 0;
86
+ z-index: 100;
87
+ }
88
+
89
+ .site-title {
90
+ font-size: 3rem;
91
+ font-weight: 800;
92
+ text-align: center;
93
+ margin-bottom: 1rem;
94
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
95
+ -webkit-background-clip: text;
96
+ -webkit-text-fill-color: transparent;
97
+ background-clip: text;
98
+ text-shadow: 0 0 30px rgba(0, 212, 255, 0.3);
99
+ }
100
+
101
+ .site-title a {
102
+ text-decoration: none;
103
+ color: inherit;
104
+ }
105
+
106
+ /* Header Image (Bandcamp-style) */
107
+ .site-header-image {
108
+ margin-bottom: 1.5rem;
109
+ width: 100%;
110
+ text-align: center;
111
+ }
112
+
113
+ .site-header-image a {
114
+ display: block;
115
+ text-decoration: none;
116
+ width: 100%;
117
+ }
118
+
119
+ .header-image {
120
+ width: 100%;
121
+ max-width: 100%;
122
+ height: auto;
123
+ max-height: 400px;
124
+ min-height: 200px;
125
+ display: block;
126
+ margin: 0 auto;
127
+ object-fit: contain;
128
+ object-position: center;
129
+ filter: drop-shadow(0 0 20px rgba(0, 212, 255, 0.3));
130
+ }
131
+
132
+ @media (max-width: 768px) {
133
+ .header-image {
134
+ max-height: 250px;
135
+ min-height: 120px;
136
+ }
137
+ }
138
+
139
+ .site-description {
140
+ text-align: center;
141
+ color: var(--text-muted);
142
+ font-size: 1.2rem;
143
+ max-width: 600px;
144
+ margin: 0 auto;
145
+ }
146
+
147
+ /* Navigation */
148
+ .breadcrumb {
149
+ margin-bottom: 2rem;
150
+ }
151
+
152
+ .breadcrumb-nav {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: 0.5rem;
156
+ margin-bottom: 2rem;
157
+ }
158
+
159
+ .breadcrumb-item {
160
+ color: var(--text-muted);
161
+ font-size: 0.9rem;
162
+ }
163
+
164
+ .breadcrumb-item:not(:last-child)::after {
165
+ content: '›';
166
+ margin-left: 0.5rem;
167
+ color: var(--text-muted);
168
+ }
169
+
170
+ .breadcrumb-link {
171
+ color: var(--primary-color);
172
+ text-decoration: none;
173
+ transition: all 0.3s ease;
174
+ }
175
+
176
+ .breadcrumb-link:hover {
177
+ color: var(--secondary-color);
178
+ }
179
+
180
+ .breadcrumb a {
181
+ color: var(--primary-color);
182
+ text-decoration: none;
183
+ font-weight: 500;
184
+ transition: all 0.3s ease;
185
+ display: inline-flex;
186
+ align-items: center;
187
+ gap: 0.5rem;
188
+ padding: 0.5rem 1rem;
189
+ background: rgba(255, 255, 255, 0.05);
190
+ border-radius: 8px;
191
+ border: 1px solid var(--border-color);
192
+ backdrop-filter: blur(10px);
193
+ }
194
+
195
+ .breadcrumb a:hover {
196
+ background: rgba(255, 255, 255, 0.1);
197
+ transform: translateX(-5px);
198
+ }
199
+
200
+ /* Artist Section */
201
+ .artist-section {
202
+ margin-bottom: 4rem;
203
+ }
204
+
205
+ .artist-header {
206
+ display: flex;
207
+ align-items: center;
208
+ gap: 2rem;
209
+ margin-bottom: 3rem;
210
+ padding: 2rem;
211
+ background: rgba(56, 27, 27, 0.05);
212
+ border-radius: 20px;
213
+ border: 1px solid var(--border-color);
214
+ backdrop-filter: blur(20px);
215
+ }
216
+
217
+ .artist-photo {
218
+ width: 120px;
219
+ height: 120px;
220
+ border-radius: 50%;
221
+ object-fit: cover;
222
+ border: 3px solid var(--primary-color);
223
+ box-shadow: 0 0 30px rgba(0, 212, 255, 0.3);
224
+ transition: all 0.3s ease;
225
+ position: relative;
226
+ overflow: hidden;
227
+ }
228
+
229
+ .artist-photo:hover {
230
+ transform: scale(1.05);
231
+ box-shadow: 0 0 40px rgba(0, 212, 255, 0.5);
232
+ border-color: var(--secondary-color);
233
+ }
234
+
235
+ .artist-photo img {
236
+ width: 100%;
237
+ height: 100%;
238
+ object-fit: cover;
239
+ border-radius: 50%;
240
+ transition: all 0.3s ease;
241
+ }
242
+
243
+ .artist-info h1 {
244
+ font-size: 2.5rem;
245
+ margin-bottom: 0.5rem;
246
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
247
+ -webkit-background-clip: text;
248
+ -webkit-text-fill-color: transparent;
249
+ background-clip: text;
250
+ }
251
+
252
+ .artist-info p {
253
+ color: var(--text-muted);
254
+ font-size: 1.1rem;
255
+ margin-bottom: 1rem;
256
+ }
257
+
258
+ /* Releases Section */
259
+ .releases-section {
260
+ margin-bottom: 4rem;
261
+ }
262
+
263
+ .releases-section h2 {
264
+ font-size: 2rem;
265
+ margin-bottom: 2rem;
266
+ color: var(--text-color);
267
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
268
+ -webkit-background-clip: text;
269
+ -webkit-text-fill-color: transparent;
270
+ background-clip: text;
271
+ }
272
+
273
+ .releases-grid {
274
+ display: grid;
275
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
276
+ gap: 2rem;
277
+ margin-bottom: 3rem;
278
+ }
279
+
280
+ .release-card {
281
+ background: rgba(255, 255, 255, 0.05);
282
+ border-radius: 20px;
283
+ padding: 2rem;
284
+ border: 1px solid var(--border-color);
285
+ backdrop-filter: blur(20px);
286
+ transition: all 0.3s ease;
287
+ text-decoration: none;
288
+ color: inherit;
289
+ position: relative;
290
+ overflow: hidden;
291
+ display: block;
292
+ width: 100%;
293
+ }
294
+
295
+ .release-card:hover {
296
+ transform: translateY(-10px);
297
+ border-color: var(--primary-color);
298
+ box-shadow: 0 20px 40px rgba(0, 212, 255, 0.2);
299
+ }
300
+
301
+ .release-card:hover::before {
302
+ opacity: 1;
303
+ }
304
+
305
+ .release-card::before {
306
+ content: '';
307
+ position: absolute;
308
+ top: 0;
309
+ left: 0;
310
+ right: 0;
311
+ bottom: 0;
312
+ background: linear-gradient(135deg,
313
+ rgba(0, 212, 255, 0.1) 0%,
314
+ rgba(255, 107, 157, 0.1) 100%);
315
+ opacity: 0;
316
+ transition: opacity 0.3s ease;
317
+ z-index: -1;
318
+ }
319
+
320
+ .release-card:hover {
321
+ transform: translateY(-10px);
322
+ border-color: var(--primary-color);
323
+ box-shadow: 0 20px 40px rgba(0, 212, 255, 0.2);
324
+ }
325
+
326
+ .release-card:hover::before {
327
+ opacity: 1;
328
+ }
329
+
330
+ .release-cover {
331
+ width: 100%;
332
+ height: 200px;
333
+ object-fit: cover;
334
+ border-radius: 15px;
335
+ margin-bottom: 1.5rem;
336
+ border: 2px solid var(--border-color);
337
+ transition: all 0.3s ease;
338
+ position: relative;
339
+ overflow: hidden;
340
+ }
341
+
342
+ .release-cover:hover {
343
+ transform: scale(1.05);
344
+ border-color: var(--primary-color);
345
+ box-shadow: 0 10px 20px rgba(0, 212, 255, 0.3);
346
+ }
347
+
348
+ .release-cover img {
349
+ width: 100%;
350
+ height: 100%;
351
+ object-fit: cover;
352
+ border-radius: 15px;
353
+ transition: all 0.3s ease;
354
+ }
355
+
356
+ .release-title {
357
+ font-size: 1.5rem;
358
+ font-weight: 700;
359
+ margin-bottom: 0.5rem;
360
+ color: var(--text-color);
361
+ }
362
+
363
+ .release-artist {
364
+ color: var(--text-muted);
365
+ margin-bottom: 1rem;
366
+ }
367
+
368
+ .release-meta {
369
+ display: flex;
370
+ justify-content: space-between;
371
+ align-items: center;
372
+ margin-bottom: 1rem;
373
+ font-size: 0.9rem;
374
+ color: var(--text-muted);
375
+ }
376
+
377
+ .release-date {
378
+ color: var(--text-muted);
379
+ font-size: 0.9rem;
380
+ }
381
+
382
+ .release-genre {
383
+ color: var(--text-muted);
384
+ font-size: 0.9rem;
385
+ font-style: italic;
386
+ }
387
+
388
+ .release-tracks {
389
+ color: var(--text-muted);
390
+ font-size: 0.9rem;
391
+ }
392
+
393
+ .release-price {
394
+ font-weight: 600;
395
+ color: var(--primary-color);
396
+ }
397
+
398
+ /* Release Detail */
399
+ .release-detail {
400
+ background: rgba(255, 255, 255, 0.05);
401
+ border-radius: 20px;
402
+ padding: 3rem;
403
+ border: 1px solid var(--border-color);
404
+ backdrop-filter: blur(20px);
405
+ margin-bottom: 3rem;
406
+ }
407
+
408
+ .release-header {
409
+ display: grid;
410
+ grid-template-columns: 300px 1fr;
411
+ gap: 3rem;
412
+ margin-bottom: 3rem;
413
+ }
414
+
415
+ .release-cover-large {
416
+ position: relative;
417
+ width: 100%;
418
+ height: 300px;
419
+ border-radius: 20px;
420
+ overflow: hidden;
421
+ border: 3px solid var(--primary-color);
422
+ box-shadow: 0 20px 40px rgba(0, 212, 255, 0.3);
423
+ transition: all 0.3s ease;
424
+ }
425
+
426
+ .release-cover-large:hover {
427
+ transform: scale(1.02);
428
+ box-shadow: 0 25px 50px rgba(0, 212, 255, 0.4);
429
+ }
430
+
431
+ .release-cover-large img {
432
+ width: 100%;
433
+ height: 100%;
434
+ object-fit: cover;
435
+ border-radius: 20px;
436
+ transition: all 0.3s ease;
437
+ }
438
+
439
+ .release-metadata h1 {
440
+ font-size: 3rem;
441
+ margin-bottom: 1rem;
442
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
443
+ -webkit-background-clip: text;
444
+ -webkit-text-fill-color: transparent;
445
+ background-clip: text;
446
+ }
447
+
448
+ .release-artist {
449
+ font-size: 1.5rem;
450
+ color: var(--text-muted);
451
+ margin-bottom: 1rem;
452
+ }
453
+
454
+ .release-description {
455
+ color: var(--text-muted);
456
+ line-height: 1.8;
457
+ margin-bottom: 2rem;
458
+ }
459
+
460
+ /* Tracks */
461
+ .track-list {
462
+ list-style: none;
463
+ background: rgba(255, 255, 255, 0.03);
464
+ border-radius: 15px;
465
+ border: 1px solid var(--border-color);
466
+ backdrop-filter: blur(10px);
467
+ overflow: hidden;
468
+ }
469
+
470
+ .tracks-list {
471
+ background: rgba(255, 255, 255, 0.03);
472
+ border-radius: 15px;
473
+ border: 1px solid var(--border-color);
474
+ backdrop-filter: blur(10px);
475
+ overflow: hidden;
476
+ }
477
+
478
+ .track-item {
479
+ display: flex;
480
+ align-items: center;
481
+ padding: 1.5rem 2rem;
482
+ border-bottom: 1px solid var(--border-color);
483
+ transition: all 0.3s ease;
484
+ cursor: pointer;
485
+ }
486
+
487
+ .track-item:last-child {
488
+ border-bottom: none;
489
+ }
490
+
491
+ .track-item:hover {
492
+ background: rgba(255, 255, 255, 0.05);
493
+ }
494
+
495
+ .track-item.playing {
496
+ background: rgba(0, 212, 255, 0.1);
497
+ border-left: 4px solid var(--primary-color);
498
+ }
499
+
500
+ .track-number {
501
+ width: 40px;
502
+ text-align: center;
503
+ color: var(--text-muted);
504
+ font-size: 1.2rem;
505
+ font-variant-numeric: tabular-nums;
506
+ font-weight: bold;
507
+ }
508
+
509
+ .track-info {
510
+ flex: 1;
511
+ margin-left: 1rem;
512
+ }
513
+
514
+ .track-title {
515
+ font-weight: 600;
516
+ margin-bottom: 0.25rem;
517
+ color: var(--text-color);
518
+ }
519
+
520
+ .track-meta {
521
+ font-size: 0.9rem;
522
+ color: var(--text-muted);
523
+ }
524
+
525
+ .track-actions {
526
+ display: flex;
527
+ gap: 1rem;
528
+ }
529
+
530
+ .track-play-btn,
531
+ .track-download-btn {
532
+ background: rgba(255, 255, 255, 0.1);
533
+ border: 1px solid var(--border-color);
534
+ color: var(--text-color);
535
+ width: 44px;
536
+ height: 44px;
537
+ border-radius: 50%;
538
+ cursor: pointer;
539
+ display: flex;
540
+ align-items: center;
541
+ justify-content: center;
542
+ transition: all 0.3s ease;
543
+ text-decoration: none;
544
+ font-size: 1rem;
545
+ backdrop-filter: blur(10px);
546
+ }
547
+
548
+ .track-play-btn:hover,
549
+ .track-download-btn:hover {
550
+ background: var(--primary-color);
551
+ color: var(--bg-color);
552
+ transform: scale(1.1);
553
+ box-shadow: 0 10px 20px rgba(0, 212, 255, 0.3);
554
+ }
555
+
556
+ /* Download Buttons */
557
+ .download-section {
558
+ background: rgba(255, 255, 255, 0.05);
559
+ border-radius: 15px;
560
+ padding: 2rem;
561
+ border: 1px solid var(--border-color);
562
+ backdrop-filter: blur(20px);
563
+ margin: 2rem 0;
564
+ text-align: center;
565
+ }
566
+
567
+ .download-buttons {
568
+ display: flex;
569
+ gap: 1rem;
570
+ justify-content: center;
571
+ margin-top: 1rem;
572
+ flex-wrap: wrap;
573
+ }
574
+
575
+ .download-all-btn {
576
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
577
+ color: white;
578
+ padding: 1rem 2rem;
579
+ border: none;
580
+ border-radius: 50px;
581
+ font-size: 1.1rem;
582
+ font-weight: 600;
583
+ cursor: pointer;
584
+ transition: all 0.3s ease;
585
+ text-decoration: none;
586
+ display: inline-block;
587
+ box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3);
588
+ }
589
+
590
+ .download-all-btn:hover {
591
+ transform: translateY(-3px);
592
+ box-shadow: 0 15px 40px rgba(0, 212, 255, 0.4);
593
+ }
594
+
595
+ .download-btn {
596
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
597
+ color: white;
598
+ padding: 1rem 2rem;
599
+ border: none;
600
+ border-radius: 50px;
601
+ font-size: 1.1rem;
602
+ font-weight: 600;
603
+ cursor: pointer;
604
+ transition: all 0.3s ease;
605
+ text-decoration: none;
606
+ display: inline-block;
607
+ box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3);
608
+ }
609
+
610
+ .download-btn:hover {
611
+ transform: translateY(-3px);
612
+ box-shadow: 0 15px 40px rgba(0, 212, 255, 0.4);
613
+ }
614
+
615
+ /* Paycurtain */
616
+ .paycurtain {
617
+ background: rgba(255, 255, 255, 0.05);
618
+ border-radius: 20px;
619
+ padding: 3rem;
620
+ border: 2px solid var(--primary-color);
621
+ backdrop-filter: blur(20px);
622
+ margin: 2rem 0;
623
+ text-align: center;
624
+ position: relative;
625
+ overflow: hidden;
626
+ }
627
+
628
+ .paycurtain::before {
629
+ content: '';
630
+ position: absolute;
631
+ top: 0;
632
+ left: 0;
633
+ right: 0;
634
+ bottom: 0;
635
+ background: linear-gradient(135deg,
636
+ rgba(0, 212, 255, 0.1) 0%,
637
+ rgba(255, 107, 157, 0.1) 100%);
638
+ z-index: -1;
639
+ }
640
+
641
+ .support-message {
642
+ font-size: 1.5rem;
643
+ margin-bottom: 1rem;
644
+ color: var(--text-color);
645
+ }
646
+
647
+ .honor-system {
648
+ color: var(--text-muted);
649
+ margin-bottom: 2rem;
650
+ font-style: italic;
651
+ }
652
+
653
+ .payment-buttons {
654
+ display: flex;
655
+ gap: 1rem;
656
+ justify-content: center;
657
+ margin-bottom: 2rem;
658
+ flex-wrap: wrap;
659
+ }
660
+
661
+ .payment-btn {
662
+ background: rgba(255, 255, 255, 0.1);
663
+ border: 1px solid var(--border-color);
664
+ color: var(--text-color);
665
+ padding: 1rem 2rem;
666
+ border-radius: 50px;
667
+ text-decoration: none;
668
+ font-weight: 600;
669
+ transition: all 0.3s ease;
670
+ backdrop-filter: blur(10px);
671
+ }
672
+
673
+ .payment-btn:hover {
674
+ background: var(--primary-color);
675
+ color: var(--bg-color);
676
+ transform: translateY(-3px);
677
+ box-shadow: 0 10px 20px rgba(0, 212, 255, 0.3);
678
+ }
679
+
680
+ .btn-outline {
681
+ background: transparent;
682
+ border: 2px solid var(--primary-color);
683
+ color: var(--primary-color);
684
+ }
685
+
686
+ .btn-outline:hover {
687
+ background: var(--primary-color);
688
+ color: var(--bg-color);
689
+ }
690
+
691
+ .payment-info {
692
+ color: var(--text-muted);
693
+ font-size: 0.9rem;
694
+ margin-top: 1rem;
695
+ }
696
+
697
+ /* License Section */
698
+ .release-license {
699
+ background: rgba(255, 255, 255, 0.03);
700
+ border-radius: 15px;
701
+ padding: 2rem;
702
+ border: 1px solid var(--border-color);
703
+ backdrop-filter: blur(10px);
704
+ margin: 2rem 0;
705
+ }
706
+
707
+ .release-license h3 {
708
+ color: var(--primary-color);
709
+ margin-bottom: 1rem;
710
+ font-size: 1.3rem;
711
+ }
712
+
713
+ .license-info {
714
+ color: var(--text-muted);
715
+ line-height: 1.6;
716
+ }
717
+
718
+ .license-info a {
719
+ color: var(--primary-color);
720
+ text-decoration: none;
721
+ }
722
+
723
+ .license-info a:hover {
724
+ text-decoration: underline;
725
+ }
726
+
727
+ /* Donation Section */
728
+ .donation-section {
729
+ background: rgba(255, 255, 255, 0.05);
730
+ border-radius: 20px;
731
+ padding: 2rem;
732
+ border: 1px solid var(--border-color);
733
+ backdrop-filter: blur(20px);
734
+ margin: 2rem 0;
735
+ text-align: center;
736
+ }
737
+
738
+ .donation-section h2 {
739
+ color: var(--primary-color);
740
+ margin-bottom: 1rem;
741
+ font-size: 1.8rem;
742
+ }
743
+
744
+ .donation-section p {
745
+ color: var(--text-muted);
746
+ margin-bottom: 2rem;
747
+ }
748
+
749
+ .donation-links {
750
+ display: flex;
751
+ gap: 1rem;
752
+ justify-content: center;
753
+ flex-wrap: wrap;
754
+ }
755
+
756
+ .donation-link {
757
+ background: rgba(255, 255, 255, 0.1);
758
+ border: 1px solid var(--border-color);
759
+ color: var(--text-color);
760
+ padding: 1rem 1.5rem;
761
+ border-radius: 50px;
762
+ text-decoration: none;
763
+ font-weight: 600;
764
+ transition: all 0.3s ease;
765
+ backdrop-filter: blur(10px);
766
+ display: flex;
767
+ align-items: center;
768
+ gap: 0.5rem;
769
+ }
770
+
771
+ .donation-link:hover {
772
+ background: var(--secondary-color);
773
+ color: var(--bg-color);
774
+ transform: translateY(-3px);
775
+ box-shadow: 0 10px 20px rgba(255, 107, 157, 0.3);
776
+ }
777
+
778
+ .donation-link i {
779
+ font-size: 1.2rem;
780
+ }
781
+
782
+ .donation-link span {
783
+ font-weight: 600;
784
+ }
785
+
786
+ .donation-link small {
787
+ font-size: 0.8rem;
788
+ opacity: 0.8;
789
+ }
790
+
791
+ /* Site Footer */
792
+ .site-footer {
793
+ background: rgba(255, 255, 255, 0.05);
794
+ border-top: 2px solid var(--border-color);
795
+ padding: 2rem 0;
796
+ margin-top: 4rem;
797
+ text-align: center;
798
+ color: var(--text-muted);
799
+ backdrop-filter: blur(20px);
800
+ }
801
+
802
+ .site-footer a {
803
+ color: var(--primary-color);
804
+ text-decoration: none;
805
+ transition: all 0.3s ease;
806
+ }
807
+
808
+ .site-footer a:hover {
809
+ color: var(--secondary-color);
810
+ }
811
+
812
+ .social-links {
813
+ margin-top: 1rem;
814
+ display: flex;
815
+ justify-content: center;
816
+ gap: 1rem;
817
+ }
818
+
819
+ .social-link {
820
+ width: 40px;
821
+ height: 40px;
822
+ border-radius: 50%;
823
+ border: 1px solid var(--border-color);
824
+ background: rgba(255, 255, 255, 0.05);
825
+ display: flex;
826
+ align-items: center;
827
+ justify-content: center;
828
+ font-size: 1.2rem;
829
+ transition: all 0.3s ease;
830
+ backdrop-filter: blur(10px);
831
+ color: var(--text-muted);
832
+ }
833
+
834
+ .social-link:hover {
835
+ background: var(--primary-color);
836
+ color: var(--bg-color);
837
+ transform: translateY(-3px);
838
+ box-shadow: 0 10px 20px rgba(0, 212, 255, 0.3);
839
+ }
840
+
841
+ /* Tunecamp Footer */
842
+ .tunecamp-footer {
843
+ background: rgba(255, 255, 255, 0.05);
844
+ border-top: 1px solid var(--border-color);
845
+ padding: 0.75rem 0;
846
+ margin-top: 2rem;
847
+ text-align: center;
848
+ backdrop-filter: blur(20px);
849
+ }
850
+
851
+ .footer-content {
852
+ display: flex;
853
+ align-items: center;
854
+ justify-content: center;
855
+ gap: 0.5rem;
856
+ font-size: 0.9rem;
857
+ color: var(--text-muted);
858
+ }
859
+
860
+ .tunecamp-link {
861
+ display: flex;
862
+ align-items: center;
863
+ gap: 0.5rem;
864
+ text-decoration: none;
865
+ color: var(--primary-color);
866
+ }
867
+
868
+ .footer-logo {
869
+ width: 20px;
870
+ height: 20px;
871
+ }
872
+
873
+ /* Audio Player */
874
+ .audio-player {
875
+ position: fixed;
876
+ bottom: 0;
877
+ left: 0;
878
+ right: 0;
879
+ background: rgba(255, 255, 255, 0.1);
880
+ backdrop-filter: blur(20px);
881
+ border-top: 1px solid var(--border-color);
882
+ padding: 1rem 2rem;
883
+ z-index: 1000;
884
+ display: none;
885
+ }
886
+
887
+ .audio-player.active {
888
+ display: block;
889
+ }
890
+
891
+ .player-controls {
892
+ display: flex;
893
+ align-items: center;
894
+ gap: 1rem;
895
+ max-width: 1200px;
896
+ margin: 0 auto;
897
+ }
898
+
899
+ .player-info {
900
+ flex: 1;
901
+ display: flex;
902
+ align-items: center;
903
+ gap: 1rem;
904
+ }
905
+
906
+ .player-cover {
907
+ width: 50px;
908
+ height: 50px;
909
+ border-radius: 8px;
910
+ object-fit: cover;
911
+ border: 2px solid var(--border-color);
912
+ transition: all 0.3s ease;
913
+ }
914
+
915
+ .player-cover:hover {
916
+ transform: scale(1.1);
917
+ border-color: var(--primary-color);
918
+ box-shadow: 0 5px 15px rgba(0, 212, 255, 0.3);
919
+ }
920
+
921
+ .player-details h4 {
922
+ font-size: 1rem;
923
+ margin-bottom: 0.25rem;
924
+ color: var(--text-color);
925
+ }
926
+
927
+ .player-details p {
928
+ font-size: 0.9rem;
929
+ color: var(--text-muted);
930
+ }
931
+
932
+ .player-buttons {
933
+ display: flex;
934
+ align-items: center;
935
+ gap: 1rem;
936
+ }
937
+
938
+ .player-btn {
939
+ background: rgba(255, 255, 255, 0.1);
940
+ border: 1px solid var(--border-color);
941
+ color: var(--text-color);
942
+ width: 40px;
943
+ height: 40px;
944
+ border-radius: 50%;
945
+ cursor: pointer;
946
+ display: flex;
947
+ align-items: center;
948
+ justify-content: center;
949
+ transition: all 0.3s ease;
950
+ backdrop-filter: blur(10px);
951
+ }
952
+
953
+ .player-btn:hover {
954
+ background: var(--primary-color);
955
+ color: var(--bg-color);
956
+ transform: scale(1.1);
957
+ }
958
+
959
+ .player-progress {
960
+ flex: 1;
961
+ margin: 0 1rem;
962
+ }
963
+
964
+ .progress-bar {
965
+ width: 100%;
966
+ height: 4px;
967
+ background: rgba(255, 255, 255, 0.1);
968
+ border-radius: 2px;
969
+ cursor: pointer;
970
+ position: relative;
971
+ }
972
+
973
+ .progress-fill {
974
+ height: 100%;
975
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
976
+ border-radius: 2px;
977
+ transition: width 0.1s ease;
978
+ }
979
+
980
+ .time-display {
981
+ display: flex;
982
+ justify-content: space-between;
983
+ font-size: 0.8rem;
984
+ color: var(--text-muted);
985
+ margin-top: 0.5rem;
986
+ }
987
+
988
+ /* Forms */
989
+ .form-group {
990
+ margin-bottom: 1.5rem;
991
+ }
992
+
993
+ .form-label {
994
+ display: block;
995
+ margin-bottom: 0.5rem;
996
+ color: var(--text-color);
997
+ font-weight: 500;
998
+ }
999
+
1000
+ .form-input {
1001
+ width: 100%;
1002
+ padding: 0.75rem 1rem;
1003
+ background: rgba(255, 255, 255, 0.05);
1004
+ border: 1px solid var(--border-color);
1005
+ border-radius: 8px;
1006
+ color: var(--text-color);
1007
+ font-size: 1rem;
1008
+ transition: all 0.3s ease;
1009
+ backdrop-filter: blur(10px);
1010
+ }
1011
+
1012
+ .form-input:focus {
1013
+ outline: none;
1014
+ border-color: var(--primary-color);
1015
+ box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);
1016
+ }
1017
+
1018
+ .form-textarea {
1019
+ resize: vertical;
1020
+ min-height: 100px;
1021
+ }
1022
+
1023
+ /* Buttons */
1024
+ .btn {
1025
+ display: inline-block;
1026
+ padding: 0.75rem 1.5rem;
1027
+ background: var(--primary-color);
1028
+ color: white;
1029
+ border: none;
1030
+ border-radius: 8px;
1031
+ font-size: 1rem;
1032
+ font-weight: 500;
1033
+ cursor: pointer;
1034
+ transition: all 0.3s ease;
1035
+ text-decoration: none;
1036
+ text-align: center;
1037
+ }
1038
+
1039
+ .btn:hover {
1040
+ background: var(--secondary-color);
1041
+ transform: translateY(-2px);
1042
+ box-shadow: 0 10px 20px rgba(0, 212, 255, 0.3);
1043
+ }
1044
+
1045
+ .btn-secondary {
1046
+ background: rgba(255, 255, 255, 0.1);
1047
+ color: var(--text-color);
1048
+ border: 1px solid var(--border-color);
1049
+ }
1050
+
1051
+ .btn-secondary:hover {
1052
+ background: rgba(255, 255, 255, 0.2);
1053
+ color: var(--text-color);
1054
+ }
1055
+
1056
+ .btn-outline {
1057
+ background: transparent;
1058
+ border: 2px solid var(--primary-color);
1059
+ color: var(--primary-color);
1060
+ }
1061
+
1062
+ .btn-outline:hover {
1063
+ background: var(--primary-color);
1064
+ color: white;
1065
+ }
1066
+
1067
+ /* Alerts */
1068
+ .alert {
1069
+ padding: 1rem 1.5rem;
1070
+ border-radius: 8px;
1071
+ margin-bottom: 1rem;
1072
+ border-left: 4px solid;
1073
+ }
1074
+
1075
+ .alert-success {
1076
+ background: rgba(16, 185, 129, 0.1);
1077
+ border-color: var(--success-color);
1078
+ color: var(--success-color);
1079
+ }
1080
+
1081
+ .alert-warning {
1082
+ background: rgba(245, 158, 11, 0.1);
1083
+ border-color: var(--warning-color);
1084
+ color: var(--warning-color);
1085
+ }
1086
+
1087
+ .alert-error {
1088
+ background: rgba(239, 68, 68, 0.1);
1089
+ border-color: var(--error-color);
1090
+ color: var(--error-color);
1091
+ }
1092
+
1093
+ /* Links */
1094
+ a {
1095
+ color: var(--primary-color);
1096
+ text-decoration: none;
1097
+ transition: all 0.3s ease;
1098
+ }
1099
+
1100
+ a:hover {
1101
+ color: var(--secondary-color);
1102
+ text-decoration: underline;
1103
+ }
1104
+
1105
+ a:visited {
1106
+ color: var(--primary-color);
1107
+ }
1108
+
1109
+ /* Typography */
1110
+ h1, h2, h3, h4, h5, h6 {
1111
+ color: var(--text-color);
1112
+ font-weight: 600;
1113
+ line-height: 1.2;
1114
+ margin-bottom: 1rem;
1115
+ }
1116
+
1117
+ h1 {
1118
+ font-size: 2.5rem;
1119
+ }
1120
+
1121
+ h2 {
1122
+ font-size: 2rem;
1123
+ }
1124
+
1125
+ h3 {
1126
+ font-size: 1.5rem;
1127
+ }
1128
+
1129
+ h4 {
1130
+ font-size: 1.25rem;
1131
+ }
1132
+
1133
+ h5 {
1134
+ font-size: 1.1rem;
1135
+ }
1136
+
1137
+ h6 {
1138
+ font-size: 1rem;
1139
+ }
1140
+
1141
+ p {
1142
+ margin-bottom: 1rem;
1143
+ line-height: 1.6;
1144
+ }
1145
+
1146
+ strong {
1147
+ font-weight: 600;
1148
+ color: var(--text-color);
1149
+ }
1150
+
1151
+ em {
1152
+ font-style: italic;
1153
+ color: var(--text-muted);
1154
+ }
1155
+
1156
+ small {
1157
+ font-size: 0.875rem;
1158
+ color: var(--text-muted);
1159
+ }
1160
+
1161
+ /* Lists */
1162
+ ul, ol {
1163
+ margin-bottom: 1rem;
1164
+ padding-left: 2rem;
1165
+ }
1166
+
1167
+ li {
1168
+ margin-bottom: 0.5rem;
1169
+ }
1170
+
1171
+ /* Code */
1172
+ code {
1173
+ background: rgba(255, 255, 255, 0.1);
1174
+ padding: 0.25rem 0.5rem;
1175
+ border-radius: 4px;
1176
+ font-family: 'Courier New', monospace;
1177
+ font-size: 0.9rem;
1178
+ color: var(--primary-color);
1179
+ }
1180
+
1181
+ pre {
1182
+ background: rgba(255, 255, 255, 0.05);
1183
+ padding: 1rem;
1184
+ border-radius: 8px;
1185
+ border: 1px solid var(--border-color);
1186
+ overflow-x: auto;
1187
+ margin-bottom: 1rem;
1188
+ }
1189
+
1190
+ pre code {
1191
+ background: none;
1192
+ padding: 0;
1193
+ color: var(--text-color);
1194
+ }
1195
+
1196
+ /* Utility Classes */
1197
+ .text-center {
1198
+ text-align: center;
1199
+ }
1200
+
1201
+ .text-left {
1202
+ text-align: left;
1203
+ }
1204
+
1205
+ .text-right {
1206
+ text-align: right;
1207
+ }
1208
+
1209
+ .hidden {
1210
+ display: none;
1211
+ }
1212
+
1213
+ .visible {
1214
+ display: block;
1215
+ }
1216
+
1217
+ .flex {
1218
+ display: flex;
1219
+ }
1220
+
1221
+ .flex-col {
1222
+ flex-direction: column;
1223
+ }
1224
+
1225
+ .items-center {
1226
+ align-items: center;
1227
+ }
1228
+
1229
+ .justify-center {
1230
+ justify-content: center;
1231
+ }
1232
+
1233
+ .justify-between {
1234
+ justify-content: space-between;
1235
+ }
1236
+
1237
+ .gap-1 { gap: 0.25rem; }
1238
+ .gap-2 { gap: 0.5rem; }
1239
+ .gap-3 { gap: 0.75rem; }
1240
+ .gap-4 { gap: 1rem; }
1241
+ .gap-5 { gap: 1.25rem; }
1242
+ .gap-6 { gap: 1.5rem; }
1243
+
1244
+ /* Loading States */
1245
+ .loading {
1246
+ opacity: 0.6;
1247
+ pointer-events: none;
1248
+ }
1249
+
1250
+ .spinner {
1251
+ display: inline-block;
1252
+ width: 20px;
1253
+ height: 20px;
1254
+ border: 2px solid var(--border-color);
1255
+ border-radius: 50%;
1256
+ border-top-color: var(--primary-color);
1257
+ animation: spin 1s ease-in-out infinite;
1258
+ }
1259
+
1260
+ @keyframes spin {
1261
+ to { transform: rotate(360deg); }
1262
+ }
1263
+
1264
+ /* Focus States */
1265
+ *:focus {
1266
+ outline: 2px solid var(--primary-color);
1267
+ outline-offset: 2px;
1268
+ }
1269
+
1270
+ /* Selection */
1271
+ ::selection {
1272
+ background: var(--primary-color);
1273
+ color: white;
1274
+ }
1275
+
1276
+ ::-moz-selection {
1277
+ background: var(--primary-color);
1278
+ color: white;
1279
+ }
1280
+
1281
+ /* Scrollbar */
1282
+ ::-webkit-scrollbar {
1283
+ width: 8px;
1284
+ }
1285
+
1286
+ ::-webkit-scrollbar-track {
1287
+ background: rgba(255, 255, 255, 0.1);
1288
+ }
1289
+
1290
+ ::-webkit-scrollbar-thumb {
1291
+ background: var(--primary-color);
1292
+ border-radius: 4px;
1293
+ }
1294
+
1295
+ ::-webkit-scrollbar-thumb:hover {
1296
+ background: var(--secondary-color);
1297
+ }
1298
+
1299
+ .mb-1 { margin-bottom: 0.5rem; }
1300
+ .mb-2 { margin-bottom: 1rem; }
1301
+ .mb-3 { margin-bottom: 1.5rem; }
1302
+ .mb-4 { margin-bottom: 2rem; }
1303
+
1304
+ .mt-1 { margin-top: 0.5rem; }
1305
+ .mt-2 { margin-top: 1rem; }
1306
+ .mt-3 { margin-top: 1.5rem; }
1307
+ .mt-4 { margin-top: 2rem; }
1308
+
1309
+ .p-1 { padding: 0.5rem; }
1310
+ .p-2 { padding: 1rem; }
1311
+ .p-3 { padding: 1.5rem; }
1312
+ .p-4 { padding: 2rem; }
1313
+
1314
+ /* Responsive */
1315
+ @media (max-width: 768px) {
1316
+ .release-header {
1317
+ grid-template-columns: 1fr;
1318
+ }
1319
+
1320
+ .artist-header {
1321
+ flex-direction: column;
1322
+ text-align: center;
1323
+ }
1324
+
1325
+ .releases-grid {
1326
+ grid-template-columns: 1fr;
1327
+ }
1328
+
1329
+ .payment-buttons {
1330
+ flex-direction: column;
1331
+ align-items: center;
1332
+ }
1333
+
1334
+ .donation-links {
1335
+ flex-direction: column;
1336
+ align-items: center;
1337
+ }
1338
+
1339
+ .donation-link {
1340
+ width: 100%;
1341
+ max-width: 200px;
1342
+ }
1343
+
1344
+ .footer-content {
1345
+ font-size: 0.8rem;
1346
+ }
1347
+
1348
+ .footer-logo {
1349
+ width: 18px;
1350
+ height: 18px;
1351
+ }
1352
+ }