dsh-audiogen 0.2.0 → 0.3.2

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,8 +1,10 @@
1
1
  /**
2
- * dsh-imagegen settings card styles. Mirrors the official plugin-config card
2
+ * dsh-audiogen settings card styles. Mirrors the official plugin-config card
3
3
  * chrome (@deepseek-ai/dsh-client-ui-settings-plugins PluginCard + fields) so
4
4
  * the card reads as a sibling of the bash / agent-loop / web-search cards;
5
- * colors ride the dsh --dsw-* tokens.
5
+ * colors ride the dsh --dsw-* tokens. The channel section follows the DSH
6
+ * "模型" settings design language: provider rows, equal-width add actions and
7
+ * the inline channel editor (provider select, API key, 自定义设置, 模型目录).
6
8
  */
7
9
 
8
10
  .card {
@@ -95,32 +97,6 @@
95
97
  padding-bottom: 8px;
96
98
  }
97
99
 
98
- .versionRow {
99
- display: flex;
100
- align-items: center;
101
- justify-content: space-between;
102
- gap: 12px;
103
- padding: 12px 0;
104
- border-bottom: 1px solid var(--dsw-alias-border-l2);
105
- }
106
-
107
- .versionLabel {
108
- font-size: 13px;
109
- font-weight: 500;
110
- line-height: 1.5;
111
- color: var(--dsw-alias-label-primary);
112
- }
113
-
114
- .versionValue {
115
- padding: 1px 8px;
116
- border-radius: 999px;
117
- background: var(--dsw-alias-bg-module-platform);
118
- color: var(--dsw-alias-label-secondary);
119
- font-family: var(--dsw-font-family-mono, monospace);
120
- font-size: 12px;
121
- line-height: 1.5;
122
- }
123
-
124
100
  /* --- fields (mirror of the official plugin-config fields) --------------------- */
125
101
 
126
102
  .field {
@@ -149,23 +125,6 @@
149
125
  color: var(--dsw-alias-label-primary);
150
126
  }
151
127
 
