@cyberpunk-vue/theme-chalk 1.14.0 → 1.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/index.css.map +1 -1
  3. package/package.json +1 -1
  4. package/src/common/var.scss +247 -247
  5. package/src/components/avatar-group.scss +113 -113
  6. package/src/components/avatar.scss +123 -123
  7. package/src/components/badge.scss +210 -210
  8. package/src/components/breadcrumb.scss +203 -203
  9. package/src/components/button.scss +975 -975
  10. package/src/components/card.scss +699 -696
  11. package/src/components/checkbox-group.scss +22 -22
  12. package/src/components/checkbox.scss +320 -320
  13. package/src/components/col.scss +43 -43
  14. package/src/components/dialog.scss +360 -360
  15. package/src/components/divider.scss +250 -250
  16. package/src/components/empty.scss +99 -99
  17. package/src/components/form-item.scss +189 -189
  18. package/src/components/form.scss +59 -59
  19. package/src/components/icon.scss +83 -83
  20. package/src/components/image-preview.scss +147 -147
  21. package/src/components/image.scss +351 -351
  22. package/src/components/input-number.scss +129 -129
  23. package/src/components/input.scss +362 -362
  24. package/src/components/loading.scss +64 -64
  25. package/src/components/notification.scss +348 -348
  26. package/src/components/pagination.scss +287 -280
  27. package/src/components/pattern-background.scss +18 -18
  28. package/src/components/popover.scss +438 -438
  29. package/src/components/progress.scss +438 -438
  30. package/src/components/radio-group.scss +22 -22
  31. package/src/components/radio.scss +286 -286
  32. package/src/components/row.scss +12 -12
  33. package/src/components/scrollbar.scss +40 -40
  34. package/src/components/segmented.scss +566 -566
  35. package/src/components/select.scss +15 -1
  36. package/src/components/slider.scss +421 -421
  37. package/src/components/status-indicator.scss +206 -206
  38. package/src/components/switch.scss +405 -405
  39. package/src/components/table.scss +474 -474
  40. package/src/components/tag.scss +416 -416
  41. package/src/components/text.scss +310 -271
  42. package/src/components/textarea.scss +106 -104
  43. package/src/components/timeline.scss +379 -379
  44. package/src/components/tree.scss +397 -397
  45. package/src/components/upload.scss +509 -509
  46. package/src/index.scss +60 -60
  47. package/src/mixins/mixins.scss +156 -156
