@vanduo-oss/vd3-cbun 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 (45) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +22 -0
  3. package/README.md +160 -0
  4. package/SKILL.md +119 -0
  5. package/dist/charts/core.d.ts +273 -0
  6. package/dist/charts/index.cjs +1828 -0
  7. package/dist/charts/index.cjs.map +7 -0
  8. package/dist/charts/index.d.ts +65 -0
  9. package/dist/charts/index.js +1805 -0
  10. package/dist/charts/index.js.map +7 -0
  11. package/dist/charts/vd3-charts.css +51 -0
  12. package/dist/charts/vue.d.ts +86 -0
  13. package/dist/flowchart/core.d.ts +288 -0
  14. package/dist/flowchart/index.cjs +3447 -0
  15. package/dist/flowchart/index.cjs.map +7 -0
  16. package/dist/flowchart/index.d.ts +54 -0
  17. package/dist/flowchart/index.js +3424 -0
  18. package/dist/flowchart/index.js.map +7 -0
  19. package/dist/flowchart/vd3-flowchart.css +600 -0
  20. package/dist/flowchart/vue.d.ts +66 -0
  21. package/dist/hex-grid/core.d.ts +200 -0
  22. package/dist/hex-grid/hex-math.cjs +162 -0
  23. package/dist/hex-grid/hex-math.cjs.map +7 -0
  24. package/dist/hex-grid/hex-math.d.ts +119 -0
  25. package/dist/hex-grid/hex-math.js +141 -0
  26. package/dist/hex-grid/hex-math.js.map +7 -0
  27. package/dist/hex-grid/index.cjs +915 -0
  28. package/dist/hex-grid/index.cjs.map +7 -0
  29. package/dist/hex-grid/index.d.ts +15 -0
  30. package/dist/hex-grid/index.js +894 -0
  31. package/dist/hex-grid/index.js.map +7 -0
  32. package/dist/hex-grid/vue.d.ts +14 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.js +11 -0
  35. package/dist/index.js.map +7 -0
  36. package/dist/meta.json +551 -0
  37. package/dist/music-player/core.d.ts +88 -0
  38. package/dist/music-player/index.cjs +1227 -0
  39. package/dist/music-player/index.cjs.map +7 -0
  40. package/dist/music-player/index.d.ts +12 -0
  41. package/dist/music-player/index.js +1204 -0
  42. package/dist/music-player/index.js.map +7 -0
  43. package/dist/music-player/vd3-music-player.css +829 -0
  44. package/dist/music-player/vue.d.ts +32 -0
  45. package/package.json +105 -0