152
- .badges {
153
- display: inline-flex;
154
- align-items: center;
155
- gap: 8px;
156
- }
157
-
158
- .badge {
159
- border-radius: 999px;
160
- padding: 1px 8px;
161
- font-size: 11px;
162
- line-height: 17px;
163
- white-space: nowrap;
164
- font-weight: 500;
165
- background: var(--dsw-alias-bg-module-platform);
166
- color: var(--dsw-alias-label-secondary);
167
- }
168
-
169
128
  .reset {
170
129
  border: none;
171
130
  background: none;
@@ -188,6 +147,7 @@
188
147
 
189
148
  .input,
190
149
  .select {
150
+ box-sizing: border-box;
191
151
  height: 34px;
192
152
  padding: 0 12px;
193
153
  border: 1px solid var(--dsw-alias-border-l2);
@@ -211,66 +171,7 @@
211
171
  cursor: default;
212
172
  }
213
173
 
214
- .inputInvalid {
215
- height: 34px;
216
- padding: 0 12px;
217
- border: 1px solid var(--dsw-alias-label-error);
218
- border-radius: 8px;
219
- background: var(--dsw-alias-bg-layer-3);
220
- font: inherit;
221
- font-size: 13px;
222
- line-height: 1.5;
223
- color: var(--dsw-alias-label-primary);
224
- outline: none;
225
- }
226
-
227
- .textarea,
228
- .textareaInvalid {
229
- min-height: 70px;
230
- resize: vertical;
231
- padding: 8px 12px;
232
- border-radius: 8px;
233
- background: var(--dsw-alias-bg-layer-3);
234
- font: inherit;
235
- font-size: 13px;
236
- line-height: 1.5;
237
- color: var(--dsw-alias-label-primary);
238
- outline: none;
239
- }
240
-
241
- .textarea { border: 1px solid var(--dsw-alias-border-l2); }
242
- .textareaInvalid { border: 1px solid var(--dsw-alias-label-error); }
243
- .textarea:focus-visible { border-color: var(--dsw-alias-brand-primary); }
244
- .textarea:disabled { color: var(--dsw-alias-label-tertiary); cursor: default; }
245
-
246
- .hint,
247
- .invalid {
248
- margin: 0;
249
- font-size: 12px;
250
- line-height: 1.5;
251
- }
252
-
253
- .hint {
254
- color: var(--dsw-alias-label-tertiary);
255
- }
256
-
257
- .invalid {
258
- color: var(--dsw-alias-label-error);
259
- }
260
-
261
- .readOnly,
262
- .notExposed {
263
- margin: 12px 0 0;
264
- font-size: 12px;
265
- line-height: 1.5;
266
- color: var(--dsw-alias-label-tertiary);
267
- }
268
-
269
- .sectionDivider {
270
- height: 1px;
271
- margin: 18px 0 14px;
272
- background: var(--dsw-alias-border-l2);
273
- }
174
+ /* --- section chrome ---------------------------------------------------------- */
274
175
 
275
176
  .sectionTitle {
276
177
  margin: 0;
@@ -286,10 +187,6 @@
286
187
  line-height: 1.5;
287
188
  }
288
189
 
289
- .modelSection {
290
- padding: 2px 0 14px;
291
- }
292
-
293
190
  .sectionHeader {
294
191
  display: flex;
295
192
  align-items: flex-start;
@@ -301,381 +198,158 @@
301
198
  max-width: 430px;
302
199
  }
303
200
 
304
- .modelSummary {
305
- display: flex;
306
- flex-wrap: wrap;
307
- align-items: center;
308
- gap: 6px;
309
- margin-top: 12px;
310
- }
311
-
312
- .modelChip {
313
- display: inline-flex;
314
- align-items: center;
315
- max-width: 100%;
316
- gap: 5px;
317
- padding: 3px 5px 3px 8px;
318
- border: 1px solid var(--dsw-alias-border-l2);
319
- border-radius: 6px;
320
- background: var(--dsw-alias-bg-layer-3);
321
- color: var(--dsw-alias-label-primary);
322
- font-family: var(--dsw-font-family-mono, monospace);
201
+ .readOnly {
202
+ margin: 12px 0 0;
323
203
  font-size: 12px;
324
204
  line-height: 1.5;
205
+ color: var(--dsw-alias-label-tertiary);
325
206
  }
326
207
 
327
- .modelChip > span {
328
- overflow: hidden;
329
- text-overflow: ellipsis;
330
- white-space: nowrap;
208
+ .link {
209
+ color: var(--dsw-alias-brand-primary);
210
+ text-decoration: none;
331
211
  }
332
212
 
333
- .modelChip button {
334
- appearance: none;
335
- border: 0;
336
- border-radius: 4px;
337
- width: 18px;
338
- height: 18px;
339
- padding: 0;
340
- background: transparent;
341
- color: var(--dsw-alias-label-tertiary);
342
- font: inherit;
343
- line-height: 18px;
344
- cursor: pointer;
213
+ .link:hover {
214
+ text-decoration: underline;
345
215
  }
346
216
 
347
- .modelChip button:hover:not(:disabled) { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-module-platform); }
348
- .modelChip button:disabled { cursor: default; opacity: 0.45; }
217
+ /* --- channel rows (provider list) --------------------------------------------- */
349
218
 
350
- .addModel {
351
- appearance: none;
352
- min-height: 28px;
353
- border: 1px dashed var(--dsw-alias-border-l2);
354
- border-radius: 6px;
355
- padding: 0 9px;
356
- background: transparent;
357
- color: var(--dsw-alias-label-secondary);
358
- font: inherit;
359
- font-size: 12px;
360
- cursor: pointer;
219
+ .channelSection {
220
+ padding: 6px 0 2px;
361
221
  }
362
222
 
363
- .addModel:hover:not(:disabled) { color: var(--dsw-alias-brand-primary); border-color: var(--dsw-alias-brand-primary); }
364
- .addModel:disabled { opacity: 0.45; cursor: default; }
223
+ .channelEmpty {
224
+ margin: 10px 0 0;
225
+ font-size: 12px;
226
+ line-height: 1.5;
227
+ color: var(--dsw-alias-label-tertiary);
228
+ }
365
229
 
366
- .manualModelRow {
230
+ .channelList {
231
+ list-style: none;
232
+ margin: 10px 0 0;
233
+ padding: 0;
367
234
  display: flex;
368
- gap: 8px;
369
- margin-top: 10px;
235
+ flex-direction: column;
236
+ gap: 6px;
370
237
  }
371
238
 
372
- .manualModelRow .input { min-width: 0; flex: 1; }
373
-
374
- .disclosure {
375
- width: 100%;
376
- appearance: none;
239
+ .channelRow {
377
240
  display: flex;
378
241
  align-items: center;
379
- gap: 8px;
380
- border: 0;
381
- border-top: 1px solid var(--dsw-alias-border-l2);
382
- padding: 13px 0;
383
- background: none;
384
- color: var(--dsw-alias-label-primary);
385
- font: inherit;
386
- font-size: 13px;
387
- font-weight: 500;
388
- text-align: left;
389
- cursor: pointer;
242
+ gap: 10px;
243
+ border: 1px solid var(--dsw-alias-border-l2);
244
+ border-radius: 10px;
245
+ padding: 8px 10px;
246
+ background: var(--dsw-alias-bg-layer-3);
247
+ }
248
+
249
+ .channelRow[data-action] {
250
+ flex-wrap: wrap;
251
+ }
252
+
253
+ .channelDotReady,
254
+ .channelDotWarn {
255
+ flex: none;
256
+ width: 9px;
257
+ height: 9px;
258
+ border-radius: 50%;
390
259
  }
391
260
 
392
- .disclosure > span:nth-child(2) { margin-left: auto; color: var(--dsw-alias-label-tertiary); font-size: 12px; font-weight: 400; }
393
- .disclosure > span:last-child { color: var(--dsw-alias-label-tertiary); }
394
- .disclosure:focus-visible { outline: 2px solid var(--dsw-alias-brand-primary); outline-offset: 2px; }
261
+ .channelDotReady {
262
+ background: var(--dsw-color-success, #2fbf71);
263
+ }
395
264
 
396
- .optionalContent {
397
- padding: 0 0 8px;
265
+ .channelDotWarn {
266
+ background: var(--dsw-color-danger, #e5484d);
398
267
  }
399
268
 
400
- .inlineDisclosure {
269
+ .channelMain {
401
270
  appearance: none;
402
- display: inline-flex;
403
- align-items: center;
404
- gap: 6px;
405
- margin-top: 12px;
271
+ flex: 1;
272
+ min-width: 0;
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: 3px;
406
276
  padding: 0;
407
277
  border: 0;
408
278
  background: none;
409
- color: var(--dsw-alias-label-secondary);
410
279
  font: inherit;
411
- font-size: 12px;
280
+ text-align: left;
412
281
  cursor: pointer;
413
282
  }
414
283
 
415
- .inlineDisclosure:hover { color: var(--dsw-alias-label-primary); }
284
+ .channelName {
285
+ font-size: 13px;
286
+ font-weight: 600;
287
+ line-height: 1.4;
288
+ color: var(--dsw-alias-label-primary);
289
+ overflow: hidden;
290
+ text-overflow: ellipsis;
291
+ white-space: nowrap;
292
+ }
416
293
 
417
- .modelFetchRow {
294
+ .channelMeta {
418
295
  display: flex;
419
- gap: 8px;
420
296
  align-items: center;
297
+ flex-wrap: wrap;
298
+ gap: 4px 8px;
421
299
  }
422
300
 
423
- .modelFetch,
424
- .modelChoices {
425
- min-height: 32px;
426
- border: 1px solid var(--dsw-alias-border-l2);
427
- border-radius: 7px;
428
- background: var(--dsw-alias-bg-layer-3);
429
- color: var(--dsw-alias-label-secondary);
430
- font: inherit;
431
- font-size: 12px;
301
+ .channelHost {
302
+ font-size: 11px;
303
+ line-height: 1.5;
304
+ color: var(--dsw-alias-label-tertiary);
305
+ font-family: var(--dsw-font-family-mono, monospace);
306
+ overflow: hidden;
307
+ text-overflow: ellipsis;
308
+ white-space: nowrap;
309
+ max-width: 180px;
432
310
  }
433
311
 
434
- .modelFetch { padding: 0 10px; cursor: pointer; }
435
- .modelFetch:hover:not(:disabled) { color: var(--dsw-alias-brand-primary); border-color: var(--dsw-alias-brand-primary); }
436
- .modelFetch:disabled { opacity: 0.5; cursor: default; }
437
- .modelChoices { min-width: 0; flex: 1; padding: 0 8px; }
438
-
439
- .modelCandidateList {
440
- display: flex;
441
- flex-wrap: wrap;
442
- gap: 6px 10px;
443
- margin-top: 10px;
312
+ .channelBadge {
313
+ border-radius: 999px;
314
+ padding: 0 7px;
315
+ font-size: 11px;
316
+ line-height: 17px;
317
+ white-space: nowrap;
318
+ font-weight: 500;
319
+ background: var(--dsw-alias-bg-module-platform);
320
+ color: var(--dsw-alias-label-secondary);
444
321
  }
445
322
 
446
- .modelCandidateLabel {
447
- width: 100%;
448
- color: var(--dsw-alias-label-tertiary);
449
- font-size: 12px;
323
+ .channelBadge[data-warn] {
324
+ color: var(--dsw-alias-label-error);
450
325
  }
451
326
 
452
- .modelCandidate {
327
+ .channelAction {
453
328
  appearance: none;
454
- display: inline-flex;
455
- align-items: center;
456
- gap: 5px;
457
- min-width: 0;
458
- color: var(--dsw-alias-label-secondary);
329
+ flex: none;
330
+ border: 0;
331
+ background: none;
332
+ padding: 4px 8px;
333
+ border-radius: 6px;
334
+ font: inherit;
459
335
  font-size: 12px;
460
336
  line-height: 1.5;
337
+ color: var(--dsw-alias-label-secondary);
461
338
  cursor: pointer;
462
- padding: 3px 6px;
463
- border: 1px solid transparent;
464
- border-radius: 5px;
465
- background: var(--dsw-alias-bg-layer-3);
466
- font: inherit;
467
339
  }
468
340
 
469
- .modelCandidate input { margin: 0; }
470
- .modelCandidate[data-selected] { border-color: var(--dsw-alias-border-l2); color: var(--dsw-alias-label-primary); }
341
+ .channelAction:hover:not(:disabled) {
342
+ color: var(--dsw-alias-label-primary);
343
+ background: var(--dsw-alias-bg-module-platform);
344
+ }
471
345
 
472
- /* --- footer (mirror of the official card footer) ------------------------------ */
346
+ .channelAction[data-danger] {
347
+ color: var(--dsw-alias-label-error);
348
+ }
473
349
 
474
- .footer {
475
- display: flex;
476
- align-items: center;
477
- justify-content: flex-end;
478
- gap: 8px;
479
- padding: 12px 0 4px;
480
- border-top: 1px solid var(--dsw-alias-border-l2);
481
- }
482
-
483
- .failed {
484
- flex: 1;
485
- min-width: 0;
486
- margin: 0;
487
- font-size: 12px;
488
- line-height: 1.5;
489
- color: var(--dsw-alias-label-error);
490
- }
491
-
492
- .discard,
493
- .save {
494
- appearance: none;
495
- border: 1px solid transparent;
496
- border-radius: 8px;
497
- padding: 5px 14px;
498
- font: inherit;
499
- font-size: 13px;
500
- line-height: 1.5;
501
- cursor: pointer;
502
- }
503
-
504
- .discard {
505
- border-color: var(--dsw-alias-border-l2);
506
- background: none;
507
- color: var(--dsw-alias-label-secondary);
508
- }
509
-
510
- .discard:hover:not(:disabled) {
511
- color: var(--dsw-alias-label-primary);
512
- border-color: var(--dsw-alias-label-dimmed);
513
- }
514
-
515
- .save {
516
- background: var(--dsw-alias-label-primary);
517
- color: var(--dsw-alias-bg-layer-3);
518
- }
519
-
520
- .discard:disabled,
521
- .save:disabled {
522
- opacity: 0.4;
523
- cursor: default;
524
- }
525
-
526
- .discard:focus-visible,
527
- .save:focus-visible {
528
- outline: 2px solid var(--dsw-alias-brand-primary);
529
- outline-offset: 1px;
530
- }
531
-
532
- @media (prefers-reduced-motion: reduce) {
533
- .card, .chevron, .chevronOpen {
534
- transition: none;
535
- }
536
- }
537
-
538
- /* --- channel list ------------------------------------------------------------------ */
539
-
540
- .channelSection {
541
- padding: 6px 0 2px;
542
- }
543
-
544
- .channelEmpty {
545
- margin: 10px 0 0;
546
- font-size: 12px;
547
- line-height: 1.5;
548
- color: var(--dsw-alias-label-tertiary);
549
- }
550
-
551
- .channelList {
552
- list-style: none;
553
- margin: 10px 0 0;
554
- padding: 0;
555
- display: flex;
556
- flex-direction: column;
557
- gap: 6px;
558
- }
559
-
560
- .channelRow {
561
- display: flex;
562
- align-items: center;
563
- gap: 10px;
564
- border: 1px solid var(--dsw-alias-border-l2);
565
- border-radius: 10px;
566
- padding: 8px 10px;
567
- background: var(--dsw-alias-bg-layer-3);
568
- }
569
-
570
- .channelRow[data-action] {
571
- flex-wrap: wrap;
572
- }
573
-
574
- .channelDotReady,
575
- .channelDotWarn {
576
- flex: none;
577
- width: 9px;
578
- height: 9px;
579
- border-radius: 50%;
580
- }
581
-
582
- .channelDotReady {
583
- background: var(--dsw-color-success, #2fbf71);
584
- }
585
-
586
- .channelDotWarn {
587
- background: var(--dsw-color-danger, #e5484d);
588
- }
589
-
590
- .channelMain {
591
- appearance: none;
592
- flex: 1;
593
- min-width: 0;
594
- display: flex;
595
- flex-direction: column;
596
- gap: 3px;
597
- padding: 0;
598
- border: 0;
599
- background: none;
600
- font: inherit;
601
- text-align: left;
602
- cursor: pointer;
603
- }
604
-
605
- .channelName {
606
- font-size: 13px;
607
- font-weight: 600;
608
- line-height: 1.4;
609
- color: var(--dsw-alias-label-primary);
610
- overflow: hidden;
611
- text-overflow: ellipsis;
612
- white-space: nowrap;
613
- }
614
-
615
- .channelMeta {
616
- display: flex;
617
- align-items: center;
618
- flex-wrap: wrap;
619
- gap: 4px 8px;
620
- }
621
-
622
- .channelHost {
623
- font-size: 11px;
624
- line-height: 1.5;
625
- color: var(--dsw-alias-label-tertiary);
626
- font-family: var(--dsw-font-family-mono, monospace);
627
- overflow: hidden;
628
- text-overflow: ellipsis;
629
- white-space: nowrap;
630
- max-width: 180px;
631
- }
632
-
633
- .channelBadge {
634
- border-radius: 999px;
635
- padding: 0 7px;
636
- font-size: 11px;
637
- line-height: 17px;
638
- white-space: nowrap;
639
- font-weight: 500;
640
- background: var(--dsw-alias-bg-module-platform);
641
- color: var(--dsw-alias-label-secondary);
642
- }
643
-
644
- .channelBadge[data-warn] {
645
- color: var(--dsw-alias-label-error);
646
- }
647
-
648
- .channelBadge[data-default] {
649
- background: var(--dsw-alias-bg-module-poped, var(--dsw-alias-bg-module-platform));
650
- color: var(--dsw-alias-brand-primary);
651
- }
652
-
653
- .channelAction {
654
- appearance: none;
655
- flex: none;
656
- border: 0;
657
- background: none;
658
- padding: 4px 8px;
659
- border-radius: 6px;
660
- font: inherit;
661
- font-size: 12px;
662
- line-height: 1.5;
663
- color: var(--dsw-alias-label-secondary);
664
- cursor: pointer;
665
- }
666
-
667
- .channelAction:hover:not(:disabled) {
668
- color: var(--dsw-alias-label-primary);
669
- background: var(--dsw-alias-bg-module-platform);
670
- }
671
-
672
- .channelAction[data-danger] {
673
- color: var(--dsw-alias-label-error);
674
- }
675
-
676
- .channelAction:disabled {
677
- opacity: 0.45;
678
- cursor: default;
350
+ .channelAction:disabled {
351
+ opacity: 0.45;
352
+ cursor: default;
679
353
  }
680
354
 
681
355
  .channelDanger {
@@ -708,17 +382,22 @@
708
382
  color: var(--dsw-alias-label-error);
709
383
  }
710
384
 
385
+ /* The two ways to gain a channel: equal-width siblings spanning the same width
386
+ as the rows above, dashed like every other "nothing here yet" affordance. */
711
387
  .channelAddRow {
712
388
  display: flex;
713
- gap: 8px;
389
+ flex-wrap: wrap;
390
+ gap: 10px;
714
391
  margin-top: 10px;
715
392
  }
716
393
 
717
394
  .channelAdd {
718
395
  appearance: none;
719
- min-height: 30px;
720
- border: 1px dashed var(--dsw-alias-border-l2);
721
- border-radius: 8px;
396
+ flex: 1 1 0;
397
+ min-width: 180px;
398
+ min-height: 44px;
399
+ border: 1px dashed var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));
400
+ border-radius: 12px;
722
401
  padding: 0 12px;
723
402
  background: transparent;
724
403
  color: var(--dsw-alias-label-secondary);
@@ -737,115 +416,178 @@
737
416
  cursor: default;
738
417
  }
739
418
 
740
- .spacer {
741
- flex: 1;
742
- }
743
-
744
- /* --- editor dialog ------------------------------------------------------------------- */
419
+ /* --- channel editor ----------------------------------------------------------- */
745
420
 
746
- .editorBackdrop {
747
- position: fixed;
748
- inset: 0;
749
- z-index: 120;
750
- display: flex;
751
- align-items: flex-start;
752
- justify-content: center;
753
- padding: 9vh 16px 16px;
754
- background: color-mix(in srgb, var(--dsw-alias-bg-layer-1, #000) 45%, transparent);
421
+ .editorWrap {
422
+ margin-top: 10px;
755
423
  }
756
424
 
757
- .editorPanel {
758
- width: min(560px, 100%);
759
- max-height: 82vh;
760
- overflow-y: auto;
425
+ .channelEditor {
426
+ display: flex;
427
+ flex-direction: column;
428
+ gap: 2px;
761
429
  border: 1px solid var(--dsw-alias-border-l2);
762
- border-radius: 14px;
763
- background: var(--dsw-alias-bg-layer-2);
764
- box-shadow: 0 18px 50px rgb(0 0 0 / 0.35);
765
- padding: 16px;
430
+ border-radius: 12px;
431
+ background: var(--dsw-alias-bg-module-platform);
432
+ padding: 14px 16px;
766
433
  }
767
434
 
768
435
  .editorHeader {
769
436
  display: flex;
770
- align-items: flex-start;
771
- justify-content: space-between;
772
- gap: 12px;
773
- padding-bottom: 10px;
774
- border-bottom: 1px solid var(--dsw-alias-border-l2);
437
+ align-items: baseline;
438
+ gap: 8px;
439
+ padding-bottom: 4px;
775
440
  }
776
441
 
777
- .editorClose {
778
- appearance: none;
779
- flex: none;
780
- width: 26px;
781
- height: 26px;
782
- border: 0;
783
- border-radius: 6px;
784
- background: none;
442
+ .editorTitle {
443
+ font-size: 14px;
444
+ line-height: 22px;
445
+ font-weight: 600;
446
+ color: var(--dsw-alias-label-primary);
447
+ }
448
+
449
+ .editorTag {
450
+ font-size: 12px;
451
+ line-height: 18px;
785
452
  color: var(--dsw-alias-label-tertiary);
786
- font: inherit;
787
- font-size: 16px;
788
- line-height: 26px;
453
+ }
454
+
455
+ /* 自定义设置 disclosure */
456
+ .customSettings {
457
+ border-top: 1px solid var(--dsw-alias-border-l2);
458
+ padding-top: 10px;
459
+ margin-top: 6px;
460
+ }
461
+
462
+ .customSettingsSummary {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 6px;
466
+ width: fit-content;
467
+ padding: 2px 4px;
468
+ margin-left: -4px;
469
+ border-radius: 6px;
789
470
  cursor: pointer;
471
+ font-size: 12px;
472
+ line-height: 18px;
473
+ font-weight: 500;
474
+ color: var(--dsw-alias-label-secondary);
475
+ list-style: none;
476
+ }
477
+
478
+ .customSettingsSummary::-webkit-details-marker {
479
+ display: none;
480
+ }
481
+
482
+ .customSettingsSummary::before {
483
+ content: '';
484
+ width: 5px;
485
+ height: 5px;
486
+ border-right: 1.5px solid currentcolor;
487
+ border-bottom: 1.5px solid currentcolor;
488
+ transform: rotate(-45deg) translate(-1px, -1px);
489
+ transition: transform 120ms ease;
490
+ }
491
+
492
+ .customSettings[open] > .customSettingsSummary::before {
493
+ transform: rotate(45deg) translate(-1px, -1px);
790
494
  }
791
495
 
792
- .editorClose:hover {
496
+ .customSettingsSummary:hover {
793
497
  color: var(--dsw-alias-label-primary);
794
- background: var(--dsw-alias-bg-module-platform);
795
498
  }
796
499
 
797
- .editorField {
500
+ .customSettingsSummary:focus-visible {
501
+ outline: 2px solid var(--dsw-alias-brand-primary);
502
+ outline-offset: 2px;
503
+ }
504
+
505
+ .customSettingsBody {
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: 6px;
509
+ padding-top: 10px;
510
+ }
511
+
512
+ /* --- model catalog ------------------------------------------------------------ */
513
+
514
+ .modelCatalog {
515
+ display: flex;
516
+ flex-direction: column;
517
+ gap: 10px;
518
+ margin-top: 6px;
519
+ padding-top: 12px;
520
+ border-top: 1px solid var(--dsw-alias-border-l2);
521
+ }
522
+
523
+ .modelCatalogHead {
798
524
  display: flex;
799
- flex-direction: column;
800
- gap: 6px;
801
- padding: 12px 0 0;
525
+ align-items: flex-start;
526
+ justify-content: space-between;
527
+ gap: 12px;
528
+ }
529
+
530
+ .modelCatalogTitle {
531
+ display: block;
532
+ font-size: 13px;
533
+ line-height: 1.5;
534
+ font-weight: 500;
535
+ color: var(--dsw-alias-label-primary);
802
536
  }
803
537
 
804
- .editorDivider {
805
- height: 1px;
806
- margin: 14px 0 4px;
807
- background: var(--dsw-alias-border-l2);
538
+ .modelCatalogMeta {
539
+ display: block;
540
+ margin-top: 1px;
541
+ color: var(--dsw-alias-label-tertiary);
542
+ font-size: 12px;
543
+ line-height: 1.5;
808
544
  }
809
545
 
810
- .editorSectionHeader {
811
- display: flex;
546
+ .linkButton {
547
+ box-sizing: border-box;
548
+ display: inline-flex;
812
549
  align-items: center;
813
- justify-content: space-between;
814
- gap: 12px;
815
- padding: 10px 0 4px;
550
+ height: 28px;
551
+ padding: 0 10px;
552
+ border: none;
553
+ border-radius: 14px;
554
+ background: transparent;
555
+ color: var(--dsw-alias-label-tertiary);
556
+ font: inherit;
557
+ font-size: 12px;
558
+ line-height: 18px;
559
+ cursor: pointer;
816
560
  }
817
561
 
818
- .editorSectionHeader .label {
819
- flex: 1;
562
+ .linkButton:hover:not(:disabled) {
563
+ background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-module-platform));
564
+ color: var(--dsw-alias-label-secondary);
820
565
  }
821
566
 
822
- .editorTools {
823
- display: flex;
824
- flex-direction: column;
825
- gap: 8px;
826
- margin-top: 10px;
567
+ .linkButton:focus-visible {
568
+ outline: 2px solid var(--dsw-alias-brand-primary);
569
+ outline-offset: 1px;
827
570
  }
828
571
 
829
- .editorFooter {
830
- display: flex;
831
- align-items: center;
832
- gap: 8px;
833
- padding-top: 12px;
834
- border-top: 1px solid var(--dsw-alias-border-l2);
572
+ .linkButton:disabled {
573
+ opacity: 0.5;
574
+ cursor: default;
835
575
  }
836
576
 
837
- .detectOk {
577
+ .modelEmpty {
838
578
  margin: 0;
579
+ padding: 12px;
580
+ border: 1px dashed var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));
581
+ border-radius: 8px;
582
+ text-align: center;
583
+ color: var(--dsw-alias-label-tertiary);
839
584
  font-size: 12px;
840
- line-height: 1.5;
841
- color: var(--dsw-color-success, var(--dsw-alias-label-secondary));
585
+ line-height: 18px;
842
586
  }
843
587
 
844
- /* --- model catalog rows ---------------------------------------------------------------- */
845
-
846
588
  .modelRows {
847
589
  list-style: none;
848
- margin: 8px 0 0;
590
+ margin: 0;
849
591
  padding: 0;
850
592
  display: flex;
851
593
  flex-direction: column;
@@ -853,72 +595,43 @@
853
595
  }
854
596
 
855
597
  .modelRow {
856
- display: flex;
857
- align-items: center;
858
- justify-content: space-between;
859
- gap: 10px;
860
- border: 1px solid var(--dsw-alias-border-l2);
861
- border-radius: 10px;
862
- padding: 8px 10px;
863
- background: var(--dsw-alias-bg-layer-3);
864
- }
865
-
866
- .modelRowInputs {
867
- flex: 1;
868
- min-width: 0;
869
- display: flex;
598
+ display: grid;
599
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1.2fr) auto auto;
870
600
  align-items: center;
871
601
  gap: 6px;
872
602
  }
873
603
 
874
- .modelRowInputs .input {
875
- flex: 1;
604
+ .modelInput {
876
605
  min-width: 0;
606
+ height: 32px;
877
607
  }
878
608
 
879
609
  .modelArrow {
880
- flex: none;
881
610
  color: var(--dsw-alias-label-tertiary);
882
611
  font-size: 12px;
883
612
  }
884
613
 
885
- .modelRowBadges {
886
- flex: none;
887
- display: flex;
888
- align-items: center;
889
- gap: 6px;
890
- }
891
-
892
- .modelBadge {
893
- border-radius: 999px;
894
- padding: 0 7px;
895
- font-size: 11px;
896
- line-height: 17px;
897
- white-space: nowrap;
898
- background: var(--dsw-alias-bg-module-platform);
899
- color: var(--dsw-alias-label-tertiary);
900
- }
901
-
902
- .modelBadge[data-verified] {
903
- color: var(--dsw-color-success, var(--dsw-alias-label-secondary));
904
- }
905
-
906
- .modelBadge[data-warn] {
907
- color: var(--dsw-alias-label-error);
614
+ .modelCategorySelect {
615
+ min-width: 0;
616
+ max-width: 108px;
617
+ height: 32px;
618
+ padding: 0 6px;
619
+ cursor: pointer;
908
620
  }
909
621
 
910
622
  .modelRowRemove {
911
623
  appearance: none;
912
624
  flex: none;
913
- width: 20px;
914
- height: 20px;
625
+ width: 24px;
626
+ height: 24px;
915
627
  border: 0;
916
- border-radius: 4px;
628
+ border-radius: 6px;
917
629
  padding: 0;
918
630
  background: transparent;
919
631
  color: var(--dsw-alias-label-tertiary);
920
632
  font: inherit;
921
- line-height: 20px;
633
+ font-size: 14px;
634
+ line-height: 24px;
922
635
  cursor: pointer;
923
636
  }
924
637
 
@@ -932,92 +645,196 @@
932
645
  cursor: default;
933
646
  }
934
647
 
935
- .modelCandidate > .modelBadge {
936
- flex: none;
648
+ .modelCatalogTools {
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 8px;
652
+ }
653
+
654
+ .addModel {
655
+ appearance: none;
656
+ min-height: 30px;
657
+ border: 1px solid var(--dsw-alias-border-l2);
658
+ border-radius: 8px;
659
+ padding: 0 12px;
660
+ background: transparent;
661
+ color: var(--dsw-alias-label-secondary);
662
+ font: inherit;
663
+ font-size: 12px;
664
+ cursor: pointer;
665
+ }
666
+
667
+ .addModel:hover:not(:disabled) {
668
+ color: var(--dsw-alias-label-primary);
669
+ border-color: var(--dsw-alias-label-dimmed);
937
670
  }
938
671
 
939
- /* --- preset picker ---------------------------------------------------------------------- */
672
+ .addModel:disabled {
673
+ opacity: 0.45;
674
+ cursor: default;
675
+ }
940
676
 
941
- .channelControls {
942
- position: relative;
677
+ .modelBadge {
678
+ flex: none;
679
+ border-radius: 999px;
680
+ padding: 0 7px;
681
+ font-size: 11px;
682
+ line-height: 17px;
683
+ white-space: nowrap;
684
+ background: var(--dsw-alias-bg-module-platform);
685
+ color: var(--dsw-alias-label-tertiary);
943
686
  }
944
687
 
945
- .presetInline {
946
- position: absolute;
947
- left: 0;
948
- bottom: calc(100% + 8px);
949
- z-index: 10;
950
- width: min(420px, calc(100vw - 48px));
951
- max-height: min(440px, 60vh);
952
- overflow-y: auto;
688
+ .detectOk {
953
689
  margin: 0;
954
- padding: 12px;
690
+ font-size: 12px;
691
+ line-height: 1.5;
692
+ color: var(--dsw-color-success, var(--dsw-alias-label-secondary));
693
+ }
694
+
695
+ /* discovered-model candidate picker */
696
+ .candidatePanel {
697
+ display: flex;
698
+ flex-direction: column;
699
+ gap: 8px;
955
700
  border: 1px solid var(--dsw-alias-border-l2);
956
701
  border-radius: 10px;
957
- background: var(--dsw-alias-bg-layer-2);
958
- box-shadow: 0 12px 30px rgb(0 0 0 / 0.3);
702
+ background: var(--dsw-alias-bg-layer-3);
703
+ padding: 10px 12px;
959
704
  }
960
705
 
961
- .presetInlineHeader {
706
+ .candidateHead {
962
707
  display: flex;
963
- align-items: flex-start;
708
+ align-items: center;
964
709
  justify-content: space-between;
965
710
  gap: 12px;
966
711
  }
967
712
 
968
- .presetList {
713
+ .candidateTitle {
714
+ font-size: 12px;
715
+ line-height: 18px;
716
+ font-weight: 500;
717
+ color: var(--dsw-alias-label-secondary);
718
+ }
719
+
720
+ .candidateList {
721
+ list-style: none;
722
+ margin: 0;
723
+ padding: 0;
969
724
  display: flex;
970
725
  flex-direction: column;
971
- gap: 8px;
972
- margin-top: 12px;
726
+ gap: 4px;
727
+ max-height: 220px;
728
+ overflow-y: auto;
973
729
  }
974
730
 
975
- .presetRow {
976
- appearance: none;
731
+ .candidate {
977
732
  display: flex;
978
- flex-direction: column;
979
- align-items: flex-start;
980
- gap: 3px;
981
- width: 100%;
982
- border: 1px solid var(--dsw-alias-border-l2);
983
- border-radius: 10px;
984
- padding: 10px 12px;
985
- background: var(--dsw-alias-bg-layer-3);
986
- color: inherit;
987
- font: inherit;
988
- text-align: left;
989
- cursor: pointer;
733
+ align-items: center;
990
734
  }
991
735
 
992
- .presetRow:hover:not(:disabled) {
993
- border-color: var(--dsw-alias-brand-primary);
736
+ .candidateLabel {
737
+ display: inline-flex;
738
+ align-items: center;
739
+ gap: 7px;
740
+ min-width: 0;
741
+ padding: 4px 2px;
742
+ color: var(--dsw-alias-label-secondary);
743
+ font-size: 12px;
744
+ line-height: 1.5;
745
+ cursor: pointer;
994
746
  }
995
747
 
996
- .presetRow[data-custom] {
997
- border-style: dashed;
748
+ .candidateLabel input {
749
+ margin: 0;
998
750
  }
999
751
 
1000
- .presetRow:disabled {
1001
- opacity: 0.5;
752
+ .candidateLabel:has(input:disabled) {
753
+ opacity: 0.55;
1002
754
  cursor: default;
1003
755
  }
1004
756
 
1005
- .presetName {
1006
- font-size: 13px;
1007
- font-weight: 600;
1008
- line-height: 1.4;
1009
- color: var(--dsw-alias-label-primary);
757
+ .candidateId {
758
+ overflow: hidden;
759
+ text-overflow: ellipsis;
760
+ white-space: nowrap;
761
+ font-family: var(--dsw-font-family-mono, monospace);
1010
762
  }
1011
763
 
1012
- .presetMeta {
1013
- font-size: 11px;
1014
- line-height: 1.5;
1015
- color: var(--dsw-alias-label-tertiary);
1016
- font-family: var(--dsw-font-family-mono, monospace);
764
+ .candidateActions {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: flex-end;
768
+ gap: 8px;
1017
769
  }
1018
770
 
1019
- .presetHint {
771
+ /* --- footer (mirror of the official card footer) ------------------------------ */
772
+
773
+ .footer,
774
+ .editorFooter {
775
+ display: flex;
776
+ align-items: center;
777
+ justify-content: flex-end;
778
+ gap: 8px;
779
+ padding: 12px 0 4px;
780
+ border-top: 1px solid var(--dsw-alias-border-l2);
781
+ }
782
+
783
+ .editorFooter {
784
+ margin-top: 8px;
785
+ }
786
+
787
+ .failed {
788
+ flex: 1;
789
+ min-width: 0;
790
+ margin: 0;
1020
791
  font-size: 12px;
1021
792
  line-height: 1.5;
793
+ color: var(--dsw-alias-label-error);
794
+ }
795
+
796
+ .discard,
797
+ .save {
798
+ appearance: none;
799
+ border: 1px solid transparent;
800
+ border-radius: 8px;
801
+ padding: 5px 14px;
802
+ font: inherit;
803
+ font-size: 13px;
804
+ line-height: 1.5;
805
+ cursor: pointer;
806
+ }
807
+
808
+ .discard {
809
+ border-color: var(--dsw-alias-border-l2);
810
+ background: none;
1022
811
  color: var(--dsw-alias-label-secondary);
1023
812
  }
813
+
814
+ .discard:hover:not(:disabled) {
815
+ color: var(--dsw-alias-label-primary);
816
+ border-color: var(--dsw-alias-label-dimmed);
817
+ }
818
+
819
+ .save {
820
+ background: var(--dsw-alias-label-primary);
821
+ color: var(--dsw-alias-bg-layer-3);
822
+ }
823
+
824
+ .discard:disabled,
825
+ .save:disabled {
826
+ opacity: 0.4;
827
+ cursor: default;
828
+ }
829
+
830
+ .discard:focus-visible,
831
+ .save:focus-visible {
832
+ outline: 2px solid var(--dsw-alias-brand-primary);
833
+ outline-offset: 1px;
834
+ }
835
+
836
+ @media (prefers-reduced-motion: reduce) {
837
+ .card, .chevron, .chevronOpen {
838
+ transition: none;
839
+ }
840
+ }