drawui-react 0.2.1 → 0.3.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,900 @@
1
+ :root {
2
+ --dw-primary: #3b82f6;
3
+ --dw-primary-hover: #2563eb;
4
+ --dw-primary-weak: #eff6ff;
5
+ --dw-primary-contrast: #ffffff;
6
+ --dw-canvas-bg: #fafafa;
7
+ --dw-panel-bg: rgba(255, 255, 255, 0.97);
8
+ --dw-panel-bg-solid: #ffffff;
9
+ --dw-panel-bg-deep: rgba(255, 255, 255, 0.99);
10
+ --dw-panel-border: rgba(0, 0, 0, 0.06);
11
+ --dw-hover-bg: rgba(0, 0, 0, 0.04);
12
+ --dw-border-strong: #e5e7eb;
13
+ --dw-dash: #d1d5db;
14
+ --dw-inset-border: rgba(0, 0, 0, 0.04);
15
+ --dw-text: #4b5563;
16
+ --dw-text-strong: #1f2937;
17
+ --dw-text-ink: #374151;
18
+ --dw-text-muted: #6b7280;
19
+ --dw-text-faint: #9ca3af;
20
+ --dw-success: #10b981;
21
+ --dw-success-strong: #22c55e;
22
+ --dw-danger: #ef4444;
23
+ --dw-swatch-border: rgba(0, 0, 0, 0.1);
24
+ --dw-swatch-border-hover: rgba(0, 0, 0, 0.25);
25
+ --dw-tooltip-bg: rgba(31, 41, 55, 0.95);
26
+ --dw-tooltip-text: #f9fafb;
27
+ --dw-shadow-sm: 0 4px 16px rgba(0, 0, 0, 0.06);
28
+ --dw-shadow-md: 0 6px 24px rgba(0, 0, 0, 0.08), 0 2px 6px rgba(0, 0, 0, 0.04);
29
+ --dw-shadow-lg: 0 10px 40px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06);
30
+ --dw-shadow-xl: 0 6px 24px rgba(0, 0, 0, 0.1), 0 2px 8px rgba(0, 0, 0, 0.05);
31
+ --dw-shadow-tooltip: 0 4px 16px rgba(0, 0, 0, 0.15);
32
+ --dw-shadow-primary: 0 2px 8px rgba(59, 130, 246, 0.3);
33
+ --dw-shadow-toggle: 0 4px 16px rgba(0, 0, 0, 0.08), 0 1px 4px rgba(0, 0, 0, 0.04);
34
+ --dw-shadow-toast: 0 4px 20px rgba(0, 0, 0, 0.08), 0 1px 4px rgba(0, 0, 0, 0.04);
35
+ }
36
+ [data-theme='dark'] {
37
+ --dw-primary: #60a5fa;
38
+ --dw-primary-hover: #93c5fd;
39
+ --dw-primary-weak: rgba(96, 165, 250, 0.16);
40
+ --dw-primary-contrast: #0f172a;
41
+ --dw-canvas-bg: #0f172a;
42
+ --dw-panel-bg: rgba(30, 41, 59, 0.92);
43
+ --dw-panel-bg-solid: #1e293b;
44
+ --dw-panel-bg-deep: rgba(30, 41, 59, 0.98);
45
+ --dw-panel-border: rgba(255, 255, 255, 0.08);
46
+ --dw-hover-bg: rgba(255, 255, 255, 0.06);
47
+ --dw-border-strong: #334155;
48
+ --dw-dash: #475569;
49
+ --dw-inset-border: rgba(255, 255, 255, 0.08);
50
+ --dw-text: #cbd5e1;
51
+ --dw-text-strong: #f1f5f9;
52
+ --dw-text-ink: #e2e8f0;
53
+ --dw-text-muted: #94a3b8;
54
+ --dw-text-faint: #64748b;
55
+ --dw-success: #34d399;
56
+ --dw-success-strong: #4ade80;
57
+ --dw-danger: #f87171;
58
+ --dw-swatch-border: rgba(255, 255, 255, 0.18);
59
+ --dw-swatch-border-hover: rgba(255, 255, 255, 0.4);
60
+ --dw-tooltip-bg: rgba(226, 232, 240, 0.95);
61
+ --dw-tooltip-text: #0f172a;
62
+ --dw-shadow-sm: 0 4px 16px rgba(0, 0, 0, 0.4);
63
+ --dw-shadow-md: 0 6px 24px rgba(0, 0, 0, 0.42), 0 2px 6px rgba(0, 0, 0, 0.24);
64
+ --dw-shadow-lg: 0 10px 40px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3);
65
+ --dw-shadow-xl: 0 6px 24px rgba(0, 0, 0, 0.45), 0 2px 8px rgba(0, 0, 0, 0.25);
66
+ --dw-shadow-tooltip: 0 4px 16px rgba(0, 0, 0, 0.5);
67
+ --dw-shadow-primary: 0 2px 8px rgba(96, 165, 250, 0.35);
68
+ --dw-shadow-toggle: 0 4px 16px rgba(0, 0, 0, 0.4), 0 1px 4px rgba(0, 0, 0, 0.24);
69
+ --dw-shadow-toast: 0 4px 20px rgba(0, 0, 0, 0.4), 0 1px 4px rgba(0, 0, 0, 0.24);
70
+ }
71
+ .drawui-canvas-board {
72
+ position: fixed;
73
+ inset: 0;
74
+ overflow: hidden;
75
+ background-color: var(--dw-canvas-bg);
76
+ }
77
+ .drawui-canvas {
78
+ display: block;
79
+ width: 100%;
80
+ height: 100%;
81
+ cursor: default;
82
+ }
83
+ .drawui-toolbar {
84
+ position: fixed;
85
+ top: 20px;
86
+ left: 50%;
87
+ transform: translateX(-50%);
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 4px;
91
+ padding: 6px;
92
+ background: var(--dw-panel-bg);
93
+ backdrop-filter: blur(16px);
94
+ -webkit-backdrop-filter: blur(16px);
95
+ border-radius: 14px;
96
+ box-shadow: var(--dw-shadow-md);
97
+ border: 1px solid var(--dw-panel-border);
98
+ z-index: 100;
99
+ }
100
+ .drawui-toolbar-button {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ width: 38px;
105
+ height: 38px;
106
+ border: none;
107
+ background: transparent;
108
+ border-radius: 10px;
109
+ color: var(--dw-text);
110
+ cursor: pointer;
111
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
112
+ }
113
+ .drawui-toolbar-button:hover {
114
+ background: var(--dw-hover-bg);
115
+ color: var(--dw-text-strong);
116
+ }
117
+ .drawui-toolbar-button.active {
118
+ background: var(--dw-primary);
119
+ color: var(--dw-primary-contrast);
120
+ box-shadow: var(--dw-shadow-primary);
121
+ }
122
+ .drawui-toolbar-button.active:hover {
123
+ background: var(--dw-primary-hover);
124
+ }
125
+ .drawui-toolbar-button svg {
126
+ width: 19px;
127
+ height: 19px;
128
+ }
129
+ .drawui-toolbar-button path {
130
+ transition: stroke-dashoffset 0.2s ease;
131
+ }
132
+ .drawui-toolbar-divider {
133
+ width: 1px;
134
+ height: 22px;
135
+ background: var(--dw-border-strong);
136
+ margin: 0 4px;
137
+ }
138
+ .drawui-toolbar-container {
139
+ position: fixed;
140
+ top: 20px;
141
+ left: 50%;
142
+ transform: translateX(-50%);
143
+ z-index: 100;
144
+ }
145
+ .drawui-toolbar-dropdown {
146
+ position: relative;
147
+ }
148
+ .drawui-toolbar-shape-grid {
149
+ position: absolute;
150
+ top: calc(100% + 8px);
151
+ left: 50%;
152
+ transform: translateX(-50%);
153
+ display: grid;
154
+ grid-template-columns: repeat(4, 1fr);
155
+ gap: 2px;
156
+ padding: 6px;
157
+ background: var(--dw-panel-bg);
158
+ backdrop-filter: blur(16px);
159
+ -webkit-backdrop-filter: blur(16px);
160
+ border-radius: 14px;
161
+ box-shadow: var(--dw-shadow-lg);
162
+ border: 1px solid var(--dw-panel-border);
163
+ background: var(--dw-panel-bg-deep);
164
+ animation: dropdownFadeIn 0.15s cubic-bezier(0.4, 0, 0.2, 1);
165
+ }
166
+ @keyframes dropdownFadeIn {
167
+ from {
168
+ opacity: 0;
169
+ transform: translateX(-50%) translateY(-4px);
170
+ }
171
+ to {
172
+ opacity: 1;
173
+ transform: translateX(-50%) translateY(0);
174
+ }
175
+ }
176
+ .drawui-toolbar-shape-item {
177
+ display: flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ width: 36px;
181
+ height: 36px;
182
+ border: none;
183
+ background: transparent;
184
+ border-radius: 8px;
185
+ color: var(--dw-text);
186
+ cursor: pointer;
187
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
188
+ }
189
+ .drawui-toolbar-shape-item:hover {
190
+ background: var(--dw-hover-bg);
191
+ color: var(--dw-text-strong);
192
+ }
193
+ .drawui-toolbar-shape-item.active {
194
+ background: var(--dw-primary-weak);
195
+ color: var(--dw-primary);
196
+ }
197
+ .drawui-toolbar-shape-item svg {
198
+ width: 20px;
199
+ height: 20px;
200
+ }
201
+ .drawui-toolbar-export-grid {
202
+ grid-template-columns: 1fr;
203
+ min-width: 132px;
204
+ }
205
+ .drawui-toolbar-export-item {
206
+ width: 100%;
207
+ height: 32px;
208
+ padding: 0 12px;
209
+ font-size: 13px;
210
+ white-space: nowrap;
211
+ justify-content: flex-start;
212
+ }
213
+ .drawui-zoom-control {
214
+ position: fixed;
215
+ top: 20px;
216
+ right: 20px;
217
+ display: flex;
218
+ flex-direction: column;
219
+ align-items: center;
220
+ gap: 4px;
221
+ padding: 6px;
222
+ background: var(--dw-panel-bg);
223
+ backdrop-filter: blur(16px);
224
+ -webkit-backdrop-filter: blur(16px);
225
+ border-radius: 14px;
226
+ box-shadow: var(--dw-shadow-md);
227
+ border: 1px solid var(--dw-panel-border);
228
+ z-index: 100;
229
+ }
230
+ .drawui-zoom-button {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ width: 34px;
235
+ height: 34px;
236
+ border: none;
237
+ background: transparent;
238
+ border-radius: 10px;
239
+ color: var(--dw-text);
240
+ cursor: pointer;
241
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
242
+ }
243
+ .drawui-zoom-button:hover {
244
+ background: var(--dw-hover-bg);
245
+ color: var(--dw-text-strong);
246
+ }
247
+ .drawui-zoom-button svg {
248
+ width: 17px;
249
+ height: 17px;
250
+ }
251
+ .drawui-zoom-level {
252
+ font-size: 12px;
253
+ color: var(--dw-text-muted);
254
+ padding: 4px 8px;
255
+ }
256
+ .drawui-status-bar {
257
+ position: fixed;
258
+ right: 20px;
259
+ bottom: calc(20px + var(--dw-status-bar-lift, 0px));
260
+ display: flex;
261
+ align-items: center;
262
+ gap: 16px;
263
+ padding: 8px 16px;
264
+ background: var(--dw-panel-bg);
265
+ backdrop-filter: blur(16px);
266
+ -webkit-backdrop-filter: blur(16px);
267
+ border-radius: 10px;
268
+ box-shadow: var(--dw-shadow-sm);
269
+ border: 1px solid var(--dw-panel-border);
270
+ font-size: 12px;
271
+ color: var(--dw-text-muted);
272
+ z-index: 100;
273
+ }
274
+ .drawui-status-item {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 6px;
278
+ }
279
+ .drawui-status-item::before {
280
+ content: '';
281
+ width: 6px;
282
+ height: 6px;
283
+ border-radius: 50%;
284
+ background: var(--dw-success);
285
+ }
286
+ .drawui-tooltip {
287
+ position: absolute;
288
+ max-width: 280px;
289
+ padding: 8px 12px;
290
+ background: var(--dw-tooltip-bg);
291
+ backdrop-filter: blur(8px);
292
+ -webkit-backdrop-filter: blur(8px);
293
+ color: var(--dw-tooltip-text);
294
+ font-size: 13px;
295
+ line-height: 1.4;
296
+ border-radius: 8px;
297
+ box-shadow: var(--dw-shadow-tooltip);
298
+ z-index: 2000;
299
+ pointer-events: none;
300
+ white-space: pre-wrap;
301
+ word-break: break-word;
302
+ animation: tooltipFadeIn 0.12s cubic-bezier(0.4, 0, 0.2, 1);
303
+ }
304
+ @keyframes tooltipFadeIn {
305
+ from {
306
+ opacity: 0;
307
+ transform: translateY(-4px);
308
+ }
309
+ to {
310
+ opacity: 1;
311
+ transform: translateY(0);
312
+ }
313
+ }
314
+ [data-drawui-tip] {
315
+ position: relative;
316
+ }
317
+ [data-drawui-tip]::after {
318
+ content: attr(data-drawui-tip);
319
+ position: absolute;
320
+ left: 50%;
321
+ top: calc(100% + 8px);
322
+ transform: translateX(-50%);
323
+ width: max-content;
324
+ max-width: 240px;
325
+ padding: 5px 9px;
326
+ font-size: 12px;
327
+ font-weight: 400;
328
+ line-height: 1.4;
329
+ text-align: center;
330
+ word-break: break-word;
331
+ color: var(--dw-tooltip-text);
332
+ background: var(--dw-tooltip-bg);
333
+ backdrop-filter: blur(8px);
334
+ -webkit-backdrop-filter: blur(8px);
335
+ border-radius: 8px;
336
+ box-shadow: var(--dw-shadow-tooltip);
337
+ opacity: 0;
338
+ pointer-events: none;
339
+ transition: opacity 0.12s cubic-bezier(0.4, 0, 0.2, 1);
340
+ z-index: 2000;
341
+ }
342
+ [data-drawui-tip]:hover::after,
343
+ [data-drawui-tip]:focus-visible::after {
344
+ opacity: 1;
345
+ transition-delay: 0.35s;
346
+ }
347
+ [data-drawui-tip][data-drawui-tip-pos='top']::after {
348
+ top: auto;
349
+ bottom: calc(100% + 8px);
350
+ }
351
+ .drawui-toast {
352
+ position: absolute;
353
+ top: 20px;
354
+ left: 50%;
355
+ transform: translateX(-50%);
356
+ display: flex;
357
+ align-items: center;
358
+ gap: 7px;
359
+ padding: 8px 18px;
360
+ background: var(--dw-panel-bg);
361
+ backdrop-filter: blur(16px);
362
+ -webkit-backdrop-filter: blur(16px);
363
+ border-radius: 20px;
364
+ box-shadow: var(--dw-shadow-toast);
365
+ border: 1px solid var(--dw-panel-border);
366
+ background: var(--dw-panel-bg-deep);
367
+ color: var(--dw-text-strong);
368
+ font-size: 13px;
369
+ font-weight: 500;
370
+ z-index: 2000;
371
+ pointer-events: none;
372
+ animation: drawui-toast-in 0.2s cubic-bezier(0.4, 0, 0.2, 1);
373
+ }
374
+ .drawui-toast-icon {
375
+ color: var(--dw-success-strong);
376
+ flex-shrink: 0;
377
+ }
378
+ @keyframes drawui-toast-in {
379
+ from {
380
+ opacity: 0;
381
+ transform: translateX(-50%) translateY(-6px) scale(0.96);
382
+ }
383
+ to {
384
+ opacity: 1;
385
+ transform: translateX(-50%) translateY(0) scale(1);
386
+ }
387
+ }
388
+ .drawui-style-floating {
389
+ position: fixed;
390
+ inset: 0;
391
+ z-index: 100;
392
+ pointer-events: none;
393
+ }
394
+ .drawui-style-toolbar {
395
+ position: absolute;
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 2px;
399
+ padding: 5px;
400
+ background: var(--dw-panel-bg);
401
+ backdrop-filter: blur(16px);
402
+ -webkit-backdrop-filter: blur(16px);
403
+ border-radius: 12px;
404
+ box-shadow: var(--dw-shadow-lg);
405
+ border: 1px solid var(--dw-panel-border);
406
+ pointer-events: auto;
407
+ /* 只做淡入、不做位移/缩放,避免出现"抖动一下"的观感 */
408
+ animation: drawui-style-toolbar-in 0.12s cubic-bezier(0.4, 0, 0.2, 1);
409
+ }
410
+ .drawui-style-tool-btn {
411
+ display: flex;
412
+ align-items: center;
413
+ justify-content: center;
414
+ width: 32px;
415
+ height: 32px;
416
+ padding: 0;
417
+ border: none;
418
+ background: transparent;
419
+ border-radius: 8px;
420
+ color: var(--dw-text-ink);
421
+ font-size: 15px;
422
+ line-height: 1;
423
+ cursor: pointer;
424
+ transition: background 0.12s cubic-bezier(0.4, 0, 0.2, 1);
425
+ }
426
+ .drawui-style-tool-btn:hover {
427
+ background: var(--dw-hover-bg);
428
+ }
429
+ .drawui-style-tool-btn.active {
430
+ background: var(--dw-primary-weak);
431
+ }
432
+ .drawui-st-swatch {
433
+ width: 18px;
434
+ height: 18px;
435
+ border-radius: 5px;
436
+ border: 1.5px solid var(--dw-swatch-border);
437
+ }
438
+ .drawui-st-none {
439
+ background: #fff linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%) 0 0 / 6px 6px;
440
+ }
441
+ .drawui-st-frame {
442
+ box-sizing: border-box;
443
+ width: 18px;
444
+ height: 18px;
445
+ border-radius: 4px;
446
+ border-width: 3px;
447
+ border-style: solid;
448
+ }
449
+ /* 无色边框:白底 + 格纹,避免图标看起来是"空的" */
450
+ .drawui-st-frame-none {
451
+ border-color: var(--dw-border-strong);
452
+ background: #fff linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%) 0 0 / 6px 6px;
453
+ }
454
+ .drawui-st-line {
455
+ width: 18px;
456
+ height: 4px;
457
+ border-radius: 2px;
458
+ }
459
+ .drawui-st-line-none {
460
+ background: var(--dw-border-strong);
461
+ }
462
+ .drawui-st-text {
463
+ font-size: 16px;
464
+ font-weight: 700;
465
+ }
466
+ .drawui-st-hl {
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ width: 18px;
471
+ height: 18px;
472
+ border-radius: 5px;
473
+ border: 1.5px solid var(--dw-swatch-border);
474
+ font-size: 11px;
475
+ font-weight: 700;
476
+ color: #1f2937;
477
+ }
478
+ .drawui-style-popover {
479
+ position: absolute;
480
+ display: flex;
481
+ flex-direction: column;
482
+ gap: 8px;
483
+ min-width: 228px;
484
+ padding: 10px 12px;
485
+ background: var(--dw-panel-bg);
486
+ backdrop-filter: blur(16px);
487
+ -webkit-backdrop-filter: blur(16px);
488
+ border-radius: 12px;
489
+ box-shadow: var(--dw-shadow-xl);
490
+ border: 1px solid var(--dw-panel-border);
491
+ background: var(--dw-panel-bg-deep);
492
+ pointer-events: auto;
493
+ animation: drawui-style-pop-in 0.12s cubic-bezier(0.4, 0, 0.2, 1);
494
+ }
495
+ .drawui-style-popover-title {
496
+ font-size: 11px;
497
+ font-weight: 500;
498
+ color: var(--dw-text-muted);
499
+ line-height: 1;
500
+ }
501
+ .drawui-muted-hint {
502
+ max-width: 180px;
503
+ font-size: 11px;
504
+ line-height: 1.5;
505
+ color: var(--dw-text-muted);
506
+ }
507
+ @keyframes drawui-style-toolbar-in {
508
+ from {
509
+ opacity: 0;
510
+ }
511
+ to {
512
+ opacity: 1;
513
+ }
514
+ }
515
+ @keyframes drawui-style-pop-in {
516
+ from {
517
+ opacity: 0;
518
+ transform: scale(0.97);
519
+ }
520
+ to {
521
+ opacity: 1;
522
+ transform: scale(1);
523
+ }
524
+ }
525
+ .drawui-color-row {
526
+ display: grid;
527
+ grid-template-columns: repeat(8, 20px);
528
+ gap: 6px;
529
+ }
530
+ .drawui-color-swatch {
531
+ box-sizing: border-box;
532
+ width: 20px;
533
+ height: 20px;
534
+ border-radius: 50%;
535
+ border: 1.5px solid var(--dw-swatch-border);
536
+ cursor: pointer;
537
+ padding: 0;
538
+ transition: transform 0.12s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.12s cubic-bezier(0.4, 0, 0.2, 1);
539
+ /* 当前选中色:内白环 + 主色外环 */
540
+ }
541
+ .drawui-color-swatch:hover {
542
+ transform: scale(1.14);
543
+ border-color: var(--dw-swatch-border-hover);
544
+ }
545
+ .drawui-color-swatch.active {
546
+ box-shadow: inset 0 0 0 2px #fff, 0 0 0 2px var(--dw-primary);
547
+ }
548
+ /* 自定义色:右下角小三角标记,区分内置色 */
549
+ .drawui-color-custom {
550
+ position: relative;
551
+ }
552
+ .drawui-color-custom::before {
553
+ content: '';
554
+ position: absolute;
555
+ right: 0;
556
+ bottom: 0;
557
+ width: 0;
558
+ height: 0;
559
+ border-style: solid;
560
+ border-width: 0 0 7px 7px;
561
+ border-color: transparent transparent var(--dw-primary) transparent;
562
+ border-bottom-right-radius: 50%;
563
+ }
564
+ /* 添加颜色:内嵌原生取色器 */
565
+ .drawui-color-add {
566
+ position: relative;
567
+ display: flex;
568
+ align-items: center;
569
+ justify-content: center;
570
+ background: var(--dw-panel-bg-solid);
571
+ border-style: dashed;
572
+ color: var(--dw-text-muted);
573
+ font-size: 15px;
574
+ line-height: 1;
575
+ }
576
+ .drawui-color-add:hover {
577
+ color: var(--dw-primary);
578
+ border-color: var(--dw-primary);
579
+ transform: scale(1.06);
580
+ }
581
+ .drawui-color-add-input {
582
+ position: absolute;
583
+ inset: 0;
584
+ width: 100%;
585
+ height: 100%;
586
+ padding: 0;
587
+ border: none;
588
+ opacity: 0;
589
+ cursor: pointer;
590
+ }
591
+ .drawui-color-swatch-transparent {
592
+ position: relative;
593
+ background: #fff linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%) 0 0 / 6px 6px;
594
+ }
595
+ .drawui-color-swatch-transparent::after {
596
+ content: '';
597
+ position: absolute;
598
+ top: 50%;
599
+ left: 2px;
600
+ right: 2px;
601
+ height: 1.5px;
602
+ background: var(--dw-danger);
603
+ transform: rotate(-45deg);
604
+ }
605
+ .drawui-opacity-row {
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 8px;
609
+ margin-top: 2px;
610
+ }
611
+ .drawui-opacity-label {
612
+ font-size: 11px;
613
+ color: var(--dw-text-muted);
614
+ white-space: nowrap;
615
+ }
616
+ .drawui-opacity-value {
617
+ font-size: 11px;
618
+ color: var(--dw-text-muted);
619
+ min-width: 34px;
620
+ text-align: right;
621
+ }
622
+ .drawui-opacity-slider {
623
+ flex: 1;
624
+ -webkit-appearance: none;
625
+ appearance: none;
626
+ /* 关键:把 input 本身撑高到 16px,否则命中区域只有 4px 高 → 滑块基本拖不动 */
627
+ height: 16px;
628
+ margin: 0;
629
+ background: transparent;
630
+ outline: none;
631
+ cursor: pointer;
632
+ }
633
+ .drawui-opacity-slider::-webkit-slider-runnable-track {
634
+ height: 4px;
635
+ border-radius: 2px;
636
+ background: var(--dw-border-strong);
637
+ }
638
+ .drawui-opacity-slider::-moz-range-track {
639
+ height: 4px;
640
+ border-radius: 2px;
641
+ background: var(--dw-border-strong);
642
+ }
643
+ .drawui-opacity-slider::-webkit-slider-thumb {
644
+ -webkit-appearance: none;
645
+ appearance: none;
646
+ width: 14px;
647
+ height: 14px;
648
+ /* (轨道高 4 - 滑块高 14) / 2,使滑块在轨道上垂直居中 */
649
+ margin-top: -5px;
650
+ border-radius: 50%;
651
+ background: #ffffff;
652
+ border: 2px solid var(--dw-primary);
653
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
654
+ transition: transform 0.12s cubic-bezier(0.4, 0, 0.2, 1);
655
+ }
656
+ .drawui-opacity-slider::-moz-range-thumb {
657
+ width: 14px;
658
+ height: 14px;
659
+ border-radius: 50%;
660
+ background: #ffffff;
661
+ border: 2px solid var(--dw-primary);
662
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
663
+ transition: transform 0.12s cubic-bezier(0.4, 0, 0.2, 1);
664
+ }
665
+ .drawui-opacity-slider:hover::-webkit-slider-thumb {
666
+ transform: scale(1.1);
667
+ }
668
+ .drawui-opacity-slider:hover::-moz-range-thumb {
669
+ transform: scale(1.1);
670
+ }
671
+ .drawui-connection-row {
672
+ display: flex;
673
+ align-items: center;
674
+ gap: 4px;
675
+ }
676
+ .drawui-connection-btn {
677
+ display: flex;
678
+ flex-direction: column;
679
+ align-items: center;
680
+ justify-content: center;
681
+ gap: 1px;
682
+ padding: 3px 6px;
683
+ border: 1px solid var(--dw-border-strong);
684
+ background: var(--dw-panel-bg-solid);
685
+ border-radius: 6px;
686
+ cursor: pointer;
687
+ transition: all 0.12s cubic-bezier(0.4, 0, 0.2, 1);
688
+ min-width: 32px;
689
+ }
690
+ .drawui-connection-btn:hover {
691
+ border-color: var(--dw-primary);
692
+ background: var(--dw-primary-weak);
693
+ }
694
+ .drawui-connection-btn.active {
695
+ border-color: var(--dw-primary);
696
+ background: var(--dw-primary);
697
+ color: var(--dw-primary-contrast);
698
+ }
699
+ .drawui-connection-btn.active .drawui-connection-icon,
700
+ .drawui-connection-btn.active .drawui-connection-label {
701
+ color: var(--dw-primary-contrast);
702
+ }
703
+ .drawui-connection-icon {
704
+ font-size: 14px;
705
+ line-height: 1;
706
+ color: var(--dw-text-ink);
707
+ }
708
+ .drawui-connection-label {
709
+ font-size: 9px;
710
+ font-weight: 500;
711
+ color: var(--dw-text-muted);
712
+ line-height: 1;
713
+ }
714
+ .drawui-minimap {
715
+ position: fixed;
716
+ bottom: 20px;
717
+ left: 20px;
718
+ display: flex;
719
+ align-items: stretch;
720
+ gap: 6px;
721
+ z-index: 100;
722
+ user-select: none;
723
+ animation: drawui-minimap-in 0.25s cubic-bezier(0.4, 0, 0.2, 1);
724
+ }
725
+ @keyframes drawui-minimap-in {
726
+ from {
727
+ opacity: 0;
728
+ transform: translateY(8px);
729
+ }
730
+ to {
731
+ opacity: 1;
732
+ transform: translateY(0);
733
+ }
734
+ }
735
+ .drawui-minimap-toggle {
736
+ display: flex;
737
+ align-items: center;
738
+ justify-content: center;
739
+ width: 32px;
740
+ height: 32px;
741
+ border: none;
742
+ background: var(--dw-panel-bg);
743
+ backdrop-filter: blur(16px);
744
+ -webkit-backdrop-filter: blur(16px);
745
+ border-radius: 10px;
746
+ box-shadow: var(--dw-shadow-toggle);
747
+ border: 1px solid var(--dw-panel-border);
748
+ color: var(--dw-text-muted);
749
+ cursor: pointer;
750
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
751
+ flex-shrink: 0;
752
+ align-self: flex-end;
753
+ }
754
+ .drawui-minimap-toggle:hover {
755
+ background: var(--dw-panel-bg-solid);
756
+ color: var(--dw-text-strong);
757
+ }
758
+ .drawui-minimap-toggle svg {
759
+ width: 16px;
760
+ height: 16px;
761
+ }
762
+ .drawui-minimap-panel {
763
+ display: flex;
764
+ flex-direction: column;
765
+ background: var(--dw-panel-bg);
766
+ backdrop-filter: blur(16px);
767
+ -webkit-backdrop-filter: blur(16px);
768
+ border-radius: 12px;
769
+ box-shadow: var(--dw-shadow-md);
770
+ border: 1px solid var(--dw-panel-border);
771
+ padding: 8px;
772
+ gap: 6px;
773
+ overflow: hidden;
774
+ }
775
+ .drawui-minimap-header {
776
+ display: flex;
777
+ align-items: center;
778
+ justify-content: space-between;
779
+ padding: 0 4px;
780
+ }
781
+ .drawui-minimap-title {
782
+ font-size: 11px;
783
+ font-weight: 500;
784
+ color: var(--dw-text-muted);
785
+ letter-spacing: 0.04em;
786
+ }
787
+ .drawui-minimap-zoom {
788
+ font-size: 10px;
789
+ font-variant-numeric: tabular-nums;
790
+ color: var(--dw-text-faint);
791
+ letter-spacing: 0.04em;
792
+ }
793
+ .drawui-minimap-canvas-wrap {
794
+ position: relative;
795
+ border-radius: 8px;
796
+ overflow: hidden;
797
+ width: 220px;
798
+ height: 140px;
799
+ background: var(--dw-canvas-bg);
800
+ box-shadow: inset 0 0 0 1px var(--dw-inset-border);
801
+ }
802
+ .drawui-minimap-canvas {
803
+ display: block;
804
+ width: 220px;
805
+ height: 140px;
806
+ touch-action: none;
807
+ }
808
+ .drawui-uml-add-row:hover {
809
+ background: var(--dw-primary-weak);
810
+ color: var(--dw-primary);
811
+ border-color: var(--dw-primary);
812
+ }
813
+ .drawui-uml-toolbar-btn:hover {
814
+ background: var(--dw-hover-bg);
815
+ }
816
+ .drawui-gen-menu {
817
+ position: absolute;
818
+ display: flex;
819
+ flex-direction: column;
820
+ gap: 6px;
821
+ padding: 8px;
822
+ background: var(--dw-panel-bg);
823
+ backdrop-filter: blur(16px);
824
+ -webkit-backdrop-filter: blur(16px);
825
+ border-radius: 12px;
826
+ box-shadow: var(--dw-shadow-xl);
827
+ border: 1px solid var(--dw-panel-border);
828
+ z-index: 500;
829
+ user-select: none;
830
+ animation: drawui-gen-menu-in 0.18s cubic-bezier(0.4, 0, 0.2, 1);
831
+ transform: translate(8px, 8px);
832
+ min-width: 140px;
833
+ }
834
+ @keyframes drawui-gen-menu-in {
835
+ from {
836
+ opacity: 0;
837
+ transform: translate(8px, 8px) scale(0.94);
838
+ }
839
+ to {
840
+ opacity: 1;
841
+ transform: translate(8px, 8px) scale(1);
842
+ }
843
+ }
844
+ .drawui-gen-menu-label {
845
+ font-size: 11px;
846
+ font-weight: 500;
847
+ color: var(--dw-text-muted);
848
+ padding: 0 2px;
849
+ }
850
+ .drawui-gen-shape-grid {
851
+ display: grid;
852
+ grid-template-columns: repeat(5, auto);
853
+ gap: 4px;
854
+ }
855
+ .drawui-gen-shape-btn {
856
+ display: flex;
857
+ flex-direction: column;
858
+ align-items: center;
859
+ justify-content: center;
860
+ gap: 2px;
861
+ width: 44px;
862
+ padding: 5px 2px 4px;
863
+ border: 1px solid var(--dw-border-strong);
864
+ background: var(--dw-panel-bg-solid);
865
+ border-radius: 8px;
866
+ cursor: pointer;
867
+ transition: all 0.12s cubic-bezier(0.4, 0, 0.2, 1);
868
+ color: var(--dw-text-ink);
869
+ }
870
+ .drawui-gen-shape-btn:hover {
871
+ border-color: var(--dw-primary);
872
+ background: var(--dw-primary-weak);
873
+ color: var(--dw-primary-hover);
874
+ }
875
+ .drawui-gen-shape-btn:active {
876
+ transform: scale(0.96);
877
+ }
878
+ .drawui-gen-shape-btn.drawui-gen-shape-active {
879
+ border-color: var(--dw-primary);
880
+ background: var(--dw-primary-weak);
881
+ color: var(--dw-primary-hover);
882
+ }
883
+ .drawui-gen-shape-glyph {
884
+ display: block;
885
+ }
886
+ .drawui-gen-shape-label {
887
+ font-size: 10px;
888
+ line-height: 1;
889
+ color: var(--dw-text-muted);
890
+ white-space: nowrap;
891
+ }
892
+ .drawui-gen-shape-btn:hover .drawui-gen-shape-label,
893
+ .drawui-gen-shape-btn.drawui-gen-shape-active .drawui-gen-shape-label {
894
+ color: var(--dw-primary-hover);
895
+ }
896
+ .drawui-gen-menu-hint {
897
+ font-size: 10px;
898
+ color: var(--dw-text-faint);
899
+ padding: 0 2px;
900
+ }