@gentomiyano/optimized-web-audio-player 0.1.0 → 0.2.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 (47) hide show
  1. package/README.md +177 -159
  2. package/dist/config/index.d.ts +1 -1
  3. package/dist/config/index.js +1 -0
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/consumer/index.d.ts +1 -1
  6. package/dist/consumer/index.js.map +1 -1
  7. package/dist/contracts/index.d.ts +2 -2
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/media-delivery/index.d.ts +1 -1
  12. package/dist/media-delivery/index.js.map +1 -1
  13. package/dist/{media-element-C9dis4aG.d.ts → media-element-DyMO-PhK.d.ts} +1 -1
  14. package/dist/{player-DE9Vqztu.d.ts → player-BxNFzRq4.d.ts} +53 -1
  15. package/dist/ports/index.d.ts +2 -2
  16. package/dist/react/index.d.ts +14 -3
  17. package/dist/react/index.js +193 -12
  18. package/dist/react/index.js.map +1 -1
  19. package/dist/testing/index.d.ts +1 -1
  20. package/dist/testing/index.js +1 -0
  21. package/dist/testing/index.js.map +1 -1
  22. package/dist/ui/index.d.ts +10 -2
  23. package/dist/ui/index.js +227 -56
  24. package/dist/ui/index.js.map +1 -1
  25. package/dist/ui/player-tokens.css +572 -572
  26. package/dist/ui/player-views.css +713 -654
  27. package/dist/ui/styles.css +2 -2
  28. package/package.json +12 -2
  29. package/dist/consumer-smoke/node_modules/.modules.yaml +0 -30
  30. package/dist/consumer-smoke/node_modules/.package-map.json +0 -1
  31. package/dist/consumer-smoke/node_modules/.pnpm/lock.yaml +0 -57
  32. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/LICENSE +0 -21
  33. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/README.md +0 -9
  34. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +0 -414
  35. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_mock.production.js +0 -406
  36. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +0 -150
  37. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.js +0 -140
  38. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.development.js +0 -364
  39. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.native.development.js +0 -350
  40. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.native.production.js +0 -330
  41. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.production.js +0 -340
  42. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/index.js +0 -7
  43. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/index.native.js +0 -7
  44. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/package.json +0 -27
  45. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/unstable_mock.js +0 -7
  46. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/unstable_post_task.js +0 -7
  47. package/dist/consumer-smoke/node_modules/.pnpm-workspace-state-v1.json +0 -29
