dsh-audiogen 0.3.4 → 0.4.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.
@@ -1,55 +1,148 @@
1
+ /**
2
+ * AI 音频 panel styles: tab shell, studio (form / results / history),
3
+ * custom audio player, «save to library» dialog and toast.
4
+ *
5
+ * Every surface rides the dsh --dsw-alias-* design tokens so the panel follows
6
+ * the active theme (light/dark/skins) by construction.
7
+ */
8
+
9
+ /* ------------------------------------------------------------------ shell */
10
+
1
11
  .panel {
12
+ position: relative;
2
13
  display: flex;
3
14
  flex-direction: column;
4
15
  gap: 12px;
5
16
  height: 100%;
6
- padding: 14px 16px;
7
- overflow: hidden;
17
+ min-height: 0;
18
+ min-width: 0;
19
+ padding: 14px 16px 16px;
8
20
  background: var(--dsw-alias-bg-base, #f7f7f8);
9
21
  color: var(--dsw-alias-label-primary, #1f2328);
10
22
  font-family: var(--dsw-font-family, system-ui, sans-serif);
11
23
  }
12
24
 
25
+ .panel,
26
+ .panel *,
27
+ .panel *::before,
28
+ .panel *::after {
29
+ box-sizing: border-box;
30
+ }
31
+
13
32
  .header {
14
33
  display: flex;
15
34
  align-items: center;
16
35
  justify-content: space-between;
36
+ gap: 12px;
37
+ flex: none;
17
38
  }
18
39
 
19
40
  .title {
20
41
  margin: 0;
21
42
  font-size: 16px;
22
43
  font-weight: 700;
44
+ color: var(--dsw-alias-label-primary, #1f2328);
45
+ white-space: nowrap;
46
+ }
47
+
48
+ .tabs {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ gap: 2px;
52
+ padding: 3px;
53
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
54
+ border-radius: 10px;
55
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
23
56
  }
24
57
 
25
- .layout {
58
+ .tab {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ gap: 6px;
62
+ min-height: 27px;
63
+ padding: 0 12px;
64
+ border: 0;
65
+ border-radius: 8px;
66
+ color: var(--dsw-alias-label-secondary, #6b7280);
67
+ background: transparent;
68
+ font-family: inherit;
69
+ font-size: 12.5px;
70
+ cursor: pointer;
71
+ transition: color 0.12s, background 0.12s;
72
+ }
73
+
74
+ .tab:hover {
75
+ color: var(--dsw-alias-label-primary, #1f2328);
76
+ }
77
+
78
+ .tab[data-active='true'] {
79
+ color: var(--dsw-alias-label-primary, #1f2328);
80
+ background: var(--dsw-alias-bg-layer-1, #fff);
81
+ font-weight: 600;
82
+ box-shadow: 0 1px 3px rgb(0 0 0 / 10%);
83
+ }
84
+
85
+ /* ------------------------------------------------------------------ studio */
86
+
87
+ .studio {
26
88
  display: flex;
27
89
  gap: 14px;
28
90
  flex: 1;
29
91
  min-height: 0;
92
+ min-width: 0;
30
93
  }
31
94
 
32
- .form {
95
+ .formCol {
33
96
  display: flex;
34
97
  flex-direction: column;
35
- gap: 12px;
98
+ gap: 11px;
36
99
  flex: none;
37
100
  width: 300px;
38
101
  min-width: 260px;
39
102
  max-width: 340px;
103
+ min-height: 0;
40
104
  overflow-y: auto;
105
+ padding: 2px;
106
+ scrollbar-width: thin;
107
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
41
108
  }
42
109
 
43
- .result {
44
- flex: 1;
45
- min-width: 0;
110
+ .formCol::-webkit-scrollbar { width: 8px; }
111
+ .formCol::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
112
+
113
+ .modeRow {
114
+ display: grid;
115
+ grid-template-columns: repeat(4, minmax(0, 1fr));
116
+ gap: 6px;
117
+ }
118
+
119
+ .modeButton {
46
120
  display: flex;
47
- flex-direction: column;
48
- border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
49
- border-radius: 12px;
121
+ align-items: center;
122
+ justify-content: center;
123
+ min-height: 34px;
124
+ padding: 6px 4px;
125
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
126
+ border-radius: 9px;
50
127
  background: var(--dsw-alias-bg-layer-1, #fff);
51
- padding: 14px;
52
- overflow-y: auto;
128
+ color: var(--dsw-alias-label-secondary, #6b7280);
129
+ font-family: inherit;
130
+ font-size: 11.5px;
131
+ white-space: nowrap;
132
+ cursor: pointer;
133
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
134
+ }
135
+
136
+ .modeButton:hover {
137
+ border-color: var(--dsw-alias-label-dimmed, #9ca3af);
138
+ color: var(--dsw-alias-label-primary, #1f2328);
139
+ }
140
+
141
+ .modeButton[data-active='true'] {
142
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
143
+ color: var(--dsw-alias-brand-primary, #2563eb);
144
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 8%, transparent);
145
+ font-weight: 600;
53
146
  }
54
147
 
55
148
  .label {
@@ -61,57 +154,98 @@
61
154
  color: var(--dsw-alias-label-secondary, #6b7280);
62
155
  }
63
156
 
64
- .textarea,
65
157
  .input,
66
- .select {
158
+ .textarea {
67
159
  width: 100%;
68
160
  min-height: 36px;
69
161
  padding: 7px 10px;
70
162
  border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
71
- border-radius: 8px;
72
- background: var(--dsw-alias-bg-layer-3, #fff);
163
+ border-radius: 9px;
164
+ background: var(--dsw-alias-bg-layer-2, #fff);
73
165
  color: var(--dsw-alias-label-primary, #1f2328);
74
- font: inherit;
166
+ font-family: inherit;
75
167
  font-size: 13px;
76
168
  outline: none;
169
+ transition: border-color 0.12s, box-shadow 0.12s;
170
+ }
171
+
172
+ .input:focus,
173
+ .textarea:focus {
174
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
175
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 14%, transparent);
77
176
  }
78
177
 
79
178
  .textarea {
80
- min-height: 110px;
179
+ min-height: 96px;
81
180
  resize: vertical;
82
181
  }
83
182
 
84
- .modeRow {
183
+ .checkbox {
85
184
  display: flex;
86
- gap: 6px;
87
- }
88
-
89
- .modeButton {
90
- flex: 1;
91
- padding: 7px 8px;
92
- border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
93
- border-radius: 8px;
94
- background: transparent;
95
- font: inherit;
185
+ align-items: center;
186
+ gap: 7px;
96
187
  font-size: 12px;
188
+ font-weight: 600;
189
+ color: var(--dsw-alias-label-secondary, #6b7280);
97
190
  cursor: pointer;
98
191
  }
99
192
 
100
- .modeButton[data-active='true'] {
101
- border-color: var(--dsw-alias-brand-primary, #2563eb);
102
- color: var(--dsw-alias-brand-primary, #2563eb);
193
+ .checkbox input {
194
+ accent-color: var(--dsw-alias-brand-primary, #2563eb);
195
+ margin: 0;
196
+ }
197
+
198
+ .hint {
199
+ margin: 0;
200
+ font-size: 11.5px;
201
+ line-height: 1.55;
202
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
203
+ }
204
+
205
+ .row {
206
+ display: flex;
207
+ gap: 8px;
208
+ align-items: flex-end;
209
+ }
210
+
211
+ .row .label { flex: 1; min-width: 0; }
212
+
213
+ .advanced {
214
+ border: 1px dashed var(--dsw-alias-border-l2, #d1d5db);
215
+ border-radius: 10px;
216
+ padding: 9px 11px;
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: 9px;
220
+ background: var(--dsw-alias-bg-layer-1, #fff);
221
+ }
222
+
223
+ .advanced summary {
224
+ cursor: pointer;
225
+ font-size: 12px;
103
226
  font-weight: 600;
227
+ color: var(--dsw-alias-label-secondary, #6b7280);
104
228
  }
105
229
 
106
230
  .generate {
107
- padding: 9px 14px;
231
+ padding: 10px 14px;
108
232
  border: 0;
109
233
  border-radius: 10px;
110
234
  background: var(--dsw-alias-label-primary, #1f2328);
111
235
  color: var(--dsw-alias-bg-layer-3, #fff);
112
- font: inherit;
236
+ font-family: inherit;
113
237
  font-size: 13px;
238
+ font-weight: 600;
114
239
  cursor: pointer;
240
+ transition: opacity 0.12s, transform 0.08s;
241
+ }
242
+
243
+ .generate:hover:not(:disabled) {
244
+ opacity: 0.92;
245
+ }
246
+
247
+ .generate:active:not(:disabled) {
248
+ transform: translateY(1px);
115
249
  }
116
250
 
117
251
  .generate:disabled {
@@ -119,116 +253,555 @@
119
253
  cursor: default;
120
254
  }
121
255
 
122
- .empty,
123
- .error,
124
- .hint {
125
- font-size: 13px;
256
+ /* --------------------------------------------------------------- results */
257
+
258
+ .resultCol {
259
+ flex: 1;
260
+ min-width: 0;
261
+ display: flex;
262
+ flex-direction: column;
263
+ gap: 10px;
264
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
265
+ border-radius: 12px;
266
+ background: var(--dsw-alias-bg-layer-1, #fff);
267
+ padding: 14px;
268
+ overflow-y: auto;
269
+ scrollbar-width: thin;
270
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
271
+ }
272
+
273
+ .resultCol::-webkit-scrollbar { width: 8px; }
274
+ .resultCol::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
275
+
276
+ .resultEmpty {
277
+ flex: 1;
278
+ display: flex;
279
+ flex-direction: column;
280
+ align-items: center;
281
+ justify-content: center;
282
+ gap: 6px;
283
+ text-align: center;
126
284
  color: var(--dsw-alias-label-secondary, #6b7280);
285
+ font-size: 13px;
286
+ }
287
+
288
+ .resultEmptyIcon {
289
+ display: inline-flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ width: 52px;
293
+ height: 52px;
294
+ margin-bottom: 4px;
295
+ border-radius: 50%;
296
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
297
+ font-size: 24px;
298
+ }
299
+
300
+ .resultEmptyHint {
301
+ margin: 0;
302
+ font-size: 11.5px;
303
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
127
304
  }
128
305
 
129
306
  .error {
130
- color: #b91c1c;
307
+ margin: 0;
308
+ padding: 9px 12px;
309
+ border: 1px solid var(--dsw-alias-label-error, #b91c1c);
310
+ border-radius: 9px;
311
+ background: color-mix(in srgb, var(--dsw-alias-label-error, #b91c1c) 6%, transparent);
312
+ color: var(--dsw-alias-label-error, #b91c1c);
313
+ font-size: 12.5px;
314
+ line-height: 1.55;
315
+ flex: none;
316
+ }
317
+
318
+ .resultMeta {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 8px;
322
+ flex: none;
323
+ font-size: 12px;
324
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
325
+ }
326
+
327
+ .resultModeChip {
328
+ padding: 2px 9px;
329
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
330
+ border-radius: 999px;
331
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
332
+ font-size: 11px;
333
+ color: var(--dsw-alias-label-secondary, #6b7280);
131
334
  }
132
335
 
133
336
  .audioList {
134
337
  display: grid;
135
338
  gap: 10px;
136
- margin-top: 8px;
137
339
  }
138
340
 
139
341
  .audioCard {
140
342
  display: flex;
141
343
  flex-direction: column;
344
+ gap: 8px;
345
+ padding: 12px;
346
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
347
+ border-radius: 12px;
348
+ background: var(--dsw-alias-bg-layer-2, #f7f7f8);
349
+ transition: border-color 0.12s;
350
+ }
351
+
352
+ .audioCard[data-saved='true'] {
353
+ border-color: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 42%, var(--dsw-alias-border-l1, #e5e7eb));
354
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 5%, var(--dsw-alias-bg-layer-2, #f7f7f8));
355
+ }
356
+
357
+ .audioCardHead {
358
+ display: flex;
359
+ align-items: center;
142
360
  gap: 6px;
143
- padding: 10px;
144
- border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);
145
- border-radius: 10px;
361
+ flex-wrap: wrap;
362
+ min-width: 0;
146
363
  }
147
364
 
148
- .audio {
149
- width: 100%;
150
- height: 36px;
365
+ .voiceIdChip {
366
+ overflow: hidden;
367
+ max-width: 100%;
368
+ padding: 2px 9px;
369
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
370
+ border-radius: 999px;
371
+ background: var(--dsw-alias-bg-layer-1, #fff);
372
+ color: var(--dsw-alias-label-secondary, #6b7280);
373
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
374
+ font-size: 10.5px;
375
+ text-overflow: ellipsis;
376
+ white-space: nowrap;
151
377
  }
152
378
 
153
- .download {
379
+ .savedChip {
380
+ display: inline-flex;
381
+ align-items: center;
382
+ gap: 5px;
383
+ padding: 2px 9px;
384
+ border-radius: 999px;
385
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 12%, transparent);
386
+ color: var(--dsw-alias-brand-primary, #2563eb);
387
+ font-size: 11px;
388
+ font-weight: 600;
389
+ }
390
+
391
+ .audioCardIndex {
392
+ margin-left: auto;
393
+ font-size: 11px;
394
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
395
+ font-variant-numeric: tabular-nums;
396
+ }
397
+
398
+ .audioCardActions {
399
+ display: flex;
400
+ align-items: center;
401
+ gap: 6px;
402
+ flex-wrap: wrap;
403
+ }
404
+
405
+ .ghostButton {
406
+ display: inline-flex;
407
+ align-items: center;
408
+ gap: 5px;
409
+ min-height: 27px;
410
+ padding: 3px 11px;
411
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
412
+ border-radius: 999px;
413
+ background: transparent;
414
+ color: var(--dsw-alias-label-secondary, #6b7280);
415
+ font-family: inherit;
154
416
  font-size: 12px;
155
- color: #2563eb;
156
417
  text-decoration: none;
418
+ cursor: pointer;
419
+ transition: color 0.12s, border-color 0.12s, background 0.12s;
157
420
  }
158
421
 
159
- .history {
422
+ .ghostButton:hover {
423
+ color: var(--dsw-alias-brand-primary, #2563eb);
424
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
425
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary, #2563eb) 8%, transparent);
426
+ }
427
+
428
+ /* --------------------------------------------------------------- history */
429
+
430
+ .historyCol {
431
+ display: flex;
432
+ flex-direction: column;
433
+ flex: none;
434
+ width: 250px;
435
+ min-width: 210px;
436
+ max-width: 290px;
437
+ min-height: 0;
438
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
439
+ border-radius: 12px;
440
+ background: var(--dsw-alias-bg-layer-1, #fff);
441
+ overflow: hidden;
442
+ }
443
+
444
+ .historyHeader {
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: space-between;
448
+ gap: 8px;
449
+ padding: 10px 12px;
450
+ border-bottom: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
160
451
  flex: none;
161
- width: 260px;
162
- overflow-y: auto;
163
- border-left: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
164
- padding-left: 12px;
165
452
  }
166
453
 
167
454
  .historyTitle {
168
455
  font-size: 13px;
169
456
  font-weight: 700;
457
+ color: var(--dsw-alias-label-primary, #1f2328);
170
458
  }
171
459
 
172
- .historyEmpty {
460
+ .historyClear {
461
+ padding: 2px 9px;
462
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
463
+ border-radius: 999px;
464
+ background: transparent;
173
465
  color: var(--dsw-alias-label-tertiary, #9ca3af);
466
+ font-family: inherit;
467
+ font-size: 11px;
468
+ cursor: pointer;
469
+ }
470
+
471
+ .historyClear:hover {
472
+ color: var(--dsw-alias-label-error, #b91c1c);
473
+ border-color: var(--dsw-alias-label-error, #b91c1c);
474
+ }
475
+
476
+ .historyList {
477
+ flex: 1;
478
+ min-height: 0;
479
+ overflow-y: auto;
480
+ display: flex;
481
+ flex-direction: column;
482
+ gap: 8px;
483
+ padding: 9px;
484
+ scrollbar-width: thin;
485
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
486
+ }
487
+
488
+ .historyList::-webkit-scrollbar { width: 8px; }
489
+ .historyList::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
490
+
491
+ .historyEmpty {
492
+ flex: 1;
493
+ display: flex;
494
+ align-items: center;
495
+ justify-content: center;
496
+ padding: 18px;
174
497
  font-size: 12px;
498
+ text-align: center;
499
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
175
500
  }
176
501
 
177
502
  .historyItem {
178
- padding: 8px 0;
179
- border-bottom: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
503
+ display: flex;
504
+ flex-direction: column;
505
+ gap: 6px;
506
+ padding: 9px;
507
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
508
+ border-radius: 10px;
509
+ background: var(--dsw-alias-bg-layer-2, #f7f7f8);
180
510
  }
181
511
 
182
512
  .historyPrompt {
183
513
  font-size: 12px;
514
+ line-height: 1.45;
515
+ color: var(--dsw-alias-label-primary, #1f2328);
516
+ display: -webkit-box;
517
+ -webkit-line-clamp: 2;
518
+ -webkit-box-orient: vertical;
184
519
  overflow: hidden;
185
- text-overflow: ellipsis;
186
- white-space: nowrap;
187
520
  }
188
521
 
189
522
  .historyMeta {
190
- font-size: 11px;
523
+ font-size: 10.5px;
191
524
  color: var(--dsw-alias-label-tertiary, #9ca3af);
525
+ white-space: nowrap;
526
+ overflow: hidden;
527
+ text-overflow: ellipsis;
192
528
  }
193
529
 
194
- .historyAudio {
195
- width: 100%;
196
- height: 30px;
197
- margin-top: 4px;
530
+ .historyActions {
531
+ display: flex;
532
+ justify-content: flex-end;
198
533
  }
199
534
 
200
- .advanced {
201
- border: 1px dashed var(--dsw-alias-border-l2, #d1d5db);
202
- border-radius: 8px;
535
+ .historyAction {
536
+ display: inline-flex;
537
+ align-items: center;
538
+ gap: 4px;
539
+ padding: 2px 9px;
540
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
541
+ border-radius: 999px;
542
+ background: transparent;
543
+ color: var(--dsw-alias-label-secondary, #6b7280);
544
+ font-family: inherit;
545
+ font-size: 11px;
546
+ cursor: pointer;
547
+ }
548
+
549
+ .historyAction:hover {
550
+ color: var(--dsw-alias-brand-primary, #2563eb);
551
+ border-color: var(--dsw-alias-brand-primary, #2563eb);
552
+ }
553
+
554
+ /* ------------------------------------------------------------ audio player */
555
+
556
+ .player {
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 9px;
203
560
  padding: 8px 10px;
561
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
562
+ border-radius: 10px;
563
+ background: var(--dsw-alias-bg-layer-1, #fff);
564
+ }
565
+
566
+ .playerCompact {
204
567
  display: flex;
205
- flex-direction: column;
568
+ align-items: center;
206
569
  gap: 8px;
570
+ padding: 6px 8px;
571
+ border: 1px solid var(--dsw-alias-border-l1, #e5e7eb);
572
+ border-radius: 9px;
573
+ background: var(--dsw-alias-bg-layer-1, #fff);
207
574
  }
208
575
 
209
- .advanced summary {
576
+ .playButton {
577
+ display: inline-flex;
578
+ align-items: center;
579
+ justify-content: center;
580
+ flex: none;
581
+ width: 30px;
582
+ height: 30px;
583
+ border: 0;
584
+ border-radius: 50%;
585
+ background: var(--dsw-alias-label-primary, #1f2328);
586
+ color: var(--dsw-alias-bg-layer-3, #fff);
210
587
  cursor: pointer;
211
- font-size: 12px;
212
- font-weight: 600;
213
- color: var(--dsw-alias-label-secondary, #6b7280);
588
+ transition: opacity 0.12s, transform 0.08s;
214
589
  }
215
590
 
216
- .row {
217
- display: flex;
218
- gap: 8px;
219
- align-items: flex-end;
591
+ .playerCompact .playButton {
592
+ width: 26px;
593
+ height: 26px;
220
594
  }
221
595
 
222
- .row .label {
596
+ .playButton:hover { opacity: 0.9; }
597
+ .playButton:active { transform: scale(0.94); }
598
+
599
+ .track {
600
+ position: relative;
223
601
  flex: 1;
602
+ min-width: 0;
603
+ height: 4px;
604
+ border-radius: 999px;
605
+ background: var(--dsw-alias-border-l2, #d1d5db);
606
+ cursor: pointer;
224
607
  }
225
608
 
226
- .checkbox {
609
+ .trackFill {
610
+ position: absolute;
611
+ inset: 0 auto 0 0;
612
+ border-radius: 999px;
613
+ background: var(--dsw-alias-brand-primary, #2563eb);
614
+ }
615
+
616
+ .trackKnob {
617
+ position: absolute;
618
+ top: 50%;
619
+ width: 11px;
620
+ height: 11px;
621
+ transform: translate(-50%, -50%);
622
+ border-radius: 50%;
623
+ background: var(--dsw-alias-brand-primary, #2563eb);
624
+ transition: transform 0.1s;
625
+ }
626
+
627
+ .time {
628
+ flex: none;
629
+ min-width: 62px;
630
+ font-size: 10.5px;
631
+ font-variant-numeric: tabular-nums;
632
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
633
+ white-space: nowrap;
634
+ text-align: right;
635
+ }
636
+
637
+ .playerCompact .time {
638
+ min-width: 56px;
639
+ font-size: 10px;
640
+ }
641
+
642
+ .muteButton {
643
+ display: inline-flex;
644
+ align-items: center;
645
+ justify-content: center;
646
+ flex: none;
647
+ width: 24px;
648
+ height: 24px;
649
+ border: 0;
650
+ border-radius: 6px;
651
+ background: transparent;
652
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
653
+ cursor: pointer;
654
+ }
655
+
656
+ .muteButton:hover {
657
+ color: var(--dsw-alias-label-primary, #1f2328);
658
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
659
+ }
660
+
661
+ /* --------------------------------------------------------- save-to-library */
662
+
663
+ .modalMask {
664
+ position: fixed;
665
+ inset: 0;
666
+ z-index: 200;
667
+ display: grid;
668
+ place-items: center;
669
+ padding: 20px;
670
+ background: rgb(0 0 0 / 40%);
671
+ backdrop-filter: blur(3px);
672
+ }
673
+
674
+ .modal {
675
+ display: flex;
676
+ flex-direction: column;
677
+ gap: 12px;
678
+ width: 440px;
679
+ max-width: 100%;
680
+ max-height: calc(100vh - 40px);
681
+ padding: 16px;
682
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
683
+ border-radius: 14px;
684
+ background: var(--dsw-alias-bg-layer-1, #fff);
685
+ box-shadow: 0 18px 50px rgb(0 0 0 / 22%);
686
+ }
687
+
688
+ .modalHead {
689
+ display: flex;
690
+ align-items: center;
691
+ justify-content: space-between;
692
+ gap: 10px;
693
+ font-size: 14px;
694
+ color: var(--dsw-alias-label-primary, #1f2328);
695
+ }
696
+
697
+ .modalBody {
698
+ display: flex;
699
+ flex-direction: column;
700
+ gap: 11px;
701
+ overflow-y: auto;
702
+ min-height: 0;
703
+ }
704
+
705
+ .formRow {
706
+ display: grid;
707
+ grid-template-columns: 1fr 1fr;
708
+ gap: 10px;
709
+ }
710
+
711
+ .modalFoot {
227
712
  display: flex;
228
713
  align-items: center;
714
+ justify-content: flex-end;
715
+ gap: 8px;
716
+ }
717
+
718
+ .primaryButton {
719
+ display: inline-flex;
720
+ align-items: center;
229
721
  gap: 6px;
230
- font-size: 12px;
722
+ min-height: 32px;
723
+ padding: 0 14px;
724
+ border: 0;
725
+ border-radius: 8px;
726
+ background: var(--dsw-alias-label-primary, #1f2328);
727
+ color: var(--dsw-alias-bg-layer-3, #fff);
728
+ font-family: inherit;
729
+ font-size: 12.5px;
231
730
  font-weight: 600;
731
+ cursor: pointer;
732
+ }
733
+
734
+ .primaryButton:disabled {
735
+ opacity: 0.5;
736
+ cursor: default;
737
+ }
738
+
739
+ .secondaryButton {
740
+ min-height: 32px;
741
+ padding: 0 14px;
742
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
743
+ border-radius: 8px;
744
+ background: transparent;
232
745
  color: var(--dsw-alias-label-secondary, #6b7280);
746
+ font-family: inherit;
747
+ font-size: 12.5px;
233
748
  cursor: pointer;
234
749
  }
750
+
751
+ .secondaryButton:hover {
752
+ color: var(--dsw-alias-label-primary, #1f2328);
753
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
754
+ }
755
+
756
+ .iconButton {
757
+ display: inline-flex;
758
+ align-items: center;
759
+ justify-content: center;
760
+ flex: none;
761
+ width: 26px;
762
+ height: 26px;
763
+ border: 0;
764
+ border-radius: 7px;
765
+ background: transparent;
766
+ color: var(--dsw-alias-label-tertiary, #9ca3af);
767
+ font-size: 16px;
768
+ line-height: 1;
769
+ cursor: pointer;
770
+ }
771
+
772
+ .iconButton:hover {
773
+ color: var(--dsw-alias-label-primary, #1f2328);
774
+ background: var(--dsw-alias-bg-layer-2, #f3f4f6);
775
+ }
776
+
777
+ /* ------------------------------------------------------------------- toast */
778
+
779
+ .toast {
780
+ position: absolute;
781
+ left: 50%;
782
+ bottom: 18px;
783
+ transform: translateX(-50%);
784
+ z-index: 150;
785
+ display: inline-flex;
786
+ align-items: center;
787
+ gap: 7px;
788
+ padding: 7px 16px;
789
+ border: 1px solid var(--dsw-alias-border-l2, #d1d5db);
790
+ border-radius: 999px;
791
+ background: var(--dsw-alias-bg-mask-1, #fff);
792
+ color: var(--dsw-alias-label-primary, #1f2328);
793
+ font-size: 12.5px;
794
+ box-shadow: 0 8px 24px rgb(0 0 0 / 22%);
795
+ backdrop-filter: blur(6px);
796
+ pointer-events: none;
797
+ animation: audiogenToastIn 160ms ease-out;
798
+ }
799
+
800
+ @keyframes audiogenToastIn {
801
+ from { opacity: 0; transform: translate(-50%, 6px); }
802
+ to { opacity: 1; transform: translate(-50%, 0); }
803
+ }
804
+
805
+ @media (prefers-reduced-motion: reduce) {
806
+ .toast { animation-duration: 1ms; }
807
+ }