@stargate91/pill-player 0.1.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.
package/dist/index.css ADDED
@@ -0,0 +1,988 @@
1
+ /* =========================================================================
2
+ Pill Player – Futuristic HUD Cyber Audio Player Styles
3
+ ========================================================================= */
4
+
5
+ :root {
6
+ /* Default / Orbital Theme */
7
+ --pp-bg: rgba(5, 14, 20, 0.92);
8
+ --pp-surface: rgba(10, 25, 36, 0.75);
9
+ --pp-surface-hover: rgba(16, 40, 58, 0.85);
10
+ --pp-border: rgba(0, 240, 255, 0.25);
11
+ --pp-border-active: rgba(0, 255, 157, 0.6);
12
+ --pp-accent: #00f0ff;
13
+ --pp-accent-secondary: #00ff9d;
14
+ --pp-accent-glow: rgba(0, 240, 255, 0.35);
15
+ --pp-text: #e6f7ff;
16
+ --pp-text-dim: #79a3b8;
17
+ --pp-grid: rgba(0, 240, 255, 0.08);
18
+ --pp-font: ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, Consolas, monospace;
19
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.6), 0 0 24px rgba(0, 240, 255, 0.15);
20
+ }
21
+
22
+ /* Cyberpunk Theme */
23
+ [data-pill-theme="cyberpunk"] {
24
+ --pp-bg: rgba(12, 6, 26, 0.94);
25
+ --pp-surface: rgba(28, 12, 54, 0.75);
26
+ --pp-surface-hover: rgba(45, 18, 86, 0.85);
27
+ --pp-border: rgba(255, 0, 110, 0.35);
28
+ --pp-border-active: rgba(0, 240, 255, 0.8);
29
+ --pp-accent: #ff006e;
30
+ --pp-accent-secondary: #00f0ff;
31
+ --pp-accent-glow: rgba(255, 0, 110, 0.4);
32
+ --pp-text: #fff0f7;
33
+ --pp-text-dim: #b87ca3;
34
+ --pp-grid: rgba(255, 0, 110, 0.08);
35
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.7), 0 0 24px rgba(255, 0, 110, 0.25);
36
+ }
37
+
38
+ /* Matrix Phosphor Theme */
39
+ [data-pill-theme="matrix"] {
40
+ --pp-bg: rgba(2, 14, 5, 0.94);
41
+ --pp-surface: rgba(5, 28, 10, 0.75);
42
+ --pp-surface-hover: rgba(8, 44, 16, 0.85);
43
+ --pp-border: rgba(0, 255, 85, 0.3);
44
+ --pp-border-active: rgba(0, 255, 85, 0.8);
45
+ --pp-accent: #00ff55;
46
+ --pp-accent-secondary: #55ff99;
47
+ --pp-accent-glow: rgba(0, 255, 85, 0.35);
48
+ --pp-text: #e0ffe8;
49
+ --pp-text-dim: #5c9c6f;
50
+ --pp-grid: rgba(0, 255, 85, 0.08);
51
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.7), 0 0 24px rgba(0, 255, 85, 0.2);
52
+ }
53
+
54
+ /* Synthwave Theme */
55
+ [data-pill-theme="synthwave"] {
56
+ --pp-bg: rgba(22, 9, 36, 0.94);
57
+ --pp-surface: rgba(42, 16, 68, 0.75);
58
+ --pp-surface-hover: rgba(62, 24, 100, 0.85);
59
+ --pp-border: rgba(255, 123, 0, 0.35);
60
+ --pp-border-active: rgba(180, 0, 255, 0.8);
61
+ --pp-accent: #ff7b00;
62
+ --pp-accent-secondary: #d946ef;
63
+ --pp-accent-glow: rgba(255, 123, 0, 0.4);
64
+ --pp-text: #fff5eb;
65
+ --pp-text-dim: #b88ba0;
66
+ --pp-grid: rgba(255, 123, 0, 0.08);
67
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.7), 0 0 24px rgba(217, 70, 239, 0.25);
68
+ }
69
+
70
+
71
+ /* Stargate Theme (Inspired by VS Code Dark Modern & Electric Azure) */
72
+ [data-pill-theme="stargate"] {
73
+ --pp-bg: rgba(22, 24, 29, 0.94);
74
+ --pp-surface: rgba(32, 36, 44, 0.75);
75
+ --pp-surface-hover: rgba(44, 50, 62, 0.85);
76
+ --pp-border: rgba(55, 148, 255, 0.28);
77
+ --pp-border-active: rgba(156, 220, 254, 0.75);
78
+ --pp-accent: #3794ff;
79
+ --pp-accent-secondary: #9cdcfe;
80
+ --pp-accent-glow: rgba(55, 148, 255, 0.3);
81
+ --pp-text: #f3f4f6;
82
+ --pp-text-dim: #9da5b4;
83
+ --pp-grid: rgba(55, 148, 255, 0.08);
84
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.65), 0 0 20px rgba(55, 148, 255, 0.15);
85
+ }
86
+
87
+ /* Amber Theme (Golden CRT Terminal / Vintage Deck) */
88
+ [data-pill-theme="amber"] {
89
+ --pp-bg: rgba(20, 14, 4, 0.94);
90
+ --pp-surface: rgba(38, 26, 8, 0.75);
91
+ --pp-surface-hover: rgba(56, 38, 12, 0.85);
92
+ --pp-border: rgba(255, 176, 0, 0.3);
93
+ --pp-border-active: rgba(255, 204, 51, 0.8);
94
+ --pp-accent: #ffb000;
95
+ --pp-accent-secondary: #ff8800;
96
+ --pp-accent-glow: rgba(255, 176, 0, 0.35);
97
+ --pp-text: #fff6e5;
98
+ --pp-text-dim: #b8976c;
99
+ --pp-grid: rgba(255, 176, 0, 0.08);
100
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.7), 0 0 24px rgba(255, 176, 0, 0.2);
101
+ }
102
+
103
+ /* Nordic Theme (Glacial Blue / Polar Frost) */
104
+ [data-pill-theme="nordic"] {
105
+ --pp-bg: rgba(13, 20, 30, 0.94);
106
+ --pp-surface: rgba(22, 33, 49, 0.75);
107
+ --pp-surface-hover: rgba(32, 47, 70, 0.85);
108
+ --pp-border: rgba(125, 211, 252, 0.25);
109
+ --pp-border-active: rgba(224, 242, 254, 0.75);
110
+ --pp-accent: #7dd3fc;
111
+ --pp-accent-secondary: #e0f2fe;
112
+ --pp-accent-glow: rgba(125, 211, 252, 0.3);
113
+ --pp-text: #f0f9ff;
114
+ --pp-text-dim: #8ba2b5;
115
+ --pp-grid: rgba(125, 211, 252, 0.08);
116
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.65), 0 0 20px rgba(125, 211, 252, 0.15);
117
+ }
118
+
119
+ /* Minimalist Dark Theme */
120
+ [data-pill-theme="minimal"] {
121
+ --pp-bg: rgba(18, 18, 18, 0.95);
122
+ --pp-surface: rgba(30, 30, 30, 0.75);
123
+ --pp-surface-hover: rgba(45, 45, 45, 0.85);
124
+ --pp-border: rgba(255, 255, 255, 0.15);
125
+ --pp-border-active: rgba(255, 255, 255, 0.6);
126
+ --pp-accent: #ffffff;
127
+ --pp-accent-secondary: #aaaaaa;
128
+ --pp-accent-glow: rgba(255, 255, 255, 0.2);
129
+ --pp-text: #f0f0f0;
130
+ --pp-text-dim: #888888;
131
+ --pp-grid: rgba(255, 255, 255, 0.05);
132
+ --pp-shadow: 0 12px 36px rgba(0, 0, 0, 0.7);
133
+ }
134
+
135
+ /* =========================================================================
136
+ DSP Spectrum Keyframe Animations
137
+ ========================================================================= */
138
+
139
+ @keyframes ppPillEqualizerPulse {
140
+ 0%, 100% { height: 3px; opacity: 0.5; }
141
+ 50% { height: 8px; opacity: 1; }
142
+ }
143
+
144
+ @keyframes ppPillEqualizerPulseTall {
145
+ 0%, 100% { height: 4px; opacity: 0.6; }
146
+ 50% { height: 12px; opacity: 1; }
147
+ }
148
+
149
+ @keyframes ppDspSubKick {
150
+ 0% { height: 4px; opacity: 0.5; }
151
+ 25% { height: 36px; opacity: 1; }
152
+ 60% { height: 14px; opacity: 0.7; }
153
+ 80% { height: 30px; opacity: 0.95; }
154
+ 100% { height: 6px; opacity: 0.5; }
155
+ }
156
+
157
+ @keyframes ppDspBassWave {
158
+ 0% { height: 6px; opacity: 0.55; }
159
+ 35% { height: 32px; opacity: 1; }
160
+ 65% { height: 16px; opacity: 0.75; }
161
+ 100% { height: 8px; opacity: 0.6; }
162
+ }
163
+
164
+ @keyframes ppDspMidsSnare {
165
+ 0% { height: 4px; opacity: 0.5; }
166
+ 20% { height: 12px; opacity: 0.65; }
167
+ 45% { height: 28px; opacity: 1; }
168
+ 70% { height: 8px; opacity: 0.55; }
169
+ 90% { height: 22px; opacity: 0.9; }
170
+ 100% { height: 4px; opacity: 0.5; }
171
+ }
172
+
173
+ @keyframes ppDspHighTransient {
174
+ 0% { height: 6px; opacity: 0.65; }
175
+ 40% { height: 20px; opacity: 0.85; }
176
+ 70% { height: 10px; opacity: 0.75; }
177
+ 100% { height: 8px; opacity: 0.7; }
178
+ }
179
+
180
+ @keyframes ppDspAirFlutter {
181
+ 0% { height: 8px; opacity: 0.7; }
182
+ 50% { height: 16px; opacity: 0.85; }
183
+ 100% { height: 10px; opacity: 0.75; }
184
+ }
185
+
186
+ @keyframes ppBeaconGlow {
187
+ 0%, 100% {
188
+ box-shadow: 0 0 0 0 transparent;
189
+ opacity: 0.45;
190
+ }
191
+ 50% {
192
+ box-shadow: 0 0 20px 2px var(--pp-accent-glow);
193
+ opacity: 1;
194
+ }
195
+ }
196
+
197
+ .pp-hud-beacon {
198
+ animation: ppBeaconGlow 4s ease-in-out infinite !important;
199
+ }
200
+
201
+ @keyframes ppLedBlink {
202
+ 0%, 100% { opacity: 1; transform: scale(1); }
203
+ 50% { opacity: 0.4; transform: scale(0.9); }
204
+ }
205
+
206
+ /* =========================================================================
207
+ Base Anchor & Positions
208
+ ========================================================================= */
209
+
210
+ .pp-anchor {
211
+ font-family: var(--pp-font);
212
+ box-sizing: border-box;
213
+ color: var(--pp-text);
214
+ z-index: 9999;
215
+ }
216
+
217
+ .pp-anchor *, .pp-anchor *::before, .pp-anchor *::after {
218
+ box-sizing: border-box;
219
+ }
220
+
221
+ .pp-position-bottom-right {
222
+ position: fixed;
223
+ bottom: 24px;
224
+ right: 24px;
225
+ display: flex;
226
+ flex-direction: column;
227
+ align-items: flex-end;
228
+ }
229
+
230
+ .pp-position-bottom-left {
231
+ position: fixed;
232
+ bottom: 24px;
233
+ left: 24px;
234
+ display: flex;
235
+ flex-direction: column;
236
+ align-items: flex-start;
237
+ }
238
+
239
+ .pp-position-top-right {
240
+ position: fixed;
241
+ top: 24px;
242
+ right: 24px;
243
+ display: flex;
244
+ flex-direction: column-reverse;
245
+ align-items: flex-end;
246
+ }
247
+
248
+ .pp-position-top-left {
249
+ position: fixed;
250
+ top: 24px;
251
+ left: 24px;
252
+ display: flex;
253
+ flex-direction: column-reverse;
254
+ align-items: flex-start;
255
+ }
256
+
257
+ .pp-position-inline {
258
+ position: relative;
259
+ width: 100%;
260
+ max-width: 380px;
261
+ display: flex;
262
+ flex-direction: column-reverse;
263
+ align-items: flex-start;
264
+ }
265
+
266
+ /* =========================================================================
267
+ Floating Trigger Pill
268
+ ========================================================================= */
269
+
270
+ .pp-pill-btn {
271
+ display: inline-flex;
272
+ align-items: center;
273
+ gap: 10px;
274
+ padding: 8px 14px;
275
+ background: var(--pp-bg);
276
+ border: 1px solid var(--pp-border);
277
+ border-radius: 9999px;
278
+ color: var(--pp-text);
279
+ cursor: pointer;
280
+ box-shadow: var(--pp-shadow);
281
+ backdrop-filter: blur(16px);
282
+ -webkit-backdrop-filter: blur(16px);
283
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
284
+ font-family: inherit;
285
+ font-size: 11px;
286
+ user-select: none;
287
+ }
288
+
289
+ .pp-pill-btn:hover {
290
+ border-color: var(--pp-accent);
291
+ box-shadow: 0 4px 20px var(--pp-accent-glow);
292
+ transform: translateY(-2px);
293
+ }
294
+
295
+ .pp-pill-btn:active {
296
+ transform: translateY(0);
297
+ }
298
+
299
+ .pp-pill-equalizer {
300
+ display: flex;
301
+ align-items: flex-end;
302
+ gap: 2.5px;
303
+ height: 14px;
304
+ padding-bottom: 1px;
305
+ }
306
+
307
+ .pp-pill-bar {
308
+ width: 2.5px;
309
+ height: 3px;
310
+ background: var(--pp-accent);
311
+ border-radius: 1px;
312
+ opacity: 0.5;
313
+ transition: height 0.2s ease;
314
+ }
315
+
316
+ .pp-is-playing .pp-pill-bar:nth-child(1) {
317
+ animation: ppPillEqualizerPulse var(--bpm-beat, 400ms) infinite ease-in-out;
318
+ }
319
+ .pp-is-playing .pp-pill-bar:nth-child(2) {
320
+ animation: ppPillEqualizerPulseTall var(--bpm-half-beat, 200ms) infinite ease-in-out;
321
+ animation-delay: 50ms;
322
+ }
323
+ .pp-is-playing .pp-pill-bar:nth-child(3) {
324
+ animation: ppPillEqualizerPulse var(--bpm-two-beats, 800ms) infinite ease-in-out;
325
+ animation-delay: 100ms;
326
+ }
327
+ .pp-is-playing .pp-pill-bar:nth-child(4) {
328
+ animation: ppPillEqualizerPulseTall var(--bpm-beat, 400ms) infinite ease-in-out;
329
+ animation-delay: 150ms;
330
+ }
331
+
332
+ .pp-pill-meta {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 6px;
336
+ font-weight: 600;
337
+ letter-spacing: 0.04em;
338
+ }
339
+
340
+ .pp-pill-code {
341
+ color: var(--pp-accent);
342
+ }
343
+
344
+ .pp-pill-bpm {
345
+ color: var(--pp-text-dim);
346
+ font-size: 10px;
347
+ }
348
+
349
+ .pp-pill-icon {
350
+ display: flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ color: var(--pp-text);
354
+ margin-left: 2px;
355
+ }
356
+
357
+ /* =========================================================================
358
+ Expanded HUD Console Card
359
+ ========================================================================= */
360
+
361
+ .pp-hud-card {
362
+ width: 380px;
363
+ max-width: calc(100vw - 32px);
364
+ background: var(--pp-bg);
365
+ border: 1px solid var(--pp-border);
366
+ border-radius: 12px;
367
+ box-shadow: var(--pp-shadow);
368
+ backdrop-filter: blur(20px);
369
+ -webkit-backdrop-filter: blur(20px);
370
+ overflow: hidden;
371
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
372
+ margin-bottom: 12px;
373
+ }
374
+
375
+ .pp-hud-card-closed {
376
+ opacity: 0;
377
+ pointer-events: none;
378
+ transform: translateY(12px) scale(0.96);
379
+ height: 0;
380
+ margin-bottom: 0;
381
+ border-color: transparent;
382
+ }
383
+
384
+ .pp-hud-card-open {
385
+ opacity: 1;
386
+ pointer-events: auto;
387
+ transform: translateY(0) scale(1);
388
+ }
389
+
390
+ /* Top positioning rules: pill stays on top, HUD opens below */
391
+ .pp-position-top-right .pp-hud-card,
392
+ .pp-position-top-left .pp-hud-card,
393
+ .pp-position-inline .pp-hud-card {
394
+ margin-bottom: 0;
395
+ margin-top: 12px;
396
+ }
397
+
398
+ .pp-position-top-right .pp-hud-card-closed,
399
+ .pp-position-top-left .pp-hud-card-closed,
400
+ .pp-position-inline .pp-hud-card-closed {
401
+ margin-top: 0;
402
+ margin-bottom: 0;
403
+ transform: translateY(-12px) scale(0.96);
404
+ }
405
+
406
+ .pp-position-top-right .pp-hud-card-open,
407
+ .pp-position-top-left .pp-hud-card-open,
408
+ .pp-position-inline .pp-hud-card-open {
409
+ transform: translateY(0) scale(1);
410
+ }
411
+
412
+ /* Header */
413
+ .pp-card-header {
414
+ display: flex;
415
+ align-items: center;
416
+ justify-content: space-between;
417
+ padding: 10px 14px;
418
+ border-bottom: 1px solid var(--pp-border);
419
+ background: var(--pp-surface);
420
+ }
421
+
422
+ .pp-telemetry-badge {
423
+ font-size: 10px;
424
+ font-weight: 700;
425
+ letter-spacing: 0.08em;
426
+ color: var(--pp-accent);
427
+ line-height: 1;
428
+ }
429
+
430
+
431
+
432
+ .pp-icon-btn {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: center;
436
+ width: 28px;
437
+ height: 28px;
438
+ border-radius: 6px;
439
+ background: transparent;
440
+ border: 1px solid transparent;
441
+ color: var(--pp-text-dim);
442
+ cursor: pointer;
443
+ transition: all 0.15s ease;
444
+ }
445
+
446
+ .pp-icon-btn:hover {
447
+ color: var(--pp-text);
448
+ background: var(--pp-surface-hover);
449
+ border-color: var(--pp-border);
450
+ }
451
+
452
+ /* Body */
453
+ .pp-card-body {
454
+ padding: 14px;
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 14px;
458
+ }
459
+
460
+ /* Track Info */
461
+ .pp-track-info {
462
+ display: flex;
463
+ flex-direction: column;
464
+ gap: 4px;
465
+ }
466
+
467
+ .pp-track-meta {
468
+ display: flex;
469
+ align-items: center;
470
+ gap: 8px;
471
+ }
472
+
473
+ .pp-genre-badge {
474
+ font-size: 9px;
475
+ font-weight: 700;
476
+ letter-spacing: 0.06em;
477
+ text-transform: uppercase;
478
+ padding: 2px 6px;
479
+ border-radius: 4px;
480
+ background: var(--pp-surface);
481
+ border: 1px solid var(--pp-border);
482
+ color: var(--pp-accent-secondary);
483
+ }
484
+
485
+ .pp-bpm-badge {
486
+ font-size: 10px;
487
+ color: var(--pp-text-dim);
488
+ }
489
+
490
+ .pp-track-title {
491
+ margin: 0;
492
+ font-size: 13px;
493
+ font-weight: 700;
494
+ color: var(--pp-text);
495
+ line-height: 1.3;
496
+ white-space: nowrap;
497
+ overflow: hidden;
498
+ text-overflow: ellipsis;
499
+ }
500
+
501
+ .pp-track-subtitle {
502
+ margin: 0;
503
+ font-size: 10px;
504
+ color: var(--pp-text-dim);
505
+ }
506
+
507
+ /* =========================================================================
508
+ DSP Spectrum Analyzer Visualizer
509
+ ========================================================================= */
510
+
511
+ .pp-visualizer {
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: 6px;
515
+ padding: 10px;
516
+ background: var(--pp-surface);
517
+ border: 1px solid var(--pp-border);
518
+ border-radius: 8px;
519
+ }
520
+
521
+ .pp-vis-header {
522
+ display: flex;
523
+ align-items: center;
524
+ justify-content: space-between;
525
+ gap: 12px;
526
+ min-height: 16px;
527
+ line-height: 1;
528
+ }
529
+
530
+ .pp-vis-title {
531
+ color: var(--pp-accent);
532
+ font-size: 10px;
533
+ font-weight: 700;
534
+ letter-spacing: 0.06em;
535
+ white-space: nowrap;
536
+ overflow: hidden;
537
+ text-overflow: ellipsis;
538
+ }
539
+
540
+ .pp-vis-dsp {
541
+ color: var(--pp-text-dim);
542
+ font-weight: 400;
543
+ margin-left: 4px;
544
+ }
545
+
546
+ .pp-vis-status {
547
+ display: inline-flex;
548
+ align-items: center;
549
+ gap: 5px;
550
+ color: var(--pp-text-dim);
551
+ font-size: 9px;
552
+ font-weight: 600;
553
+ letter-spacing: 0.05em;
554
+ white-space: nowrap;
555
+ flex-shrink: 0;
556
+ }
557
+
558
+ .pp-status-led {
559
+ width: 5px;
560
+ height: 5px;
561
+ border-radius: 50%;
562
+ background: var(--pp-text-dim);
563
+ opacity: 0.5;
564
+ }
565
+
566
+ .pp-status-led-active {
567
+ background: var(--pp-accent-secondary);
568
+ box-shadow: 0 0 6px var(--pp-accent-secondary);
569
+ opacity: 1;
570
+ animation: ppLedBlink 1.5s infinite ease-in-out;
571
+ }
572
+
573
+ .pp-vis-stage {
574
+ position: relative;
575
+ height: 48px;
576
+ display: flex;
577
+ align-items: flex-end;
578
+ background: rgba(0, 0, 0, 0.3);
579
+ border-radius: 4px;
580
+ overflow: hidden;
581
+ padding: 0 4px;
582
+ }
583
+
584
+ .pp-vis-grid {
585
+ position: absolute;
586
+ inset: 0;
587
+ display: flex;
588
+ flex-direction: column;
589
+ justify-content: space-between;
590
+ pointer-events: none;
591
+ padding: 4px 0;
592
+ }
593
+
594
+ .pp-grid-line {
595
+ height: 1px;
596
+ width: 100%;
597
+ background: var(--pp-grid);
598
+ }
599
+
600
+ .pp-vis-bars {
601
+ position: relative;
602
+ z-index: 2;
603
+ display: flex;
604
+ align-items: flex-end;
605
+ justify-content: space-between;
606
+ width: 100%;
607
+ height: 100%;
608
+ }
609
+
610
+ .pp-bar-col {
611
+ flex: 1;
612
+ display: flex;
613
+ align-items: flex-end;
614
+ justify-content: center;
615
+ height: 100%;
616
+ padding: 0 1px;
617
+ }
618
+
619
+ .pp-spectrum-bar {
620
+ width: 100%;
621
+ height: 3px;
622
+ background: var(--pp-accent);
623
+ border-radius: 1px 1px 0 0;
624
+ opacity: 0.25;
625
+ transition: height 0.18s ease-out, opacity 0.18s ease-out;
626
+ }
627
+
628
+ /* Procedural BPM DSP Keyframes when no live AudioContext */
629
+ .pp-is-playing .pp-bar-col:nth-child(1) .pp-spectrum-bar,
630
+ .pp-is-playing .pp-bar-col:nth-child(2) .pp-spectrum-bar {
631
+ animation: ppDspSubKick var(--bpm-beat, 400ms) infinite ease-in-out;
632
+ }
633
+ .pp-is-playing .pp-bar-col:nth-child(3) .pp-spectrum-bar,
634
+ .pp-is-playing .pp-bar-col:nth-child(4) .pp-spectrum-bar,
635
+ .pp-is-playing .pp-bar-col:nth-child(5) .pp-spectrum-bar {
636
+ animation: ppDspBassWave var(--bpm-two-beats, 800ms) infinite ease-in-out;
637
+ }
638
+ .pp-is-playing .pp-bar-col:nth-child(6) .pp-spectrum-bar,
639
+ .pp-is-playing .pp-bar-col:nth-child(7) .pp-spectrum-bar,
640
+ .pp-is-playing .pp-bar-col:nth-child(8) .pp-spectrum-bar,
641
+ .pp-is-playing .pp-bar-col:nth-child(9) .pp-spectrum-bar {
642
+ animation: ppDspMidsSnare var(--bpm-half-beat, 200ms) infinite ease-in-out;
643
+ }
644
+ .pp-is-playing .pp-bar-col:nth-child(10) .pp-spectrum-bar,
645
+ .pp-is-playing .pp-bar-col:nth-child(11) .pp-spectrum-bar,
646
+ .pp-is-playing .pp-bar-col:nth-child(12) .pp-spectrum-bar,
647
+ .pp-is-playing .pp-bar-col:nth-child(13) .pp-spectrum-bar {
648
+ animation: ppDspHighTransient var(--bpm-beat, 400ms) infinite ease-in-out;
649
+ }
650
+ .pp-is-playing .pp-bar-col:nth-child(14) .pp-spectrum-bar,
651
+ .pp-is-playing .pp-bar-col:nth-child(15) .pp-spectrum-bar,
652
+ .pp-is-playing .pp-bar-col:nth-child(16) .pp-spectrum-bar {
653
+ animation: ppDspAirFlutter var(--bpm-half-beat, 200ms) infinite ease-in-out;
654
+ }
655
+
656
+ .pp-freq-scale {
657
+ display: flex;
658
+ justify-content: space-between;
659
+ font-size: 8px;
660
+ color: var(--pp-text-dim);
661
+ padding: 0 2px;
662
+ }
663
+
664
+ /* =========================================================================
665
+ Mixcloud / Iframe Embed Container
666
+ ========================================================================= */
667
+
668
+ .pp-iframe-wrapper {
669
+ position: relative;
670
+ width: 100%;
671
+ height: 120px;
672
+ border-radius: 6px;
673
+ overflow: hidden;
674
+ border: 1px solid var(--pp-border);
675
+ background: rgba(0, 0, 0, 0.4);
676
+ }
677
+
678
+ .pp-mixcloud-iframe {
679
+ display: block;
680
+ width: 100%;
681
+ height: 120px;
682
+ border: none;
683
+ }
684
+
685
+ .pp-iframe-hint {
686
+ font-size: 9px;
687
+ color: var(--pp-text-dim);
688
+ text-align: center;
689
+ }
690
+
691
+ /* =========================================================================
692
+ Controls Row
693
+ ========================================================================= */
694
+
695
+ .pp-controls-row {
696
+ display: flex;
697
+ align-items: center;
698
+ justify-content: space-between;
699
+ gap: 8px;
700
+ }
701
+
702
+ .pp-ctrl-btn {
703
+ display: flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ width: 36px;
707
+ height: 36px;
708
+ border-radius: 8px;
709
+ background: var(--pp-surface);
710
+ border: 1px solid var(--pp-border);
711
+ color: var(--pp-text);
712
+ cursor: pointer;
713
+ transition: all 0.15s ease;
714
+ }
715
+
716
+ .pp-ctrl-btn:hover {
717
+ background: var(--pp-surface-hover);
718
+ border-color: var(--pp-accent);
719
+ color: var(--pp-accent);
720
+ transform: translateY(-1px);
721
+ }
722
+
723
+ .pp-ctrl-btn-main {
724
+ flex: 1;
725
+ display: flex;
726
+ align-items: center;
727
+ justify-content: center;
728
+ gap: 8px;
729
+ height: 36px;
730
+ padding: 0 14px;
731
+ border-radius: 8px;
732
+ background: var(--pp-accent);
733
+ border: 1px solid var(--pp-accent);
734
+ color: #050e14;
735
+ font-family: inherit;
736
+ font-size: 11px;
737
+ font-weight: 700;
738
+ letter-spacing: 0.05em;
739
+ cursor: pointer;
740
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
741
+ }
742
+
743
+ .pp-ctrl-btn-main:hover {
744
+ box-shadow: 0 0 16px var(--pp-accent-glow);
745
+ transform: translateY(-1px);
746
+ }
747
+
748
+ .pp-is-playing .pp-ctrl-btn-main {
749
+ background: var(--pp-surface);
750
+ border-color: var(--pp-accent);
751
+ color: var(--pp-accent);
752
+ }
753
+
754
+ /* =========================================================================
755
+ Playlist Tracklist
756
+ ========================================================================= */
757
+
758
+ .pp-playlist {
759
+ display: flex;
760
+ flex-direction: column;
761
+ gap: 6px;
762
+ border-top: 1px solid var(--pp-border);
763
+ padding-top: 12px;
764
+ }
765
+
766
+ .pp-playlist-header {
767
+ display: flex;
768
+ justify-content: space-between;
769
+ font-size: 9px;
770
+ font-weight: 700;
771
+ letter-spacing: 0.06em;
772
+ color: var(--pp-text-dim);
773
+ }
774
+
775
+ .pp-playlist-list {
776
+ display: flex;
777
+ flex-direction: column;
778
+ gap: 4px;
779
+ max-height: 140px;
780
+ overflow-y: auto;
781
+ scrollbar-width: thin;
782
+ scrollbar-color: var(--pp-border) transparent;
783
+ }
784
+
785
+ .pp-playlist-list::-webkit-scrollbar {
786
+ width: 4px;
787
+ }
788
+ .pp-playlist-list::-webkit-scrollbar-thumb {
789
+ background: var(--pp-border);
790
+ border-radius: 4px;
791
+ }
792
+
793
+ .pp-track-item {
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: space-between;
797
+ padding: 6px 8px;
798
+ border-radius: 6px;
799
+ background: transparent;
800
+ border: 1px solid transparent;
801
+ color: var(--pp-text-dim);
802
+ cursor: pointer;
803
+ font-family: inherit;
804
+ font-size: 10px;
805
+ transition: all 0.15s ease;
806
+ text-align: left;
807
+ }
808
+
809
+ .pp-track-item:hover {
810
+ background: var(--pp-surface);
811
+ color: var(--pp-text);
812
+ border-color: var(--pp-border);
813
+ }
814
+
815
+ .pp-track-item-active {
816
+ background: var(--pp-surface);
817
+ border-color: var(--pp-accent);
818
+ color: var(--pp-text);
819
+ }
820
+
821
+ .pp-track-item-left {
822
+ display: flex;
823
+ align-items: center;
824
+ gap: 6px;
825
+ overflow: hidden;
826
+ }
827
+
828
+ .pp-track-item-code {
829
+ color: var(--pp-accent);
830
+ font-weight: 700;
831
+ white-space: nowrap;
832
+ }
833
+
834
+ .pp-track-item-title {
835
+ white-space: nowrap;
836
+ overflow: hidden;
837
+ text-overflow: ellipsis;
838
+ }
839
+
840
+ .pp-track-item-right {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 8px;
844
+ font-size: 9px;
845
+ color: var(--pp-text-dim);
846
+ white-space: nowrap;
847
+ }
848
+
849
+
850
+ /* =========================================================================
851
+ Seamless & Themed Mixcloud Iframe Handling
852
+ ========================================================================= */
853
+
854
+ .pp-iframe-seamless {
855
+ position: absolute;
856
+ width: 1px;
857
+ height: 1px;
858
+ padding: 0;
859
+ margin: -1px;
860
+ overflow: hidden;
861
+ clip: rect(0, 0, 0, 0);
862
+ white-space: nowrap;
863
+ border: 0;
864
+ opacity: 0;
865
+ pointer-events: none;
866
+ }
867
+
868
+ .pp-iframe-themed iframe {
869
+ transition: filter 0.3s ease;
870
+ }
871
+
872
+ [data-pill-theme="orbital"] .pp-iframe-themed iframe {
873
+ filter: hue-rotate(170deg) contrast(1.1) brightness(0.9);
874
+ }
875
+
876
+ [data-pill-theme="cyberpunk"] .pp-iframe-themed iframe {
877
+ filter: hue-rotate(295deg) saturate(1.8) contrast(1.2) brightness(0.85);
878
+ }
879
+
880
+ [data-pill-theme="matrix"] .pp-iframe-themed iframe {
881
+ filter: hue-rotate(85deg) saturate(2.5) contrast(1.3) brightness(0.8);
882
+ }
883
+
884
+ [data-pill-theme="synthwave"] .pp-iframe-themed iframe {
885
+ filter: hue-rotate(230deg) saturate(1.5) contrast(1.15) brightness(0.9);
886
+ }
887
+
888
+ [data-pill-theme="minimal"] .pp-iframe-themed iframe {
889
+ filter: grayscale(1) contrast(1.2) brightness(0.85);
890
+ }
891
+
892
+ [data-pill-theme="stargate"] .pp-iframe-themed iframe {
893
+ filter: hue-rotate(200deg) saturate(1.3) contrast(1.1) brightness(0.9);
894
+ }
895
+
896
+ [data-pill-theme="amber"] .pp-iframe-themed iframe {
897
+ filter: hue-rotate(40deg) saturate(2.2) contrast(1.2) brightness(0.85);
898
+ }
899
+
900
+ [data-pill-theme="nordic"] .pp-iframe-themed iframe {
901
+ filter: hue-rotate(190deg) saturate(0.9) contrast(1.05) brightness(0.95);
902
+ }
903
+
904
+ /* =========================================================================
905
+ Audio Seekbar (Progress & Scrubbing)
906
+ ========================================================================= */
907
+
908
+ .pp-seekbar-wrapper {
909
+ display: flex;
910
+ align-items: center;
911
+ gap: 10px;
912
+ width: 100%;
913
+ padding: 2px 0 4px 0;
914
+ user-select: none;
915
+ }
916
+
917
+ .pp-time {
918
+ font-family: var(--pp-font-mono, 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
919
+ font-size: 10px;
920
+ font-weight: 600;
921
+ letter-spacing: 0.05em;
922
+ color: var(--pp-text-dim);
923
+ min-width: 34px;
924
+ text-align: center;
925
+ font-variant-numeric: tabular-nums;
926
+ line-height: 1;
927
+ }
928
+
929
+ .pp-time-current {
930
+ color: var(--pp-accent);
931
+ }
932
+
933
+ .pp-seekbar-track {
934
+ position: relative;
935
+ flex: 1;
936
+ height: 4px;
937
+ background: var(--pp-surface-hover, rgba(255, 255, 255, 0.08));
938
+ border: 1px solid var(--pp-border);
939
+ border-radius: 9999px;
940
+ cursor: pointer;
941
+ touch-action: none;
942
+ transition: height 0.15s ease, border-color 0.15s ease;
943
+ outline: none;
944
+ }
945
+
946
+ .pp-seekbar-track:focus-visible {
947
+ border-color: var(--pp-accent);
948
+ box-shadow: 0 0 8px var(--pp-accent-glow);
949
+ }
950
+
951
+ .pp-seekbar-track:hover,
952
+ .pp-seekbar-dragging {
953
+ height: 6px;
954
+ border-color: var(--pp-accent);
955
+ }
956
+
957
+ .pp-seekbar-fill {
958
+ position: absolute;
959
+ top: 0;
960
+ left: 0;
961
+ height: 100%;
962
+ background: var(--pp-accent);
963
+ border-radius: 9999px;
964
+ box-shadow: 0 0 8px var(--pp-accent-glow);
965
+ pointer-events: none;
966
+ transition: width 0.04s linear;
967
+ }
968
+
969
+ .pp-seekbar-thumb {
970
+ position: absolute;
971
+ top: 50%;
972
+ transform: translate(-50%, -50%);
973
+ width: 10px;
974
+ height: 10px;
975
+ border-radius: 50%;
976
+ background: #ffffff;
977
+ border: 2px solid var(--pp-accent);
978
+ box-shadow: 0 0 8px var(--pp-accent);
979
+ pointer-events: none;
980
+ opacity: 0;
981
+ transition: opacity 0.15s ease, transform 0.15s ease;
982
+ }
983
+
984
+ .pp-seekbar-track:hover .pp-seekbar-thumb,
985
+ .pp-seekbar-dragging .pp-seekbar-thumb {
986
+ opacity: 1;
987
+ transform: translate(-50%, -50%) scale(1.2);
988
+ }