@dickpy/dsh-imagegen 1.5.2 → 1.5.4

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,929 @@
1
+ /* Infinite canvas workspace — node-graph canvas styled after
2
+ * basketikun/infinite-canvas: floating docks, card nodes, wire connections. */
3
+
4
+ .root {
5
+ position: relative;
6
+ display: flex;
7
+ flex: 1 1 auto;
8
+ flex-direction: column;
9
+ height: 100%;
10
+ min-width: 0;
11
+ min-height: 0;
12
+ overflow: hidden;
13
+ border: 1px solid var(--dsw-alias-border-l1);
14
+ border-radius: 10px;
15
+ background: var(--dsw-alias-bg-layer-1);
16
+ color: var(--dsw-alias-label-primary);
17
+ font-family: var(--dsw-font-family, inherit);
18
+ user-select: none;
19
+ }
20
+
21
+ .selectCursor { cursor: default; }
22
+ .panCursor { cursor: grab; }
23
+ .panCursor:active { cursor: grabbing; }
24
+
25
+ /* ------------------------------------------------------------- top bar */
26
+
27
+ .topBar {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 8px;
31
+ padding: 8px 12px;
32
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
33
+ flex: none;
34
+ z-index: 40;
35
+ background: var(--dsw-alias-bg-layer-1);
36
+ }
37
+
38
+ .projectSelect {
39
+ max-width: 180px;
40
+ height: 30px;
41
+ padding: 0 8px;
42
+ border-radius: 8px;
43
+ border: 1px solid var(--dsw-alias-border-l1);
44
+ background: transparent;
45
+ color: var(--dsw-alias-label-primary);
46
+ font-size: 12.5px;
47
+ }
48
+
49
+ .titleButton {
50
+ height: 30px;
51
+ padding: 0 10px;
52
+ border: 1px solid transparent;
53
+ border-radius: 8px;
54
+ background: transparent;
55
+ color: var(--dsw-alias-label-primary);
56
+ font-size: 13px;
57
+ font-weight: 600;
58
+ max-width: 260px;
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ white-space: nowrap;
62
+ cursor: text;
63
+ }
64
+
65
+ .titleButton:hover { border-color: var(--dsw-alias-border-l1); }
66
+
67
+ .titleInput {
68
+ height: 30px;
69
+ padding: 0 10px;
70
+ border-radius: 8px;
71
+ border: 1px solid var(--dsw-alias-brand-primary);
72
+ background: transparent;
73
+ color: var(--dsw-alias-label-primary);
74
+ font-size: 13px;
75
+ font-weight: 600;
76
+ width: 240px;
77
+ outline: none;
78
+ }
79
+
80
+ .topBarSpacer { flex: 1; }
81
+
82
+ .saveState {
83
+ font-size: 11.5px;
84
+ color: var(--dsw-alias-label-tertiary);
85
+ white-space: nowrap;
86
+ }
87
+
88
+ .saveState[data-state="error"] { color: var(--dsw-alias-label-error); }
89
+ .saveState[data-state="saving"] { color: var(--dsw-alias-state-warn-primary, var(--dsw-alias-label-secondary)); }
90
+
91
+ /* ---------------------------------------------------------- icon button */
92
+
93
+ .iconButton {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ gap: 5px;
98
+ width: 30px;
99
+ height: 30px;
100
+ flex: none;
101
+ border: none;
102
+ border-radius: 8px;
103
+ background: transparent;
104
+ color: var(--dsw-alias-label-secondary);
105
+ cursor: pointer;
106
+ padding: 0;
107
+ }
108
+
109
+ .iconButton:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }
110
+ .iconButton[data-active] { background: color-mix(in srgb, var(--dsw-alias-brand-primary) 16%, transparent); color: var(--dsw-alias-brand-primary); }
111
+ .iconButton:disabled { opacity: 0.35; cursor: not-allowed; }
112
+ .iconButton:disabled:hover { background: transparent; color: var(--dsw-alias-label-secondary); }
113
+
114
+ /* (node tools moved to the bottom-center dock above) */
115
+
116
+ /* ------------------------------------------------------------- viewport */
117
+
118
+ .viewport {
119
+ position: relative;
120
+ flex: 1;
121
+ min-height: 0;
122
+ overflow: hidden;
123
+ touch-action: none;
124
+ }
125
+
126
+ .grid {
127
+ position: absolute;
128
+ inset: 0;
129
+ pointer-events: none;
130
+ opacity: 0.5;
131
+ }
132
+
133
+ .grid[data-mode="dots"] {
134
+ background-image: radial-gradient(circle, color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent) 1.1px, transparent 1.4px);
135
+ }
136
+
137
+ .grid[data-mode="lines"] {
138
+ background-image:
139
+ linear-gradient(color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent) 1px, transparent 1px),
140
+ linear-gradient(90deg, color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent) 1px, transparent 1px);
141
+ }
142
+
143
+ .grid[data-mode="blank"] { background-image: none; }
144
+
145
+ .world {
146
+ position: absolute;
147
+ left: 0;
148
+ top: 0;
149
+ transform-origin: 0 0;
150
+ }
151
+
152
+ .marquee {
153
+ position: absolute;
154
+ z-index: 20;
155
+ border: 1px solid var(--dsw-alias-brand-primary);
156
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent);
157
+ border-radius: 4px;
158
+ pointer-events: none;
159
+ }
160
+
161
+ /* ------------------------------------------------------------ nodes */
162
+
163
+ .node {
164
+ position: absolute;
165
+ display: flex;
166
+ flex-direction: column;
167
+ border-radius: 14px;
168
+ border: 1.5px solid var(--dsw-alias-border-l1);
169
+ background: var(--dsw-alias-bg-layer-1);
170
+ box-shadow: 0 8px 24px rgb(15 23 42 / 12%);
171
+ overflow: visible;
172
+ cursor: grab;
173
+ touch-action: none;
174
+ }
175
+
176
+ .node:active { cursor: grabbing; }
177
+
178
+ .nodeGlow {
179
+ position: absolute;
180
+ inset: -6px;
181
+ border-radius: 18px;
182
+ pointer-events: none;
183
+ opacity: 0;
184
+ transition: opacity 0.15s ease;
185
+ }
186
+
187
+ .nodeSelected {
188
+ border-color: var(--dsw-alias-brand-primary);
189
+ z-index: 2;
190
+ }
191
+
192
+ .nodeSelected .nodeGlow {
193
+ opacity: 1;
194
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary) 22%, transparent);
195
+ }
196
+
197
+ .nodeRelated { border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, transparent); }
198
+
199
+ .nodeConnectTarget {
200
+ border-color: var(--dsw-alias-brand-primary);
201
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--dsw-alias-brand-primary) 26%, transparent);
202
+ }
203
+
204
+ .nodeHeader {
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 6px;
208
+ padding: 7px 12px 5px;
209
+ font-size: 11.5px;
210
+ color: var(--dsw-alias-label-secondary);
211
+ cursor: inherit;
212
+ flex: none;
213
+ }
214
+
215
+ .nodeTitle {
216
+ font-weight: 600;
217
+ overflow: hidden;
218
+ text-overflow: ellipsis;
219
+ white-space: nowrap;
220
+ }
221
+
222
+ .nodeSize {
223
+ margin-left: auto;
224
+ font-size: 10.5px;
225
+ color: var(--dsw-alias-label-tertiary);
226
+ font-variant-numeric: tabular-nums;
227
+ }
228
+
229
+ .nodeSpinner {
230
+ width: 11px;
231
+ height: 11px;
232
+ flex: none;
233
+ border-radius: 50%;
234
+ border: 1.5px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 30%, transparent);
235
+ border-top-color: var(--dsw-alias-brand-primary);
236
+ animation: canvasSpin 0.8s linear infinite;
237
+ }
238
+
239
+ .nodeBody {
240
+ flex: 1;
241
+ min-height: 0;
242
+ margin: 0 8px 8px;
243
+ border-radius: 9px;
244
+ overflow: hidden;
245
+ background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);
246
+ display: flex;
247
+ align-items: center;
248
+ justify-content: center;
249
+ pointer-events: none;
250
+ }
251
+
252
+ .nodeBody img {
253
+ width: 100%;
254
+ height: 100%;
255
+ object-fit: contain;
256
+ display: block;
257
+ }
258
+
259
+ .nodeState,
260
+ .nodeStateError {
261
+ display: flex;
262
+ flex-direction: column;
263
+ align-items: center;
264
+ gap: 8px;
265
+ font-size: 12px;
266
+ color: var(--dsw-alias-label-secondary);
267
+ padding: 12px;
268
+ text-align: center;
269
+ pointer-events: auto;
270
+ }
271
+
272
+ .nodeStateError { color: var(--dsw-alias-label-error); }
273
+
274
+ .nodeStateError button {
275
+ border: none;
276
+ border-radius: 7px;
277
+ padding: 4px 12px;
278
+ background: var(--dsw-alias-interactive-bg-hover);
279
+ color: var(--dsw-alias-label-primary);
280
+ font-size: 12px;
281
+ cursor: pointer;
282
+ }
283
+
284
+ .nodeEmpty {
285
+ display: flex;
286
+ flex-direction: column;
287
+ align-items: center;
288
+ gap: 8px;
289
+ border: 1.5px dashed color-mix(in srgb, var(--dsw-alias-label-primary) 24%, transparent);
290
+ border-radius: 9px;
291
+ margin: 6px;
292
+ padding: 14px;
293
+ background: transparent;
294
+ color: var(--dsw-alias-label-tertiary);
295
+ font-size: 12px;
296
+ cursor: pointer;
297
+ }
298
+
299
+ .nodeEmpty:hover {
300
+ border-color: var(--dsw-alias-brand-primary);
301
+ color: var(--dsw-alias-brand-primary);
302
+ }
303
+
304
+ .textNode { cursor: default; }
305
+
306
+ /* image nodes render as bare cards: the picture fills the frame */
307
+ .imageNode .nodeBody { margin: 6px; }
308
+
309
+ .textArea {
310
+ flex: 1;
311
+ min-height: 0;
312
+ margin: 0 8px 8px;
313
+ border: none;
314
+ resize: none;
315
+ outline: none;
316
+ background: transparent;
317
+ color: var(--dsw-alias-label-primary);
318
+ font-size: 13px;
319
+ line-height: 1.55;
320
+ padding: 4px 6px;
321
+ cursor: text;
322
+ pointer-events: auto;
323
+ }
324
+
325
+ .textArea::placeholder { color: var(--dsw-alias-label-tertiary); }
326
+
327
+ /* --------------------------------------------------- bottom dock */
328
+
329
+ .dock {
330
+ position: absolute;
331
+ left: 50%;
332
+ bottom: 14px;
333
+ transform: translateX(-50%);
334
+ z-index: 30;
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 2px;
338
+ padding: 6px;
339
+ border-radius: 13px;
340
+ border: 1px solid var(--dsw-alias-border-l1);
341
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 92%, transparent);
342
+ box-shadow: 0 10px 30px rgb(15 23 42 / 14%);
343
+ backdrop-filter: blur(10px);
344
+ }
345
+
346
+ .dock .iconButton { width: 34px; height: 34px; }
347
+
348
+ .dockDivider {
349
+ width: 1px;
350
+ height: 18px;
351
+ margin: 0 4px;
352
+ background: var(--dsw-alias-border-l1);
353
+ }
354
+
355
+ /* ------------------------------------------------- floating composer */
356
+
357
+ .composer {
358
+ position: absolute;
359
+ z-index: 35;
360
+ width: 560px;
361
+ display: flex;
362
+ flex-direction: column;
363
+ gap: 8px;
364
+ padding: 10px;
365
+ border-radius: 14px;
366
+ border: 1px solid var(--dsw-alias-border-l1);
367
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 96%, transparent);
368
+ box-shadow: 0 16px 44px rgb(15 23 42 / 18%);
369
+ backdrop-filter: blur(10px);
370
+ }
371
+
372
+ .composerPrompt {
373
+ width: 100%;
374
+ min-height: 38px;
375
+ max-height: 120px;
376
+ resize: none;
377
+ border: none;
378
+ outline: none;
379
+ background: transparent;
380
+ color: var(--dsw-alias-label-primary);
381
+ font-size: 13px;
382
+ line-height: 1.5;
383
+ padding: 2px 4px;
384
+ cursor: text;
385
+ }
386
+
387
+ .composerPrompt::placeholder { color: var(--dsw-alias-label-tertiary); }
388
+
389
+ .composerMeta { display: flex; }
390
+
391
+ .composerChip {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: 5px;
395
+ font-size: 11px;
396
+ padding: 2px 9px;
397
+ border-radius: 999px;
398
+ border: 1px solid color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, transparent);
399
+ color: var(--dsw-alias-brand-primary);
400
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary) 8%, transparent);
401
+ }
402
+
403
+ .composerControls {
404
+ display: flex;
405
+ align-items: center;
406
+ gap: 6px;
407
+ }
408
+
409
+ .composerControls select {
410
+ height: 28px;
411
+ border-radius: 999px;
412
+ border: 1px solid var(--dsw-alias-border-l1);
413
+ background: transparent;
414
+ color: var(--dsw-alias-label-primary);
415
+ font-size: 11.5px;
416
+ padding: 0 8px;
417
+ min-width: 0;
418
+ max-width: 128px;
419
+ }
420
+
421
+ .composerSend {
422
+ margin-left: auto;
423
+ width: 34px;
424
+ height: 34px;
425
+ flex: none;
426
+ border: none;
427
+ border-radius: 50%;
428
+ background: var(--dsw-alias-label-primary);
429
+ color: var(--dsw-alias-bg-layer-1);
430
+ cursor: pointer;
431
+ display: inline-flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ }
435
+
436
+ .composerSend:hover { opacity: 0.88; }
437
+ .composerSend:disabled { opacity: 0.35; cursor: not-allowed; }
438
+
439
+ /* ------------------------------------------------------ config node */
440
+
441
+ .configNode {
442
+ padding: 0 10px 10px;
443
+ cursor: grab;
444
+ }
445
+
446
+ .configNode .nodeHeader { padding: 7px 2px 5px; }
447
+
448
+ .configLinks {
449
+ display: flex;
450
+ margin: 2px 0 8px;
451
+ flex: none;
452
+ }
453
+
454
+ .configLinks .composerChip {
455
+ font-size: 10.5px;
456
+ padding: 2px 8px;
457
+ }
458
+
459
+ .configHint {
460
+ flex: 1;
461
+ min-height: 0;
462
+ margin: 0;
463
+ font-size: 11px;
464
+ line-height: 1.55;
465
+ color: var(--dsw-alias-label-tertiary);
466
+ overflow: auto;
467
+ }
468
+
469
+ /* connection handles */
470
+
471
+ .handle {
472
+ position: absolute;
473
+ top: 50%;
474
+ width: 12px;
475
+ height: 12px;
476
+ border-radius: 50%;
477
+ transform: translateY(-50%) scale(0.6);
478
+ background: var(--dsw-alias-bg-layer-1);
479
+ border: 2px solid var(--dsw-alias-brand-primary);
480
+ opacity: 0;
481
+ transition: opacity 0.12s ease, transform 0.12s ease;
482
+ cursor: crosshair;
483
+ z-index: 3;
484
+ }
485
+
486
+ .handleLeft { left: -7px; }
487
+ .handleRight { right: -7px; }
488
+
489
+ .node:hover .handle,
490
+ .nodeSelected .handle,
491
+ .nodeConnectTarget .handle {
492
+ opacity: 1;
493
+ transform: translateY(-50%) scale(1);
494
+ }
495
+
496
+ .handle:hover { background: var(--dsw-alias-brand-primary); }
497
+
498
+ .resizeHandle {
499
+ position: absolute;
500
+ right: -5px;
501
+ bottom: -5px;
502
+ width: 14px;
503
+ height: 14px;
504
+ border-radius: 4px;
505
+ background: var(--dsw-alias-brand-primary);
506
+ border: 2px solid var(--dsw-alias-bg-layer-1);
507
+ cursor: nwse-resize;
508
+ z-index: 3;
509
+ }
510
+
511
+ /* hover toolbar */
512
+
513
+ .hoverToolbar {
514
+ position: absolute;
515
+ top: -36px;
516
+ left: 50%;
517
+ transform: translateX(-50%);
518
+ display: flex;
519
+ gap: 2px;
520
+ padding: 4px;
521
+ border-radius: 10px;
522
+ border: 1px solid var(--dsw-alias-border-l1);
523
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 92%, transparent);
524
+ box-shadow: 0 8px 22px rgb(15 23 42 / 14%);
525
+ opacity: 0;
526
+ pointer-events: none;
527
+ transition: opacity 0.12s ease;
528
+ z-index: 4;
529
+ }
530
+
531
+ .node:hover .hoverToolbar,
532
+ .nodeSelected .hoverToolbar {
533
+ opacity: 1;
534
+ pointer-events: auto;
535
+ }
536
+
537
+ /* -------------------------------------------------------- connections */
538
+
539
+ .connectionLayer {
540
+ position: absolute;
541
+ overflow: visible;
542
+ pointer-events: none;
543
+ z-index: 0;
544
+ }
545
+
546
+ .connectionPath {
547
+ fill: none;
548
+ stroke: color-mix(in srgb, var(--dsw-alias-label-primary) 38%, transparent);
549
+ stroke-width: 2;
550
+ stroke-opacity: 0.85;
551
+ pointer-events: none;
552
+ }
553
+
554
+ .connectionActive {
555
+ stroke: var(--dsw-alias-brand-primary);
556
+ stroke-width: 3;
557
+ stroke-opacity: 1;
558
+ filter: drop-shadow(0 0 6px color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, transparent));
559
+ }
560
+
561
+ .connectionPreview {
562
+ fill: none;
563
+ stroke: var(--dsw-alias-brand-primary);
564
+ stroke-width: 2;
565
+ stroke-dasharray: 5 5;
566
+ pointer-events: none;
567
+ }
568
+
569
+ /* --------------------------------------------------------- empty hint */
570
+
571
+ .emptyHint {
572
+ position: absolute;
573
+ left: 50%;
574
+ top: 44%;
575
+ transform: translate(-50%, -50%);
576
+ display: flex;
577
+ flex-direction: column;
578
+ align-items: center;
579
+ gap: 6px;
580
+ text-align: center;
581
+ color: var(--dsw-alias-label-tertiary);
582
+ pointer-events: none;
583
+ z-index: 5;
584
+ }
585
+
586
+ .emptyHint strong {
587
+ font-size: 16px;
588
+ color: var(--dsw-alias-label-secondary);
589
+ }
590
+
591
+ .emptyHint span { font-size: 12.5px; max-width: 320px; line-height: 1.6; }
592
+
593
+ /* ------------------------------------------------------------ zoom dock */
594
+
595
+ .zoomDock {
596
+ position: absolute;
597
+ left: 14px;
598
+ bottom: 14px;
599
+ z-index: 30;
600
+ display: flex;
601
+ align-items: center;
602
+ gap: 6px;
603
+ padding: 6px 8px;
604
+ border-radius: 12px;
605
+ border: 1px solid var(--dsw-alias-border-l1);
606
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 88%, transparent);
607
+ box-shadow: 0 10px 30px rgb(15 23 42 / 12%);
608
+ backdrop-filter: blur(10px);
609
+ }
610
+
611
+ .zoomDock input[type="range"] {
612
+ width: 96px;
613
+ accent-color: var(--dsw-alias-brand-primary);
614
+ }
615
+
616
+ .zoomValue {
617
+ width: 40px;
618
+ text-align: right;
619
+ font-size: 11.5px;
620
+ color: var(--dsw-alias-label-secondary);
621
+ font-variant-numeric: tabular-nums;
622
+ }
623
+
624
+ /* -------------------------------------------------------------- minimap */
625
+
626
+ .minimap {
627
+ position: absolute;
628
+ left: 14px;
629
+ bottom: 62px;
630
+ z-index: 30;
631
+ width: 220px;
632
+ height: 150px;
633
+ border-radius: 12px;
634
+ border: 1px solid var(--dsw-alias-border-l1);
635
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 88%, transparent);
636
+ box-shadow: 0 10px 30px rgb(15 23 42 / 12%);
637
+ overflow: hidden;
638
+ backdrop-filter: blur(10px);
639
+ }
640
+
641
+ .minimapCanvas {
642
+ position: relative;
643
+ width: 100%;
644
+ height: 100%;
645
+ cursor: crosshair;
646
+ }
647
+
648
+ .minimapNode {
649
+ position: absolute;
650
+ border-radius: 2px;
651
+ opacity: 0.8;
652
+ }
653
+
654
+ .minimapImage { background: var(--dsw-alias-brand-primary); }
655
+ .minimapText { background: color-mix(in srgb, var(--dsw-alias-label-primary) 40%, transparent); }
656
+ .minimapSelected { outline: 1.5px solid var(--dsw-alias-brand-primary); }
657
+
658
+ .minimapViewport {
659
+ position: absolute;
660
+ border: 1.5px solid var(--dsw-alias-brand-primary);
661
+ background: color-mix(in srgb, var(--dsw-alias-brand-primary) 10%, transparent);
662
+ border-radius: 2px;
663
+ pointer-events: none;
664
+ }
665
+
666
+ /* ------------------------------------------------------------ inspector */
667
+
668
+ .inspectorRow {
669
+ display: flex;
670
+ gap: 8px;
671
+ }
672
+
673
+ .inspectorRow > * { flex: 1; min-width: 0; }
674
+
675
+ /* --------------------------------------------------------- context menu */
676
+
677
+ .contextMenu {
678
+ position: fixed;
679
+ z-index: 90;
680
+ min-width: 176px;
681
+ padding: 5px;
682
+ border-radius: 11px;
683
+ border: 1px solid var(--dsw-alias-border-l1);
684
+ background: color-mix(in srgb, var(--dsw-alias-bg-layer-1) 96%, transparent);
685
+ box-shadow: 0 16px 40px rgb(15 23 42 / 20%);
686
+ display: flex;
687
+ flex-direction: column;
688
+ }
689
+
690
+ .contextMenu button {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 8px;
694
+ border: none;
695
+ border-radius: 7px;
696
+ background: transparent;
697
+ color: var(--dsw-alias-label-primary);
698
+ font-size: 12.5px;
699
+ padding: 7px 10px;
700
+ cursor: pointer;
701
+ text-align: left;
702
+ }
703
+
704
+ .contextMenu button:hover { background: var(--dsw-alias-interactive-bg-hover); }
705
+ .contextMenu button[data-danger] { color: var(--dsw-alias-label-error); }
706
+
707
+ /* ---------------------------------------------------------- error toast */
708
+
709
+ .errorToast {
710
+ position: absolute;
711
+ left: 50%;
712
+ bottom: 18px;
713
+ transform: translateX(-50%);
714
+ z-index: 60;
715
+ display: flex;
716
+ align-items: center;
717
+ gap: 10px;
718
+ max-width: min(560px, 80%);
719
+ padding: 9px 12px;
720
+ border-radius: 10px;
721
+ border: 1px solid color-mix(in srgb, var(--dsw-alias-label-error) 35%, transparent);
722
+ background: color-mix(in srgb, var(--dsw-alias-label-error) 12%, var(--dsw-alias-bg-layer-1));
723
+ color: var(--dsw-alias-label-error);
724
+ font-size: 12.5px;
725
+ box-shadow: 0 12px 30px rgb(15 23 42 / 18%);
726
+ }
727
+
728
+ .errorToast button {
729
+ border: none;
730
+ background: transparent;
731
+ color: inherit;
732
+ cursor: pointer;
733
+ padding: 2px;
734
+ display: inline-flex;
735
+ flex: none;
736
+ }
737
+
738
+ /* ---------------------------------------------------------- picker modal */
739
+
740
+ .modalBackdrop {
741
+ position: absolute;
742
+ inset: 0;
743
+ z-index: 70;
744
+ background: color-mix(in srgb, var(--dsw-alias-label-primary) 32%, transparent);
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: center;
748
+ }
749
+
750
+ .picker {
751
+ width: min(720px, 92%);
752
+ max-height: 84%;
753
+ display: flex;
754
+ flex-direction: column;
755
+ border-radius: 14px;
756
+ border: 1px solid var(--dsw-alias-border-l1);
757
+ background: var(--dsw-alias-bg-layer-1);
758
+ box-shadow: 0 24px 60px rgb(15 23 42 / 26%);
759
+ overflow: hidden;
760
+ }
761
+
762
+ .pickerHeader {
763
+ display: flex;
764
+ align-items: center;
765
+ justify-content: space-between;
766
+ padding: 12px 14px;
767
+ font-size: 14px;
768
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
769
+ }
770
+
771
+ .pickerHeader button {
772
+ border: none;
773
+ background: transparent;
774
+ color: var(--dsw-alias-label-secondary);
775
+ font-size: 18px;
776
+ cursor: pointer;
777
+ padding: 0 4px;
778
+ }
779
+
780
+ .pickerTabs {
781
+ display: flex;
782
+ gap: 4px;
783
+ padding: 10px 14px 0;
784
+ }
785
+
786
+ .pickerTabs button {
787
+ border: none;
788
+ border-radius: 8px 8px 0 0;
789
+ background: transparent;
790
+ color: var(--dsw-alias-label-secondary);
791
+ font-size: 12.5px;
792
+ padding: 7px 12px;
793
+ cursor: pointer;
794
+ }
795
+
796
+ .pickerTabs button[data-active] {
797
+ background: var(--dsw-alias-interactive-bg-hover);
798
+ color: var(--dsw-alias-brand-primary);
799
+ }
800
+
801
+ .pickerBody {
802
+ flex: 1;
803
+ min-height: 0;
804
+ overflow: auto;
805
+ padding: 14px;
806
+ }
807
+
808
+ .pickerGrid {
809
+ display: grid;
810
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
811
+ gap: 10px;
812
+ }
813
+
814
+ .pickerCard {
815
+ display: flex;
816
+ flex-direction: column;
817
+ gap: 6px;
818
+ border: 1.5px solid var(--dsw-alias-border-l1);
819
+ border-radius: 10px;
820
+ background: transparent;
821
+ padding: 6px;
822
+ cursor: pointer;
823
+ text-align: left;
824
+ color: var(--dsw-alias-label-primary);
825
+ }
826
+
827
+ .pickerCard[data-selected] {
828
+ border-color: var(--dsw-alias-brand-primary);
829
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--dsw-alias-brand-primary) 25%, transparent);
830
+ }
831
+
832
+ .pickerCard img {
833
+ width: 100%;
834
+ height: 110px;
835
+ object-fit: cover;
836
+ border-radius: 7px;
837
+ }
838
+
839
+ .pickerCardPrompt {
840
+ font-size: 11.5px;
841
+ overflow: hidden;
842
+ text-overflow: ellipsis;
843
+ white-space: nowrap;
844
+ }
845
+
846
+ .pickerCard small {
847
+ color: var(--dsw-alias-label-tertiary);
848
+ font-size: 10.5px;
849
+ }
850
+
851
+ .pickerFooter {
852
+ display: flex;
853
+ align-items: center;
854
+ justify-content: space-between;
855
+ padding-top: 12px;
856
+ font-size: 12.5px;
857
+ color: var(--dsw-alias-label-secondary);
858
+ }
859
+
860
+ .pickerFooter button,
861
+ .generateForm button {
862
+ height: 32px;
863
+ padding: 0 16px;
864
+ border: none;
865
+ border-radius: 8px;
866
+ background: var(--dsw-alias-brand-primary);
867
+ color: var(--dsw-alias-bg-base, #fff);
868
+ font-size: 12.5px;
869
+ font-weight: 600;
870
+ cursor: pointer;
871
+ display: inline-flex;
872
+ align-items: center;
873
+ gap: 6px;
874
+ }
875
+
876
+ .pickerFooter button:disabled,
877
+ .generateForm button:disabled { opacity: 0.45; cursor: not-allowed; }
878
+
879
+ .uploadBox {
880
+ display: flex;
881
+ flex-direction: column;
882
+ align-items: center;
883
+ justify-content: center;
884
+ gap: 8px;
885
+ min-height: 220px;
886
+ border: 1.5px dashed color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);
887
+ border-radius: 12px;
888
+ color: var(--dsw-alias-label-secondary);
889
+ cursor: pointer;
890
+ text-align: center;
891
+ }
892
+
893
+ .uploadBox:hover { border-color: var(--dsw-alias-brand-primary); }
894
+ .uploadBox input { display: none; }
895
+ .uploadBox small { color: var(--dsw-alias-label-tertiary); font-size: 11px; }
896
+
897
+ .uploadIcon { color: var(--dsw-alias-brand-primary); }
898
+
899
+ .generateForm {
900
+ display: flex;
901
+ flex-direction: column;
902
+ gap: 10px;
903
+ }
904
+
905
+ .generateForm textarea {
906
+ min-height: 110px;
907
+ resize: vertical;
908
+ border-radius: 9px;
909
+ border: 1px solid var(--dsw-alias-border-l1);
910
+ background: transparent;
911
+ color: var(--dsw-alias-label-primary);
912
+ font-size: 12.5px;
913
+ padding: 8px 10px;
914
+ outline: none;
915
+ }
916
+
917
+ .generateForm select {
918
+ height: 30px;
919
+ border-radius: 8px;
920
+ border: 1px solid var(--dsw-alias-border-l1);
921
+ background: transparent;
922
+ color: var(--dsw-alias-label-primary);
923
+ font-size: 12.5px;
924
+ padding: 0 8px;
925
+ }
926
+
927
+ @keyframes canvasSpin {
928
+ to { transform: rotate(360deg); }
929
+ }