@@ -1,572 +1,572 @@
1
- :where(.player-surface, .player-debug-panel) {
2
- --player-bg: #050505;
3
- --player-panel: #0b0c0d;
4
- --player-panel-soft: #111315;
5
- --player-text: #f7f7f3;
6
- --player-muted: rgb(247 247 243 / 0.58);
7
- --player-faint: rgb(247 247 243 / 0.18);
8
- --player-rule: rgb(247 247 243 / 0.22);
9
- --player-brand: #477fa7;
10
- --player-progress: #477fa7;
11
- --player-waveform-rest: rgb(247 247 243 / 0.27);
12
- --player-seek-track: rgb(247 247 243 / 0.3);
13
- --player-active-wash: rgb(71 127 167 / 0.1);
14
- --player-accent: var(--player-brand);
15
- --player-accent-contrast: #fff;
16
- --player-danger: #c76d67;
17
- --player-focus: #77a9cc;
18
- --player-control-bg: transparent;
19
- --player-font-sans:
20
- Inter, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif;
21
- --player-font-title:
22
- var(
23
- --player-font-title-override,
24
- Bahnschrift,
25
- "DIN Alternate",
26
- "Arial Narrow",
27
- "Roboto Condensed",
28
- "Helvetica Neue",
29
- Arial,
30
- sans-serif
31
- );
32
- --player-font-title-japanese:
33
- var(
34
- --player-font-title-japanese-override,
35
- "IBM Plex Sans JP",
36
- "Yu Gothic",
37
- YuGothic,
38
- "Hiragino Sans",
39
- "Hiragino Kaku Gothic ProN",
40
- "Noto Sans JP",
41
- "BIZ UDPGothic",
42
- Meiryo,
43
- sans-serif
44
- );
45
- --player-font-digital:
46
- "Roboto Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
47
- --player-hit: 44px;
48
- color: var(--player-text);
49
- font-family: var(--player-font-sans);
50
- }
51
-
52
- :where(.player-surface, .player-debug-panel)[data-appearance="light"] {
53
- --player-bg: #f7f6f0;
54
- --player-panel: #ecece5;
55
- --player-panel-soft: #e1e3da;
56
- --player-text: #11120f;
57
- --player-muted: rgb(17 18 15 / 0.64);
58
- --player-faint: rgb(17 18 15 / 0.14);
59
- --player-rule: rgb(17 18 15 / 0.23);
60
- --player-brand: #477fa7;
61
- --player-progress: #001f3f;
62
- --player-waveform-rest: rgb(34 53 63 / 0.38);
63
- --player-seek-track: rgb(17 18 15 / 0.28);
64
- --player-active-wash: rgb(71 127 167 / 0.08);
65
- --player-accent: var(--player-brand);
66
- --player-accent-contrast: #fff;
67
- --player-danger: #9f453f;
68
- --player-focus: #2f668e;
69
- --player-control-bg: transparent;
70
- --player-lcd: #d3d2c2;
71
- --player-lcd-rule: rgb(66 68 57 / 0.26);
72
- }
73
-
74
- .player-surface {
75
- box-sizing: border-box;
76
- width: 100%;
77
- max-width: 100%;
78
- min-width: 0;
79
- overflow: hidden;
80
- border: 1px solid var(--player-rule);
81
- border-radius: 2px;
82
- background: var(--player-bg);
83
- color: var(--player-text);
84
- }
85
-
86
- .player-surface *,
87
- .player-debug-panel * {
88
- box-sizing: border-box;
89
- }
90
-
91
- .player-visually-hidden {
92
- position: absolute;
93
- width: 1px;
94
- height: 1px;
95
- padding: 0;
96
- overflow: hidden;
97
- clip: rect(0, 0, 0, 0);
98
- white-space: nowrap;
99
- border: 0;
100
- }
101
-
102
- .player-artwork {
103
- position: relative;
104
- display: block;
105
- width: 100%;
106
- height: 100%;
107
- min-width: 0;
108
- overflow: hidden;
109
- border: 0;
110
- background: var(--player-panel-soft);
111
- }
112
-
113
- .player-artwork__image {
114
- display: block;
115
- width: 100%;
116
- height: 100%;
117
- object-fit: cover;
118
- }
119
-
120
- .player-artwork--image::after {
121
- position: absolute;
122
- inset: 0;
123
- box-shadow: inset 0 0 4px 1px var(--player-bg);
124
- content: "";
125
- opacity: 0.36;
126
- pointer-events: none;
127
- }
128
-
129
- .player-artwork--fallback {
130
- background: var(--player-panel-soft);
131
- }
132
-
133
- .player-artwork--fallback::before,
134
- .player-artwork--fallback::after,
135
- .player-artwork--fallback > span::before {
136
- position: absolute;
137
- content: "";
138
- background: var(--player-rule);
139
- }
140
-
141
- .player-artwork--fallback::before {
142
- inset: 18% 46% 18% auto;
143
- width: 1px;
144
- }
145
-
146
- .player-artwork--fallback::after {
147
- inset: 46% 18% auto;
148
- height: 1px;
149
- }
150
-
151
- .player-artwork--fallback > span::before {
152
- inset: 28%;
153
- border: 1px solid var(--player-rule);
154
- background: transparent;
155
- }
156
-
157
- .player-metadata {
158
- display: grid;
159
- min-width: 0;
160
- gap: 0.22rem;
161
- }
162
-
163
- .player-kicker,
164
- .player-status,
165
- .player-time,
166
- .player-queue-number,
167
- .player-queue-count {
168
- font-family: var(--player-font-digital);
169
- font-size: 0.68rem;
170
- font-variant-numeric: tabular-nums;
171
- letter-spacing: 0.09em;
172
- text-transform: uppercase;
173
- }
174
-
175
- .player-kicker,
176
- .player-status {
177
- color: var(--player-accent);
178
- }
179
-
180
- .player-title,
181
- .player-creator,
182
- .player-collection {
183
- min-width: 0;
184
- overflow: hidden;
185
- text-overflow: ellipsis;
186
- white-space: nowrap;
187
- }
188
-
189
- .player-title {
190
- display: block;
191
- position: relative;
192
- width: 100%;
193
- font-size: clamp(0.94rem, 1.8vw, 1.25rem);
194
- font-family: var(--player-font-title);
195
- font-stretch: semi-condensed;
196
- font-weight: 350;
197
- font-variation-settings: "wght" 340, "wdth" 88;
198
- letter-spacing: 0.025em;
199
- }
200
-
201
- .player-title__text {
202
- display: inline-block;
203
- min-width: max-content;
204
- white-space: nowrap;
205
- }
206
-
207
- .player-title[data-script="japanese"] {
208
- font-family: var(--player-font-title-japanese);
209
- font-feature-settings: "palt" 1;
210
- font-stretch: normal;
211
- font-variation-settings: normal;
212
- font-weight:
213
- var(--player-font-title-japanese-weight-override, 300);
214
- letter-spacing:
215
- var(
216
- --player-font-title-japanese-letter-spacing-override,
217
- 0.025em
218
- );
219
- }
220
-
221
- .player-title[data-scroll="true"] .player-title__text {
222
- animation:
223
- player-title-marquee var(--player-title-scroll-duration) linear
224
- infinite;
225
- will-change: transform;
226
- }
227
-
228
- .player-creator,
229
- .player-collection {
230
- color: var(--player-muted);
231
- font-size: 0.76rem;
232
- }
233
-
234
- .player-icon-button,
235
- .player-error button {
236
- display: inline-flex;
237
- align-items: center;
238
- justify-content: center;
239
- min-width: var(--player-hit);
240
- min-height: var(--player-hit);
241
- padding: 0;
242
- border: 0;
243
- border-radius: 1px;
244
- background: var(--player-control-bg);
245
- color: var(--player-text);
246
- cursor: pointer;
247
- }
248
-
249
- .player-icon-button:hover:not(:disabled),
250
- .player-icon-button[aria-pressed="true"] {
251
- color: var(--player-brand);
252
- }
253
-
254
- .player-icon-button:active:not(:disabled) {
255
- background: var(--player-active-wash);
256
- }
257
-
258
- .player-icon-button:disabled {
259
- cursor: not-allowed;
260
- opacity: 0.32;
261
- }
262
-
263
- .player-icon-button:focus-visible,
264
- .player-error button:focus-visible,
265
- .player-surface input:focus-visible,
266
- .player-debug-panel button:focus-visible,
267
- .player-debug-panel input:focus-visible,
268
- .player-debug-panel select:focus-visible,
269
- .player-debug-panel textarea:focus-visible {
270
- outline: 2px solid var(--player-focus);
271
- outline-offset: 3px;
272
- }
273
-
274
- .player-play-button {
275
- min-width: 50px;
276
- min-height: 50px;
277
- border: 1px solid var(--player-rule);
278
- border-radius: 50%;
279
- color: var(--player-text);
280
- }
281
-
282
- .player-play-button:hover:not(:disabled),
283
- .player-play-button--active {
284
- border-color: var(--player-brand);
285
- background: transparent;
286
- color: var(--player-brand);
287
- }
288
-
289
- .player-transport {
290
- display: flex;
291
- align-items: center;
292
- justify-content: center;
293
- min-width: 0;
294
- gap: clamp(0.1rem, 1vw, 0.55rem);
295
- }
296
-
297
- .player-transport--compact {
298
- gap: 0;
299
- }
300
-
301
- .player-transport--compact .player-play-button {
302
- min-width: var(--player-hit);
303
- min-height: var(--player-hit);
304
- border: 1px solid var(--player-rule);
305
- border-radius: 50%;
306
- }
307
-
308
- .player-time {
309
- display: flex;
310
- align-items: center;
311
- justify-content: space-between;
312
- gap: 0.5rem;
313
- color: var(--player-muted);
314
- }
315
-
316
- .player-waveform {
317
- display: block;
318
- width: 100%;
319
- height: 42px;
320
- overflow: visible;
321
- color: var(--player-waveform-rest);
322
- }
323
-
324
- .player-waveform__base {
325
- fill: none;
326
- stroke: currentColor;
327
- stroke-width: 0.5;
328
- vector-effect: non-scaling-stroke;
329
- }
330
-
331
- .player-waveform__played {
332
- fill: none;
333
- stroke: var(--player-progress);
334
- stroke-width: 0.5;
335
- vector-effect: non-scaling-stroke;
336
- }
337
-
338
- .player-seek {
339
- position: relative;
340
- display: flex;
341
- align-items: center;
342
- width: 100%;
343
- min-width: 0;
344
- min-height: var(--player-hit);
345
- cursor: pointer;
346
- }
347
-
348
- .player-seek::before,
349
- .player-seek__progress {
350
- position: absolute;
351
- top: 50%;
352
- left: 0;
353
- height: 1px;
354
- pointer-events: none;
355
- content: "";
356
- }
357
-
358
- .player-seek::before {
359
- width: 100%;
360
- background: var(--player-seek-track);
361
- }
362
-
363
- .player-seek__progress {
364
- background: var(--player-progress);
365
- }
366
-
367
- .player-seek[data-disabled="true"] {
368
- cursor: not-allowed;
369
- opacity: 0.38;
370
- }
371
-
372
- .player-seek input,
373
- .player-volume input {
374
- position: relative;
375
- z-index: 1;
376
- width: 100%;
377
- height: var(--player-hit);
378
- margin: 0;
379
- cursor: inherit;
380
- appearance: none;
381
- background: transparent;
382
- }
383
-
384
- .player-seek input {
385
- touch-action: pan-y;
386
- user-select: none;
387
- }
388
-
389
- .player-seek input::-webkit-slider-runnable-track {
390
- height: 1px;
391
- background: transparent;
392
- }
393
-
394
- .player-seek input::-moz-range-track {
395
- height: 1px;
396
- border: 0;
397
- background: transparent;
398
- }
399
-
400
- .player-volume input::-webkit-slider-runnable-track {
401
- height: 1px;
402
- background: var(--player-seek-track);
403
- }
404
-
405
- .player-volume input::-moz-range-track {
406
- height: 1px;
407
- border: 0;
408
- background: var(--player-seek-track);
409
- }
410
-
411
- .player-seek input::-webkit-slider-thumb,
412
- .player-volume input::-webkit-slider-thumb {
413
- width: 10px;
414
- height: 10px;
415
- margin-top: -4px;
416
- appearance: none;
417
- border: 0;
418
- border-radius: 50%;
419
- background: var(--player-brand);
420
- }
421
-
422
- .player-seek input::-moz-range-thumb,
423
- .player-volume input::-moz-range-thumb {
424
- width: 10px;
425
- height: 10px;
426
- border: 0;
427
- border-radius: 50%;
428
- background: var(--player-brand);
429
- }
430
-
431
- .player-volume {
432
- display: flex;
433
- align-items: center;
434
- min-width: 0;
435
- }
436
-
437
- .player-volume label {
438
- width: min(120px, 18vw);
439
- }
440
-
441
- .player-volume-popover {
442
- position: relative;
443
- display: flex;
444
- flex: none;
445
- align-items: center;
446
- justify-content: center;
447
- }
448
-
449
- .player-volume-popover__panel {
450
- position: absolute;
451
- z-index: 10;
452
- bottom: calc(100% + 0.45rem);
453
- left: 50%;
454
- display: grid;
455
- width: 54px;
456
- min-height: 136px;
457
- padding: 0.55rem 0.35rem 0.4rem;
458
- transform: translateX(-50%);
459
- border: 1px solid var(--player-rule);
460
- border-radius: 2px;
461
- background: var(--player-panel);
462
- place-items: center;
463
- }
464
-
465
- .player-volume-popover__panel label {
466
- display: flex;
467
- width: var(--player-hit);
468
- height: 102px;
469
- align-items: center;
470
- justify-content: center;
471
- }
472
-
473
- .player-volume-popover__panel input {
474
- width: var(--player-hit);
475
- height: 102px;
476
- margin: 0;
477
- cursor: pointer;
478
- appearance: none;
479
- background: transparent;
480
- direction: rtl;
481
- writing-mode: vertical-lr;
482
- }
483
-
484
- .player-volume-popover__panel input::-webkit-slider-runnable-track {
485
- width: 2px;
486
- height: 100%;
487
- background: var(--player-rule);
488
- }
489
-
490
- .player-volume-popover__panel input::-moz-range-track {
491
- width: 2px;
492
- height: 100%;
493
- border: 0;
494
- background: var(--player-rule);
495
- }
496
-
497
- .player-volume-popover__panel input::-webkit-slider-thumb {
498
- width: 10px;
499
- height: 10px;
500
- margin-left: -4px;
501
- appearance: none;
502
- border: 0;
503
- border-radius: 50%;
504
- background: var(--player-accent);
505
- }
506
-
507
- .player-volume-popover__panel input::-moz-range-thumb {
508
- width: 10px;
509
- height: 10px;
510
- border: 0;
511
- border-radius: 50%;
512
- background: var(--player-accent);
513
- }
514
-
515
- .player-volume-popover__panel output {
516
- color: var(--player-muted);
517
- font-family: var(--player-font-digital);
518
- font-size: 0.62rem;
519
- font-variant-numeric: tabular-nums;
520
- }
521
-
522
- .player-error {
523
- display: flex;
524
- align-items: center;
525
- justify-content: space-between;
526
- gap: 1rem;
527
- padding: 0.65rem 0.8rem;
528
- border-top: 1px solid var(--player-danger);
529
- color: var(--player-danger);
530
- font-size: 0.78rem;
531
- }
532
-
533
- .player-error button {
534
- gap: 0.35rem;
535
- min-height: 36px;
536
- padding: 0 0.6rem;
537
- color: inherit;
538
- font: inherit;
539
- }
540
-
541
- @media (prefers-reduced-motion: reduce) {
542
- :where(.player-surface, .player-debug-panel) *,
543
- :where(.player-surface, .player-debug-panel) *::before,
544
- :where(.player-surface, .player-debug-panel) *::after {
545
- scroll-behavior: auto !important;
546
- transition-duration: 0.01ms !important;
547
- animation-duration: 0.01ms !important;
548
- animation-iteration-count: 1 !important;
549
- }
550
-
551
- .player-title[data-scroll="true"] .player-title__text {
552
- animation-duration: var(--player-title-scroll-duration) !important;
553
- animation-iteration-count: infinite !important;
554
- }
555
- }
556
-
557
- @keyframes player-title-marquee {
558
- 0%,
559
- 12% {
560
- transform: translateX(0);
561
- }
562
-
563
- 82%,
564
- 94% {
565
- transform: translateX(var(--player-title-scroll-offset));
566
- }
567
-
568
- 94.01%,
569
- 100% {
570
- transform: translateX(0);
571
- }
572
- }
1
+ :where(.player-surface, .player-debug-panel) {
2
+ --player-bg: #050505;
3
+ --player-panel: #0b0c0d;
4
+ --player-panel-soft: #111315;
5
+ --player-text: #f7f7f3;
6
+ --player-muted: rgb(247 247 243 / 0.58);
7
+ --player-faint: rgb(247 247 243 / 0.18);
8
+ --player-rule: rgb(247 247 243 / 0.22);
9
+ --player-brand: #477fa7;
10
+ --player-progress: #477fa7;
11
+ --player-waveform-rest: rgb(247 247 243 / 0.27);
12
+ --player-seek-track: rgb(247 247 243 / 0.3);
13
+ --player-active-wash: rgb(71 127 167 / 0.1);
14
+ --player-accent: var(--player-brand);
15
+ --player-accent-contrast: #fff;
16
+ --player-danger: #c76d67;
17
+ --player-focus: #77a9cc;
18
+ --player-control-bg: transparent;
19
+ --player-font-sans:
20
+ Inter, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif;
21
+ --player-font-title:
22
+ var(
23
+ --player-font-title-override,
24
+ Bahnschrift,
25
+ "DIN Alternate",
26
+ "Arial Narrow",
27
+ "Roboto Condensed",
28
+ "Helvetica Neue",
29
+ Arial,
30
+ sans-serif
31
+ );
32
+ --player-font-title-japanese:
33
+ var(
34
+ --player-font-title-japanese-override,
35
+ "IBM Plex Sans JP",
36
+ "Yu Gothic",
37
+ YuGothic,
38
+ "Hiragino Sans",
39
+ "Hiragino Kaku Gothic ProN",
40
+ "Noto Sans JP",
41
+ "BIZ UDPGothic",
42
+ Meiryo,
43
+ sans-serif
44
+ );
45
+ --player-font-digital:
46
+ "Roboto Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
47
+ --player-hit: 44px;
48
+ color: var(--player-text);
49
+ font-family: var(--player-font-sans);
50
+ }
51
+
52
+ :where(.player-surface, .player-debug-panel)[data-appearance="light"] {
53
+ --player-bg: #f7f6f0;
54
+ --player-panel: #ecece5;
55
+ --player-panel-soft: #e1e3da;
56
+ --player-text: #11120f;
57
+ --player-muted: rgb(17 18 15 / 0.64);
58
+ --player-faint: rgb(17 18 15 / 0.14);
59
+ --player-rule: rgb(17 18 15 / 0.23);
60
+ --player-brand: #477fa7;
61
+ --player-progress: #001f3f;
62
+ --player-waveform-rest: rgb(34 53 63 / 0.38);
63
+ --player-seek-track: rgb(17 18 15 / 0.28);
64
+ --player-active-wash: rgb(71 127 167 / 0.08);
65
+ --player-accent: var(--player-brand);
66
+ --player-accent-contrast: #fff;
67
+ --player-danger: #9f453f;
68
+ --player-focus: #2f668e;
69
+ --player-control-bg: transparent;
70
+ --player-lcd: #d3d2c2;
71
+ --player-lcd-rule: rgb(66 68 57 / 0.26);
72
+ }
73
+
74
+ .player-surface {
75
+ box-sizing: border-box;
76
+ width: 100%;
77
+ max-width: 100%;
78
+ min-width: 0;
79
+ overflow: hidden;
80
+ border: 1px solid var(--player-rule);
81
+ border-radius: 2px;
82
+ background: var(--player-bg);
83
+ color: var(--player-text);
84
+ }
85
+
86
+ .player-surface *,
87
+ .player-debug-panel * {
88
+ box-sizing: border-box;
89
+ }
90
+
91
+ .player-visually-hidden {
92
+ position: absolute;
93
+ width: 1px;
94
+ height: 1px;
95
+ padding: 0;
96
+ overflow: hidden;
97
+ clip: rect(0, 0, 0, 0);
98
+ white-space: nowrap;
99
+ border: 0;
100
+ }
101
+
102
+ .player-artwork {
103
+ position: relative;
104
+ display: block;
105
+ width: 100%;
106
+ height: 100%;
107
+ min-width: 0;
108
+ overflow: hidden;
109
+ border: 0;
110
+ background: var(--player-panel-soft);
111
+ }
112
+
113
+ .player-artwork__image {
114
+ display: block;
115
+ width: 100%;
116
+ height: 100%;
117
+ object-fit: cover;
118
+ }
119
+
120
+ .player-artwork--image::after {
121
+ position: absolute;
122
+ inset: 0;
123
+ box-shadow: inset 0 0 4px 1px var(--player-bg);
124
+ content: "";
125
+ opacity: 0.36;
126
+ pointer-events: none;
127
+ }
128
+
129
+ .player-artwork--fallback {
130
+ background: var(--player-panel-soft);
131
+ }
132
+
133
+ .player-artwork--fallback::before,
134
+ .player-artwork--fallback::after,
135
+ .player-artwork--fallback > span::before {
136
+ position: absolute;
137
+ content: "";
138
+ background: var(--player-rule);
139
+ }
140
+
141
+ .player-artwork--fallback::before {
142
+ inset: 18% 46% 18% auto;
143
+ width: 1px;
144
+ }
145
+
146
+ .player-artwork--fallback::after {
147
+ inset: 46% 18% auto;
148
+ height: 1px;
149
+ }
150
+
151
+ .player-artwork--fallback > span::before {
152
+ inset: 28%;
153
+ border: 1px solid var(--player-rule);
154
+ background: transparent;
155
+ }
156
+
157
+ .player-metadata {
158
+ display: grid;
159
+ min-width: 0;
160
+ gap: 0.22rem;
161
+ }
162
+
163
+ .player-kicker,
164
+ .player-status,
165
+ .player-time,
166
+ .player-queue-number,
167
+ .player-queue-count {
168
+ font-family: var(--player-font-digital);
169
+ font-size: 0.68rem;
170
+ font-variant-numeric: tabular-nums;
171
+ letter-spacing: 0.09em;
172
+ text-transform: uppercase;
173
+ }
174
+
175
+ .player-kicker,
176
+ .player-status {
177
+ color: var(--player-accent);
178
+ }
179
+
180
+ .player-title,
181
+ .player-creator,
182
+ .player-collection {
183
+ min-width: 0;
184
+ overflow: hidden;
185
+ text-overflow: ellipsis;
186
+ white-space: nowrap;
187
+ }
188
+
189
+ .player-title {
190
+ display: block;
191
+ position: relative;
192
+ width: 100%;
193
+ font-size: clamp(0.94rem, 1.8vw, 1.25rem);
194
+ font-family: var(--player-font-title);
195
+ font-stretch: semi-condensed;
196
+ font-weight: 350;
197
+ font-variation-settings: "wght" 340, "wdth" 88;
198
+ letter-spacing: 0.025em;
199
+ }
200
+
201
+ .player-title__text {
202
+ display: inline-block;
203
+ min-width: max-content;
204
+ white-space: nowrap;
205
+ }
206
+
207
+ .player-title[data-script="japanese"] {
208
+ font-family: var(--player-font-title-japanese);
209
+ font-feature-settings: "palt" 1;
210
+ font-stretch: normal;
211
+ font-variation-settings: normal;
212
+ font-weight:
213
+ var(--player-font-title-japanese-weight-override, 300);
214
+ letter-spacing:
215
+ var(
216
+ --player-font-title-japanese-letter-spacing-override,
217
+ 0.025em
218
+ );
219
+ }
220
+
221
+ .player-title[data-scroll="true"] .player-title__text {
222
+ animation:
223
+ player-title-marquee var(--player-title-scroll-duration) linear
224
+ infinite;
225
+ will-change: transform;
226
+ }
227
+
228
+ .player-creator,
229
+ .player-collection {
230
+ color: var(--player-muted);
231
+ font-size: 0.76rem;
232
+ }
233
+
234
+ .player-icon-button,
235
+ .player-error button {
236
+ display: inline-flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ min-width: var(--player-hit);
240
+ min-height: var(--player-hit);
241
+ padding: 0;
242
+ border: 0;
243
+ border-radius: 1px;
244
+ background: var(--player-control-bg);
245
+ color: var(--player-text);
246
+ cursor: pointer;
247
+ }
248
+
249
+ .player-icon-button:hover:not(:disabled),
250
+ .player-icon-button[aria-pressed="true"] {
251
+ color: var(--player-brand);
252
+ }
253
+
254
+ .player-icon-button:active:not(:disabled) {
255
+ background: var(--player-active-wash);
256
+ }
257
+
258
+ .player-icon-button:disabled {
259
+ cursor: not-allowed;
260
+ opacity: 0.32;
261
+ }
262
+
263
+ .player-icon-button:focus-visible,
264
+ .player-error button:focus-visible,
265
+ .player-surface input:focus-visible,
266
+ .player-debug-panel button:focus-visible,
267
+ .player-debug-panel input:focus-visible,
268
+ .player-debug-panel select:focus-visible,
269
+ .player-debug-panel textarea:focus-visible {
270
+ outline: 2px solid var(--player-focus);
271
+ outline-offset: 3px;
272
+ }
273
+
274
+ .player-play-button {
275
+ min-width: 50px;
276
+ min-height: 50px;
277
+ border: 1px solid var(--player-rule);
278
+ border-radius: 50%;
279
+ color: var(--player-text);
280
+ }
281
+
282
+ .player-play-button:hover:not(:disabled),
283
+ .player-play-button--active {
284
+ border-color: var(--player-brand);
285
+ background: transparent;
286
+ color: var(--player-brand);
287
+ }
288
+
289
+ .player-transport {
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ min-width: 0;
294
+ gap: clamp(0.1rem, 1vw, 0.55rem);
295
+ }
296
+
297
+ .player-transport--compact {
298
+ gap: 0;
299
+ }
300
+
301
+ .player-transport--compact .player-play-button {
302
+ min-width: var(--player-hit);
303
+ min-height: var(--player-hit);
304
+ border: 1px solid var(--player-rule);
305
+ border-radius: 50%;
306
+ }
307
+
308
+ .player-time {
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: space-between;
312
+ gap: 0.5rem;
313
+ color: var(--player-muted);
314
+ }
315
+
316
+ .player-waveform {
317
+ display: block;
318
+ width: 100%;
319
+ height: 42px;
320
+ overflow: visible;
321
+ color: var(--player-waveform-rest);
322
+ }
323
+
324
+ .player-waveform__base {
325
+ fill: none;
326
+ stroke: currentColor;
327
+ stroke-width: 0.5;
328
+ vector-effect: non-scaling-stroke;
329
+ }
330
+
331
+ .player-waveform__played {
332
+ fill: none;
333
+ stroke: var(--player-progress);
334
+ stroke-width: 0.5;
335
+ vector-effect: non-scaling-stroke;
336
+ }
337
+
338
+ .player-seek {
339
+ position: relative;
340
+ display: flex;
341
+ align-items: center;
342
+ width: 100%;
343
+ min-width: 0;
344
+ min-height: var(--player-hit);
345
+ cursor: pointer;
346
+ }
347
+
348
+ .player-seek::before,
349
+ .player-seek__progress {
350
+ position: absolute;
351
+ top: 50%;
352
+ left: 0;
353
+ height: 1px;
354
+ pointer-events: none;
355
+ content: "";
356
+ }
357
+
358
+ .player-seek::before {
359
+ width: 100%;
360
+ background: var(--player-seek-track);
361
+ }
362
+
363
+ .player-seek__progress {
364
+ background: var(--player-progress);
365
+ }
366
+
367
+ .player-seek[data-disabled="true"] {
368
+ cursor: not-allowed;
369
+ opacity: 0.38;
370
+ }
371
+
372
+ .player-seek input,
373
+ .player-volume input {
374
+ position: relative;
375
+ z-index: 1;
376
+ width: 100%;
377
+ height: var(--player-hit);
378
+ margin: 0;
379
+ cursor: inherit;
380
+ appearance: none;
381
+ background: transparent;
382
+ }
383
+
384
+ .player-seek input {
385
+ touch-action: pan-y;
386
+ user-select: none;
387
+ }
388
+
389
+ .player-seek input::-webkit-slider-runnable-track {
390
+ height: 1px;
391
+ background: transparent;
392
+ }
393
+
394
+ .player-seek input::-moz-range-track {
395
+ height: 1px;
396
+ border: 0;
397
+ background: transparent;
398
+ }
399
+
400
+ .player-volume input::-webkit-slider-runnable-track {
401
+ height: 1px;
402
+ background: var(--player-seek-track);
403
+ }
404
+
405
+ .player-volume input::-moz-range-track {
406
+ height: 1px;
407
+ border: 0;
408
+ background: var(--player-seek-track);
409
+ }
410
+
411
+ .player-seek input::-webkit-slider-thumb,
412
+ .player-volume input::-webkit-slider-thumb {
413
+ width: 10px;
414
+ height: 10px;
415
+ margin-top: -4px;
416
+ appearance: none;
417
+ border: 0;
418
+ border-radius: 50%;
419
+ background: var(--player-brand);
420
+ }
421
+
422
+ .player-seek input::-moz-range-thumb,
423
+ .player-volume input::-moz-range-thumb {
424
+ width: 10px;
425
+ height: 10px;
426
+ border: 0;
427
+ border-radius: 50%;
428
+ background: var(--player-brand);
429
+ }
430
+
431
+ .player-volume {
432
+ display: flex;
433
+ align-items: center;
434
+ min-width: 0;
435
+ }
436
+
437
+ .player-volume label {
438
+ width: min(120px, 18vw);
439
+ }
440
+
441
+ .player-volume-popover {
442
+ position: relative;
443
+ display: flex;
444
+ flex: none;
445
+ align-items: center;
446
+ justify-content: center;
447
+ }
448
+
449
+ .player-volume-popover__panel {
450
+ position: absolute;
451
+ z-index: 10;
452
+ bottom: calc(100% + 0.45rem);
453
+ left: 50%;
454
+ display: grid;
455
+ width: 54px;
456
+ min-height: 136px;
457
+ padding: 0.55rem 0.35rem 0.4rem;
458
+ transform: translateX(-50%);
459
+ border: 1px solid var(--player-rule);
460
+ border-radius: 2px;
461
+ background: var(--player-panel);
462
+ place-items: center;
463
+ }
464
+
465
+ .player-volume-popover__panel label {
466
+ display: flex;
467
+ width: var(--player-hit);
468
+ height: 102px;
469
+ align-items: center;
470
+ justify-content: center;
471
+ }
472
+
473
+ .player-volume-popover__panel input {
474
+ width: var(--player-hit);
475
+ height: 102px;
476
+ margin: 0;
477
+ cursor: pointer;
478
+ appearance: none;
479
+ background: transparent;
480
+ direction: rtl;
481
+ writing-mode: vertical-lr;
482
+ }
483
+
484
+ .player-volume-popover__panel input::-webkit-slider-runnable-track {
485
+ width: 2px;
486
+ height: 100%;
487
+ background: var(--player-rule);
488
+ }
489
+
490
+ .player-volume-popover__panel input::-moz-range-track {
491
+ width: 2px;
492
+ height: 100%;
493
+ border: 0;
494
+ background: var(--player-rule);
495
+ }
496
+
497
+ .player-volume-popover__panel input::-webkit-slider-thumb {
498
+ width: 10px;
499
+ height: 10px;
500
+ margin-left: -4px;
501
+ appearance: none;
502
+ border: 0;
503
+ border-radius: 50%;
504
+ background: var(--player-accent);
505
+ }
506
+
507
+ .player-volume-popover__panel input::-moz-range-thumb {
508
+ width: 10px;
509
+ height: 10px;
510
+ border: 0;
511
+ border-radius: 50%;
512
+ background: var(--player-accent);
513
+ }
514
+
515
+ .player-volume-popover__panel output {
516
+ color: var(--player-muted);
517
+ font-family: var(--player-font-digital);
518
+ font-size: 0.62rem;
519
+ font-variant-numeric: tabular-nums;
520
+ }
521
+
522
+ .player-error {
523
+ display: flex;
524
+ align-items: center;
525
+ justify-content: space-between;
526
+ gap: 1rem;
527
+ padding: 0.65rem 0.8rem;
528
+ border-top: 1px solid var(--player-danger);
529
+ color: var(--player-danger);
530
+ font-size: 0.78rem;
531
+ }
532
+
533
+ .player-error button {
534
+ gap: 0.35rem;
535
+ min-height: 36px;
536
+ padding: 0 0.6rem;
537
+ color: inherit;
538
+ font: inherit;
539
+ }
540
+
541
+ @media (prefers-reduced-motion: reduce) {
542
+ :where(.player-surface, .player-debug-panel) *,
543
+ :where(.player-surface, .player-debug-panel) *::before,
544
+ :where(.player-surface, .player-debug-panel) *::after {
545
+ scroll-behavior: auto !important;
546
+ transition-duration: 0.01ms !important;
547
+ animation-duration: 0.01ms !important;
548
+ animation-iteration-count: 1 !important;
549
+ }
550
+
551
+ .player-title[data-scroll="true"] .player-title__text {
552
+ animation-duration: var(--player-title-scroll-duration) !important;
553
+ animation-iteration-count: infinite !important;
554
+ }
555
+ }
556
+
557
+ @keyframes player-title-marquee {
558
+ 0%,
559
+ 12% {
560
+ transform: translateX(0);
561
+ }
562
+
563
+ 82%,
564
+ 94% {
565
+ transform: translateX(var(--player-title-scroll-offset));
566
+ }
567
+
568
+ 94.01%,
569
+ 100% {
570
+ transform: translateX(0);
571
+ }
572
+ }