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,796 @@
1
+ /* Tunecamp - Minimal Theme */
2
+
3
+ :root {
4
+ --primary-color: #2563eb;
5
+ --secondary-color: #1e40af;
6
+ --bg-color: #ffffff;
7
+ --surface-color: #f8fafc;
8
+ --text-color: #0f172a;
9
+ --text-muted: #64748b;
10
+ --border-color: #e2e8f0;
11
+ --success-color: #10b981;
12
+ --hover-color: #eff6ff;
13
+ }
14
+
15
+ * {
16
+ margin: 0;
17
+ padding: 0;
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ body {
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
23
+ background: var(--bg-color);
24
+ color: var(--text-color);
25
+ line-height: 1.6;
26
+ }
27
+
28
+ .container {
29
+ max-width: 1100px;
30
+ margin: 0 auto;
31
+ padding: 2rem;
32
+ }
33
+
34
+ /* Header */
35
+ .site-header {
36
+ background: var(--bg-color);
37
+ border-bottom: 1px solid var(--border-color);
38
+ padding: 3rem 0;
39
+ margin-bottom: 4rem;
40
+ }
41
+
42
+ .site-title {
43
+ font-size: 2rem;
44
+ margin-bottom: 0.5rem;
45
+ font-weight: 300;
46
+ letter-spacing: -0.5px;
47
+ }
48
+
49
+ .site-title a {
50
+ color: var(--text-color);
51
+ text-decoration: none;
52
+ }
53
+
54
+ /* Header Image (Bandcamp-style) */
55
+ .site-header-image {
56
+ margin-bottom: 1.5rem;
57
+ text-align: center;
58
+ width: 100%;
59
+ }
60
+
61
+ .site-header-image a {
62
+ display: block;
63
+ text-decoration: none;
64
+ width: 100%;
65
+ }
66
+
67
+ .header-image {
68
+ width: 100%;
69
+ max-width: 100%;
70
+ height: auto;
71
+ max-height: 400px;
72
+ min-height: 200px;
73
+ display: block;
74
+ margin: 0 auto;
75
+ object-fit: contain;
76
+ object-position: center;
77
+ }
78
+
79
+ @media (max-width: 768px) {
80
+ .header-image {
81
+ max-height: 250px;
82
+ min-height: 120px;
83
+ }
84
+ }
85
+
86
+ .site-description {
87
+ color: var(--text-muted);
88
+ font-size: 1rem;
89
+ font-weight: 300;
90
+ }
91
+
92
+ /* Artist Section */
93
+ .artist-section {
94
+ margin-bottom: 5rem;
95
+ padding-bottom: 3rem;
96
+ border-bottom: 1px solid var(--border-color);
97
+ }
98
+
99
+ .artist-header {
100
+ display: flex;
101
+ gap: 2rem;
102
+ align-items: flex-start;
103
+ }
104
+
105
+ .artist-photo {
106
+ width: 120px;
107
+ height: 120px;
108
+ border-radius: 4px;
109
+ object-fit: cover;
110
+ }
111
+
112
+ .artist-info h2 {
113
+ font-size: 1.75rem;
114
+ margin-bottom: 1rem;
115
+ font-weight: 400;
116
+ }
117
+
118
+ .artist-bio {
119
+ color: var(--text-muted);
120
+ line-height: 1.8;
121
+ max-width: 600px;
122
+ }
123
+
124
+ /* Releases Grid */
125
+ .releases-section h2 {
126
+ font-size: 1.5rem;
127
+ margin-bottom: 2rem;
128
+ font-weight: 400;
129
+ }
130
+
131
+ .releases-grid {
132
+ display: grid;
133
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
134
+ gap: 3rem 2rem;
135
+ }
136
+
137
+ .release-card {
138
+ transition: transform 0.2s;
139
+ }
140
+
141
+ .release-card:hover {
142
+ transform: translateY(-2px);
143
+ }
144
+
145
+ .release-link {
146
+ text-decoration: none;
147
+ color: inherit;
148
+ display: block;
149
+ }
150
+
151
+ .release-cover {
152
+ aspect-ratio: 1;
153
+ overflow: hidden;
154
+ background: var(--surface-color);
155
+ margin-bottom: 1rem;
156
+ border-radius: 2px;
157
+ }
158
+
159
+ .release-cover img {
160
+ width: 100%;
161
+ height: 100%;
162
+ object-fit: cover;
163
+ display: block;
164
+ }
165
+
166
+ .release-cover-placeholder {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ font-size: 3rem;
171
+ color: var(--border-color);
172
+ }
173
+
174
+ .release-info {
175
+ padding: 0;
176
+ }
177
+
178
+ .release-title {
179
+ font-size: 1.1rem;
180
+ margin-bottom: 0.25rem;
181
+ font-weight: 500;
182
+ }
183
+
184
+ .release-date {
185
+ color: var(--text-muted);
186
+ font-size: 0.85rem;
187
+ margin-bottom: 0.75rem;
188
+ }
189
+
190
+ .release-genres {
191
+ display: flex;
192
+ gap: 0.5rem;
193
+ flex-wrap: wrap;
194
+ margin-bottom: 0.75rem;
195
+ }
196
+
197
+ .genre-tag {
198
+ background: transparent;
199
+ border: 1px solid var(--border-color);
200
+ color: var(--text-muted);
201
+ padding: 0.15rem 0.6rem;
202
+ border-radius: 2px;
203
+ font-size: 0.75rem;
204
+ }
205
+
206
+ .release-tracks-count {
207
+ color: var(--text-muted);
208
+ font-size: 0.85rem;
209
+ margin-bottom: 0.75rem;
210
+ }
211
+
212
+ .release-download-badge {
213
+ background: var(--success-color);
214
+ color: white;
215
+ padding: 0.4rem 0.8rem;
216
+ border-radius: 2px;
217
+ font-size: 0.75rem;
218
+ display: inline-block;
219
+ }
220
+
221
+ /* Release Detail */
222
+ .breadcrumb {
223
+ margin-bottom: 3rem;
224
+ }
225
+
226
+ .breadcrumb a {
227
+ color: var(--text-muted);
228
+ text-decoration: none;
229
+ font-size: 0.9rem;
230
+ }
231
+
232
+ .breadcrumb a:hover {
233
+ color: var(--primary-color);
234
+ }
235
+
236
+ .release-header {
237
+ display: grid;
238
+ grid-template-columns: 350px 1fr;
239
+ gap: 4rem;
240
+ margin-bottom: 4rem;
241
+ }
242
+
243
+ .release-cover-large img {
244
+ width: 100%;
245
+ border-radius: 2px;
246
+ }
247
+
248
+ .release-metadata h1 {
249
+ font-size: 2.25rem;
250
+ margin-bottom: 0.5rem;
251
+ font-weight: 400;
252
+ }
253
+
254
+ .release-artist {
255
+ font-size: 1.25rem;
256
+ color: var(--text-muted);
257
+ margin-bottom: 1rem;
258
+ font-weight: 300;
259
+ }
260
+
261
+ .release-description {
262
+ line-height: 1.8;
263
+ margin: 1.5rem 0;
264
+ color: var(--text-muted);
265
+ }
266
+
267
+ .release-credits {
268
+ margin: 1.5rem 0;
269
+ }
270
+
271
+ .release-credits h3 {
272
+ margin-bottom: 0.5rem;
273
+ font-weight: 500;
274
+ font-size: 1rem;
275
+ }
276
+
277
+ .release-credits ul {
278
+ list-style: none;
279
+ color: var(--text-muted);
280
+ font-size: 0.9rem;
281
+ }
282
+
283
+ .btn {
284
+ padding: 0.75rem 1.5rem;
285
+ border: 1px solid var(--text-color);
286
+ border-radius: 2px;
287
+ font-size: 0.9rem;
288
+ cursor: pointer;
289
+ transition: all 0.2s;
290
+ display: inline-flex;
291
+ align-items: center;
292
+ gap: 0.5rem;
293
+ background: transparent;
294
+ color: var(--text-color);
295
+ }
296
+
297
+ .btn-primary {
298
+ background: var(--text-color);
299
+ color: var(--bg-color);
300
+ }
301
+
302
+ .btn-primary:hover {
303
+ background: var(--primary-color);
304
+ border-color: var(--primary-color);
305
+ }
306
+
307
+ /* Audio Player */
308
+ .audio-player {
309
+ background: var(--surface-color);
310
+ border-radius: 4px;
311
+ padding: 2rem;
312
+ margin-bottom: 3rem;
313
+ border: 1px solid var(--border-color);
314
+ }
315
+
316
+ .player-track-info {
317
+ display: flex;
318
+ gap: 1rem;
319
+ margin-bottom: 1.5rem;
320
+ align-items: center;
321
+ }
322
+
323
+ .player-cover {
324
+ width: 70px;
325
+ height: 70px;
326
+ border-radius: 2px;
327
+ overflow: hidden;
328
+ background: var(--bg-color);
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ font-size: 1.5rem;
333
+ color: var(--border-color);
334
+ }
335
+
336
+ .player-cover img {
337
+ width: 100%;
338
+ height: 100%;
339
+ object-fit: cover;
340
+ }
341
+
342
+ .player-title {
343
+ font-size: 1rem;
344
+ font-weight: 500;
345
+ }
346
+
347
+ .player-artist {
348
+ color: var(--text-muted);
349
+ font-size: 0.9rem;
350
+ }
351
+
352
+ .player-controls {
353
+ display: flex;
354
+ justify-content: center;
355
+ gap: 1rem;
356
+ margin-bottom: 1.5rem;
357
+ }
358
+
359
+ .player-btn {
360
+ background: transparent;
361
+ border: 1px solid var(--border-color);
362
+ color: var(--text-color);
363
+ width: 44px;
364
+ height: 44px;
365
+ border-radius: 50%;
366
+ cursor: pointer;
367
+ transition: all 0.2s;
368
+ font-size: 1rem;
369
+ }
370
+
371
+ .player-btn-play {
372
+ width: 52px;
373
+ height: 52px;
374
+ background: var(--text-color);
375
+ color: var(--bg-color);
376
+ border-color: var(--text-color);
377
+ }
378
+
379
+ .player-btn:hover {
380
+ border-color: var(--primary-color);
381
+ color: var(--primary-color);
382
+ }
383
+
384
+ .player-btn-play:hover {
385
+ background: var(--primary-color);
386
+ border-color: var(--primary-color);
387
+ color: var(--bg-color);
388
+ }
389
+
390
+ .player-progress {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 1rem;
394
+ margin-bottom: 1rem;
395
+ }
396
+
397
+ .player-time {
398
+ color: var(--text-muted);
399
+ font-size: 0.85rem;
400
+ min-width: 40px;
401
+ font-variant-numeric: tabular-nums;
402
+ }
403
+
404
+ .progress-bar {
405
+ flex: 1;
406
+ height: 4px;
407
+ -webkit-appearance: none;
408
+ appearance: none;
409
+ background: var(--border-color);
410
+ border-radius: 2px;
411
+ outline: none;
412
+ }
413
+
414
+ .progress-bar::-webkit-slider-thumb {
415
+ -webkit-appearance: none;
416
+ appearance: none;
417
+ width: 14px;
418
+ height: 14px;
419
+ background: var(--text-color);
420
+ border-radius: 50%;
421
+ cursor: pointer;
422
+ }
423
+
424
+ .player-volume {
425
+ display: flex;
426
+ align-items: center;
427
+ gap: 1rem;
428
+ max-width: 200px;
429
+ color: var(--text-muted);
430
+ }
431
+
432
+ .volume-bar {
433
+ flex: 1;
434
+ height: 4px;
435
+ -webkit-appearance: none;
436
+ appearance: none;
437
+ background: var(--border-color);
438
+ border-radius: 2px;
439
+ }
440
+
441
+ .volume-bar::-webkit-slider-thumb {
442
+ -webkit-appearance: none;
443
+ appearance: none;
444
+ width: 12px;
445
+ height: 12px;
446
+ background: var(--text-color);
447
+ border-radius: 50%;
448
+ cursor: pointer;
449
+ }
450
+
451
+ /* Track List */
452
+ .tracklist h2 {
453
+ font-size: 1.25rem;
454
+ margin-bottom: 1.5rem;
455
+ font-weight: 500;
456
+ }
457
+
458
+ .track-list {
459
+ list-style: none;
460
+ }
461
+
462
+ .track-item {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 1rem;
466
+ padding: 1rem 0;
467
+ border-bottom: 1px solid var(--border-color);
468
+ transition: all 0.2s;
469
+ }
470
+
471
+ .track-item:hover {
472
+ background: var(--hover-color);
473
+ padding-left: 1rem;
474
+ padding-right: 1rem;
475
+ margin-left: -1rem;
476
+ margin-right: -1rem;
477
+ }
478
+
479
+ .track-item.playing {
480
+ background: var(--hover-color);
481
+ padding-left: 1rem;
482
+ padding-right: 1rem;
483
+ margin-left: -1rem;
484
+ margin-right: -1rem;
485
+ }
486
+
487
+ .track-number {
488
+ width: 30px;
489
+ text-align: right;
490
+ color: var(--text-muted);
491
+ font-size: 0.9rem;
492
+ font-variant-numeric: tabular-nums;
493
+ }
494
+
495
+ .track-info {
496
+ flex: 1;
497
+ }
498
+
499
+ .track-title {
500
+ font-weight: 400;
501
+ margin-bottom: 0.25rem;
502
+ }
503
+
504
+ .track-meta {
505
+ font-size: 0.8rem;
506
+ color: var(--text-muted);
507
+ }
508
+
509
+ .track-actions {
510
+ display: flex;
511
+ gap: 0.5rem;
512
+ }
513
+
514
+ .track-play-btn,
515
+ .track-download-btn {
516
+ background: transparent;
517
+ border: 1px solid var(--border-color);
518
+ color: var(--text-color);
519
+ width: 32px;
520
+ height: 32px;
521
+ border-radius: 50%;
522
+ cursor: pointer;
523
+ display: flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ transition: all 0.2s;
527
+ text-decoration: none;
528
+ font-size: 0.85rem;
529
+ }
530
+
531
+ .track-play-btn:hover,
532
+ .track-download-btn:hover {
533
+ background: var(--text-color);
534
+ color: var(--bg-color);
535
+ border-color: var(--text-color);
536
+ }
537
+
538
+ /* Footer */
539
+ .site-footer {
540
+ background: var(--bg-color);
541
+ border-top: 1px solid var(--border-color);
542
+ padding: 3rem 0;
543
+ margin-top: 5rem;
544
+ text-align: center;
545
+ color: var(--text-muted);
546
+ font-size: 0.9rem;
547
+ }
548
+
549
+ .site-footer a {
550
+ color: var(--primary-color);
551
+ text-decoration: none;
552
+ }
553
+
554
+ .social-links {
555
+ margin-top: 1.5rem;
556
+ display: flex;
557
+ justify-content: center;
558
+ gap: 0.75rem;
559
+ }
560
+
561
+ .social-link {
562
+ width: 36px;
563
+ height: 36px;
564
+ border-radius: 50%;
565
+ border: 1px solid var(--border-color);
566
+ display: flex;
567
+ align-items: center;
568
+ justify-content: center;
569
+ font-size: 1rem;
570
+ transition: all 0.2s;
571
+ color: var(--text-muted);
572
+ }
573
+
574
+ .social-link:hover {
575
+ background: var(--text-color);
576
+ color: var(--bg-color);
577
+ border-color: var(--text-color);
578
+ }
579
+
580
+ /* Paycurtain Styles */
581
+ .paycurtain {
582
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
583
+ border-radius: 12px;
584
+ padding: 2rem;
585
+ margin: 1rem 0;
586
+ color: white;
587
+ text-align: center;
588
+ }
589
+
590
+ .support-message {
591
+ margin-bottom: 1.5rem;
592
+ }
593
+
594
+ .support-message p {
595
+ margin: 0.5rem 0;
596
+ }
597
+
598
+ .honor-system {
599
+ font-size: 0.9rem;
600
+ opacity: 0.9;
601
+ font-style: italic;
602
+ }
603
+
604
+ .payment-buttons {
605
+ display: flex;
606
+ gap: 1rem;
607
+ justify-content: center;
608
+ flex-wrap: wrap;
609
+ }
610
+
611
+ .btn-outline {
612
+ background: transparent;
613
+ border: 2px solid rgba(255, 255, 255, 0.3);
614
+ color: white;
615
+ padding: 0.75rem 1.5rem;
616
+ border-radius: 8px;
617
+ text-decoration: none;
618
+ display: inline-flex;
619
+ align-items: center;
620
+ gap: 0.5rem;
621
+ transition: all 0.3s ease;
622
+ }
623
+
624
+ .btn-outline:hover {
625
+ background: rgba(255, 255, 255, 0.1);
626
+ border-color: rgba(255, 255, 255, 0.5);
627
+ }
628
+
629
+ .payment-info {
630
+ font-size: 0.9rem;
631
+ opacity: 0.8;
632
+ margin-top: 1rem;
633
+ }
634
+
635
+ /* License Styles */
636
+ .release-license {
637
+ margin: 1.5rem 0;
638
+ padding: 1rem;
639
+ background: #f8f9fa;
640
+ border-radius: 8px;
641
+ border-left: 4px solid #007bff;
642
+ }
643
+
644
+ .release-license h3 {
645
+ margin: 0 0 0.5rem 0;
646
+ color: #333;
647
+ }
648
+
649
+ .license-info {
650
+ margin: 0;
651
+ color: #666;
652
+ }
653
+
654
+ .license-info a {
655
+ color: #007bff;
656
+ text-decoration: none;
657
+ }
658
+
659
+ .license-info a:hover {
660
+ text-decoration: underline;
661
+ }
662
+
663
+ /* Donation Section */
664
+ .donation-section {
665
+ margin: 3rem 0;
666
+ padding: 2rem;
667
+ background: linear-gradient(135deg, #ff6b6b 0%, #ffa500 100%);
668
+ border-radius: 12px;
669
+ color: white;
670
+ text-align: center;
671
+ }
672
+
673
+ .donation-section h2 {
674
+ margin: 0 0 1rem 0;
675
+ color: white;
676
+ }
677
+
678
+ .donation-section p {
679
+ margin: 0 0 1.5rem 0;
680
+ opacity: 0.9;
681
+ }
682
+
683
+ .donation-links {
684
+ display: flex;
685
+ gap: 1rem;
686
+ justify-content: center;
687
+ flex-wrap: wrap;
688
+ }
689
+
690
+ .donation-link {
691
+ background: rgba(255, 255, 255, 0.1);
692
+ border: 2px solid rgba(255, 255, 255, 0.3);
693
+ color: white;
694
+ padding: 1rem 1.5rem;
695
+ border-radius: 8px;
696
+ text-decoration: none;
697
+ display: flex;
698
+ flex-direction: column;
699
+ align-items: center;
700
+ gap: 0.5rem;
701
+ transition: all 0.3s ease;
702
+ min-width: 120px;
703
+ }
704
+
705
+ .donation-link:hover {
706
+ background: rgba(255, 255, 255, 0.2);
707
+ border-color: rgba(255, 255, 255, 0.5);
708
+ transform: translateY(-2px);
709
+ }
710
+
711
+ .donation-link i {
712
+ font-size: 1.5rem;
713
+ }
714
+
715
+ .donation-link span {
716
+ font-weight: 600;
717
+ }
718
+
719
+ .donation-link small {
720
+ font-size: 0.8rem;
721
+ opacity: 0.8;
722
+ }
723
+
724
+ /* Tunecamp Footer */
725
+ .tunecamp-footer {
726
+ background: #f8f9fa;
727
+ border-top: 1px solid #e9ecef;
728
+ padding: 0.75rem 0;
729
+ margin-top: 2rem;
730
+ text-align: center;
731
+ }
732
+
733
+ .footer-content {
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+ gap: 0.5rem;
738
+ font-size: 0.9rem;
739
+ color: #6c757d;
740
+ }
741
+
742
+ .tunecamp-link {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 0.5rem;
746
+ text-decoration: none;
747
+ color: #007bff;
748
+ }
749
+
750
+
751
+ .footer-logo {
752
+ width: 20px;
753
+ height: 20px;
754
+ }
755
+
756
+
757
+ /* Responsive */
758
+ @media (max-width: 768px) {
759
+ .release-header {
760
+ grid-template-columns: 1fr;
761
+ }
762
+
763
+ .artist-header {
764
+ flex-direction: column;
765
+ text-align: center;
766
+ }
767
+
768
+ .releases-grid {
769
+ grid-template-columns: 1fr;
770
+ }
771
+
772
+ .payment-buttons {
773
+ flex-direction: column;
774
+ align-items: center;
775
+ }
776
+
777
+ .donation-links {
778
+ flex-direction: column;
779
+ align-items: center;
780
+ }
781
+
782
+ .donation-link {
783
+ width: 100%;
784
+ max-width: 200px;
785
+ }
786
+
787
+ .footer-content {
788
+ font-size: 0.8rem;
789
+ }
790
+
791
+ .footer-logo {
792
+ width: 18px;
793
+ height: 18px;
794
+ }
795
+ }
796
+