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,1170 @@
1
+ /* Tunecamp - Default Theme */
2
+
3
+ /* Dark Theme (default) */
4
+ :root,
5
+ [data-theme="dark"] {
6
+ --primary-color: #4d4747;
7
+ --secondary-color: #8b5cf6;
8
+ --bg-color: #000000;
9
+ --surface-color: #000000;
10
+ --text-color: #f1f5f9;
11
+ --text-muted: #94a3b8;
12
+ --border-color: #334155;
13
+ --success-color: #10b981;
14
+ --warning-color: #f59e0b;
15
+ }
16
+
17
+ /* Light Theme */
18
+ [data-theme="light"] {
19
+ --primary-color: #4f46e5;
20
+ --secondary-color: #7c3aed;
21
+ --bg-color: #f8fafc;
22
+ --surface-color: #ffffff;
23
+ --text-color: #1e293b;
24
+ --text-muted: #64748b;
25
+ --border-color: #e2e8f0;
26
+ --success-color: #059669;
27
+ --warning-color: #d97706;
28
+ }
29
+
30
+ * {
31
+ margin: 0;
32
+ padding: 0;
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ body {
37
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
38
+ background: var(--bg-color);
39
+ color: var(--text-color);
40
+ line-height: 1.6;
41
+ transition: background-color 0.3s ease, color 0.3s ease;
42
+ }
43
+
44
+ .container {
45
+ max-width: 1200px;
46
+ margin: 0 auto;
47
+ padding: 2rem;
48
+ }
49
+
50
+ /* Header */
51
+ .site-header {
52
+ background: var(--surface-color);
53
+ border-bottom: 2px solid var(--border-color);
54
+ padding: 2rem 0;
55
+ margin-bottom: 3rem;
56
+ transition: background-color 0.3s ease, border-color 0.3s ease;
57
+ }
58
+
59
+ .header-row {
60
+ display: flex;
61
+ justify-content: space-between;
62
+ align-items: center;
63
+ }
64
+
65
+ .header-image-wrapper {
66
+ position: relative;
67
+ width: 100%;
68
+ }
69
+
70
+ .site-title {
71
+ font-size: 2.5rem;
72
+ margin-bottom: 0.5rem;
73
+ }
74
+
75
+ .site-title a {
76
+ color: var(--text-color);
77
+ text-decoration: none;
78
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
79
+ -webkit-background-clip: text;
80
+ -webkit-text-fill-color: transparent;
81
+ background-clip: text;
82
+ }
83
+
84
+ /* Header Image (Bandcamp-style) */
85
+ .site-header-image {
86
+ margin-bottom: 1.5rem;
87
+ width: 100%;
88
+ text-align: center;
89
+ }
90
+
91
+ .site-header-image a {
92
+ display: block;
93
+ text-decoration: none;
94
+ width: 100%;
95
+ }
96
+
97
+ .header-image {
98
+ width: 100%;
99
+ max-width: 100%;
100
+ height: auto;
101
+ max-height: 400px;
102
+ min-height: 200px;
103
+ display: block;
104
+ margin: 0 auto;
105
+ object-fit: contain;
106
+ object-position: center;
107
+ }
108
+
109
+ @media (max-width: 768px) {
110
+ .header-image {
111
+ max-height: 250px;
112
+ min-height: 120px;
113
+ }
114
+ }
115
+
116
+ /* Theme Toggle Button */
117
+ .theme-toggle {
118
+ background: var(--border-color);
119
+ border: none;
120
+ width: 44px;
121
+ height: 44px;
122
+ border-radius: 50%;
123
+ cursor: pointer;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ font-size: 1.2rem;
128
+ color: var(--text-color);
129
+ transition: all 0.3s ease;
130
+ }
131
+
132
+ .theme-toggle:hover {
133
+ background: var(--primary-color);
134
+ transform: scale(1.1);
135
+ }
136
+
137
+ .site-description {
138
+ color: var(--text-muted);
139
+ font-size: 1.1rem;
140
+ }
141
+
142
+ /* Artist Section */
143
+ .artist-section {
144
+ margin-bottom: 4rem;
145
+ }
146
+
147
+ .artist-header {
148
+ display: flex;
149
+ gap: 2rem;
150
+ align-items: center;
151
+ }
152
+
153
+ .artist-photo {
154
+ width: 150px;
155
+ height: 150px;
156
+ border-radius: 50%;
157
+ object-fit: cover;
158
+ border: 3px solid var(--primary-color);
159
+ }
160
+
161
+ .artist-info h2 {
162
+ font-size: 2rem;
163
+ margin-bottom: 1rem;
164
+ }
165
+
166
+ .artist-bio {
167
+ color: var(--text-muted);
168
+ line-height: 1.8;
169
+ }
170
+
171
+ /* Releases Grid */
172
+ .releases-section h2 {
173
+ font-size: 2rem;
174
+ margin-bottom: 2rem;
175
+ }
176
+
177
+ /* Search and Filter Controls */
178
+ .releases-controls {
179
+ display: flex;
180
+ gap: 1rem;
181
+ margin-bottom: 2rem;
182
+ flex-wrap: wrap;
183
+ align-items: center;
184
+ }
185
+
186
+ .search-box {
187
+ position: relative;
188
+ flex: 1;
189
+ min-width: 200px;
190
+ }
191
+
192
+ .search-box i {
193
+ position: absolute;
194
+ left: 1rem;
195
+ top: 50%;
196
+ transform: translateY(-50%);
197
+ color: var(--text-muted);
198
+ }
199
+
200
+ .search-box input {
201
+ width: 100%;
202
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
203
+ background: var(--surface-color);
204
+ border: 1px solid var(--border-color);
205
+ border-radius: 8px;
206
+ color: var(--text-color);
207
+ font-size: 1rem;
208
+ }
209
+
210
+ .search-box input:focus {
211
+ outline: none;
212
+ border-color: var(--primary-color);
213
+ }
214
+
215
+ .search-box input::placeholder {
216
+ color: var(--text-muted);
217
+ }
218
+
219
+ .filter-controls {
220
+ display: flex;
221
+ gap: 0.75rem;
222
+ }
223
+
224
+ .filter-select {
225
+ padding: 0.75rem 1rem;
226
+ background: var(--surface-color);
227
+ border: 1px solid var(--border-color);
228
+ border-radius: 8px;
229
+ color: var(--text-color);
230
+ font-size: 0.9rem;
231
+ cursor: pointer;
232
+ min-width: 140px;
233
+ }
234
+
235
+ .filter-select:focus {
236
+ outline: none;
237
+ border-color: var(--primary-color);
238
+ }
239
+
240
+ .no-results {
241
+ text-align: center;
242
+ padding: 3rem;
243
+ color: var(--text-muted);
244
+ font-size: 1.1rem;
245
+ }
246
+
247
+ .releases-grid {
248
+ display: grid;
249
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
250
+ gap: 2rem;
251
+ }
252
+
253
+
254
+ .release-card {
255
+ background: var(--surface-color);
256
+ border-radius: 12px;
257
+ overflow: hidden;
258
+ transition: transform 0.3s, box-shadow 0.3s;
259
+ border: 1px solid var(--border-color);
260
+ }
261
+
262
+ .release-card:hover {
263
+ transform: translateY(-5px);
264
+ box-shadow: 0 10px 30px rgba(99, 102, 241, 0.3);
265
+ }
266
+
267
+ .release-link {
268
+ text-decoration: none;
269
+ color: inherit;
270
+ display: block;
271
+ }
272
+
273
+ .release-cover {
274
+ aspect-ratio: 1;
275
+ overflow: hidden;
276
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
277
+ }
278
+
279
+ .release-cover img {
280
+ width: 100%;
281
+ height: 100%;
282
+ object-fit: cover;
283
+ display: block;
284
+ }
285
+
286
+ .release-cover-placeholder {
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ font-size: 4rem;
291
+ color: rgba(255, 255, 255, 0.3);
292
+ }
293
+
294
+ .release-info {
295
+ padding: 1.5rem;
296
+ }
297
+
298
+ .release-title {
299
+ font-size: 1.25rem;
300
+ margin-bottom: 0.5rem;
301
+ }
302
+
303
+ .release-date {
304
+ color: var(--text-muted);
305
+ font-size: 0.9rem;
306
+ margin-bottom: 0.5rem;
307
+ }
308
+
309
+ .release-downloads {
310
+ color: var(--text-muted);
311
+ font-size: 0.85rem;
312
+ margin-bottom: 1rem;
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 0.5rem;
316
+ }
317
+
318
+ .release-downloads i {
319
+ color: var(--primary-color);
320
+ }
321
+
322
+ .release-genres {
323
+ display: flex;
324
+ gap: 0.5rem;
325
+ flex-wrap: wrap;
326
+ margin-bottom: 1rem;
327
+ }
328
+
329
+ .genre-tag {
330
+ background: var(--primary-color);
331
+ padding: 0.25rem 0.75rem;
332
+ border-radius: 20px;
333
+ font-size: 0.8rem;
334
+ }
335
+
336
+ .release-tracks-count {
337
+ color: var(--text-muted);
338
+ font-size: 0.9rem;
339
+ margin-bottom: 1rem;
340
+ }
341
+
342
+ .release-download-badge {
343
+ background: var(--success-color);
344
+ color: white;
345
+ padding: 0.5rem 1rem;
346
+ border-radius: 6px;
347
+ font-size: 0.85rem;
348
+ display: inline-block;
349
+ }
350
+
351
+ /* Release Detail */
352
+ .breadcrumb {
353
+ margin-bottom: 2rem;
354
+ }
355
+
356
+ .breadcrumb a {
357
+ color: var(--primary-color);
358
+ text-decoration: none;
359
+ }
360
+
361
+ .breadcrumb a:hover {
362
+ text-decoration: underline;
363
+ }
364
+
365
+ .release-header {
366
+ display: grid;
367
+ grid-template-columns: 400px 1fr;
368
+ gap: 3rem;
369
+ margin-bottom: 3rem;
370
+ }
371
+
372
+ .release-cover-large img {
373
+ width: 100%;
374
+ border-radius: 12px;
375
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
376
+ }
377
+
378
+ .release-metadata h1 {
379
+ font-size: 2.5rem;
380
+ margin-bottom: 0.5rem;
381
+ }
382
+
383
+ .release-artist {
384
+ font-size: 1.5rem;
385
+ color: var(--text-muted);
386
+ margin-bottom: 1rem;
387
+ }
388
+
389
+ .release-description {
390
+ line-height: 1.8;
391
+ margin: 1.5rem 0;
392
+ color: var(--text-muted);
393
+ }
394
+
395
+ .release-credits {
396
+ margin: 1.5rem 0;
397
+ }
398
+
399
+ .release-credits h3 {
400
+ margin-bottom: 0.5rem;
401
+ }
402
+
403
+ .release-credits ul {
404
+ list-style: none;
405
+ color: var(--text-muted);
406
+ }
407
+
408
+ .btn {
409
+ padding: 0.75rem 2rem;
410
+ border: none;
411
+ border-radius: 8px;
412
+ font-size: 1rem;
413
+ cursor: pointer;
414
+ transition: all 0.3s;
415
+ display: inline-flex;
416
+ align-items: center;
417
+ gap: 0.5rem;
418
+ }
419
+
420
+ .btn-primary {
421
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
422
+ color: white;
423
+ }
424
+
425
+ .btn-primary:hover {
426
+ transform: translateY(-2px);
427
+ box-shadow: 0 5px 15px rgba(99, 102, 241, 0.4);
428
+ }
429
+
430
+ /* Audio Player */
431
+ .audio-player {
432
+ background: var(--surface-color);
433
+ border-radius: 12px;
434
+ padding: 2rem;
435
+ margin-bottom: 2rem;
436
+ border: 1px solid var(--border-color);
437
+ }
438
+
439
+ .player-track-info {
440
+ display: flex;
441
+ gap: 1rem;
442
+ margin-bottom: 1.5rem;
443
+ align-items: center;
444
+ }
445
+
446
+ .player-cover {
447
+ width: 80px;
448
+ height: 80px;
449
+ border-radius: 8px;
450
+ overflow: hidden;
451
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ font-size: 2rem;
456
+ color: rgba(255, 255, 255, 0.5);
457
+ }
458
+
459
+ .player-cover img {
460
+ width: 100%;
461
+ height: 100%;
462
+ object-fit: cover;
463
+ }
464
+
465
+ .player-title {
466
+ font-size: 1.2rem;
467
+ font-weight: bold;
468
+ }
469
+
470
+ .player-artist {
471
+ color: var(--text-muted);
472
+ }
473
+
474
+ .player-controls {
475
+ display: flex;
476
+ justify-content: center;
477
+ gap: 1rem;
478
+ margin-bottom: 1.5rem;
479
+ }
480
+
481
+ .player-btn {
482
+ background: var(--border-color);
483
+ border: none;
484
+ color: var(--text-color);
485
+ width: 50px;
486
+ height: 50px;
487
+ border-radius: 50%;
488
+ cursor: pointer;
489
+ transition: all 0.3s;
490
+ font-size: 1.2rem;
491
+ }
492
+
493
+ .player-btn-play {
494
+ width: 60px;
495
+ height: 60px;
496
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
497
+ }
498
+
499
+ .player-btn:hover {
500
+ transform: scale(1.1);
501
+ }
502
+
503
+ .player-progress {
504
+ display: flex;
505
+ align-items: center;
506
+ gap: 1rem;
507
+ margin-bottom: 1rem;
508
+ }
509
+
510
+ .player-time {
511
+ color: var(--text-muted);
512
+ font-size: 0.9rem;
513
+ min-width: 40px;
514
+ }
515
+
516
+ .progress-bar {
517
+ flex: 1;
518
+ height: 6px;
519
+ -webkit-appearance: none;
520
+ appearance: none;
521
+ background: var(--border-color);
522
+ border-radius: 3px;
523
+ outline: none;
524
+ }
525
+
526
+ .progress-bar::-webkit-slider-thumb {
527
+ -webkit-appearance: none;
528
+ appearance: none;
529
+ width: 16px;
530
+ height: 16px;
531
+ background: var(--primary-color);
532
+ border-radius: 50%;
533
+ cursor: pointer;
534
+ }
535
+
536
+ .player-volume {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 1rem;
540
+ max-width: 200px;
541
+ }
542
+
543
+ .volume-bar {
544
+ flex: 1;
545
+ height: 4px;
546
+ -webkit-appearance: none;
547
+ appearance: none;
548
+ background: var(--border-color);
549
+ border-radius: 2px;
550
+ }
551
+
552
+ .volume-bar::-webkit-slider-thumb {
553
+ -webkit-appearance: none;
554
+ appearance: none;
555
+ width: 12px;
556
+ height: 12px;
557
+ background: var(--primary-color);
558
+ border-radius: 50%;
559
+ cursor: pointer;
560
+ }
561
+
562
+ /* Track List */
563
+ .tracklist h2 {
564
+ font-size: 1.5rem;
565
+ margin-bottom: 1.5rem;
566
+ }
567
+
568
+ .track-list {
569
+ list-style: none;
570
+ }
571
+
572
+ .track-item {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 1rem;
576
+ padding: 1rem;
577
+ background: var(--surface-color);
578
+ border-radius: 8px;
579
+ margin-bottom: 0.5rem;
580
+ border: 1px solid var(--border-color);
581
+ transition: all 0.3s;
582
+ }
583
+
584
+ .track-item:hover {
585
+ background: var(--border-color);
586
+ }
587
+
588
+ .track-item.playing {
589
+ border-color: var(--primary-color);
590
+ background: rgba(99, 102, 241, 0.1);
591
+ }
592
+
593
+ .track-number {
594
+ width: 30px;
595
+ text-align: center;
596
+ color: var(--text-muted);
597
+ }
598
+
599
+ .track-info {
600
+ flex: 1;
601
+ }
602
+
603
+ .track-title {
604
+ font-weight: 500;
605
+ margin-bottom: 0.25rem;
606
+ }
607
+
608
+ .track-meta {
609
+ font-size: 0.85rem;
610
+ color: var(--text-muted);
611
+ }
612
+
613
+ .track-actions {
614
+ display: flex;
615
+ gap: 0.5rem;
616
+ }
617
+
618
+ .track-play-btn,
619
+ .track-download-btn {
620
+ background: transparent;
621
+ border: 1px solid var(--border-color);
622
+ color: var(--text-color);
623
+ width: 36px;
624
+ height: 36px;
625
+ border-radius: 50%;
626
+ cursor: pointer;
627
+ display: flex;
628
+ align-items: center;
629
+ justify-content: center;
630
+ transition: all 0.3s;
631
+ text-decoration: none;
632
+ }
633
+
634
+ .track-play-btn:hover,
635
+ .track-download-btn:hover {
636
+ background: var(--primary-color);
637
+ border-color: var(--primary-color);
638
+ }
639
+
640
+ /* Footer */
641
+ .site-footer {
642
+ background: var(--surface-color);
643
+ border-top: 2px solid var(--border-color);
644
+ padding: 2rem 0;
645
+ margin-top: 4rem;
646
+ text-align: center;
647
+ color: var(--text-muted);
648
+ }
649
+
650
+ .site-footer a {
651
+ color: var(--primary-color);
652
+ text-decoration: none;
653
+ }
654
+
655
+ .social-links {
656
+ margin-top: 1rem;
657
+ display: flex;
658
+ justify-content: center;
659
+ gap: 1rem;
660
+ }
661
+
662
+ .social-link {
663
+ width: 40px;
664
+ height: 40px;
665
+ border-radius: 50%;
666
+ background: var(--border-color);
667
+ display: flex;
668
+ align-items: center;
669
+ justify-content: center;
670
+ font-size: 1.2rem;
671
+ transition: all 0.3s;
672
+ }
673
+
674
+ .social-link:hover {
675
+ background: var(--primary-color);
676
+ transform: translateY(-3px);
677
+ }
678
+
679
+ /* Paycurtain Styles */
680
+ .paycurtain {
681
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
682
+ border-radius: 12px;
683
+ padding: 2rem;
684
+ margin: 1rem 0;
685
+ color: white;
686
+ text-align: center;
687
+ }
688
+
689
+ .support-message {
690
+ margin-bottom: 1.5rem;
691
+ }
692
+
693
+ .support-message p {
694
+ margin: 0.5rem 0;
695
+ }
696
+
697
+ .honor-system {
698
+ font-size: 0.9rem;
699
+ opacity: 0.9;
700
+ font-style: italic;
701
+ }
702
+
703
+ .payment-buttons {
704
+ display: flex;
705
+ gap: 1rem;
706
+ justify-content: center;
707
+ flex-wrap: wrap;
708
+ }
709
+
710
+ .btn-outline {
711
+ background: transparent;
712
+ border: 2px solid rgba(255, 255, 255, 0.3);
713
+ color: white;
714
+ padding: 0.75rem 1.5rem;
715
+ border-radius: 8px;
716
+ text-decoration: none;
717
+ display: inline-flex;
718
+ align-items: center;
719
+ gap: 0.5rem;
720
+ transition: all 0.3s ease;
721
+ }
722
+
723
+ .btn-outline:hover {
724
+ background: rgba(255, 255, 255, 0.1);
725
+ border-color: rgba(255, 255, 255, 0.5);
726
+ }
727
+
728
+ .payment-info {
729
+ font-size: 0.9rem;
730
+ opacity: 0.8;
731
+ margin-top: 1rem;
732
+ }
733
+
734
+ /* License Styles */
735
+ .release-license {
736
+ margin: 1.5rem 0;
737
+ padding: 1rem;
738
+ background: #f8f9fa;
739
+ border-radius: 8px;
740
+ border-left: 4px solid #007bff;
741
+ }
742
+
743
+ .release-license h3 {
744
+ margin: 0 0 0.5rem 0;
745
+ color: #333;
746
+ }
747
+
748
+ .license-info {
749
+ margin: 0;
750
+ color: #666;
751
+ }
752
+
753
+ .license-info a {
754
+ color: #007bff;
755
+ text-decoration: none;
756
+ }
757
+
758
+ .license-info a:hover {
759
+ text-decoration: underline;
760
+ }
761
+
762
+ /* Donation Section */
763
+ .donation-section {
764
+ margin: 3rem 0;
765
+ padding: 2rem;
766
+ background: linear-gradient(135deg, #ff6b6b 0%, #ffa500 100%);
767
+ border-radius: 12px;
768
+ color: white;
769
+ text-align: center;
770
+ }
771
+
772
+ .donation-section h2 {
773
+ margin: 0 0 1rem 0;
774
+ color: white;
775
+ }
776
+
777
+ .donation-section p {
778
+ margin: 0 0 1.5rem 0;
779
+ opacity: 0.9;
780
+ }
781
+
782
+ .donation-links {
783
+ display: flex;
784
+ gap: 1rem;
785
+ justify-content: center;
786
+ flex-wrap: wrap;
787
+ }
788
+
789
+ .donation-link {
790
+ background: rgba(255, 255, 255, 0.1);
791
+ border: 2px solid rgba(255, 255, 255, 0.3);
792
+ color: white;
793
+ padding: 1rem 1.5rem;
794
+ border-radius: 8px;
795
+ text-decoration: none;
796
+ display: flex;
797
+ flex-direction: column;
798
+ align-items: center;
799
+ gap: 0.5rem;
800
+ transition: all 0.3s ease;
801
+ min-width: 120px;
802
+ }
803
+
804
+ .donation-link:hover {
805
+ background: rgba(255, 255, 255, 0.2);
806
+ border-color: rgba(255, 255, 255, 0.5);
807
+ transform: translateY(-2px);
808
+ }
809
+
810
+ .donation-link i {
811
+ font-size: 1.5rem;
812
+ }
813
+
814
+ .donation-link span {
815
+ font-weight: 600;
816
+ }
817
+
818
+ .donation-link small {
819
+ font-size: 0.8rem;
820
+ opacity: 0.8;
821
+ }
822
+
823
+ /* Tunecamp Footer */
824
+ .tunecamp-footer {
825
+ background: var(--surface-color);
826
+ border-top: 1px solid var(--border-color);
827
+ padding: 0.75rem 0;
828
+ margin-top: 2rem;
829
+ text-align: center;
830
+ }
831
+
832
+ .footer-content {
833
+ display: flex;
834
+ align-items: center;
835
+ justify-content: center;
836
+ gap: 0.5rem;
837
+ font-size: 0.9rem;
838
+ color: var(--text-muted);
839
+ }
840
+
841
+ .tunecamp-link {
842
+ display: flex;
843
+ align-items: center;
844
+ gap: 0.5rem;
845
+ text-decoration: none;
846
+ color: var(--primary-color);
847
+ }
848
+
849
+
850
+ .footer-logo {
851
+ width: 20px;
852
+ height: 20px;
853
+ }
854
+
855
+
856
+ /* Share & Embed Section */
857
+ .release-share-section {
858
+ margin: 2rem 0;
859
+ padding: 1.5rem;
860
+ background: var(--surface-color);
861
+ border-radius: 8px;
862
+ border: 1px solid var(--border-color);
863
+ }
864
+
865
+ .share-actions h3 {
866
+ margin-bottom: 1rem;
867
+ color: var(--text-color);
868
+ font-size: 1.2rem;
869
+ }
870
+
871
+ .share-buttons {
872
+ display: flex;
873
+ flex-wrap: wrap;
874
+ gap: 0.75rem;
875
+ }
876
+
877
+ .share-btn {
878
+ display: inline-flex;
879
+ align-items: center;
880
+ gap: 0.5rem;
881
+ padding: 0.75rem 1.25rem;
882
+ background: var(--bg-color);
883
+ border: 1px solid var(--border-color);
884
+ border-radius: 6px;
885
+ color: var(--text-color);
886
+ text-decoration: none;
887
+ font-size: 0.9rem;
888
+ cursor: pointer;
889
+ transition: all 0.2s ease;
890
+ }
891
+
892
+ .share-btn:hover {
893
+ background: var(--primary-color);
894
+ color: white;
895
+ border-color: var(--primary-color);
896
+ transform: translateY(-2px);
897
+ }
898
+
899
+ .share-btn i {
900
+ font-size: 1rem;
901
+ }
902
+
903
+ /* Embed Modal */
904
+ .embed-modal {
905
+ display: none;
906
+ position: fixed;
907
+ z-index: 1000;
908
+ left: 0;
909
+ top: 0;
910
+ width: 100%;
911
+ height: 100%;
912
+ background-color: rgba(0, 0, 0, 0.7);
913
+ align-items: center;
914
+ justify-content: center;
915
+ }
916
+
917
+ .embed-modal-content {
918
+ background: var(--surface-color);
919
+ border-radius: 12px;
920
+ width: 90%;
921
+ max-width: 800px;
922
+ max-height: 90vh;
923
+ display: flex;
924
+ flex-direction: column;
925
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
926
+ }
927
+
928
+ .embed-modal-header {
929
+ display: flex;
930
+ justify-content: space-between;
931
+ align-items: center;
932
+ padding: 1.5rem;
933
+ border-bottom: 1px solid var(--border-color);
934
+ }
935
+
936
+ .embed-modal-header h3 {
937
+ margin: 0;
938
+ color: var(--text-color);
939
+ }
940
+
941
+ .embed-modal-close {
942
+ background: none;
943
+ border: none;
944
+ font-size: 2rem;
945
+ color: var(--text-muted);
946
+ cursor: pointer;
947
+ padding: 0;
948
+ width: 2rem;
949
+ height: 2rem;
950
+ display: flex;
951
+ align-items: center;
952
+ justify-content: center;
953
+ border-radius: 4px;
954
+ transition: all 0.2s ease;
955
+ }
956
+
957
+ .embed-modal-close:hover {
958
+ background: var(--bg-color);
959
+ color: var(--text-color);
960
+ }
961
+
962
+ .embed-modal-body {
963
+ padding: 1.5rem;
964
+ overflow-y: auto;
965
+ flex: 1;
966
+ }
967
+
968
+ .embed-tabs {
969
+ display: flex;
970
+ gap: 0.5rem;
971
+ margin-bottom: 1rem;
972
+ border-bottom: 1px solid var(--border-color);
973
+ }
974
+
975
+ .embed-tab {
976
+ padding: 0.75rem 1.5rem;
977
+ background: none;
978
+ border: none;
979
+ border-bottom: 2px solid transparent;
980
+ color: var(--text-muted);
981
+ cursor: pointer;
982
+ font-size: 0.9rem;
983
+ transition: all 0.2s ease;
984
+ }
985
+
986
+ .embed-tab:hover {
987
+ color: var(--text-color);
988
+ }
989
+
990
+ .embed-tab.active {
991
+ color: var(--primary-color);
992
+ border-bottom-color: var(--primary-color);
993
+ }
994
+
995
+ .embed-code-content {
996
+ display: flex;
997
+ flex-direction: column;
998
+ gap: 1rem;
999
+ }
1000
+
1001
+ .embed-code-text {
1002
+ width: 100%;
1003
+ min-height: 300px;
1004
+ padding: 1rem;
1005
+ background: var(--bg-color);
1006
+ border: 1px solid var(--border-color);
1007
+ border-radius: 6px;
1008
+ color: var(--text-color);
1009
+ font-family: 'Courier New', monospace;
1010
+ font-size: 0.85rem;
1011
+ line-height: 1.5;
1012
+ resize: vertical;
1013
+ }
1014
+
1015
+ .embed-code-text:focus {
1016
+ outline: none;
1017
+ border-color: var(--primary-color);
1018
+ }
1019
+
1020
+ /* Responsive */
1021
+ @media (max-width: 768px) {
1022
+ .release-header {
1023
+ grid-template-columns: 1fr;
1024
+ }
1025
+
1026
+ .artist-header {
1027
+ flex-direction: column;
1028
+ text-align: center;
1029
+ }
1030
+
1031
+ .releases-grid {
1032
+ grid-template-columns: 1fr;
1033
+ }
1034
+
1035
+ .payment-buttons {
1036
+ flex-direction: column;
1037
+ align-items: center;
1038
+ }
1039
+
1040
+ .donation-links {
1041
+ flex-direction: column;
1042
+ align-items: center;
1043
+ }
1044
+
1045
+ .donation-link {
1046
+ width: 100%;
1047
+ max-width: 200px;
1048
+ }
1049
+
1050
+ .footer-content {
1051
+ font-size: 0.8rem;
1052
+ }
1053
+
1054
+ .footer-logo {
1055
+ width: 18px;
1056
+ height: 18px;
1057
+ }
1058
+ }
1059
+
1060
+ /* Unlock Codes Section */
1061
+ .unlock-codes-section {
1062
+ background: linear-gradient(135deg, var(--surface-color), var(--bg-color));
1063
+ border: 1px solid var(--border-color);
1064
+ border-radius: 16px;
1065
+ padding: 2rem;
1066
+ text-align: center;
1067
+ max-width: 500px;
1068
+ margin: 0 auto;
1069
+ }
1070
+
1071
+ .unlock-header {
1072
+ margin-bottom: 1.5rem;
1073
+ }
1074
+
1075
+ .unlock-header i {
1076
+ font-size: 3rem;
1077
+ color: var(--primary-color);
1078
+ margin-bottom: 1rem;
1079
+ display: block;
1080
+ }
1081
+
1082
+ .unlock-header h3 {
1083
+ font-size: 1.5rem;
1084
+ margin-bottom: 0.5rem;
1085
+ color: var(--text-color);
1086
+ }
1087
+
1088
+ .unlock-header p {
1089
+ color: var(--text-muted);
1090
+ }
1091
+
1092
+ .unlock-form {
1093
+ margin-bottom: 1.5rem;
1094
+ }
1095
+
1096
+ .code-input-group {
1097
+ display: flex;
1098
+ gap: 0.5rem;
1099
+ max-width: 350px;
1100
+ margin: 0 auto;
1101
+ }
1102
+
1103
+ .code-input-group input {
1104
+ flex: 1;
1105
+ padding: 1rem;
1106
+ font-size: 1.2rem;
1107
+ font-family: 'Courier New', monospace;
1108
+ text-align: center;
1109
+ letter-spacing: 0.1em;
1110
+ background: var(--bg-color);
1111
+ border: 2px solid var(--border-color);
1112
+ border-radius: 8px;
1113
+ color: var(--text-color);
1114
+ text-transform: uppercase;
1115
+ }
1116
+
1117
+ .code-input-group input:focus {
1118
+ outline: none;
1119
+ border-color: var(--primary-color);
1120
+ }
1121
+
1122
+ .code-input-group input::placeholder {
1123
+ color: var(--text-muted);
1124
+ opacity: 0.5;
1125
+ }
1126
+
1127
+ .unlock-error {
1128
+ color: #ef4444;
1129
+ margin-top: 0.75rem;
1130
+ font-size: 0.9rem;
1131
+ }
1132
+
1133
+ .unlock-success {
1134
+ padding: 2rem;
1135
+ animation: fadeIn 0.3s ease;
1136
+ }
1137
+
1138
+ .unlock-success .success-icon {
1139
+ font-size: 4rem;
1140
+ color: var(--success-color);
1141
+ margin-bottom: 1rem;
1142
+ }
1143
+
1144
+ .unlock-success h4 {
1145
+ font-size: 1.5rem;
1146
+ color: var(--text-color);
1147
+ margin-bottom: 0.5rem;
1148
+ }
1149
+
1150
+ .unlock-success p {
1151
+ color: var(--text-muted);
1152
+ margin-bottom: 1.5rem;
1153
+ }
1154
+
1155
+ .unlock-info {
1156
+ margin-top: 1rem;
1157
+ padding-top: 1rem;
1158
+ border-top: 1px solid var(--border-color);
1159
+ color: var(--text-muted);
1160
+ }
1161
+
1162
+ @keyframes fadeIn {
1163
+ from { opacity: 0; transform: scale(0.95); }
1164
+ to { opacity: 1; transform: scale(1); }
1165
+ }
1166
+
1167
+ .btn-lg {
1168
+ padding: 1rem 2rem;
1169
+ font-size: 1.1rem;
1170
+ }