dsh-audiogen 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.
@@ -0,0 +1,1566 @@
1
+ /**
2
+ * dsh-audiogen studio styles. Scoped by the plugin's own data attributes so
3
+ * nothing leaks into the rest of the GUI; colors ride the dsh --dsw-* tokens
4
+ * and interactive controls reuse the system primitives (Button / Pill), so
5
+ * the studio follows the active theme (light/dark and skins) by construction.
6
+ * The center-column hide rules are attribute-scoped and must stay in this
7
+ * stylesheet (it is imported by mount.tsx, so the styles load with the
8
+ * plugin).
9
+ */
10
+
11
+ /* --- center-column takeover (global rules, attribute-scoped) ----------------- */
12
+
13
+ /* The panel container rides inside the conversation grid item as an extra
14
+ trailing child; hidden unless the panel is active. The position rule covers
15
+ both shells: the legacy `[data-pane="conversation"]` and the rc.6+
16
+ AppFrame class-based column ([class*="centerCol"]) — without a positioned
17
+ ancestor the absolutely-positioned view resolves against the frame. */
18
+ [data-pane='conversation'],
19
+ [class*='centerCol'] {
20
+ position: relative;
21
+ }
22
+
23
+ /* The panel container rides inside the conversation grid item as an extra
24
+ trailing child; hidden unless the panel is active. */
25
+ [data-dsh-audiogen-view] {
26
+ position: absolute;
27
+ inset: 0;
28
+ display: none;
29
+ z-index: 60;
30
+ background: var(--dsw-alias-bg-base);
31
+ }
32
+
33
+ /* The center column is single-occupant; the :not() guards keep the sibling
34
+ panels (task board / ssh) from fighting over visibility if both activation
35
+ attributes ever coexist. */
36
+ html[data-dsh-audiogen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-audiogen-view] {
37
+ display: block;
38
+ }
39
+
40
+ /* While the panel is active, the conversation content underneath is hidden
41
+ (it stays mounted and stateful). */
42
+ html[data-dsh-audiogen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane='conversation'] > :not([data-dsh-audiogen-view]),
43
+ html[data-dsh-audiogen-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*='centerCol'] > :not([data-dsh-audiogen-view]) {
44
+ display: none !important;
45
+ }
46
+
47
+ /* --- sidebar entry row ------------------------------------------------------- */
48
+
49
+ .entry {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: 8px;
53
+ width: 100%;
54
+ height: 32px;
55
+ padding: 0 12px;
56
+ background: transparent;
57
+ border: none;
58
+ border-radius: 8px;
59
+ color: var(--dsw-alias-label-secondary);
60
+ cursor: pointer;
61
+ font-size: 13px;
62
+ white-space: nowrap;
63
+ }
64
+
65
+ .entry:hover {
66
+ background: var(--dsw-specific-sidebar-nav-item-hover);
67
+ color: var(--dsw-alias-label-primary);
68
+ }
69
+
70
+ .entry[data-active] {
71
+ background: var(--dsw-specific-sidebar-nav-item-active);
72
+ color: var(--dsw-alias-label-primary);
73
+ font-weight: 600;
74
+ }
75
+
76
+ .entryIcon {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ flex: none;
81
+ }
82
+
83
+ .entryLabel {
84
+ overflow: hidden;
85
+ text-overflow: ellipsis;
86
+ }
87
+
88
+ /* Collapsed rail: icon-only, centered, matching the shell's 56px rail. */
89
+ [data-dsh-frame][data-sidebar-collapsed] .entry {
90
+ justify-content: center;
91
+ padding: 0;
92
+ width: 100%;
93
+ }
94
+
95
+ [data-dsh-frame][data-sidebar-collapsed] .entryLabel {
96
+ display: none;
97
+ }
98
+
99
+ /* --- panel frame -------------------------------------------------------------- */
100
+
101
+ .view {
102
+ overflow: hidden;
103
+ }
104
+
105
+ /* The shell does not ship a global `box-sizing: border-box` reset, so scope
106
+ one to the panel subtree: without it, `height: 100%` + padding grows past
107
+ the container and clips the footer off the bottom of the screen. */
108
+ .panel,
109
+ .panel *,
110
+ .panel *::before,
111
+ .panel *::after {
112
+ box-sizing: border-box;
113
+ }
114
+
115
+ .panel {
116
+ position: relative;
117
+ display: flex;
118
+ flex-direction: column;
119
+ height: 100%;
120
+ min-width: 0;
121
+ min-height: 0;
122
+ overflow: hidden;
123
+ padding: 14px 16px 16px;
124
+ gap: 10px;
125
+ background: var(--dsw-alias-bg-base);
126
+ color: var(--dsw-alias-label-primary);
127
+ font-family: var(--dsw-font-family);
128
+ }
129
+
130
+ .panelHeader {
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: space-between;
134
+ gap: 12px;
135
+ flex: none;
136
+ }
137
+
138
+ .panelHeading {
139
+ display: flex;
140
+ align-items: baseline;
141
+ gap: 10px;
142
+ min-width: 0;
143
+ }
144
+
145
+ .panelTitle {
146
+ margin: 0;
147
+ font-size: 16px;
148
+ font-weight: 700;
149
+ color: var(--dsw-alias-label-primary);
150
+ white-space: nowrap;
151
+ }
152
+
153
+ /* GitHub icon button next to the title (opens the repo). */
154
+ .githubLink {
155
+ display: inline-flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ flex: none;
159
+ width: 22px;
160
+ height: 22px;
161
+ border-radius: 6px;
162
+ color: var(--dsw-alias-label-secondary);
163
+ text-decoration: none;
164
+ transition: color 0.12s, background 0.12s;
165
+ }
166
+
167
+ .githubLink:hover {
168
+ color: var(--dsw-alias-label-primary);
169
+ background: var(--dsw-alias-bg-layer-2);
170
+ }
171
+
172
+ /* --- connection status and update notice -------------------------------------- */
173
+
174
+ .connectionStatus {
175
+ display: inline-flex;
176
+ align-items: center;
177
+ gap: 6px;
178
+ flex: none;
179
+ height: 28px;
180
+ padding: 0 10px;
181
+ border: 1px solid var(--dsw-alias-label-error);
182
+ border-radius: 8px;
183
+ background: transparent;
184
+ color: var(--dsw-alias-label-error);
185
+ font: inherit;
186
+ font-size: 12px;
187
+ line-height: 1;
188
+ white-space: nowrap;
189
+ }
190
+
191
+ .connectionStatus[data-connected='true'] {
192
+ border-color: var(--dsw-alias-state-success-primary);
193
+ color: var(--dsw-alias-state-success-primary);
194
+ }
195
+
196
+ .connectionDot {
197
+ width: 6px;
198
+ height: 6px;
199
+ border-radius: 50%;
200
+ background: currentColor;
201
+ }
202
+
203
+ .updateBanner {
204
+ display: flex;
205
+ align-items: center;
206
+ justify-content: space-between;
207
+ gap: 12px;
208
+ flex: none;
209
+ padding: 7px 10px 7px 12px;
210
+ font-size: 12px;
211
+ line-height: 1.5;
212
+ border-radius: 10px;
213
+ border: 1px solid var(--dsw-alias-state-warn-primary);
214
+ color: var(--dsw-alias-state-warn-primary);
215
+ overflow-wrap: anywhere;
216
+ }
217
+
218
+ .updateBanner[data-kind='ok'] {
219
+ color: var(--dsw-alias-state-success-primary);
220
+ border-color: var(--dsw-alias-state-success-primary);
221
+ }
222
+
223
+ .updateText {
224
+ min-width: 0;
225
+ }
226
+
227
+ .updateActions {
228
+ display: inline-flex;
229
+ align-items: center;
230
+ gap: 10px;
231
+ flex: none;
232
+ }
233
+
234
+ .updateRelease {
235
+ color: inherit;
236
+ text-decoration: underline;
237
+ text-underline-offset: 2px;
238
+ white-space: nowrap;
239
+ }
240
+
241
+ @media (max-width: 700px) {
242
+ .panelHeader {
243
+ align-items: flex-start;
244
+ }
245
+
246
+ .panelHeading {
247
+ align-items: flex-start;
248
+ flex-direction: column;
249
+ gap: 2px;
250
+ }
251
+
252
+ .updateBanner {
253
+ align-items: flex-start;
254
+ flex-direction: column;
255
+ }
256
+
257
+ .updateActions {
258
+ width: 100%;
259
+ justify-content: space-between;
260
+ }
261
+ }
262
+
263
+ /* --- studio split: left config sidebar (narrow) + right canvas (wide) --------- */
264
+
265
+ .studio {
266
+ display: flex;
267
+ gap: 14px;
268
+ flex: 1;
269
+ min-height: 0;
270
+ min-width: 0;
271
+ }
272
+
273
+ .config {
274
+ display: flex;
275
+ flex-direction: column;
276
+ gap: 12px;
277
+ flex: none;
278
+ width: 300px;
279
+ min-width: 260px;
280
+ max-width: 340px;
281
+ height: 100%;
282
+ min-height: 0;
283
+ overflow: hidden;
284
+ }
285
+
286
+ /* The cards scroll in their own scrollport; the footer stays a fixed sibling
287
+ below, so nothing ever hides underneath it (text and edit modes alike). */
288
+ .configScroll {
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: 12px;
292
+ flex: 1;
293
+ min-height: 0;
294
+ overflow-y: auto;
295
+ padding-right: 2px;
296
+ scrollbar-width: thin;
297
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
298
+ }
299
+
300
+ .configScroll::-webkit-scrollbar {
301
+ width: 8px;
302
+ }
303
+
304
+ .configScroll::-webkit-scrollbar-thumb {
305
+ background: var(--dsw-alias-border-l2);
306
+ border-radius: 999px;
307
+ }
308
+
309
+ .canvas {
310
+ position: relative;
311
+ flex: 1;
312
+ min-width: 0;
313
+ min-height: 0;
314
+ display: flex;
315
+ flex-direction: column;
316
+ border: 1px solid var(--dsw-alias-border-l1);
317
+ border-radius: 12px;
318
+ background: var(--dsw-alias-bg-layer-1);
319
+ overflow: hidden;
320
+ }
321
+
322
+ .taskTray {
323
+ position: absolute;
324
+ z-index: 6;
325
+ top: 12px;
326
+ right: 12px;
327
+ width: min(360px, calc(100% - 24px));
328
+ max-height: calc(100% - 24px);
329
+ display: flex;
330
+ flex-direction: column;
331
+ overflow: hidden;
332
+ border: 1px solid var(--dsw-alias-border-l2);
333
+ border-radius: 9px;
334
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 92%, transparent);
335
+ box-shadow: 0 8px 24px rgb(0 0 0 / 12%);
336
+ backdrop-filter: blur(10px);
337
+ }
338
+
339
+ .taskTray[data-open='false'] { width: auto; max-width: calc(100% - 24px); }
340
+ .taskTrayHeader { display: flex; align-items: stretch; min-height: 34px; color: var(--dsw-alias-label-primary); font-size: 12px; font-weight: 600; border-bottom: 1px solid var(--dsw-alias-border-l1); }
341
+ .taskTray[data-open='false'] .taskTrayHeader { border-bottom: 0; }
342
+ .taskTrayToggle { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; padding: 8px 10px; border: 0; color: inherit; background: transparent; cursor: pointer; font: inherit; font-size: inherit; font-weight: inherit; text-align: left; }
343
+ .taskTrayToggle:hover { background: var(--dsw-alias-bg-layer-2); }
344
+ .taskTrayCount { min-width: 18px; padding: 1px 5px; border-radius: 999px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-2); font-size: 11px; font-weight: 500; text-align: center; }
345
+ .taskTrayChevron { margin-left: auto; color: var(--dsw-alias-label-tertiary); font-size: 12px; font-weight: 400; }
346
+ .taskTrayClose { width: 32px; border: 0; border-left: 1px solid var(--dsw-alias-border-l1); color: var(--dsw-alias-label-tertiary); background: transparent; cursor: pointer; font: inherit; font-size: 17px; }
347
+ .taskTrayClose:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-2); }
348
+ .taskTray[data-open='false'] .taskTrayToggle { min-height: 34px; }
349
+ .taskRows { min-height: 0; overflow-y: auto; }
350
+ .taskTray[data-open='false'] .taskRows { display: none; }
351
+ .taskRow { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 7px; align-items: center; padding: 7px 10px; border-top: 1px solid var(--dsw-alias-border-l1); }
352
+ .taskRow:first-of-type { border-top: 0; }
353
+ .taskStatus { color: var(--dsw-alias-label-tertiary); font-size: 11px; white-space: nowrap; }
354
+ .taskRow[data-status='running'] .taskStatus { color: var(--dsw-alias-brand-primary); }
355
+ .taskRow[data-status='failed'] .taskStatus { color: var(--dsw-alias-label-error); }
356
+ .taskPrompt { overflow: hidden; color: var(--dsw-alias-label-secondary); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
357
+ .taskRow button { padding: 2px 7px; border: 0; border-radius: 5px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-2); cursor: pointer; font: inherit; font-size: 11px; }
358
+ .taskRow button:hover { color: var(--dsw-alias-brand-primary); }
359
+
360
+ .configGuide { position: fixed; inset: 0; z-index: 1100; display: grid; place-items: center; padding: 20px; background: rgb(0 0 0 / 35%); }
361
+ .configGuideBody { display: flex; width: min(360px, 100%); flex-direction: column; gap: 12px; padding: 18px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 10px; color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-1); box-shadow: 0 14px 40px rgb(0 0 0 / 20%); }
362
+ .configGuideBody span { color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 1.55; }
363
+ .configGuideBody button { align-self: flex-end; min-height: 30px; padding: 0 12px; border: 0; border-radius: 7px; color: var(--dsw-alias-bg-layer-1); background: var(--dsw-alias-brand-primary); cursor: pointer; font: inherit; font-size: 12px; }
364
+
365
+ /* --- history column (far right) ------------------------------------------------ */
366
+
367
+ .history {
368
+ display: flex;
369
+ flex-direction: column;
370
+ flex: none;
371
+ width: 240px;
372
+ min-width: 200px;
373
+ max-width: 280px;
374
+ min-height: 0;
375
+ border: 1px solid var(--dsw-alias-border-l1);
376
+ border-radius: 12px;
377
+ background: var(--dsw-alias-bg-layer-1);
378
+ overflow: hidden;
379
+ }
380
+
381
+ .historyHeader {
382
+ display: flex;
383
+ align-items: center;
384
+ justify-content: space-between;
385
+ gap: 8px;
386
+ padding: 10px 12px;
387
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
388
+ flex: none;
389
+ }
390
+
391
+ .historyFilters {
392
+ display: grid;
393
+ grid-template-columns: 1fr 1fr;
394
+ gap: 6px;
395
+ padding: 8px 10px;
396
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
397
+ }
398
+
399
+ .historySearch,
400
+ .historyFilters select,
401
+ .gallerySearch {
402
+ min-width: 0;
403
+ min-height: 29px;
404
+ box-sizing: border-box;
405
+ padding: 0 8px;
406
+ border: 1px solid var(--dsw-alias-border-l2);
407
+ border-radius: 7px;
408
+ color: var(--dsw-alias-label-primary);
409
+ background: var(--dsw-alias-bg-layer-2);
410
+ font: inherit;
411
+ font-size: 11px;
412
+ }
413
+
414
+ .historySearch { grid-column: 1 / -1; }
415
+ .gallerySearch { width: 156px; }
416
+ .galleryTagInput { width: 130px; min-height: 29px; box-sizing: border-box; padding: 0 8px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 7px; color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-2); font: inherit; font-size: 11px; }
417
+ .galleryBulkButton { min-height: 29px; padding: 0 8px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 7px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-1); cursor: pointer; font: inherit; font-size: 11px; }
418
+ .galleryBulkButton:hover:not(:disabled) { color: var(--dsw-alias-brand-primary); border-color: var(--dsw-alias-brand-primary); }
419
+ .galleryBulkButton:disabled { opacity: .45; cursor: default; }
420
+
421
+ .historyTitle {
422
+ font-size: 13px;
423
+ font-weight: 600;
424
+ color: var(--dsw-alias-label-primary);
425
+ }
426
+
427
+ .historyClear {
428
+ padding: 2px 8px;
429
+ font: inherit;
430
+ font-size: 11.5px;
431
+ color: var(--dsw-alias-label-tertiary);
432
+ background: transparent;
433
+ border: 1px solid var(--dsw-alias-border-l2);
434
+ border-radius: 999px;
435
+ cursor: pointer;
436
+ }
437
+
438
+ .historyClear:hover {
439
+ color: var(--dsw-alias-label-error);
440
+ border-color: var(--dsw-alias-label-error);
441
+ }
442
+
443
+ .historyList {
444
+ flex: 1;
445
+ min-height: 0;
446
+ overflow-y: auto;
447
+ display: flex;
448
+ flex-direction: column;
449
+ gap: 8px;
450
+ padding: 10px;
451
+ scrollbar-width: thin;
452
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
453
+ }
454
+
455
+ .historyList::-webkit-scrollbar {
456
+ width: 8px;
457
+ }
458
+
459
+ .historyList::-webkit-scrollbar-thumb {
460
+ background: var(--dsw-alias-border-l2);
461
+ border-radius: 999px;
462
+ }
463
+
464
+ .historyEmpty {
465
+ flex: 1;
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ padding: 20px;
470
+ font-size: 12px;
471
+ line-height: 1.6;
472
+ text-align: center;
473
+ color: var(--dsw-alias-label-tertiary);
474
+ }
475
+
476
+ .historyItem {
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: 6px;
480
+ padding: 8px;
481
+ border: 1px solid var(--dsw-alias-border-l1);
482
+ border-radius: 10px;
483
+ background: var(--dsw-alias-bg-layer-2);
484
+ flex: none;
485
+ }
486
+
487
+ .historyItem:hover {
488
+ border-color: var(--dsw-alias-border-l2);
489
+ }
490
+
491
+ .historyItem[data-active] {
492
+ border-color: var(--dsw-alias-brand-primary);
493
+ }
494
+
495
+ .historyMain {
496
+ display: flex;
497
+ gap: 8px;
498
+ align-items: flex-start;
499
+ padding: 0;
500
+ background: transparent;
501
+ border: none;
502
+ font: inherit;
503
+ color: inherit;
504
+ text-align: left;
505
+ cursor: pointer;
506
+ min-width: 0;
507
+ }
508
+
509
+ .historyThumb {
510
+ width: 52px;
511
+ height: 52px;
512
+ border-radius: 8px;
513
+ object-fit: cover;
514
+ background: var(--dsw-alias-bg-base);
515
+ flex: none;
516
+ }
517
+
518
+ .historyThumbPlaceholder {
519
+ width: 52px;
520
+ height: 52px;
521
+ border-radius: 8px;
522
+ background: var(--dsw-alias-bg-layer-3);
523
+ flex: none;
524
+ }
525
+
526
+ .historyInfo {
527
+ flex: 1;
528
+ min-width: 0;
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 4px;
532
+ }
533
+
534
+ .historyPrompt {
535
+ font-size: 12px;
536
+ line-height: 1.4;
537
+ color: var(--dsw-alias-label-primary);
538
+ display: -webkit-box;
539
+ -webkit-line-clamp: 2;
540
+ -webkit-box-orient: vertical;
541
+ overflow: hidden;
542
+ }
543
+
544
+ .historyMeta {
545
+ font-size: 11px;
546
+ color: var(--dsw-alias-label-tertiary);
547
+ white-space: nowrap;
548
+ overflow: hidden;
549
+ text-overflow: ellipsis;
550
+ }
551
+
552
+ .historyActions {
553
+ display: flex;
554
+ gap: 6px;
555
+ justify-content: flex-end;
556
+ }
557
+
558
+ .historyAction {
559
+ padding: 2px 8px;
560
+ font: inherit;
561
+ font-size: 11.5px;
562
+ color: var(--dsw-alias-label-secondary);
563
+ background: transparent;
564
+ border: 1px solid var(--dsw-alias-border-l2);
565
+ border-radius: 999px;
566
+ cursor: pointer;
567
+ }
568
+
569
+ .historyAction:hover {
570
+ color: var(--dsw-alias-label-primary);
571
+ border-color: var(--dsw-alias-label-dimmed);
572
+ }
573
+
574
+ .historyAction[data-danger]:hover {
575
+ color: var(--dsw-alias-label-error);
576
+ border-color: var(--dsw-alias-label-error);
577
+ }
578
+
579
+ /* --- cards (system-aligned rounded group chrome) ------------------------------ */
580
+
581
+ .card {
582
+ display: flex;
583
+ flex-direction: column;
584
+ gap: 10px;
585
+ padding: 12px;
586
+ background: var(--dsw-alias-bg-layer-2);
587
+ border: 1px solid var(--dsw-alias-border-l1);
588
+ border-radius: 12px;
589
+ flex: none;
590
+ }
591
+
592
+ /* --- mode tabs (system Pill switcher) ------------------------------------------ */
593
+
594
+ .modeRow {
595
+ display: flex;
596
+ gap: 8px;
597
+ align-items: center;
598
+ }
599
+
600
+ .modePill {
601
+ flex: 1;
602
+ justify-content: center;
603
+ height: 28px;
604
+ font-size: 13px;
605
+ }
606
+
607
+ /* --- reference image upload (edit mode) ---------------------------------------- */
608
+
609
+ .uploadBox {
610
+ display: flex;
611
+ flex-direction: column;
612
+ align-items: center;
613
+ justify-content: center;
614
+ gap: 6px;
615
+ min-height: 128px;
616
+ padding: 16px;
617
+ color: var(--dsw-alias-label-secondary);
618
+ background: transparent;
619
+ border: 1.5px dashed var(--dsw-alias-border-l2);
620
+ border-radius: 12px;
621
+ cursor: pointer;
622
+ font: inherit;
623
+ font-size: 12.5px;
624
+ text-align: center;
625
+ }
626
+
627
+ .uploadBox:hover {
628
+ color: var(--dsw-alias-label-primary);
629
+ border-color: var(--dsw-alias-label-dimmed);
630
+ background: var(--dsw-alias-interactive-bg-hover);
631
+ }
632
+
633
+ .uploadBox:focus-visible {
634
+ outline: 2px solid var(--dsw-alias-brand-primary);
635
+ outline-offset: 1px;
636
+ }
637
+
638
+ .uploadIcon {
639
+ display: inline-flex;
640
+ color: var(--dsw-alias-label-tertiary);
641
+ }
642
+
643
+ .uploadHint {
644
+ font-size: 11px;
645
+ color: var(--dsw-alias-label-tertiary);
646
+ }
647
+
648
+ .reference {
649
+ display: flex;
650
+ flex-direction: column;
651
+ gap: 8px;
652
+ }
653
+
654
+ .referenceImage {
655
+ width: 100%;
656
+ max-height: 176px;
657
+ object-fit: contain;
658
+ border-radius: 10px;
659
+ background: var(--dsw-alias-bg-base);
660
+ border: 1px solid var(--dsw-alias-border-l1);
661
+ }
662
+
663
+ .referenceActions {
664
+ display: flex;
665
+ gap: 8px;
666
+ }
667
+
668
+ .hiddenFile {
669
+ display: none;
670
+ }
671
+
672
+ /* --- prompt -------------------------------------------------------------------- */
673
+
674
+ .prompt {
675
+ width: 100%;
676
+ min-height: 120px;
677
+ padding: 10px 12px;
678
+ font-size: 13px;
679
+ line-height: 1.6;
680
+ color: var(--dsw-alias-label-primary);
681
+ background: var(--dsw-alias-bg-layer-3);
682
+ border: 1px solid var(--dsw-alias-border-l2);
683
+ border-radius: 10px;
684
+ outline: none;
685
+ resize: vertical;
686
+ font-family: inherit;
687
+ box-sizing: border-box;
688
+ }
689
+
690
+ .prompt:focus-visible {
691
+ border-color: var(--dsw-alias-brand-primary);
692
+ }
693
+
694
+ .prompt::placeholder {
695
+ color: var(--dsw-alias-label-tertiary);
696
+ }
697
+
698
+ .promptFooter {
699
+ display: flex;
700
+ align-items: center;
701
+ justify-content: space-between;
702
+ gap: 8px;
703
+ margin-top: -6px;
704
+ }
705
+
706
+ .templatesButton {
707
+ display: inline-flex;
708
+ align-items: center;
709
+ gap: 6px;
710
+ height: 26px;
711
+ padding: 0 12px;
712
+ border: 1px solid var(--dsw-alias-brand-primary);
713
+ border-radius: 999px;
714
+ background: linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 5%, transparent));
715
+ color: var(--dsw-alias-brand-primary);
716
+ font-size: 12px;
717
+ font-weight: 600;
718
+ font-family: inherit;
719
+ cursor: pointer;
720
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--dsw-alias-brand-primary) 22%, transparent);
721
+ transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
722
+ }
723
+
724
+ .templatesButton svg {
725
+ flex: none;
726
+ }
727
+
728
+ .templatesButton:hover {
729
+ background: linear-gradient(135deg, color-mix(in srgb, var(--dsw-alias-brand-primary) 24%, transparent), color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent));
730
+ color: var(--dsw-alias-brand-primary);
731
+ transform: translateY(-1px);
732
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, transparent);
733
+ }
734
+
735
+ .templatesButton:active {
736
+ transform: translateY(0);
737
+ }
738
+
739
+ .enhanceButton {
740
+ height: 26px;
741
+ margin-left: auto;
742
+ padding: 0 11px;
743
+ border: 1px solid var(--dsw-alias-border-l2);
744
+ border-radius: 999px;
745
+ color: var(--dsw-alias-label-secondary);
746
+ background: var(--dsw-alias-bg-layer-2);
747
+ font: inherit;
748
+ font-size: 12px;
749
+ cursor: pointer;
750
+ }
751
+
752
+ .enhanceButton:hover:not(:disabled) {
753
+ color: var(--dsw-alias-brand-primary);
754
+ border-color: var(--dsw-alias-brand-primary);
755
+ }
756
+
757
+ .enhanceButton:disabled { opacity: 0.5; cursor: default; }
758
+
759
+ .promptCount {
760
+ font-size: 11px;
761
+ color: var(--dsw-alias-label-tertiary);
762
+ font-variant-numeric: tabular-nums;
763
+ }
764
+
765
+ /* --- parameter groups ----------------------------------------------------------- */
766
+
767
+ .paramGroup {
768
+ display: flex;
769
+ flex-direction: column;
770
+ gap: 8px;
771
+ }
772
+
773
+ .paramLabel {
774
+ font-size: 12px;
775
+ font-weight: 600;
776
+ color: var(--dsw-alias-label-secondary);
777
+ }
778
+
779
+ .optionRow {
780
+ display: flex;
781
+ gap: 6px;
782
+ flex-wrap: wrap;
783
+ }
784
+
785
+ .optionGrid {
786
+ display: grid;
787
+ grid-template-columns: repeat(3, 1fr);
788
+ gap: 6px;
789
+ }
790
+
791
+ .optionPill {
792
+ justify-content: center;
793
+ }
794
+
795
+ .paramHint {
796
+ font-size: 11px;
797
+ line-height: 1.45;
798
+ color: var(--dsw-alias-label-tertiary);
799
+ }
800
+
801
+ /* --- footer: model dropdown + generate button (fixed under the scroll) -------- */
802
+
803
+ .footer {
804
+ display: flex;
805
+ flex-direction: column;
806
+ align-items: stretch;
807
+ gap: 8px;
808
+ flex: none;
809
+ padding: 10px 2px 0 0;
810
+ border-top: 1px solid var(--dsw-alias-border-l1);
811
+ }
812
+
813
+ .modelWrap {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 5px;
817
+ min-width: 0;
818
+ }
819
+
820
+ .modelLabel {
821
+ font-size: 12px;
822
+ font-weight: 600;
823
+ color: var(--dsw-alias-label-secondary);
824
+ }
825
+
826
+ .modelSelect {
827
+ width: 100%;
828
+ height: 36px;
829
+ display: flex;
830
+ align-items: center;
831
+ justify-content: space-between;
832
+ gap: 8px;
833
+ padding: 0 12px;
834
+ font-size: 13px;
835
+ color: var(--dsw-alias-label-primary);
836
+ background: var(--dsw-alias-bg-layer-2);
837
+ border: 1px solid var(--dsw-alias-border-l2);
838
+ border-radius: 18px;
839
+ outline: none;
840
+ font-family: inherit;
841
+ cursor: pointer;
842
+ text-align: left;
843
+ }
844
+
845
+ .modelSelect:focus-visible {
846
+ border-color: var(--dsw-alias-brand-primary);
847
+ }
848
+
849
+ .modelSelect:disabled {
850
+ opacity: 0.55;
851
+ cursor: default;
852
+ }
853
+
854
+ /* Model dropdown trigger + upward-opening menu. */
855
+ .modelMenu {
856
+ position: relative;
857
+ display: block;
858
+ min-width: 0;
859
+ }
860
+
861
+ /* The list opens UPWARD (absolute above the trigger) so it never hides
862
+ behind the footer edge below. */
863
+ .modelMenuList {
864
+ position: absolute;
865
+ left: 0;
866
+ right: 0;
867
+ bottom: calc(100% + 6px);
868
+ z-index: 40;
869
+ display: flex;
870
+ flex-direction: column;
871
+ padding: 4px;
872
+ background: var(--dsw-alias-bg-layer-2);
873
+ border: 1px solid var(--dsw-alias-border-l2);
874
+ border-radius: 12px;
875
+ box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.18);
876
+ overflow: hidden;
877
+ }
878
+
879
+ .modelMenuItem {
880
+ display: block;
881
+ width: 100%;
882
+ padding: 7px 10px;
883
+ font: inherit;
884
+ font-size: 13px;
885
+ color: var(--dsw-alias-label-primary);
886
+ background: transparent;
887
+ border: none;
888
+ border-radius: 8px;
889
+ cursor: pointer;
890
+ text-align: left;
891
+ white-space: nowrap;
892
+ overflow: hidden;
893
+ text-overflow: ellipsis;
894
+ }
895
+
896
+ .modelMenuItem:hover {
897
+ background: var(--dsw-alias-bg-hover);
898
+ }
899
+
900
+ .modelMenuItem[data-selected] {
901
+ color: var(--dsw-alias-brand-primary);
902
+ font-weight: 600;
903
+ background: var(--dsw-alias-bg-layer-1);
904
+ }
905
+
906
+ .generateButton {
907
+ width: 100%;
908
+ }
909
+
910
+ .generateInner {
911
+ display: inline-flex;
912
+ align-items: center;
913
+ gap: 7px;
914
+ }
915
+
916
+ /* --- canvas states --------------------------------------------------------------- */
917
+
918
+ .canvasState {
919
+ flex: 1;
920
+ display: flex;
921
+ flex-direction: column;
922
+ align-items: center;
923
+ justify-content: center;
924
+ gap: 8px;
925
+ padding: 24px;
926
+ text-align: center;
927
+ color: var(--dsw-alias-label-tertiary);
928
+ }
929
+
930
+ .canvasStateTitle {
931
+ font-size: 14px;
932
+ font-weight: 600;
933
+ color: var(--dsw-alias-label-secondary);
934
+ }
935
+
936
+ .canvasStateHint {
937
+ font-size: 12px;
938
+ max-width: 380px;
939
+ line-height: 1.6;
940
+ }
941
+
942
+ .canvasEmptyIcon {
943
+ display: inline-flex;
944
+ margin-bottom: 4px;
945
+ color: var(--dsw-alias-label-tertiary);
946
+ }
947
+
948
+ .canvasError {
949
+ margin: 14px;
950
+ padding: 10px 14px;
951
+ font-size: 12.5px;
952
+ line-height: 1.6;
953
+ color: var(--dsw-alias-label-error);
954
+ background: var(--dsw-alias-bg-layer-2);
955
+ border: 1px solid var(--dsw-alias-label-error);
956
+ border-radius: 10px;
957
+ overflow-wrap: anywhere;
958
+ flex: none;
959
+ }
960
+
961
+ .canvasBody {
962
+ flex: 1;
963
+ min-height: 0;
964
+ display: flex;
965
+ flex-direction: column;
966
+ gap: 10px;
967
+ overflow-y: auto;
968
+ padding: 14px;
969
+ scrollbar-width: thin;
970
+ scrollbar-color: var(--dsw-alias-border-l2) transparent;
971
+ }
972
+
973
+ .canvasBody::-webkit-scrollbar {
974
+ width: 8px;
975
+ }
976
+
977
+ .canvasBody::-webkit-scrollbar-thumb {
978
+ background: var(--dsw-alias-border-l2);
979
+ border-radius: 999px;
980
+ }
981
+
982
+ .canvasMeta {
983
+ flex: none;
984
+ display: flex;
985
+ align-items: center;
986
+ gap: 8px;
987
+ font-size: 12px;
988
+ color: var(--dsw-alias-label-tertiary);
989
+ }
990
+
991
+ .canvasHistoryTag {
992
+ padding: 1px 8px;
993
+ font-size: 11px;
994
+ color: var(--dsw-alias-label-secondary);
995
+ background: var(--dsw-alias-bg-layer-2);
996
+ border: 1px solid var(--dsw-alias-border-l2);
997
+ border-radius: 999px;
998
+ white-space: nowrap;
999
+ }
1000
+
1001
+ /* --- result grid ----------------------------------------------------------------- */
1002
+
1003
+ .grid {
1004
+ display: grid;
1005
+ flex: 1;
1006
+ min-height: 0;
1007
+ gap: 14px;
1008
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1009
+ grid-template-rows: repeat(2, minmax(0, 1fr));
1010
+ }
1011
+
1012
+ .grid[data-count='1'] .imageCard {
1013
+ grid-area: 1 / 1 / 3 / 3;
1014
+ }
1015
+
1016
+ .imageCard {
1017
+ position: relative;
1018
+ display: flex;
1019
+ flex-direction: column;
1020
+ margin: 0;
1021
+ border: 1px solid var(--dsw-alias-border-l1);
1022
+ border-radius: 12px;
1023
+ overflow: hidden;
1024
+ background: var(--dsw-alias-bg-layer-2);
1025
+ cursor: zoom-in;
1026
+ min-height: 0;
1027
+ }
1028
+
1029
+ .imageCard:focus-visible {
1030
+ outline: 2px solid var(--dsw-alias-brand-primary);
1031
+ outline-offset: 1px;
1032
+ }
1033
+
1034
+ .image {
1035
+ display: block;
1036
+ flex: 1;
1037
+ min-height: 0;
1038
+ width: 100%;
1039
+ object-fit: cover;
1040
+ background: var(--dsw-alias-bg-base);
1041
+ }
1042
+
1043
+ .imageCaption {
1044
+ padding: 7px 10px;
1045
+ font-size: 11px;
1046
+ line-height: 1.5;
1047
+ color: var(--dsw-alias-label-tertiary);
1048
+ white-space: nowrap;
1049
+ overflow: hidden;
1050
+ text-overflow: ellipsis;
1051
+ border-top: 1px solid var(--dsw-alias-border-l1);
1052
+ }
1053
+
1054
+ .download {
1055
+ position: absolute;
1056
+ top: 8px;
1057
+ right: 8px;
1058
+ padding: 2px 10px;
1059
+ font-size: 12px;
1060
+ line-height: 20px;
1061
+ font-weight: 500;
1062
+ color: var(--dsw-alias-label-primary);
1063
+ background: var(--dsw-alias-bg-mask-1);
1064
+ border: 1px solid var(--dsw-alias-border-l2);
1065
+ border-radius: 999px;
1066
+ text-decoration: none;
1067
+ opacity: 0;
1068
+ transition: opacity 0.12s;
1069
+ backdrop-filter: blur(4px);
1070
+ }
1071
+
1072
+ .imageCard:hover .download {
1073
+ opacity: 1;
1074
+ }
1075
+
1076
+ .download:hover {
1077
+ background: var(--dsw-alias-bg-base);
1078
+ }
1079
+
1080
+ /* Add-to-gallery pill (top-left, mirrors .download; shows on card hover). */
1081
+ .galleryAdd {
1082
+ position: absolute;
1083
+ top: 8px;
1084
+ left: 8px;
1085
+ display: inline-flex;
1086
+ align-items: center;
1087
+ gap: 5px;
1088
+ padding: 2px 10px;
1089
+ font: inherit;
1090
+ font-size: 12px;
1091
+ line-height: 20px;
1092
+ font-weight: 500;
1093
+ color: var(--dsw-alias-label-primary);
1094
+ background: var(--dsw-alias-bg-mask-1);
1095
+ border: 1px solid var(--dsw-alias-border-l2);
1096
+ border-radius: 999px;
1097
+ cursor: pointer;
1098
+ opacity: 0;
1099
+ transition: opacity 0.12s;
1100
+ backdrop-filter: blur(4px);
1101
+ }
1102
+
1103
+ .imageCard:hover .galleryAdd {
1104
+ opacity: 1;
1105
+ }
1106
+
1107
+ .galleryAdd:hover {
1108
+ background: var(--dsw-alias-bg-base);
1109
+ }
1110
+
1111
+ .galleryAdd:disabled {
1112
+ opacity: 0.4;
1113
+ cursor: default;
1114
+ }
1115
+
1116
+ /* Hover hint for the click-to-zoom behavior. */
1117
+ .zoomHint {
1118
+ position: absolute;
1119
+ left: 8px;
1120
+ bottom: 8px;
1121
+ display: inline-flex;
1122
+ align-items: center;
1123
+ gap: 5px;
1124
+ padding: 2px 10px;
1125
+ font-size: 12px;
1126
+ line-height: 20px;
1127
+ font-weight: 500;
1128
+ color: var(--dsw-alias-label-primary);
1129
+ background: var(--dsw-alias-bg-mask-1);
1130
+ border: 1px solid var(--dsw-alias-border-l2);
1131
+ border-radius: 999px;
1132
+ opacity: 0;
1133
+ transition: opacity 0.12s;
1134
+ backdrop-filter: blur(4px);
1135
+ pointer-events: none;
1136
+ }
1137
+
1138
+ .imageCard:hover .zoomHint {
1139
+ opacity: 1;
1140
+ }
1141
+
1142
+ /* --- spinner --------------------------------------------------------------------- */
1143
+
1144
+ .spinner,
1145
+ .bigSpinner {
1146
+ display: inline-block;
1147
+ flex: none;
1148
+ border-radius: 50%;
1149
+ border: 2px solid currentColor;
1150
+ border-top-color: transparent;
1151
+ animation: dshImageGenSpin 800ms linear infinite;
1152
+ }
1153
+
1154
+ .spinner {
1155
+ width: 11px;
1156
+ height: 11px;
1157
+ }
1158
+
1159
+ .bigSpinner {
1160
+ width: 30px;
1161
+ height: 30px;
1162
+ border-width: 3px;
1163
+ color: var(--dsw-alias-state-business-primary);
1164
+ margin-bottom: 6px;
1165
+ }
1166
+
1167
+ /* --- full-screen image preview (lightbox) -------------------------------------- */
1168
+
1169
+ .lightbox {
1170
+ position: fixed;
1171
+ inset: 0;
1172
+ z-index: 1000;
1173
+ display: flex;
1174
+ align-items: center;
1175
+ justify-content: center;
1176
+ padding: 24px;
1177
+ background: rgba(0, 0, 0, 0.72);
1178
+ backdrop-filter: blur(6px);
1179
+ }
1180
+
1181
+ .lightboxClose {
1182
+ position: absolute;
1183
+ top: 16px;
1184
+ right: 16px;
1185
+ display: inline-flex;
1186
+ align-items: center;
1187
+ justify-content: center;
1188
+ width: 38px;
1189
+ height: 38px;
1190
+ color: #fff;
1191
+ background: rgba(255, 255, 255, 0.14);
1192
+ border: 1px solid rgba(255, 255, 255, 0.28);
1193
+ border-radius: 50%;
1194
+ cursor: pointer;
1195
+ }
1196
+
1197
+ .lightboxClose:hover {
1198
+ background: rgba(255, 255, 255, 0.26);
1199
+ }
1200
+
1201
+ .lightboxNav {
1202
+ position: absolute;
1203
+ top: 50%;
1204
+ transform: translateY(-50%);
1205
+ display: inline-flex;
1206
+ align-items: center;
1207
+ justify-content: center;
1208
+ width: 42px;
1209
+ height: 42px;
1210
+ color: #fff;
1211
+ background: rgba(255, 255, 255, 0.14);
1212
+ border: 1px solid rgba(255, 255, 255, 0.28);
1213
+ border-radius: 50%;
1214
+ cursor: pointer;
1215
+ }
1216
+
1217
+ .lightboxNav:hover {
1218
+ background: rgba(255, 255, 255, 0.26);
1219
+ }
1220
+
1221
+ .lightboxNav[data-dir='prev'] {
1222
+ left: max(20px, calc(50% - 640px));
1223
+ }
1224
+
1225
+ .lightboxNav[data-dir='next'] {
1226
+ right: max(20px, calc(50% - 640px));
1227
+ }
1228
+
1229
+ .lightboxFigure {
1230
+ display: flex;
1231
+ flex-direction: column;
1232
+ gap: 10px;
1233
+ margin: 0;
1234
+ max-width: min(1100px, calc(100vw - 160px));
1235
+ width: min(1100px, calc(100vw - 160px));
1236
+ height: min(820px, calc(100vh - 48px));
1237
+ min-height: 0;
1238
+ }
1239
+
1240
+ .lightboxStage {
1241
+ flex: 1;
1242
+ min-height: 0;
1243
+ position: relative;
1244
+ overflow: auto;
1245
+ border-radius: 10px;
1246
+ background: rgba(255, 255, 255, 0.04);
1247
+ }
1248
+
1249
+ .lightboxScaleFrame {
1250
+ display: flex;
1251
+ align-items: center;
1252
+ justify-content: center;
1253
+ min-width: 100%;
1254
+ min-height: 100%;
1255
+ }
1256
+
1257
+ .lightboxImage {
1258
+ display: block;
1259
+ max-width: 100%;
1260
+ max-height: 100%;
1261
+ object-fit: contain;
1262
+ border-radius: 10px;
1263
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5);
1264
+ }
1265
+
1266
+ .lightboxTools {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ justify-content: center;
1270
+ gap: 6px;
1271
+ }
1272
+
1273
+ .lightboxTool,
1274
+ .lightboxZoomLevel,
1275
+ .lightboxCopy {
1276
+ display: inline-flex;
1277
+ align-items: center;
1278
+ justify-content: center;
1279
+ color: #fff;
1280
+ background: rgba(255, 255, 255, 0.14);
1281
+ border: 1px solid rgba(255, 255, 255, 0.28);
1282
+ cursor: pointer;
1283
+ }
1284
+
1285
+ .lightboxTool,
1286
+ .lightboxZoomLevel {
1287
+ height: 32px;
1288
+ }
1289
+
1290
+ .lightboxTool {
1291
+ width: 32px;
1292
+ border-radius: 50%;
1293
+ }
1294
+
1295
+ .lightboxZoomLevel {
1296
+ min-width: 58px;
1297
+ padding: 0 9px;
1298
+ border-radius: 999px;
1299
+ font: inherit;
1300
+ font-size: 12px;
1301
+ font-variant-numeric: tabular-nums;
1302
+ }
1303
+
1304
+ .lightboxTool:hover,
1305
+ .lightboxZoomLevel:hover,
1306
+ .lightboxCopy:hover {
1307
+ background: rgba(255, 255, 255, 0.26);
1308
+ }
1309
+
1310
+ .lightboxCaptionRow {
1311
+ display: flex;
1312
+ align-items: flex-start;
1313
+ gap: 8px;
1314
+ min-width: 0;
1315
+ }
1316
+
1317
+ .lightboxCaption {
1318
+ flex: 1;
1319
+ min-width: 0;
1320
+ font-size: 12px;
1321
+ line-height: 1.6;
1322
+ color: rgba(255, 255, 255, 0.9);
1323
+ display: -webkit-box;
1324
+ -webkit-line-clamp: 3;
1325
+ -webkit-box-orient: vertical;
1326
+ overflow: hidden;
1327
+ }
1328
+
1329
+ .lightboxCopy {
1330
+ flex: none;
1331
+ gap: 5px;
1332
+ min-height: 28px;
1333
+ padding: 4px 9px;
1334
+ border-radius: 999px;
1335
+ font: inherit;
1336
+ font-size: 12px;
1337
+ white-space: nowrap;
1338
+ }
1339
+
1340
+ .lightboxMeta {
1341
+ display: flex;
1342
+ align-items: center;
1343
+ justify-content: space-between;
1344
+ gap: 12px;
1345
+ }
1346
+
1347
+ .lightboxIndex {
1348
+ font-size: 12px;
1349
+ color: rgba(255, 255, 255, 0.8);
1350
+ font-variant-numeric: tabular-nums;
1351
+ }
1352
+
1353
+ .lightboxActions {
1354
+ display: inline-flex;
1355
+ align-items: center;
1356
+ gap: 8px;
1357
+ }
1358
+
1359
+ .lightboxDownload,
1360
+ .lightboxEdit {
1361
+ padding: 4px 14px;
1362
+ font: inherit;
1363
+ font-size: 12.5px;
1364
+ font-weight: 500;
1365
+ color: #fff;
1366
+ background: rgba(255, 255, 255, 0.14);
1367
+ border: 1px solid rgba(255, 255, 255, 0.28);
1368
+ border-radius: 999px;
1369
+ text-decoration: none;
1370
+ cursor: pointer;
1371
+ }
1372
+
1373
+ .lightboxDownload:hover,
1374
+ .lightboxEdit:hover {
1375
+ background: rgba(255, 255, 255, 0.26);
1376
+ }
1377
+
1378
+ .lightboxEdit {
1379
+ color: #fff;
1380
+ background: rgba(255, 255, 255, 0.14);
1381
+ border: 1px solid rgba(255, 255, 255, 0.28);
1382
+ border-radius: 999px;
1383
+ }
1384
+
1385
+ @media (max-width: 720px) {
1386
+ .lightbox {
1387
+ padding: 16px;
1388
+ }
1389
+
1390
+ .lightboxFigure {
1391
+ width: calc(100vw - 32px);
1392
+ max-width: none;
1393
+ }
1394
+
1395
+ .lightboxNav[data-dir='prev'] {
1396
+ left: 20px;
1397
+ }
1398
+
1399
+ .lightboxNav[data-dir='next'] {
1400
+ right: 20px;
1401
+ }
1402
+
1403
+ .lightboxCaptionRow,
1404
+ .lightboxMeta {
1405
+ align-items: stretch;
1406
+ flex-direction: column;
1407
+ }
1408
+
1409
+ .lightboxCopy,
1410
+ .lightboxActions {
1411
+ align-self: flex-end;
1412
+ }
1413
+ }
1414
+
1415
+ @keyframes dshImageGenSpin {
1416
+ to { transform: rotate(360deg); }
1417
+ }
1418
+
1419
+ /* Transient "added to gallery" toast, centered above the canvas bottom. */
1420
+ .galleryToast {
1421
+ position: absolute;
1422
+ left: 50%;
1423
+ bottom: 24px;
1424
+ transform: translateX(-50%);
1425
+ z-index: 30;
1426
+ display: inline-flex;
1427
+ align-items: center;
1428
+ gap: 7px;
1429
+ padding: 6px 16px;
1430
+ font-size: 13px;
1431
+ font-weight: 500;
1432
+ color: var(--dsw-alias-label-primary);
1433
+ background: var(--dsw-alias-bg-mask-1);
1434
+ border: 1px solid var(--dsw-alias-border-l2);
1435
+ border-radius: 999px;
1436
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.22);
1437
+ backdrop-filter: blur(6px);
1438
+ pointer-events: none;
1439
+ animation: dshImageGenToastIn 160ms ease-out;
1440
+ }
1441
+
1442
+ @keyframes dshImageGenToastIn {
1443
+ from { opacity: 0; transform: translate(-50%, 6px); }
1444
+ to { opacity: 1; transform: translate(-50%, 0); }
1445
+ }
1446
+
1447
+ @media (prefers-reduced-motion: reduce) {
1448
+ .download, .spinner, .bigSpinner {
1449
+ transition: none;
1450
+ animation-duration: 1.5s;
1451
+ }
1452
+ }
1453
+
1454
+ /* --- gallery workspace -------------------------------------------------------- */
1455
+ .config[data-gallery='true'] .configScroll > *:not(:first-child),
1456
+ .config[data-gallery='true'] .footer,
1457
+ .canvas[data-gallery='true'] > .canvasState,
1458
+ .canvas[data-gallery='true'] > .canvasError,
1459
+ .canvas[data-gallery='true'] > .canvasBody,
1460
+ .studio:has(.config[data-gallery='true']) > .history { display: none; }
1461
+ .config[data-gallery='true'] .configScroll { display: flex; flex: none; overflow: visible; order: 1; }
1462
+ .config[data-gallery='true'] .galleryFilters { order: 2; flex: 1; min-height: 0; }
1463
+ .galleryFilters { padding: 18px 14px; overflow-y: auto; overflow-x: hidden; }
1464
+ .galleryFilterHeading { margin: 0 4px 10px; color: var(--dsw-alias-label-tertiary); font-size: 12px; font-weight: 600; }
1465
+ .galleryFilter { display: flex; align-items: center; justify-content: space-between; width: 100%; min-height: 34px; padding: 0 10px; border: 0; border-radius: 9px; color: var(--dsw-alias-label-secondary); background: transparent; cursor: pointer; text-align: left; }
1466
+ .galleryFilter:hover, .galleryFilter[data-active] { color: var(--dsw-alias-brand-primary); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent); }
1467
+ .galleryFilterCount { min-width: 20px; padding: 1px 6px; border-radius: 999px; color: var(--dsw-alias-label-tertiary); background: var(--dsw-alias-bg-layer-2); font-size: 11px; text-align: center; }
1468
+ .galleryFilterDivider { height: 1px; margin: 18px 4px; background: var(--dsw-alias-border-l1); }
1469
+ .galleryRatioList { display: flex; flex-wrap: wrap; gap: 6px; }
1470
+ .galleryRatio { padding: 6px 10px; border: 0; border-radius: 999px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-2); cursor: pointer; font-size: 12px; }
1471
+ .galleryRatio[data-active] { color: var(--dsw-alias-brand-primary); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 13%, transparent); }
1472
+ .galleryTagFilterList { display: flex; flex-wrap: wrap; gap: 6px; }
1473
+ .galleryTagFilter { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; min-height: 27px; padding: 0 8px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 6px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-2); cursor: pointer; font: inherit; font-size: 11px; }
1474
+ .galleryTagFilter span:first-child { overflow: hidden; max-width: 112px; text-overflow: ellipsis; white-space: nowrap; }
1475
+ .galleryTagFilter span:last-child { color: var(--dsw-alias-label-tertiary); font-size: 10px; }
1476
+ .galleryTagFilter:hover, .galleryTagFilter[data-active] { color: var(--dsw-alias-brand-primary); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent); }
1477
+ .galleryFilterNote { margin: 20px 4px 0; color: var(--dsw-alias-label-quaternary); font-size: 11px; line-height: 1.5; }
1478
+ .galleryWorkspace { position: absolute; inset: 0; display: flex; width: 100%; height: 100%; min-width: 0; min-height: 0; flex-direction: column; overflow: hidden; padding: 22px 24px 26px; box-sizing: border-box; }
1479
+ .galleryToolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex: none; min-width: 0; margin-bottom: 18px; }
1480
+ .galleryHeading { display: inline; margin: 0; color: var(--dsw-alias-label-primary); font-size: 20px; font-weight: 700; }
1481
+ .galleryCount { margin-left: 8px; color: var(--dsw-alias-label-tertiary); font-size: 13px; }
1482
+ .galleryToolbarActions { display: flex; align-items: center; gap: 10px; min-width: 0; flex-wrap: wrap; }
1483
+ .gallerySelectMode, .galleryBulkButton, .gallerySelectionClear { min-height: 30px; padding: 0 10px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 7px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-1); cursor: pointer; font: inherit; font-size: 12px; }
1484
+ .gallerySelectMode:hover, .gallerySelectMode[data-active], .galleryBulkButton:hover:not(:disabled) { color: var(--dsw-alias-brand-primary); border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 38%, var(--dsw-alias-border-l1)); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent); }
1485
+ .galleryBulkButton:disabled { cursor: not-allowed; opacity: .45; }
1486
+ .gallerySelectionBar { display: flex; align-items: center; gap: 10px; flex: none; min-width: 0; margin: -4px 0 16px; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 35%, var(--dsw-alias-border-l1)); border-radius: 9px; background: color-mix(in srgb, var(--dsw-alias-brand-primary) 7%, var(--dsw-alias-bg-layer-1)); }
1487
+ .gallerySelectionBar strong { flex: none; color: var(--dsw-alias-brand-primary); font-size: 12px; }
1488
+ .gallerySelectionClear { margin-left: auto; }
1489
+ .gallerySelectionClear:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-2); }
1490
+ .galleryTagInput, .gallerySearch { min-width: 0; height: 30px; padding: 0 10px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 7px; outline: none; color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-1); font: inherit; font-size: 12px; }
1491
+ .galleryTagInput { flex: 1 1 190px; }
1492
+ .galleryTagInput:focus, .gallerySearch:focus { border-color: var(--dsw-alias-brand-primary); }
1493
+ .galleryViewToggle { display: flex; padding: 3px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 9px; background: var(--dsw-alias-bg-layer-1); }
1494
+ .galleryViewToggle button, .gallerySort, .galleryClear { min-height: 30px; padding: 0 10px; border: 0; border-radius: 7px; color: var(--dsw-alias-label-secondary); background: transparent; cursor: pointer; font: inherit; font-size: 12px; }
1495
+ .galleryViewToggle button[data-active], .galleryViewToggle button:hover, .gallerySort:hover, .galleryClear:hover { color: var(--dsw-alias-brand-primary); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 11%, transparent); }
1496
+ .gallerySort { border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); }
1497
+ .galleryClear { border: 1px solid var(--dsw-alias-border-l1); }
1498
+ .compareControl { display: flex; flex-direction: column; gap: 6px; margin: 0 0 10px; }
1499
+ .compareToggle, .compareModelChoices label { display: flex; align-items: center; gap: 6px; color: var(--dsw-alias-label-secondary); font-size: 12px; cursor: pointer; }
1500
+ .compareToggle input, .compareModelChoices input { accent-color: var(--dsw-alias-brand-primary); }
1501
+ .compareModelChoices { display: flex; flex-wrap: wrap; gap: 6px; }
1502
+ .compareModelChoices label { padding: 4px 6px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 5px; font-size: 10px; }
1503
+ .comparisonBoard { position: absolute; z-index: 4; top: 14px; right: 14px; bottom: 14px; left: 14px; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px; background: var(--dsw-alias-bg-layer-1); box-shadow: 0 8px 24px rgb(0 0 0 / 12%); }
1504
+ .comparisonBoard > header { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid var(--dsw-alias-border-l1); }
1505
+ .comparisonBoard > header div { display: flex; align-items: baseline; gap: 7px; }
1506
+ .comparisonBoard > header strong { color: var(--dsw-alias-label-primary); font-size: 13px; }
1507
+ .comparisonBoard > header span { color: var(--dsw-alias-label-tertiary); font-size: 11px; }
1508
+ .comparisonBoard > header button { min-height: 28px; padding: 0 9px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 5px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-2); cursor: pointer; font: inherit; font-size: 11px; }
1509
+ .comparisonGrid { display: grid; flex: 1; min-height: 0; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); grid-template-rows: minmax(0, 1fr); gap: 12px; overflow: auto; padding: 12px; }
1510
+ .comparisonGrid article { display: flex; height: 100%; min-width: 0; min-height: 0; flex-direction: column; gap: 7px; }
1511
+ .comparisonGrid article > strong { color: var(--dsw-alias-label-primary); font-size: 12px; }
1512
+ .comparisonImageButton { display: flex; width: 100%; min-height: 0; flex: 1; padding: 0; overflow: hidden; border: 0; cursor: zoom-in; background: var(--dsw-alias-bg-base); }
1513
+ .comparisonImageButton:focus-visible { outline: 2px solid var(--dsw-alias-brand-primary); outline-offset: -2px; }
1514
+ .comparisonGrid article > span { display: grid; flex: 1; min-height: 0; place-items: center; color: var(--dsw-alias-label-tertiary); background: var(--dsw-alias-bg-layer-2); font-size: 12px; }
1515
+ .comparisonGrid img { display: block; width: 100%; height: 100%; min-height: 0; max-height: none; flex: 1; object-fit: contain; background: var(--dsw-alias-bg-base); }
1516
+ .comparisonFullscreen { position: fixed; z-index: 1200; inset: 0; overflow: auto; padding: 54px 24px 24px; background: rgb(0 0 0 / 92%); }
1517
+ .comparisonFullscreenGrid { display: grid; min-height: 100%; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); align-items: start; gap: 18px; }
1518
+ .comparisonFullscreen figure { min-width: 0; margin: 0; }
1519
+ .comparisonFullscreen figcaption { margin-bottom: 8px; color: #fff; font-size: 13px; font-weight: 600; }
1520
+ .comparisonFullscreen img { display: block; width: 100%; margin-bottom: 10px; background: #111; }
1521
+ .historyItem[data-comparison] { border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 55%, var(--dsw-alias-border-l1)); }
1522
+ .galleryMasonry { display: grid; flex: 1 1 auto; width: 100%; height: 0; max-width: 100%; min-width: 0; min-height: 0; box-sizing: border-box; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-auto-rows: max-content; align-content: start; gap: 16px; overflow-y: scroll; overflow-x: hidden; overscroll-behavior: contain; padding: 2px 8px 16px 2px; scrollbar-width: thin; scrollbar-color: var(--dsw-alias-border-l2) transparent; }
1523
+ .galleryMasonry::-webkit-scrollbar { width: 8px; }
1524
+ .galleryMasonry::-webkit-scrollbar-thumb { background: var(--dsw-alias-border-l2); border-radius: 999px; }
1525
+ .galleryCard { position: relative; display: block; width: 100%; margin: 0; overflow: hidden; border: 1px solid var(--dsw-alias-border-l1); border-radius: 14px; background: var(--dsw-alias-bg-layer-1); box-shadow: 0 5px 18px rgb(24 32 54 / 7%); }
1526
+ .galleryCard[data-selected] { border-color: var(--dsw-alias-brand-primary); box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary) 26%, transparent), 0 5px 18px rgb(24 32 54 / 7%); }
1527
+ .gallerySelect { position: absolute; z-index: 2; top: 9px; right: 9px; display: grid; width: 26px; height: 26px; place-items: center; border: 1px solid rgb(255 255 255 / 75%); border-radius: 7px; background: rgb(0 0 0 / 58%); cursor: pointer; }
1528
+ .gallerySelect input { width: 16px; height: 16px; margin: 0; accent-color: var(--dsw-alias-brand-primary); cursor: pointer; }
1529
+ .galleryImageButton { position: relative; display: block; width: 100%; padding: 0; border: 0; background: var(--dsw-alias-bg-base); cursor: zoom-in; }
1530
+ .galleryImageButton[data-selecting] { cursor: pointer; }
1531
+ .galleryImage { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
1532
+ .galleryMasonry[data-view='masonry'] .galleryCard:nth-child(3n + 1) .galleryImage { aspect-ratio: 4 / 5; }
1533
+ .galleryMasonry[data-view='masonry'] .galleryCard:nth-child(3n + 2) .galleryImage { aspect-ratio: 4 / 3; }
1534
+ .galleryMasonry[data-view='masonry'] .galleryCard:nth-child(3n) .galleryImage { aspect-ratio: 3 / 4; }
1535
+ .galleryBadge { position: absolute; top: 10px; left: 10px; padding: 4px 9px; border-radius: 999px; color: #fff; background: rgb(18 23 36 / 76%); font-size: 11px; backdrop-filter: blur(4px); }
1536
+ .galleryCardFooter { display: flex; align-items: center; gap: 9px; min-width: 0; padding: 10px 12px; }
1537
+ .galleryAvatar { display: grid; flex: none; width: 27px; height: 27px; place-items: center; border-radius: 50%; color: #fff; background: var(--dsw-alias-brand-primary); font-size: 12px; font-weight: 700; }
1538
+ .galleryCardInfo { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 2px; }
1539
+ .galleryCardInfo strong, .galleryCardInfo small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1540
+ .galleryCardInfo strong { color: var(--dsw-alias-label-primary); font-size: 12px; }
1541
+ .galleryCardInfo small { color: var(--dsw-alias-label-tertiary); font-size: 10px; }
1542
+ .galleryTags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
1543
+ .galleryTags button { overflow: hidden; max-width: 96px; min-height: 19px; padding: 1px 6px; border: 0; border-radius: 4px; color: var(--dsw-alias-brand-primary); background: color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent); cursor: pointer; font: inherit; font-size: 10px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
1544
+ .galleryTags button:hover { background: color-mix(in srgb, var(--dsw-alias-brand-primary) 17%, transparent); }
1545
+ .galleryTags .galleryTagEdit { flex: none; color: var(--dsw-alias-label-tertiary); background: transparent; }
1546
+ .galleryTagEditor { display: flex; align-items: center; gap: 6px; padding: 0 12px 10px 48px; }
1547
+ .galleryTagEditor input { min-width: 0; flex: 1; height: 27px; padding: 0 8px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 6px; outline: none; color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-layer-2); font: inherit; font-size: 11px; }
1548
+ .galleryTagEditor input:focus { border-color: var(--dsw-alias-brand-primary); }
1549
+ .galleryTagEditor button { height: 27px; padding: 0 8px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 6px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-bg-layer-1); cursor: pointer; font: inherit; font-size: 11px; }
1550
+ .galleryTagEditor button[type='submit'] { color: var(--dsw-alias-brand-primary); }
1551
+ .galleryRemove { flex: none; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 50%; color: var(--dsw-alias-label-tertiary); background: transparent; cursor: pointer; font-size: 18px; }
1552
+ .galleryRemove:hover { color: var(--dsw-alias-state-error); background: var(--dsw-alias-bg-layer-2); }
1553
+
1554
+ @media (max-width: 1100px) {
1555
+ .galleryMasonry { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1556
+ }
1557
+
1558
+ @media (max-width: 760px) {
1559
+ .studio { flex-direction: column; overflow: auto; }
1560
+ .config { width: auto; max-width: none; height: auto; min-height: 0; }
1561
+ .config[data-gallery='true'] { flex: none; }
1562
+ .canvas { min-height: 560px; }
1563
+ .galleryToolbar { align-items: flex-start; flex-direction: column; }
1564
+ .galleryToolbarActions { width: 100%; flex-wrap: wrap; }
1565
+ .galleryMasonry { grid-template-columns: 1fr; }
1566
+ }