@@ -0,0 +1,829 @@
1
+ /**
2
+ * Vanduo Framework - Music Player
3
+ * Audio playback component with transport controls, volume, and optional
4
+ * shuffle, progress bar, and playlist features.
5
+ */
6
+
7
+ :root {
8
+ /* Sizing (Fibonacci pairs) */
9
+ --vd-music-player-padding-x: 1.3125rem; /* 21px */
10
+ --vd-music-player-padding-y: 0.8125rem; /* 13px */
11
+ --vd-music-player-padding-x-sm: 0.8125rem; /* 13px */
12
+ --vd-music-player-padding-y-sm: 0.5rem; /* 8px */
13
+ --vd-music-player-padding-x-lg: 2.125rem; /* 34px */
14
+ --vd-music-player-padding-y-lg: 1.3125rem; /* 21px */
15
+ --vd-music-player-gap: 0.8125rem; /* 13px */
16
+ --vd-music-player-btn-size: 2.125rem; /* 34px */
17
+ --vd-music-player-btn-size-sm: 1.625rem; /* 26px */
18
+ --vd-music-player-btn-size-lg: 2.625rem; /* 42px */
19
+ --vd-music-player-icon-size: 1.125rem;
20
+ --vd-music-player-volume-width: clamp(3.25rem, 16vw, 4.5rem);
21
+ --vd-music-player-volume-width-sm: 3rem;
22
+ --vd-music-player-volume-width-lg: 5.5rem;
23
+ --vd-music-player-border-radius: var(--vd-border-radius, 0.5rem);
24
+ --vd-music-player-border-width: 1px;
25
+
26
+ /* Colors */
27
+ --vd-music-player-bg: var(--vd-bg-primary);
28
+ --vd-music-player-bg-secondary: var(--vd-bg-secondary);
29
+ --vd-music-player-border: var(--vd-border-color);
30
+ --vd-music-player-text: var(--vd-text-primary);
31
+ --vd-music-player-text-muted: var(--vd-text-muted);
32
+ --vd-music-player-accent: var(--vd-color-primary);
33
+ --vd-music-player-btn-hover-bg: var(--vd-bg-secondary);
34
+ --vd-music-player-btn-active-bg: var(--vd-color-primary-alpha-10, rgba(var(--vd-color-primary-rgb, 59,130,246), 0.1));
35
+ --vd-music-player-track-bg: var(--vd-border-color);
36
+ --vd-music-player-track-fill: var(--vd-color-primary);
37
+ --vd-music-player-playlist-hover: var(--vd-bg-secondary);
38
+ --vd-music-player-playlist-active-bg: var(--vd-color-primary-alpha-10, rgba(var(--vd-color-primary-rgb, 59,130,246), 0.1));
39
+ --vd-music-player-playlist-active-text: var(--vd-color-primary);
40
+
41
+ /* Transitions */
42
+ --vd-music-player-transition: 0.15s ease;
43
+
44
+ /* Glass (uses framework glass tokens; music-player-glass can override) */
45
+ --vd-music-player-glass-bg: var(--vd-glass-bg-light, rgba(255, 255, 255, 0.72));
46
+ --vd-music-player-glass-border: var(--vd-glass-border-light, rgba(255, 255, 255, 0.5));
47
+ --vd-music-player-glass-shadow: var(--vd-glass-shadow, 0 4px 24px rgba(0, 0, 0, 0.12));
48
+ --vd-music-player-floating-shadow: 0 12px 40px rgba(0, 0, 0, 0.18);
49
+ --vd-music-player-floating-z: 10050;
50
+ --vd-music-player-floating-offset: 1rem;
51
+ --vd-music-player-toolbar-gap: 0.375rem;
52
+ --vd-music-player-handle-size: 1.5rem;
53
+ }
54
+
55
+ /* Dark Theme */
56
+ [data-theme="dark"] {
57
+ --vd-music-player-bg: var(--vd-bg-primary);
58
+ --vd-music-player-bg-secondary: var(--vd-color-gray-800);
59
+ --vd-music-player-btn-hover-bg: var(--vd-color-gray-700);
60
+ --vd-music-player-playlist-hover: var(--vd-color-gray-700);
61
+ --vd-music-player-glass-bg: var(--vd-glass-bg-dark, rgba(30, 30, 40, 0.72));
62
+ --vd-music-player-glass-border: var(--vd-glass-border-dark, rgba(255, 255, 255, 0.14));
63
+ }
64
+
65
+ @media (prefers-color-scheme: dark) {
66
+ :root:not([data-theme]) {
67
+ --vd-music-player-bg: var(--vd-bg-primary);
68
+ --vd-music-player-bg-secondary: var(--vd-color-gray-800);
69
+ --vd-music-player-btn-hover-bg: var(--vd-color-gray-700);
70
+ --vd-music-player-playlist-hover: var(--vd-color-gray-700);
71
+ --vd-music-player-glass-bg: var(--vd-glass-bg-dark, rgba(30, 30, 40, 0.72));
72
+ --vd-music-player-glass-border: var(--vd-glass-border-dark, rgba(255, 255, 255, 0.14));
73
+ }
74
+ }
75
+
76
+ /* ============================================================
77
+ Base Container
78
+ ============================================================ */
79
+
80
+ .vd-music-player {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: 0;
84
+ background-color: var(--vd-music-player-bg);
85
+ border: var(--vd-music-player-border-width) solid var(--vd-music-player-border);
86
+ border-radius: var(--vd-music-player-border-radius);
87
+ padding: var(--vd-music-player-padding-y) var(--vd-music-player-padding-x);
88
+ min-width: 16rem;
89
+ max-width: 28rem;
90
+ width: 100%;
91
+ box-sizing: border-box;
92
+ }
93
+
94
+ /* ============================================================
95
+ Now Playing — track info bar
96
+ ============================================================ */
97
+
98
+ .vd-music-player-info {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 0.625rem;
102
+ min-height: 1.5rem;
103
+ margin-bottom: 0.625rem;
104
+ }
105
+
106
+ .vd-music-player-icon {
107
+ flex-shrink: 0;
108
+ color: var(--vd-music-player-accent);
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ width: 1rem;
113
+ height: 1rem;
114
+ }
115
+
116
+ .vd-music-player-track-name {
117
+ font-size: var(--vd-font-size-sm, 0.875rem);
118
+ color: var(--vd-music-player-text);
119
+ flex: 1;
120
+ overflow: hidden;
121
+ white-space: nowrap;
122
+ text-overflow: ellipsis;
123
+ min-width: 0;
124
+ }
125
+
126
+ .vd-music-player-track-name.is-idle {
127
+ color: var(--vd-music-player-text-muted);
128
+ font-style: italic;
129
+ }
130
+
131
+ /* ============================================================
132
+ Controls Row
133
+ ============================================================ */
134
+
135
+ .vd-music-player-controls {
136
+ display: flex;
137
+ align-items: center;
138
+ flex-wrap: wrap;
139
+ gap: 0.375rem;
140
+ }
141
+
142
+ .vd-music-player-btn {
143
+ display: inline-flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ width: var(--vd-music-player-btn-size);
147
+ height: var(--vd-music-player-btn-size);
148
+ padding: 0;
149
+ background: transparent;
150
+ border: none;
151
+ border-radius: var(--vd-music-player-border-radius);
152
+ color: var(--vd-music-player-text);
153
+ cursor: pointer;
154
+ transition:
155
+ background-color var(--vd-music-player-transition),
156
+ color var(--vd-music-player-transition);
157
+ flex-shrink: 0;
158
+ }
159
+
160
+ .vd-music-player-btn:hover:not(:disabled) {
161
+ background-color: var(--vd-music-player-btn-hover-bg);
162
+ color: var(--vd-music-player-accent);
163
+ }
164
+
165
+ .vd-music-player-btn:focus-visible {
166
+ outline: 2px solid var(--vd-music-player-accent);
167
+ outline-offset: 1px;
168
+ }
169
+
170
+ .vd-music-player-btn:disabled {
171
+ opacity: 0.38;
172
+ cursor: not-allowed;
173
+ }
174
+
175
+ .vd-music-player-btn.is-active {
176
+ color: var(--vd-music-player-accent);
177
+ background-color: var(--vd-music-player-btn-active-bg);
178
+ }
179
+
180
+ .vd-music-player-btn-repeat {
181
+ position: relative;
182
+ }
183
+
184
+ .vd-music-player-repeat-badge {
185
+ position: absolute;
186
+ top: 0.15rem;
187
+ right: 0.15rem;
188
+ font-size: 0.55rem;
189
+ font-weight: 700;
190
+ line-height: 1;
191
+ pointer-events: none;
192
+ }
193
+
194
+ /* Play/Pause is slightly larger */
195
+ .vd-music-player-btn-play {
196
+ width: calc(var(--vd-music-player-btn-size) + 0.25rem);
197
+ height: calc(var(--vd-music-player-btn-size) + 0.25rem);
198
+ }
199
+
200
+ .vd-music-player-btn svg,
201
+ .vd-music-player-btn i {
202
+ width: var(--vd-music-player-icon-size);
203
+ height: var(--vd-music-player-icon-size);
204
+ font-size: var(--vd-music-player-icon-size);
205
+ pointer-events: none;
206
+ }
207
+
208
+ /* Spacer to push volume to the right */
209
+ .vd-music-player-spacer {
210
+ flex: 1 1 1.5rem;
211
+ min-width: 0;
212
+ }
213
+
214
+ /* ============================================================
215
+ Volume
216
+ ============================================================ */
217
+
218
+ .vd-music-player-volume {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 0.3125rem;
222
+ flex: 0 1 auto;
223
+ min-width: 0;
224
+ max-width: 100%;
225
+ }
226
+
227
+ .vd-music-player-volume-icon {
228
+ flex-shrink: 0;
229
+ color: var(--vd-music-player-text-muted);
230
+ display: flex;
231
+ align-items: center;
232
+ width: 1rem;
233
+ height: 1rem;
234
+ font-size: 1rem;
235
+ }
236
+
237
+ .vd-music-player-volume-slider {
238
+ -webkit-appearance: none;
239
+ appearance: none;
240
+ width: var(--vd-music-player-volume-width);
241
+ height: 4px;
242
+ border-radius: 9999px;
243
+ background: var(--vd-music-player-track-bg);
244
+ cursor: pointer;
245
+ outline: none;
246
+ min-width: 3.25rem;
247
+ max-width: 100%;
248
+ flex: 0 1 var(--vd-music-player-volume-width);
249
+ }
250
+
251
+ .vd-music-player-volume-slider:focus-visible {
252
+ outline: 2px solid var(--vd-music-player-accent);
253
+ outline-offset: 2px;
254
+ }
255
+
256
+ /* WebKit thumb */
257
+ .vd-music-player-volume-slider::-webkit-slider-thumb {
258
+ -webkit-appearance: none;
259
+ appearance: none;
260
+ width: 0.75rem;
261
+ height: 0.75rem;
262
+ border-radius: 50%;
263
+ background: var(--vd-music-player-accent);
264
+ cursor: pointer;
265
+ transition: transform var(--vd-music-player-transition);
266
+ }
267
+
268
+ .vd-music-player-volume-slider::-webkit-slider-thumb:hover {
269
+ transform: scale(1.2);
270
+ }
271
+
272
+ /* Firefox thumb */
273
+ .vd-music-player-volume-slider::-moz-range-thumb {
274
+ width: 0.75rem;
275
+ height: 0.75rem;
276
+ border-radius: 50%;
277
+ background: var(--vd-music-player-accent);
278
+ cursor: pointer;
279
+ border: none;
280
+ transition: transform var(--vd-music-player-transition);
281
+ }
282
+
283
+ .vd-music-player-volume-slider::-moz-range-thumb:hover {
284
+ transform: scale(1.2);
285
+ }
286
+
287
+ /* Firefox track fill */
288
+ .vd-music-player-volume-slider::-moz-range-progress {
289
+ background: var(--vd-music-player-track-fill);
290
+ border-radius: 9999px;
291
+ }
292
+
293
+ /* ============================================================
294
+ Progress Bar
295
+ ============================================================ */
296
+
297
+ .vd-music-player-progress {
298
+ display: none;
299
+ align-items: center;
300
+ gap: 0.5rem;
301
+ margin-top: 0.625rem;
302
+ }
303
+
304
+ .vd-music-player.has-progress .vd-music-player-progress {
305
+ display: flex;
306
+ }
307
+
308
+ .vd-music-player-progress-bar {
309
+ -webkit-appearance: none;
310
+ appearance: none;
311
+ flex: 1;
312
+ height: 4px;
313
+ border-radius: 9999px;
314
+ background: var(--vd-music-player-track-bg);
315
+ cursor: pointer;
316
+ outline: none;
317
+ }
318
+
319
+ .vd-music-player-progress-bar:focus-visible {
320
+ outline: 2px solid var(--vd-music-player-accent);
321
+ outline-offset: 2px;
322
+ }
323
+
324
+ .vd-music-player-progress-bar::-webkit-slider-thumb {
325
+ -webkit-appearance: none;
326
+ appearance: none;
327
+ width: 0.75rem;
328
+ height: 0.75rem;
329
+ border-radius: 50%;
330
+ background: var(--vd-music-player-accent);
331
+ cursor: pointer;
332
+ transition: transform var(--vd-music-player-transition);
333
+ }
334
+
335
+ .vd-music-player-progress-bar::-webkit-slider-thumb:hover {
336
+ transform: scale(1.2);
337
+ }
338
+
339
+ .vd-music-player-progress-bar::-moz-range-thumb {
340
+ width: 0.75rem;
341
+ height: 0.75rem;
342
+ border-radius: 50%;
343
+ background: var(--vd-music-player-accent);
344
+ border: none;
345
+ cursor: pointer;
346
+ transition: transform var(--vd-music-player-transition);
347
+ }
348
+
349
+ .vd-music-player-progress-bar::-moz-range-progress {
350
+ background: var(--vd-music-player-track-fill);
351
+ border-radius: 9999px;
352
+ }
353
+
354
+ .vd-music-player-time {
355
+ font-size: 0.6875rem;
356
+ color: var(--vd-music-player-text-muted);
357
+ white-space: nowrap;
358
+ flex-shrink: 0;
359
+ font-variant-numeric: tabular-nums;
360
+ min-width: 2.5rem;
361
+ text-align: right;
362
+ }
363
+
364
+ .vd-music-player-time:first-child {
365
+ text-align: left;
366
+ }
367
+
368
+ /* ============================================================
369
+ Playlist
370
+ ============================================================ */
371
+
372
+ .vd-music-player-playlist {
373
+ display: none;
374
+ flex-direction: column;
375
+ margin-top: 0.625rem;
376
+ border-top: var(--vd-music-player-border-width) solid var(--vd-music-player-border);
377
+ padding-top: 0.5rem;
378
+ max-height: 12rem;
379
+ overflow-y: auto;
380
+ scrollbar-width: thin;
381
+ }
382
+
383
+ .vd-music-player.has-playlist .vd-music-player-playlist.is-open {
384
+ display: flex;
385
+ }
386
+
387
+ .vd-music-player-playlist-item {
388
+ display: flex;
389
+ align-items: center;
390
+ gap: 0.5rem;
391
+ padding: 0.375rem 0.5rem;
392
+ border-radius: calc(var(--vd-music-player-border-radius) * 0.5);
393
+ cursor: pointer;
394
+ font-size: var(--vd-font-size-sm, 0.875rem);
395
+ color: var(--vd-music-player-text);
396
+ background: transparent;
397
+ border: none;
398
+ text-align: left;
399
+ width: 100%;
400
+ transition:
401
+ background-color var(--vd-music-player-transition),
402
+ color var(--vd-music-player-transition);
403
+ }
404
+
405
+ .vd-music-player-playlist-item:hover {
406
+ background-color: var(--vd-music-player-playlist-hover);
407
+ }
408
+
409
+ .vd-music-player-playlist-item:focus-visible {
410
+ outline: 2px solid var(--vd-music-player-accent);
411
+ outline-offset: 1px;
412
+ }
413
+
414
+ .vd-music-player-playlist-item.is-active {
415
+ background-color: var(--vd-music-player-playlist-active-bg);
416
+ color: var(--vd-music-player-playlist-active-text);
417
+ font-weight: var(--vd-font-weight-medium, 500);
418
+ }
419
+
420
+ .vd-music-player-playlist-num {
421
+ flex-shrink: 0;
422
+ width: 1.25rem;
423
+ font-size: 0.6875rem;
424
+ color: var(--vd-music-player-text-muted);
425
+ text-align: right;
426
+ font-variant-numeric: tabular-nums;
427
+ }
428
+
429
+ .vd-music-player-playlist-item.is-active .vd-music-player-playlist-num {
430
+ color: var(--vd-music-player-accent);
431
+ }
432
+
433
+ .vd-music-player-playlist-name {
434
+ flex: 1;
435
+ overflow: hidden;
436
+ white-space: nowrap;
437
+ text-overflow: ellipsis;
438
+ min-width: 0;
439
+ }
440
+
441
+ /* ============================================================
442
+ Variants — Compact (floating minimal bar)
443
+ ============================================================ */
444
+
445
+ .vd-music-player-compact {
446
+ flex-direction: row;
447
+ align-items: center;
448
+ padding: 0.5rem 0.8125rem;
449
+ min-width: auto;
450
+ max-width: none;
451
+ width: auto;
452
+ gap: 0.5rem;
453
+ }
454
+
455
+ .vd-music-player-compact .vd-music-player-info {
456
+ display: none;
457
+ }
458
+
459
+ .vd-music-player-compact .vd-music-player-controls {
460
+ gap: 0.125rem;
461
+ }
462
+
463
+ /* ============================================================
464
+ Variants — Inline (full-width bar)
465
+ ============================================================ */
466
+
467
+ .vd-music-player-inline {
468
+ flex-direction: row;
469
+ align-items: center;
470
+ flex-wrap: wrap;
471
+ padding: 0.625rem var(--vd-music-player-padding-x);
472
+ min-width: 0;
473
+ max-width: none;
474
+ gap: 0.625rem;
475
+ }
476
+
477
+ .vd-music-player-inline .vd-music-player-info {
478
+ flex: 1;
479
+ min-width: 8rem;
480
+ margin-bottom: 0;
481
+ }
482
+
483
+ .vd-music-player-inline .vd-music-player-controls {
484
+ flex: 1 1 auto;
485
+ justify-content: flex-end;
486
+ min-width: 0;
487
+ }
488
+
489
+ .vd-music-player-inline .vd-music-player-volume {
490
+ flex: 0 1 auto;
491
+ }
492
+
493
+ .vd-music-player-inline .vd-music-player-volume-slider {
494
+ width: clamp(4rem, 18vw, 5.5rem);
495
+ flex-basis: clamp(4rem, 18vw, 5.5rem);
496
+ }
497
+
498
+ .vd-music-player-inline .vd-music-player-progress {
499
+ flex-basis: 100%;
500
+ margin-top: 0.375rem;
501
+ }
502
+
503
+ /* ============================================================
504
+ Sizes
505
+ ============================================================ */
506
+
507
+ .vd-music-player-sm {
508
+ padding: var(--vd-music-player-padding-y-sm) var(--vd-music-player-padding-x-sm);
509
+ font-size: var(--vd-font-size-sm, 0.875rem);
510
+ }
511
+
512
+ .vd-music-player-sm .vd-music-player-btn {
513
+ width: var(--vd-music-player-btn-size-sm);
514
+ height: var(--vd-music-player-btn-size-sm);
515
+ }
516
+
517
+ .vd-music-player-sm .vd-music-player-btn-play {
518
+ width: calc(var(--vd-music-player-btn-size-sm) + 0.125rem);
519
+ height: calc(var(--vd-music-player-btn-size-sm) + 0.125rem);
520
+ }
521
+
522
+ .vd-music-player-sm .vd-music-player-btn svg,
523
+ .vd-music-player-sm .vd-music-player-btn i {
524
+ font-size: 0.9375rem;
525
+ width: 0.9375rem;
526
+ height: 0.9375rem;
527
+ }
528
+
529
+ .vd-music-player-sm .vd-music-player-volume-slider {
530
+ width: var(--vd-music-player-volume-width-sm);
531
+ min-width: var(--vd-music-player-volume-width-sm);
532
+ flex-basis: var(--vd-music-player-volume-width-sm);
533
+ }
534
+
535
+ .vd-music-player-lg {
536
+ padding: var(--vd-music-player-padding-y-lg) var(--vd-music-player-padding-x-lg);
537
+ }
538
+
539
+ .vd-music-player-lg .vd-music-player-btn {
540
+ width: var(--vd-music-player-btn-size-lg);
541
+ height: var(--vd-music-player-btn-size-lg);
542
+ }
543
+
544
+ .vd-music-player-lg .vd-music-player-btn-play {
545
+ width: calc(var(--vd-music-player-btn-size-lg) + 0.25rem);
546
+ height: calc(var(--vd-music-player-btn-size-lg) + 0.25rem);
547
+ }
548
+
549
+ .vd-music-player-lg .vd-music-player-btn svg,
550
+ .vd-music-player-lg .vd-music-player-btn i {
551
+ font-size: 1.25rem;
552
+ width: 1.25rem;
553
+ height: 1.25rem;
554
+ }
555
+
556
+ .vd-music-player-lg .vd-music-player-volume-slider {
557
+ width: var(--vd-music-player-volume-width-lg);
558
+ min-width: 4rem;
559
+ flex-basis: var(--vd-music-player-volume-width-lg);
560
+ }
561
+
562
+ /* ============================================================
563
+ Neutral color variant — use gray instead of primary
564
+ ============================================================ */
565
+
566
+ .vd-music-player-neutral {
567
+ --vd-music-player-accent: var(--vd-text-primary);
568
+ --vd-music-player-track-fill: var(--vd-text-primary);
569
+ --vd-music-player-playlist-active-text: var(--vd-text-primary);
570
+ --vd-music-player-playlist-active-bg: var(--vd-bg-secondary);
571
+ --vd-music-player-btn-active-bg: var(--vd-bg-secondary);
572
+ }
573
+
574
+ /* ============================================================
575
+ Glass variant — frosted surface (aligns with effects/glass.css)
576
+ ============================================================ */
577
+
578
+ .vd-music-player-glass {
579
+ position: relative;
580
+ overflow: hidden;
581
+ background: var(--vd-music-player-glass-bg);
582
+ border-color: var(--vd-music-player-glass-border);
583
+ box-shadow: var(--vd-music-player-glass-shadow);
584
+ backdrop-filter: blur(var(--vd-glass-blur, 12px)) saturate(var(--vd-glass-saturate, 1.8));
585
+ -webkit-backdrop-filter: blur(var(--vd-glass-blur, 12px)) saturate(var(--vd-glass-saturate, 1.8));
586
+ isolation: isolate;
587
+ }
588
+
589
+ .vd-music-player-glass::before {
590
+ content: "";
591
+ position: absolute;
592
+ inset: 0;
593
+ background: linear-gradient(
594
+ to bottom,
595
+ rgba(255, 255, 255, var(--vd-glass-highlight-alpha, 0.12)) 0%,
596
+ rgba(255, 255, 255, 0) 45%
597
+ );
598
+ pointer-events: none;
599
+ z-index: 0;
600
+ border-radius: inherit;
601
+ }
602
+
603
+ .vd-music-player-glass::after {
604
+ content: "";
605
+ position: absolute;
606
+ inset: 0;
607
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140' viewBox='0 0 140 140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.15' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.25'/%3E%3C/svg%3E");
608
+ opacity: var(--vd-glass-noise-opacity, 0.12);
609
+ pointer-events: none;
610
+ z-index: 0;
611
+ border-radius: inherit;
612
+ }
613
+
614
+ .vd-music-player-glass > * {
615
+ position: relative;
616
+ z-index: 1;
617
+ }
618
+
619
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
620
+ .vd-music-player-glass {
621
+ background: var(--vd-music-player-bg);
622
+ }
623
+
624
+ .vd-music-player-glass::before,
625
+ .vd-music-player-glass::after {
626
+ display: none;
627
+ }
628
+ }
629
+
630
+ /* ============================================================
631
+ Floating / detached — fixed overlay above page content
632
+ ============================================================ */
633
+
634
+ .vd-music-player.vd-music-player-floating {
635
+ position: fixed;
636
+ z-index: var(--vd-music-player-floating-z);
637
+ max-width: min(28rem, calc(100vw - 2 * var(--vd-music-player-floating-offset)));
638
+ width: min(28rem, calc(100vw - 2 * var(--vd-music-player-floating-offset)));
639
+ margin: 0;
640
+ box-shadow: var(--vd-music-player-floating-shadow);
641
+ transition:
642
+ box-shadow var(--vd-music-player-transition),
643
+ transform var(--vd-music-player-transition);
644
+ }
645
+
646
+ .vd-music-player-floating.vd-music-player-floating-bottom-left,
647
+ .vd-music-player-floating.vd-music-player-floating-bottom-right {
648
+ bottom: var(--vd-music-player-floating-offset);
649
+ top: auto;
650
+ }
651
+
652
+ .vd-music-player-floating.vd-music-player-floating-bottom-left {
653
+ left: var(--vd-music-player-floating-offset);
654
+ right: auto;
655
+ }
656
+
657
+ .vd-music-player-floating.vd-music-player-floating-bottom-right {
658
+ right: var(--vd-music-player-floating-offset);
659
+ left: auto;
660
+ }
661
+
662
+ .vd-music-player-floating.vd-music-player-floating-top-left,
663
+ .vd-music-player-floating.vd-music-player-floating-top-right {
664
+ top: var(--vd-music-player-floating-offset);
665
+ bottom: auto;
666
+ }
667
+
668
+ .vd-music-player-floating.vd-music-player-floating-top-left {
669
+ left: var(--vd-music-player-floating-offset);
670
+ right: auto;
671
+ }
672
+
673
+ .vd-music-player-floating.vd-music-player-floating-top-right {
674
+ right: var(--vd-music-player-floating-offset);
675
+ left: auto;
676
+ }
677
+
678
+ .vd-music-player-floating:hover {
679
+ box-shadow: var(--vd-glass-float-shadow, 0 14px 42px rgba(0, 0, 0, 0.2));
680
+ }
681
+
682
+ /* Custom coordinates (set via JS) override corner presets */
683
+ .vd-music-player-floating.is-position-custom {
684
+ top: var(--vd-music-player-floating-top, 1rem) !important;
685
+ left: var(--vd-music-player-floating-left, 1rem) !important;
686
+ right: auto !important;
687
+ bottom: auto !important;
688
+ }
689
+
690
+ /* ============================================================
691
+ Toolbar — drag handle, detach, minimize
692
+ ============================================================ */
693
+
694
+ .vd-music-player-toolbar {
695
+ display: flex;
696
+ align-items: center;
697
+ gap: var(--vd-music-player-toolbar-gap);
698
+ margin: calc(-0.25rem) calc(-0.25rem) 0.5rem calc(-0.25rem);
699
+ min-height: var(--vd-music-player-handle-size);
700
+ position: relative;
701
+ z-index: 2;
702
+ }
703
+
704
+ .vd-music-player-drag-handle {
705
+ display: none;
706
+ flex-shrink: 0;
707
+ align-items: center;
708
+ justify-content: center;
709
+ width: 2.25rem;
710
+ height: var(--vd-music-player-handle-size);
711
+ padding: 0;
712
+ border: none;
713
+ border-radius: var(--vd-music-player-border-radius);
714
+ background: transparent;
715
+ color: var(--vd-music-player-text-muted);
716
+ cursor: grab;
717
+ touch-action: none;
718
+ }
719
+
720
+ .vd-music-player-drag-handle:active {
721
+ cursor: grabbing;
722
+ }
723
+
724
+ .vd-music-player-drag-handle .ph {
725
+ font-size: 1.125rem;
726
+ pointer-events: none;
727
+ }
728
+
729
+ .vd-music-player-detached.vd-music-player-draggable .vd-music-player-drag-handle {
730
+ display: inline-flex;
731
+ }
732
+
733
+ .vd-music-player-toolbar-spacer {
734
+ flex: 1 1 auto;
735
+ min-width: 0.5rem;
736
+ }
737
+
738
+ .vd-music-player-btn-attach,
739
+ .vd-music-player-btn-detach,
740
+ .vd-music-player-btn-minimize {
741
+ flex-shrink: 0;
742
+ }
743
+
744
+ /* Detach: show detach when inline; after detach show attach + optional drag */
745
+ .vd-music-player.vd-music-player-detached .vd-music-player-btn-detach {
746
+ display: none;
747
+ }
748
+
749
+ .vd-music-player .vd-music-player-btn-attach {
750
+ display: none;
751
+ }
752
+
753
+ .vd-music-player.vd-music-player-detached .vd-music-player-btn-attach {
754
+ display: inline-flex;
755
+ }
756
+
757
+ /* ============================================================
758
+ Minimized — compact transport + volume only
759
+ ============================================================ */
760
+
761
+ .vd-music-player-minimized .vd-music-player-info,
762
+ .vd-music-player-minimized .vd-music-player-progress,
763
+ .vd-music-player-minimized .vd-music-player-playlist {
764
+ display: none !important;
765
+ }
766
+
767
+ .vd-music-player-minimized .vd-music-player-btn-repeat,
768
+ .vd-music-player-minimized .vd-music-player-btn-shuffle,
769
+ .vd-music-player-minimized .vd-music-player-btn-playlist {
770
+ display: none;
771
+ }
772
+
773
+ .vd-music-player-minimized {
774
+ min-width: auto;
775
+ max-width: min(22rem, 100vw);
776
+ }
777
+
778
+ /* ============================================================
779
+ Reduced Motion
780
+ ============================================================ */
781
+
782
+ @media (prefers-reduced-transparency: reduce) {
783
+ .vd-music-player-glass {
784
+ backdrop-filter: none;
785
+ -webkit-backdrop-filter: none;
786
+ background: var(--vd-music-player-bg);
787
+ border-color: var(--vd-music-player-border);
788
+ }
789
+
790
+ .vd-music-player-glass::before,
791
+ .vd-music-player-glass::after {
792
+ display: none;
793
+ }
794
+ }
795
+
796
+ @media (prefers-reduced-motion: reduce) {
797
+ .vd-music-player-btn,
798
+ .vd-music-player-volume-slider::-webkit-slider-thumb,
799
+ .vd-music-player-volume-slider::-moz-range-thumb,
800
+ .vd-music-player-progress-bar::-webkit-slider-thumb,
801
+ .vd-music-player-progress-bar::-moz-range-thumb,
802
+ .vd-music-player-playlist-item,
803
+ .vd-music-player-floating {
804
+ transition: none;
805
+ }
806
+
807
+ .vd-music-player-floating:hover {
808
+ box-shadow: var(--vd-music-player-floating-shadow);
809
+ }
810
+ }
811
+
812
+ @media (max-width: 640px) {
813
+ .vd-music-player {
814
+ min-width: 0;
815
+ max-width: none;
816
+ }
817
+
818
+ .vd-music-player-controls {
819
+ row-gap: 0.5rem;
820
+ }
821
+
822
+ .vd-music-player-spacer {
823
+ display: none;
824
+ }
825
+
826
+ .vd-music-player-volume {
827
+ margin-left: auto;
828
+ }
829
+ }