@@ -1,509 +1,509 @@
1
- // CpUpload 组件样式
2
- // 赛博朋克/机甲风格
3
-
4
- @use '../common/var' as *;
5
- @use '../mixins/mixins' as *;
6
-
7
- @include b(upload) {
8
- display: inline-flex;
9
- flex-direction: column;
10
- gap: var(--cp-spacing-md);
11
- width: 100%;
12
-
13
- // ===== CSS 变量 =====
14
- --cp-upload-color: var(--cp-color-primary);
15
- --cp-upload-border-color: var(--cp-border);
16
- --cp-upload-bg: transparent;
17
- --cp-upload-card-size: 120px;
18
- --cp-upload-success-color: var(--cp-color-success);
19
-
20
- // ===== 颜色类型 =====
21
- @include m(primary) { --cp-upload-color: var(--cp-color-primary); --cp-upload-border-color: var(--cp-color-primary); }
22
- @include m(success) { --cp-upload-color: var(--cp-color-success); --cp-upload-border-color: var(--cp-color-success); }
23
- @include m(warning) { --cp-upload-color: var(--cp-color-warning); --cp-upload-border-color: var(--cp-color-warning); }
24
- @include m(error) { --cp-upload-color: var(--cp-color-error); --cp-upload-border-color: var(--cp-color-error); }
25
- @include m(info) { --cp-upload-color: var(--cp-color-info); --cp-upload-border-color: var(--cp-color-info); }
26
-
27
- // ===== 隐藏 input =====
28
- @include e(input) {
29
- display: none;
30
- }
31
-
32
- // ===== 触发器 =====
33
- @include e(trigger) {
34
- display: inline-flex;
35
- cursor: pointer;
36
- }
37
-
38
- // ===== 拖拽区 =====
39
- @include e(dragger) {
40
- display: flex;
41
- align-items: center;
42
- justify-content: center;
43
- width: 100%;
44
- min-height: 160px;
45
- padding: var(--cp-spacing-xl);
46
- border: 2px dashed var(--cp-upload-border-color);
47
- background: var(--cp-upload-bg);
48
- transition: all 0.3s ease;
49
-
50
- // 切角
51
- clip-path: polygon(12px 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%, 0 12px);
52
- }
53
-
54
- // ===== 拖拽区内容 =====
55
- @include e(drag-content) {
56
- display: flex;
57
- flex-direction: column;
58
- align-items: center;
59
- gap: var(--cp-spacing-md);
60
- color: var(--cp-text-muted);
61
- user-select: none;
62
- }
63
-
64
- @include e(drag-icon) {
65
- width: 48px;
66
- height: 48px;
67
- color: var(--cp-text-muted);
68
- opacity: 0.6;
69
- transition: all 0.3s ease;
70
- }
71
-
72
- @include e(drag-text) {
73
- display: inline-flex;
74
- align-items: center;
75
- gap: 0.25em;
76
- font-size: var(--cp-font-size-md);
77
- }
78
-
79
- // ===== Picture-card 触发卡片 =====
80
- @include e(card-trigger) {
81
- display: flex;
82
- flex-direction: column;
83
- align-items: center;
84
- justify-content: center;
85
- gap: var(--cp-spacing-xs);
86
- width: var(--cp-upload-card-width, var(--cp-upload-card-size));
87
- height: var(--cp-upload-card-height, var(--cp-upload-card-size));
88
- border: 2px dashed var(--cp-upload-border-color);
89
- background: var(--cp-upload-bg);
90
- color: var(--cp-text-muted);
91
- transition: all 0.3s ease;
92
- clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
93
-
94
- svg {
95
- width: 28px;
96
- height: 28px;
97
- transition: transform 0.3s ease;
98
- }
99
-
100
- &:hover {
101
- border-color: var(--cp-upload-color);
102
- color: var(--cp-upload-color);
103
- box-shadow: inset 0 0 20px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
104
-
105
- svg {
106
- transform: scale(1.1);
107
- }
108
- }
109
- }
110
-
111
- @include e(card-trigger-text) {
112
- font-size: var(--cp-font-size-sm);
113
- text-align: center;
114
- max-width: 100%;
115
- overflow: hidden;
116
- text-overflow: ellipsis;
117
- white-space: nowrap;
118
- }
119
-
120
- // ===== 变体 =====
121
-
122
- // Outline (实线边框)
123
- @include m(outline) {
124
- .cp-upload__dragger,
125
- .cp-upload__card-trigger {
126
- border-style: solid;
127
- }
128
- }
129
-
130
- // Dashed (虚线边框 - 默认)
131
- @include m(dashed) {
132
- .cp-upload__dragger,
133
- .cp-upload__card-trigger {
134
- border-style: dashed;
135
- }
136
- }
137
-
138
- // Filled (填充背景)
139
- @include m(filled) {
140
- .cp-upload__dragger,
141
- .cp-upload__card-trigger {
142
- border-style: solid;
143
- background: var(--cp-bg-elevated);
144
- }
145
- }
146
-
147
- // Ghost (无边框)
148
- @include m(ghost) {
149
- .cp-upload__dragger,
150
- .cp-upload__card-trigger {
151
- border-color: transparent;
152
- background: transparent;
153
-
154
- &:hover {
155
- background: var(--cp-state-hover);
156
- border-color: var(--cp-border);
157
- }
158
- }
159
- }
160
-
161
- // ===== 形状 =====
162
- @include m(shape-no-clip) {
163
- .cp-upload__dragger,
164
- .cp-upload__card-trigger,
165
- .cp-upload__card,
166
- .cp-upload__item {
167
- clip-path: none;
168
- border-radius: 0;
169
- }
170
- }
171
-
172
- @include m(shape-round) {
173
- .cp-upload__dragger,
174
- .cp-upload__card-trigger,
175
- .cp-upload__card,
176
- .cp-upload__item {
177
- clip-path: none;
178
- border-radius: var(--cp-radius-lg);
179
- }
180
- }
181
-
182
- // ===== 拖拽 hover =====
183
- @include when(dragover) {
184
- .cp-upload__dragger {
185
- border-color: var(--cp-upload-color);
186
- box-shadow: inset 0 0 30px color-mix(in srgb, var(--cp-upload-color), transparent 70%), 0 0 15px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
187
- background: color-mix(in srgb, var(--cp-upload-color), transparent 95%);
188
- }
189
-
190
- .cp-upload__card-trigger {
191
- border-color: var(--cp-upload-color);
192
- color: var(--cp-upload-color);
193
- box-shadow: inset 0 0 20px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
194
-
195
- svg {
196
- transform: scale(1.1);
197
- }
198
- }
199
-
200
- .cp-upload__drag-icon {
201
- color: var(--cp-upload-color);
202
- opacity: 1;
203
- transform: translateY(-4px);
204
- }
205
- }
206
-
207
- // ===== Hover 和 Focus =====
208
- &:not(.is-disabled) {
209
- .cp-upload__dragger:hover {
210
- border-color: var(--cp-upload-color);
211
- box-shadow: inset 0 0 15px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
212
- }
213
-
214
- .cp-upload__dragger:hover .cp-upload__drag-icon {
215
- color: var(--cp-upload-color);
216
- opacity: 0.8;
217
- }
218
- }
219
-
220
- // ===== 禁用 =====
221
- @include when(disabled) {
222
- .cp-upload__trigger,
223
- .cp-upload__dragger {
224
- cursor: not-allowed;
225
- opacity: 0.5;
226
- filter: grayscale(0.5);
227
- }
228
- }
229
-
230
- // ===== 减淡模式 (Dimmed Mode) =====
231
- // 平常以无色彩的默认形态展示,hover / 激活时显示主题色
232
- @include when(dimmed) {
233
- &:not(.is-dragover) {
234
- .cp-upload__dragger:not(:hover) {
235
- border-color: var(--cp-border);
236
- box-shadow: none;
237
- background: var(--cp-upload-bg);
238
- }
239
- }
240
-
241
- .cp-upload__card-trigger:not(:hover) {
242
- border-color: var(--cp-border);
243
- color: var(--cp-text-muted);
244
- box-shadow: none;
245
- }
246
-
247
- .cp-upload__item:not(:hover) {
248
- border-color: var(--cp-border);
249
- }
250
-
251
- .cp-upload__card:not(:hover) {
252
- border-color: var(--cp-border);
253
- }
254
- }
255
-
256
-
257
- // ===== 文件列表 =====
258
- @include e(list) {
259
- display: flex;
260
- flex-direction: column;
261
- gap: var(--cp-spacing-xs);
262
- }
263
-
264
- // List 模式为 picture-card 时使用 grid
265
- @include m(list-picture-card) {
266
- .cp-upload__list {
267
- display: flex;
268
- flex-direction: row;
269
- flex-wrap: wrap;
270
- gap: var(--cp-spacing-md);
271
- }
272
-
273
- // 触发器和卡片在同一行
274
- display: inline-flex;
275
- flex-direction: row;
276
- flex-wrap: wrap;
277
- gap: var(--cp-spacing-md);
278
- align-items: flex-start;
279
- }
280
-
281
- // ===== 文件项 (text / picture) =====
282
- @include e(item) {
283
- display: flex;
284
- flex-direction: column;
285
- gap: 2px;
286
- padding: var(--cp-spacing-sm) var(--cp-spacing-md);
287
- border: 1px solid var(--cp-border);
288
- background: var(--cp-bg-elevated);
289
- font-size: var(--cp-font-size-sm);
290
- transition: all 0.25s ease;
291
- position: relative;
292
- clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
293
-
294
- &:hover {
295
- border-color: var(--cp-upload-color);
296
-
297
- .cp-upload__remove {
298
- opacity: 1;
299
- }
300
- }
301
-
302
- &.is-success {
303
- border-color: var(--cp-upload-success-color);
304
- }
305
-
306
- &.is-error {
307
- border-color: var(--cp-color-error);
308
- }
309
- }
310
-
311
- // Picture 模式的行布局
312
- @include e(item--picture) {
313
- flex-direction: row;
314
- align-items: center;
315
- gap: var(--cp-spacing-md);
316
- }
317
-
318
- @include e(item-info) {
319
- display: flex;
320
- align-items: center;
321
- gap: var(--cp-spacing-sm);
322
- flex: 1;
323
- min-width: 0;
324
- }
325
-
326
- @include e(file-icon) {
327
- width: 16px;
328
- height: 16px;
329
- color: var(--cp-text-muted);
330
- flex-shrink: 0;
331
- }
332
-
333
- @include e(file-name) {
334
- flex: 1;
335
- overflow: hidden;
336
- text-overflow: ellipsis;
337
- white-space: nowrap;
338
- color: var(--cp-text-secondary);
339
- }
340
-
341
- @include e(file-size) {
342
- flex-shrink: 0;
343
- color: var(--cp-text-muted);
344
- font-size: var(--cp-font-size-sm);
345
- font-family: var(--cp-font-family-mono);
346
- }
347
-
348
- @include e(status-icon) {
349
- width: 16px;
350
- height: 16px;
351
- flex-shrink: 0;
352
- }
353
-
354
- @include e(status-icon--success) {
355
- color: var(--cp-color-success);
356
- }
357
-
358
- @include e(status-icon--error) {
359
- color: var(--cp-color-error);
360
- }
361
-
362
- @include e(remove) {
363
- display: inline-flex;
364
- align-items: center;
365
- cursor: pointer;
366
- color: var(--cp-text-muted);
367
- opacity: 0;
368
- transition: all 0.2s ease;
369
- flex-shrink: 0;
370
- margin-left: auto;
371
-
372
- svg {
373
- width: 14px;
374
- height: 14px;
375
- }
376
-
377
- &:hover {
378
- color: var(--cp-color-error);
379
- }
380
- }
381
-
382
- @include e(actions) {
383
- display: flex;
384
- align-items: center;
385
- gap: var(--cp-spacing-sm);
386
- flex-shrink: 0;
387
- }
388
-
389
- @include e(progress) {
390
- width: 100%;
391
- }
392
-
393
- @include e(thumbnail) {
394
- flex-shrink: 0;
395
- }
396
-
397
- @include e(file-placeholder) {
398
- display: flex;
399
- align-items: center;
400
- justify-content: center;
401
- width: 48px;
402
- height: 48px;
403
- background: var(--cp-bg-deep);
404
- color: var(--cp-text-muted);
405
-
406
- svg {
407
- width: 24px;
408
- height: 24px;
409
- }
410
- }
411
-
412
- // ===== Picture-card 卡片 =====
413
- @include e(card) {
414
- position: relative;
415
- display: flex;
416
- align-items: center;
417
- justify-content: center;
418
- width: var(--cp-upload-card-width, var(--cp-upload-card-size));
419
- height: var(--cp-upload-card-height, var(--cp-upload-card-size));
420
- border: 1px solid var(--cp-border);
421
- background: var(--cp-bg-elevated);
422
- overflow: hidden;
423
- transition: all 0.3s ease;
424
- clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
425
-
426
- &:hover {
427
- border-color: var(--cp-upload-color);
428
-
429
- .cp-upload__card-actions {
430
- opacity: 1;
431
- }
432
- }
433
-
434
- &.is-success {
435
- border-color: var(--cp-upload-success-color);
436
- }
437
-
438
- &.is-error {
439
- border-color: var(--cp-color-error);
440
- }
441
-
442
- // CpImage 铺满
443
- .cp-image {
444
- position: absolute;
445
- inset: 0;
446
- }
447
- }
448
-
449
- // 单图内联预览:卡片充当触发器
450
- @include e(card--inline) {
451
- cursor: pointer;
452
- }
453
-
454
- @include e(card-file) {
455
- display: flex;
456
- flex-direction: column;
457
- align-items: center;
458
- justify-content: center;
459
- gap: var(--cp-spacing-xs);
460
- color: var(--cp-text-muted);
461
- padding: var(--cp-spacing-sm);
462
-
463
- svg {
464
- width: 32px;
465
- height: 32px;
466
- }
467
-
468
- span {
469
- font-size: 11px;
470
- overflow: hidden;
471
- text-overflow: ellipsis;
472
- white-space: nowrap;
473
- max-width: 100%;
474
- }
475
- }
476
-
477
- @include e(card-progress) {
478
- position: absolute;
479
- inset: 0;
480
- display: flex;
481
- align-items: center;
482
- justify-content: center;
483
- background: color-mix(in srgb, var(--cp-bg-deep) 75%, transparent);
484
- backdrop-filter: blur(2px);
485
- z-index: 2;
486
- }
487
-
488
- @include e(card-actions) {
489
- position: absolute;
490
- inset: 0;
491
- display: flex;
492
- align-items: center;
493
- justify-content: center;
494
- gap: var(--cp-spacing-md);
495
- background: color-mix(in srgb, var(--cp-bg-deep) 70%, transparent);
496
- opacity: 0;
497
- transition: opacity 0.25s ease;
498
- z-index: 3;
499
- }
500
- }
501
-
502
- // ===== 表单集成:label 顶部对齐 =====
503
- .cp-form-item:has(.cp-upload) {
504
- align-items: flex-start;
505
-
506
- > .cp-form-item__label {
507
- padding-top: var(--cp-spacing-sm);
508
- }
509
- }
1
+ // CpUpload 组件样式
2
+ // 赛博朋克/机甲风格
3
+
4
+ @use '../common/var' as *;
5
+ @use '../mixins/mixins' as *;
6
+
7
+ @include b(upload) {
8
+ display: inline-flex;
9
+ flex-direction: column;
10
+ gap: var(--cp-spacing-md);
11
+ width: 100%;
12
+
13
+ // ===== CSS 变量 =====
14
+ --cp-upload-color: var(--cp-color-primary);
15
+ --cp-upload-border-color: var(--cp-border);
16
+ --cp-upload-bg: transparent;
17
+ --cp-upload-card-size: 120px;
18
+ --cp-upload-success-color: var(--cp-color-success);
19
+
20
+ // ===== 颜色类型 =====
21
+ @include m(primary) { --cp-upload-color: var(--cp-color-primary); --cp-upload-border-color: var(--cp-color-primary); }
22
+ @include m(success) { --cp-upload-color: var(--cp-color-success); --cp-upload-border-color: var(--cp-color-success); }
23
+ @include m(warning) { --cp-upload-color: var(--cp-color-warning); --cp-upload-border-color: var(--cp-color-warning); }
24
+ @include m(error) { --cp-upload-color: var(--cp-color-error); --cp-upload-border-color: var(--cp-color-error); }
25
+ @include m(info) { --cp-upload-color: var(--cp-color-info); --cp-upload-border-color: var(--cp-color-info); }
26
+
27
+ // ===== 隐藏 input =====
28
+ @include e(input) {
29
+ display: none;
30
+ }
31
+
32
+ // ===== 触发器 =====
33
+ @include e(trigger) {
34
+ display: inline-flex;
35
+ cursor: pointer;
36
+ }
37
+
38
+ // ===== 拖拽区 =====
39
+ @include e(dragger) {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ width: 100%;
44
+ min-height: 160px;
45
+ padding: var(--cp-spacing-xl);
46
+ border: 2px dashed var(--cp-upload-border-color);
47
+ background: var(--cp-upload-bg);
48
+ transition: all 0.3s ease;
49
+
50
+ // 切角
51
+ clip-path: polygon(12px 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%, 0 12px);
52
+ }
53
+
54
+ // ===== 拖拽区内容 =====
55
+ @include e(drag-content) {
56
+ display: flex;
57
+ flex-direction: column;
58
+ align-items: center;
59
+ gap: var(--cp-spacing-md);
60
+ color: var(--cp-text-muted);
61
+ user-select: none;
62
+ }
63
+
64
+ @include e(drag-icon) {
65
+ width: 48px;
66
+ height: 48px;
67
+ color: var(--cp-text-muted);
68
+ opacity: 0.6;
69
+ transition: all 0.3s ease;
70
+ }
71
+
72
+ @include e(drag-text) {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ gap: 0.25em;
76
+ font-size: var(--cp-font-size-md);
77
+ }
78
+
79
+ // ===== Picture-card 触发卡片 =====
80
+ @include e(card-trigger) {
81
+ display: flex;
82
+ flex-direction: column;
83
+ align-items: center;
84
+ justify-content: center;
85
+ gap: var(--cp-spacing-xs);
86
+ width: var(--cp-upload-card-width, var(--cp-upload-card-size));
87
+ height: var(--cp-upload-card-height, var(--cp-upload-card-size));
88
+ border: 2px dashed var(--cp-upload-border-color);
89
+ background: var(--cp-upload-bg);
90
+ color: var(--cp-text-muted);
91
+ transition: all 0.3s ease;
92
+ clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
93
+
94
+ svg {
95
+ width: 28px;
96
+ height: 28px;
97
+ transition: transform 0.3s ease;
98
+ }
99
+
100
+ &:hover {
101
+ border-color: var(--cp-upload-color);
102
+ color: var(--cp-upload-color);
103
+ box-shadow: inset 0 0 20px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
104
+
105
+ svg {
106
+ transform: scale(1.1);
107
+ }
108
+ }
109
+ }
110
+
111
+ @include e(card-trigger-text) {
112
+ font-size: var(--cp-font-size-sm);
113
+ text-align: center;
114
+ max-width: 100%;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ // ===== 变体 =====
121
+
122
+ // Outline (实线边框)
123
+ @include m(outline) {
124
+ .cp-upload__dragger,
125
+ .cp-upload__card-trigger {
126
+ border-style: solid;
127
+ }
128
+ }
129
+
130
+ // Dashed (虚线边框 - 默认)
131
+ @include m(dashed) {
132
+ .cp-upload__dragger,
133
+ .cp-upload__card-trigger {
134
+ border-style: dashed;
135
+ }
136
+ }
137
+
138
+ // Filled (填充背景)
139
+ @include m(filled) {
140
+ .cp-upload__dragger,
141
+ .cp-upload__card-trigger {
142
+ border-style: solid;
143
+ background: var(--cp-bg-elevated);
144
+ }
145
+ }
146
+
147
+ // Ghost (无边框)
148
+ @include m(ghost) {
149
+ .cp-upload__dragger,
150
+ .cp-upload__card-trigger {
151
+ border-color: transparent;
152
+ background: transparent;
153
+
154
+ &:hover {
155
+ background: var(--cp-state-hover);
156
+ border-color: var(--cp-border);
157
+ }
158
+ }
159
+ }
160
+
161
+ // ===== 形状 =====
162
+ @include m(shape-no-clip) {
163
+ .cp-upload__dragger,
164
+ .cp-upload__card-trigger,
165
+ .cp-upload__card,
166
+ .cp-upload__item {
167
+ clip-path: none;
168
+ border-radius: 0;
169
+ }
170
+ }
171
+
172
+ @include m(shape-round) {
173
+ .cp-upload__dragger,
174
+ .cp-upload__card-trigger,
175
+ .cp-upload__card,
176
+ .cp-upload__item {
177
+ clip-path: none;
178
+ border-radius: var(--cp-radius-lg);
179
+ }
180
+ }
181
+
182
+ // ===== 拖拽 hover =====
183
+ @include when(dragover) {
184
+ .cp-upload__dragger {
185
+ border-color: var(--cp-upload-color);
186
+ box-shadow: inset 0 0 30px color-mix(in srgb, var(--cp-upload-color), transparent 70%), 0 0 15px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
187
+ background: color-mix(in srgb, var(--cp-upload-color), transparent 95%);
188
+ }
189
+
190
+ .cp-upload__card-trigger {
191
+ border-color: var(--cp-upload-color);
192
+ color: var(--cp-upload-color);
193
+ box-shadow: inset 0 0 20px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
194
+
195
+ svg {
196
+ transform: scale(1.1);
197
+ }
198
+ }
199
+
200
+ .cp-upload__drag-icon {
201
+ color: var(--cp-upload-color);
202
+ opacity: 1;
203
+ transform: translateY(-4px);
204
+ }
205
+ }
206
+
207
+ // ===== Hover 和 Focus =====
208
+ &:not(.is-disabled) {
209
+ .cp-upload__dragger:hover {
210
+ border-color: var(--cp-upload-color);
211
+ box-shadow: inset 0 0 15px color-mix(in srgb, var(--cp-upload-color), transparent 80%);
212
+ }
213
+
214
+ .cp-upload__dragger:hover .cp-upload__drag-icon {
215
+ color: var(--cp-upload-color);
216
+ opacity: 0.8;
217
+ }
218
+ }
219
+
220
+ // ===== 禁用 =====
221
+ @include when(disabled) {
222
+ .cp-upload__trigger,
223
+ .cp-upload__dragger {
224
+ cursor: not-allowed;
225
+ opacity: 0.5;
226
+ filter: grayscale(0.5);
227
+ }
228
+ }
229
+
230
+ // ===== 减淡模式 (Dimmed Mode) =====
231
+ // 平常以无色彩的默认形态展示,hover / 激活时显示主题色
232
+ @include when(dimmed) {
233
+ &:not(.is-dragover) {
234
+ .cp-upload__dragger:not(:hover) {
235
+ border-color: var(--cp-border);
236
+ box-shadow: none;
237
+ background: var(--cp-upload-bg);
238
+ }
239
+ }
240
+
241
+ .cp-upload__card-trigger:not(:hover) {
242
+ border-color: var(--cp-border);
243
+ color: var(--cp-text-muted);
244
+ box-shadow: none;
245
+ }
246
+
247
+ .cp-upload__item:not(:hover) {
248
+ border-color: var(--cp-border);
249
+ }
250
+
251
+ .cp-upload__card:not(:hover) {
252
+ border-color: var(--cp-border);
253
+ }
254
+ }
255
+
256
+
257
+ // ===== 文件列表 =====
258
+ @include e(list) {
259
+ display: flex;
260
+ flex-direction: column;
261
+ gap: var(--cp-spacing-xs);
262
+ }
263
+
264
+ // List 模式为 picture-card 时使用 grid
265
+ @include m(list-picture-card) {
266
+ .cp-upload__list {
267
+ display: flex;
268
+ flex-direction: row;
269
+ flex-wrap: wrap;
270
+ gap: var(--cp-spacing-md);
271
+ }
272
+
273
+ // 触发器和卡片在同一行
274
+ display: inline-flex;
275
+ flex-direction: row;
276
+ flex-wrap: wrap;
277
+ gap: var(--cp-spacing-md);
278
+ align-items: flex-start;
279
+ }
280
+
281
+ // ===== 文件项 (text / picture) =====
282
+ @include e(item) {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: 2px;
286
+ padding: var(--cp-spacing-sm) var(--cp-spacing-md);
287
+ border: 1px solid var(--cp-border);
288
+ background: var(--cp-bg-elevated);
289
+ font-size: var(--cp-font-size-sm);
290
+ transition: all 0.25s ease;
291
+ position: relative;
292
+ clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
293
+
294
+ &:hover {
295
+ border-color: var(--cp-upload-color);
296
+
297
+ .cp-upload__remove {
298
+ opacity: 1;
299
+ }
300
+ }
301
+
302
+ &.is-success {
303
+ border-color: var(--cp-upload-success-color);
304
+ }
305
+
306
+ &.is-error {
307
+ border-color: var(--cp-color-error);
308
+ }
309
+ }
310
+
311
+ // Picture 模式的行布局
312
+ @include e(item--picture) {
313
+ flex-direction: row;
314
+ align-items: center;
315
+ gap: var(--cp-spacing-md);
316
+ }
317
+
318
+ @include e(item-info) {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: var(--cp-spacing-sm);
322
+ flex: 1;
323
+ min-width: 0;
324
+ }
325
+
326
+ @include e(file-icon) {
327
+ width: 16px;
328
+ height: 16px;
329
+ color: var(--cp-text-muted);
330
+ flex-shrink: 0;
331
+ }
332
+
333
+ @include e(file-name) {
334
+ flex: 1;
335
+ overflow: hidden;
336
+ text-overflow: ellipsis;
337
+ white-space: nowrap;
338
+ color: var(--cp-text-secondary);
339
+ }
340
+
341
+ @include e(file-size) {
342
+ flex-shrink: 0;
343
+ color: var(--cp-text-muted);
344
+ font-size: var(--cp-font-size-sm);
345
+ font-family: var(--cp-font-family-mono);
346
+ }
347
+
348
+ @include e(status-icon) {
349
+ width: 16px;
350
+ height: 16px;
351
+ flex-shrink: 0;
352
+ }
353
+
354
+ @include e(status-icon--success) {
355
+ color: var(--cp-color-success);
356
+ }
357
+
358
+ @include e(status-icon--error) {
359
+ color: var(--cp-color-error);
360
+ }
361
+
362
+ @include e(remove) {
363
+ display: inline-flex;
364
+ align-items: center;
365
+ cursor: pointer;
366
+ color: var(--cp-text-muted);
367
+ opacity: 0;
368
+ transition: all 0.2s ease;
369
+ flex-shrink: 0;
370
+ margin-left: auto;
371
+
372
+ svg {
373
+ width: 14px;
374
+ height: 14px;
375
+ }
376
+
377
+ &:hover {
378
+ color: var(--cp-color-error);
379
+ }
380
+ }
381
+
382
+ @include e(actions) {
383
+ display: flex;
384
+ align-items: center;
385
+ gap: var(--cp-spacing-sm);
386
+ flex-shrink: 0;
387
+ }
388
+
389
+ @include e(progress) {
390
+ width: 100%;
391
+ }
392
+
393
+ @include e(thumbnail) {
394
+ flex-shrink: 0;
395
+ }
396
+
397
+ @include e(file-placeholder) {
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: center;
401
+ width: 48px;
402
+ height: 48px;
403
+ background: var(--cp-bg-deep);
404
+ color: var(--cp-text-muted);
405
+
406
+ svg {
407
+ width: 24px;
408
+ height: 24px;
409
+ }
410
+ }
411
+
412
+ // ===== Picture-card 卡片 =====
413
+ @include e(card) {
414
+ position: relative;
415
+ display: flex;
416
+ align-items: center;
417
+ justify-content: center;
418
+ width: var(--cp-upload-card-width, var(--cp-upload-card-size));
419
+ height: var(--cp-upload-card-height, var(--cp-upload-card-size));
420
+ border: 1px solid var(--cp-border);
421
+ background: var(--cp-bg-elevated);
422
+ overflow: hidden;
423
+ transition: all 0.3s ease;
424
+ clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
425
+
426
+ &:hover {
427
+ border-color: var(--cp-upload-color);
428
+
429
+ .cp-upload__card-actions {
430
+ opacity: 1;
431
+ }
432
+ }
433
+
434
+ &.is-success {
435
+ border-color: var(--cp-upload-success-color);
436
+ }
437
+
438
+ &.is-error {
439
+ border-color: var(--cp-color-error);
440
+ }
441
+
442
+ // CpImage 铺满
443
+ .cp-image {
444
+ position: absolute;
445
+ inset: 0;
446
+ }
447
+ }
448
+
449
+ // 单图内联预览:卡片充当触发器
450
+ @include e(card--inline) {
451
+ cursor: pointer;
452
+ }
453
+
454
+ @include e(card-file) {
455
+ display: flex;
456
+ flex-direction: column;
457
+ align-items: center;
458
+ justify-content: center;
459
+ gap: var(--cp-spacing-xs);
460
+ color: var(--cp-text-muted);
461
+ padding: var(--cp-spacing-sm);
462
+
463
+ svg {
464
+ width: 32px;
465
+ height: 32px;
466
+ }
467
+
468
+ span {
469
+ font-size: 11px;
470
+ overflow: hidden;
471
+ text-overflow: ellipsis;
472
+ white-space: nowrap;
473
+ max-width: 100%;
474
+ }
475
+ }
476
+
477
+ @include e(card-progress) {
478
+ position: absolute;
479
+ inset: 0;
480
+ display: flex;
481
+ align-items: center;
482
+ justify-content: center;
483
+ background: color-mix(in srgb, var(--cp-bg-deep) 75%, transparent);
484
+ backdrop-filter: blur(2px);
485
+ z-index: 2;
486
+ }
487
+
488
+ @include e(card-actions) {
489
+ position: absolute;
490
+ inset: 0;
491
+ display: flex;
492
+ align-items: center;
493
+ justify-content: center;
494
+ gap: var(--cp-spacing-md);
495
+ background: color-mix(in srgb, var(--cp-bg-deep) 70%, transparent);
496
+ opacity: 0;
497
+ transition: opacity 0.25s ease;
498
+ z-index: 3;
499
+ }
500
+ }
501
+
502
+ // ===== 表单集成:label 顶部对齐 =====
503
+ .cp-form-item:has(.cp-upload) {
504
+ align-items: flex-start;
505
+
506
+ > .cp-form-item__label {
507
+ padding-top: var(--cp-spacing-sm);
508
+ }
509
+ }