@cyberpunk-vue/theme-chalk 1.12.7 → 1.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,567 +1,568 @@
1
- // CpDropdown 组件样式
2
- // 赛博朋克/机甲风格下拉选择器
3
-
4
- @use '../common/var' as *;
5
- @use '../mixins/mixins' as *;
6
-
7
- // 动画
8
- @keyframes cp-dropdown-fade-in {
9
- from {
10
- opacity: 0;
11
- transform: scaleY(0.8);
12
- }
13
- to {
14
- opacity: 1;
15
- transform: scaleY(1);
16
- }
17
- }
18
-
19
- @keyframes cp-dropdown-fade-out {
20
- from {
21
- opacity: 1;
22
- transform: scaleY(1);
23
- }
24
- to {
25
- opacity: 0;
26
- transform: scaleY(0.8);
27
- }
28
- }
29
-
30
- @include b(dropdown) {
31
- position: relative;
32
- display: inline-flex;
33
- width: var(--cp-dropdown-width, 100%);
34
-
35
- // ===== 触发器 =====
36
- @include e(trigger) {
37
- position: relative;
38
- display: inline-flex;
39
- align-items: center;
40
- width: 100%;
41
- padding: 0 var(--cp-spacing-md);
42
- background: transparent;
43
- border: 1px solid var(--cp-dropdown-inactive-color, var(--cp-border));
44
- color: var(--cp-text-primary);
45
- font-family: var(--cp-font-family-ui);
46
- cursor: pointer;
47
- transition: all 0.2s ease;
48
- outline: none;
49
-
50
- // 机甲风切角 (Top-Left, Bottom-Right)
51
- clip-path: polygon(8px 0,
52
- 100% 0,
53
- 100% calc(100% - 8px),
54
- calc(100% - 8px) 100%,
55
- 0 100%,
56
- 0 8px);
57
-
58
- // 装饰性小方块 (右上角)
59
- &::after {
60
- content: '';
61
- position: absolute;
62
- top: 0;
63
- right: 0;
64
- width: 6px;
65
- height: 6px;
66
- background: var(--cp-border);
67
- opacity: 0.6;
68
- z-index: 2;
69
- transition: all 0.2s ease;
70
- }
71
-
72
- &:hover:not(.is-disabled) {
73
- border-color: var(--cp-color-primary);
74
-
75
- &::after {
76
- background: var(--cp-color-primary);
77
- opacity: 0.8;
78
- }
79
- }
80
-
81
- &:focus:not(.is-disabled) {
82
- border-color: var(--cp-color-primary);
83
- box-shadow: 0 0 10px var(--cp-color-primary-light), inset 0 0 5px var(--cp-color-primary-light);
84
-
85
- &::after {
86
- background: var(--cp-color-primary);
87
- opacity: 1;
88
- box-shadow: 0 0 5px var(--cp-color-primary);
89
- }
90
- }
91
- }
92
-
93
- // ===== 尺寸 =====
94
- @include m(sm) {
95
- .cp-dropdown__trigger {
96
- height: var(--cp-size-sm);
97
- font-size: var(--cp-font-size-sm);
98
- padding: 0 var(--cp-spacing-sm);
99
- clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
100
-
101
- &::after {
102
- width: 5px;
103
- height: 5px;
104
- }
105
- }
106
- }
107
-
108
- @include m(md) {
109
- .cp-dropdown__trigger {
110
- height: var(--cp-size-md);
111
- font-size: var(--cp-font-size-md);
112
- }
113
- }
114
-
115
- @include m(lg) {
116
- .cp-dropdown__trigger {
117
- height: var(--cp-size-lg);
118
- font-size: var(--cp-font-size-lg);
119
- padding: 0 var(--cp-spacing-lg);
120
- clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
121
-
122
- &::after {
123
- width: 8px;
124
- height: 8px;
125
- }
126
- }
127
- }
128
-
129
- // ===== 变体 =====
130
- @include m(outline) {
131
- .cp-dropdown__trigger {
132
- background: transparent;
133
- border-color: var(--cp-dropdown-inactive-color, var(--cp-border));
134
- }
135
- }
136
-
137
- @include m(filled) {
138
- .cp-dropdown__trigger {
139
- background: var(--cp-bg-elevated);
140
- border-color: var(--cp-dropdown-inactive-color, var(--cp-border));
141
-
142
- &:hover:not(.is-disabled) {
143
- background: rgba(var(--cp-color-primary-rgb), 0.05);
144
- }
145
-
146
- &:focus:not(.is-disabled) {
147
- background: color-mix(in srgb, var(--cp-color-primary) 8%, transparent);
148
- }
149
- }
150
- }
151
-
152
- @include m(ghost) {
153
- .cp-dropdown__trigger {
154
- background: transparent;
155
- border-color: transparent;
156
- border-bottom-color: var(--cp-border);
157
- clip-path: none;
158
-
159
- &::after {
160
- display: none;
161
- }
162
-
163
- &:hover:not(.is-disabled) {
164
- border-bottom-color: var(--cp-color-primary);
165
- }
166
-
167
- &:focus:not(.is-disabled) {
168
- border-bottom-color: var(--cp-color-primary);
169
- box-shadow: 0 2px 0 0 var(--cp-color-primary);
170
- }
171
- }
172
- }
173
-
174
- // ===== 形状 =====
175
- @include m(shape-no-clip) {
176
- .cp-dropdown__trigger {
177
- clip-path: none;
178
-
179
- &::after {
180
- display: none;
181
- }
182
- }
183
- }
184
-
185
- @include m(shape-round) {
186
- .cp-dropdown__trigger {
187
- clip-path: none;
188
- border-radius: var(--cp-radius-lg);
189
-
190
- &::after {
191
- display: none;
192
- }
193
- }
194
- }
195
-
196
- // ===== 状态 =====
197
- @include when(disabled) {
198
- .cp-dropdown__trigger {
199
- cursor: not-allowed;
200
- opacity: 0.5;
201
- filter: grayscale(0.5);
202
- }
203
- }
204
-
205
- @include when(active) {
206
- .cp-dropdown__trigger {
207
- border-color: var(--cp-color-primary);
208
- box-shadow: 0 0 10px var(--cp-color-primary-light);
209
-
210
- &::after {
211
- background: var(--cp-color-primary);
212
- opacity: 1;
213
- }
214
- }
215
-
216
- .cp-dropdown__arrow {
217
- color: var(--cp-color-primary);
218
- }
219
- }
220
-
221
- // ===== 自定义颜色 =====
222
- @include when(custom-color) {
223
- .cp-dropdown__trigger {
224
- &:hover:not(.is-disabled) {
225
- border-color: var(--cp-dropdown-custom-color);
226
-
227
- &::after {
228
- background: var(--cp-dropdown-custom-color);
229
- }
230
- }
231
-
232
- &:focus:not(.is-disabled) {
233
- border-color: var(--cp-dropdown-custom-color);
234
- box-shadow: 0 0 10px var(--cp-dropdown-custom-color-light), inset 0 0 5px var(--cp-dropdown-custom-color-light);
235
-
236
- &::after {
237
- background: var(--cp-dropdown-custom-color);
238
- box-shadow: 0 0 5px var(--cp-dropdown-custom-color);
239
- }
240
- }
241
- }
242
-
243
- &.is-active .cp-dropdown__trigger {
244
- border-color: var(--cp-dropdown-custom-color);
245
- box-shadow: 0 0 10px var(--cp-dropdown-custom-color-light);
246
-
247
- &::after {
248
- background: var(--cp-dropdown-custom-color);
249
- }
250
- }
251
-
252
- &.is-active .cp-dropdown__arrow {
253
- color: var(--cp-dropdown-custom-color);
254
- }
255
-
256
- .cp-dropdown__option.is-selected {
257
- color: var(--cp-dropdown-custom-color);
258
-
259
- &::before {
260
- background: var(--cp-dropdown-custom-color);
261
- }
262
- }
263
- }
264
-
265
- // ===== 自定义尺寸 =====
266
- @include when(custom-size) {
267
- .cp-dropdown__trigger {
268
- height: var(--cp-dropdown-height);
269
- }
270
- }
271
-
272
- // ===== 内部元素 =====
273
- @include e(prefix) {
274
- display: inline-flex;
275
- align-items: center;
276
- margin-right: var(--cp-spacing-sm);
277
- color: var(--cp-text-secondary);
278
- font-size: 1.1em;
279
- }
280
-
281
- @include e(inline-input) {
282
- flex: 1;
283
- min-width: 0;
284
- height: 100%;
285
- padding: 0;
286
- background: transparent;
287
- border: none;
288
- color: var(--cp-text-primary);
289
- font-family: inherit;
290
- font-size: inherit;
291
- outline: none;
292
- cursor: pointer;
293
- transition: opacity var(--cp-dropdown-clear-duration, 150ms) ease, transform var(--cp-dropdown-clear-duration, 150ms) ease, letter-spacing var(--cp-dropdown-clear-duration, 150ms) ease;
294
-
295
- &::placeholder {
296
- color: var(--cp-dropdown-placeholder-color, var(--cp-text-muted));
297
- }
298
-
299
- @include when(active) {
300
- cursor: text;
301
- }
302
- }
303
-
304
- @include e(value) {
305
- flex: 1;
306
- overflow: hidden;
307
- text-overflow: ellipsis;
308
- white-space: nowrap;
309
- user-select: none;
310
- transition: opacity var(--cp-dropdown-clear-duration, 150ms) ease, transform var(--cp-dropdown-clear-duration, 150ms) ease, letter-spacing var(--cp-dropdown-clear-duration, 150ms) ease;
311
-
312
- @include when(placeholder) {
313
- color: var(--cp-dropdown-placeholder-color, var(--cp-text-muted));
314
- }
315
- }
316
-
317
- // 清除动画状态
318
- @include when(clearing) {
319
- .cp-dropdown__value,
320
- .cp-dropdown__inline-input {
321
- opacity: 0;
322
- transform: scaleX(0.8);
323
- letter-spacing: -0.5em;
324
- transform-origin: left center;
325
- }
326
- }
327
-
328
- @include e(clear) {
329
- display: inline-flex;
330
- align-items: center;
331
- margin-left: var(--cp-spacing-xs);
332
- color: var(--cp-text-muted);
333
- font-size: 1em;
334
- cursor: pointer;
335
- transition: all 0.2s ease;
336
-
337
- &:hover {
338
- color: var(--cp-text-secondary);
339
- transform: rotate(90deg);
340
- }
341
-
342
- svg {
343
- width: 1em;
344
- height: 1em;
345
- }
346
- }
347
-
348
- @include e(arrow) {
349
- display: inline-flex;
350
- align-items: center;
351
- margin-left: var(--cp-spacing-sm);
352
- color: var(--cp-text-muted);
353
- font-size: 0.9em;
354
- transition: transform 0.2s ease, color 0.2s ease;
355
-
356
- &.is-reverse {
357
- transform: rotate(180deg);
358
- }
359
-
360
- svg {
361
- width: 1.2em;
362
- height: 1.2em;
363
- }
364
- }
365
-
366
- // ===== 弹层 =====
367
- @include e(popper) {
368
- position: absolute;
369
- z-index: 2000;
370
- background: var(--cp-bg-elevated);
371
- border: 1px solid var(--cp-border);
372
- box-shadow:
373
- 0 4px 16px rgba(0, 0, 0, 0.4),
374
- 0 0 1px var(--cp-color-primary),
375
- inset 0 0 20px color-mix(in srgb, var(--cp-color-primary) 3%, transparent);
376
- backdrop-filter: blur(8px);
377
- overflow: visible;
378
-
379
- // 切角样式
380
- clip-path: polygon(
381
- 8px 0, 100% 0,
382
- 100% calc(100% - 8px), calc(100% - 8px) 100%,
383
- 0 100%, 0 8px
384
- );
385
-
386
- // 入场动画
387
- animation: cp-dropdown-fade-in 0.2s ease-out;
388
- transform-origin: top center;
389
-
390
- @include m(top) {
391
- transform-origin: bottom center;
392
- }
393
-
394
- // 标记角 (右上 & 左下)
395
- &::before {
396
- content: '';
397
- position: absolute;
398
- top: 0;
399
- right: 0;
400
- width: 12px;
401
- height: 12px;
402
- border-right: 2px solid var(--cp-color-primary);
403
- border-top: 2px solid var(--cp-color-primary);
404
- opacity: 0.8;
405
- z-index: 1;
406
- }
407
-
408
- &::after {
409
- content: '';
410
- position: absolute;
411
- bottom: 0;
412
- left: 0;
413
- width: 12px;
414
- height: 12px;
415
- border-left: 2px solid var(--cp-color-primary);
416
- border-bottom: 2px solid var(--cp-color-primary);
417
- opacity: 0.8;
418
- z-index: 1;
419
- }
420
-
421
- // 形状变体
422
- &.cp-dropdown--shape-no-clip {
423
- clip-path: none;
424
- }
425
-
426
- &.cp-dropdown--shape-round {
427
- clip-path: none;
428
- border-radius: var(--cp-radius-lg);
429
-
430
- &::before,
431
- &::after {
432
- display: none;
433
- }
434
- }
435
- }
436
-
437
- // ===== 过滤搜索 =====
438
- @include e(filter) {
439
- padding: var(--cp-spacing-sm);
440
- border-bottom: 1px solid var(--cp-border);
441
- }
442
-
443
- @include e(filter-input) {
444
- width: 100%;
445
- padding: var(--cp-spacing-xs) var(--cp-spacing-sm);
446
- background: var(--cp-bg-base);
447
- border: 1px solid var(--cp-border);
448
- color: var(--cp-text-primary);
449
- font-family: inherit;
450
- font-size: var(--cp-font-size-sm);
451
- outline: none;
452
- transition: border-color 0.2s ease;
453
-
454
- &:focus {
455
- border-color: var(--cp-color-primary);
456
- }
457
-
458
- &::placeholder {
459
- color: var(--cp-text-muted);
460
- }
461
- }
462
-
463
- // ===== 选项列表 =====
464
- @include e(options) {
465
- list-style: none;
466
- margin: 0;
467
- padding: var(--cp-spacing-xs) 0;
468
- overflow-y: auto;
469
- max-height: inherit;
470
-
471
- // scrollbar 跟随 primary 颜色变量
472
- scrollbar-width: thin;
473
- scrollbar-color: color-mix(in srgb, var(--cp-color-primary) 40%, transparent) rgba(26, 26, 36, 0.8);
474
-
475
- &::-webkit-scrollbar {
476
- width: 6px;
477
- height: 6px;
478
- }
479
-
480
- &::-webkit-scrollbar-track {
481
- background: rgba(26, 26, 36, 0.8);
482
- }
483
-
484
- &::-webkit-scrollbar-thumb {
485
- background: color-mix(in srgb, var(--cp-color-primary) 40%, transparent);
486
- border-radius: 3px;
487
-
488
- &:hover {
489
- background: color-mix(in srgb, var(--cp-color-primary) 60%, transparent);
490
- }
491
- }
492
- }
493
-
494
- @include e(option) {
495
- position: relative;
496
- display: flex;
497
- align-items: center;
498
- justify-content: space-between;
499
- padding: var(--cp-spacing-sm) var(--cp-spacing-md);
500
- color: var(--cp-text-secondary);
501
- cursor: pointer;
502
- transition: all 0.15s ease;
503
- white-space: nowrap;
504
-
505
- // 左侧装饰线 (选中时)
506
- &::before {
507
- content: '';
508
- position: absolute;
509
- left: 0;
510
- top: 50%;
511
- transform: translateY(-50%);
512
- width: 2px;
513
- height: 60%;
514
- background: transparent;
515
- transition: background 0.15s ease;
516
- }
517
-
518
- &:hover:not(.is-disabled),
519
- &.is-hover:not(.is-disabled) {
520
- background: color-mix(in srgb, var(--cp-color-primary) 8%, transparent);
521
- color: var(--cp-text-primary);
522
- }
523
-
524
- &.is-selected {
525
- color: var(--cp-color-primary);
526
- font-weight: 500;
527
-
528
- &::before {
529
- background: var(--cp-color-primary);
530
- }
531
- }
532
-
533
- &.is-disabled {
534
- color: var(--cp-text-muted);
535
- cursor: not-allowed;
536
- opacity: 0.5;
537
- }
538
- }
539
-
540
- @include e(check) {
541
- display: inline-flex;
542
- align-items: center;
543
- color: var(--cp-color-primary);
544
- font-size: 1em;
545
-
546
- svg {
547
- width: 1em;
548
- height: 1em;
549
- }
550
- }
551
-
552
- @include e(empty) {
553
- padding: var(--cp-spacing-lg) var(--cp-spacing-md);
554
- text-align: center;
555
- color: var(--cp-text-muted);
556
- font-size: var(--cp-font-size-sm);
557
- }
558
- }
559
-
560
- // 过渡动画
561
- .cp-dropdown-fade-enter-active {
562
- animation: cp-dropdown-fade-in 0.2s ease-out;
563
- }
564
-
565
- .cp-dropdown-fade-leave-active {
566
- animation: cp-dropdown-fade-out 0.15s ease-in;
567
- }
1
+ // CpSelect 组件样式
2
+ // 赛博朋克/机甲风格下拉选择器
3
+
4
+ @use '../common/var' as *;
5
+ @use '../mixins/mixins' as *;
6
+
7
+ // 动画
8
+ @keyframes cp-select-fade-in {
9
+ from {
10
+ opacity: 0;
11
+ transform: scaleY(0.8);
12
+ }
13
+ to {
14
+ opacity: 1;
15
+ transform: scaleY(1);
16
+ }
17
+ }
18
+
19
+ @keyframes cp-select-fade-out {
20
+ from {
21
+ opacity: 1;
22
+ transform: scaleY(1);
23
+ }
24
+ to {
25
+ opacity: 0;
26
+ transform: scaleY(0.8);
27
+ }
28
+ }
29
+
30
+ @include b(select) {
31
+ position: relative;
32
+ display: inline-flex;
33
+ width: var(--cp-select-width, 100%);
34
+
35
+ // ===== 触发器 =====
36
+ @include e(trigger) {
37
+ position: relative;
38
+ display: inline-flex;
39
+ align-items: center;
40
+ width: 100%;
41
+ padding: 0 var(--cp-spacing-md);
42
+ background: transparent;
43
+ border: 1px solid var(--cp-select-inactive-color, var(--cp-border));
44
+ color: var(--cp-text-primary);
45
+ font-family: var(--cp-font-family-ui);
46
+ cursor: pointer;
47
+ transition: all 0.2s ease;
48
+ outline: none;
49
+
50
+ // 机甲风切角 (Top-Left, Bottom-Right)
51
+ clip-path: polygon(8px 0,
52
+ 100% 0,
53
+ 100% calc(100% - 8px),
54
+ calc(100% - 8px) 100%,
55
+ 0 100%,
56
+ 0 8px);
57
+
58
+ // 装饰性小方块 (右上角)
59
+ &::after {
60
+ content: '';
61
+ position: absolute;
62
+ top: 0;
63
+ right: 0;
64
+ width: 6px;
65
+ height: 6px;
66
+ background: var(--cp-border);
67
+ opacity: 0.6;
68
+ z-index: 2;
69
+ transition: all 0.2s ease;
70
+ }
71
+
72
+ &:hover:not(.is-disabled) {
73
+ border-color: var(--cp-color-primary);
74
+
75
+ &::after {
76
+ background: var(--cp-color-primary);
77
+ opacity: 0.8;
78
+ }
79
+ }
80
+
81
+ &:focus:not(.is-disabled) {
82
+ border-color: var(--cp-color-primary);
83
+ box-shadow: 0 0 10px var(--cp-color-primary-light), inset 0 0 5px var(--cp-color-primary-light);
84
+
85
+ &::after {
86
+ background: var(--cp-color-primary);
87
+ opacity: 1;
88
+ box-shadow: 0 0 5px var(--cp-color-primary);
89
+ }
90
+ }
91
+ }
92
+
93
+ // ===== 尺寸 =====
94
+ @include m(sm) {
95
+ .cp-select__trigger {
96
+ height: var(--cp-size-sm);
97
+ font-size: var(--cp-font-size-sm);
98
+ padding: 0 var(--cp-spacing-sm);
99
+ clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px);
100
+
101
+ &::after {
102
+ width: 5px;
103
+ height: 5px;
104
+ }
105
+ }
106
+ }
107
+
108
+ @include m(md) {
109
+ .cp-select__trigger {
110
+ height: var(--cp-size-md);
111
+ font-size: var(--cp-font-size-md);
112
+ }
113
+ }
114
+
115
+ @include m(lg) {
116
+ .cp-select__trigger {
117
+ height: var(--cp-size-lg);
118
+ font-size: var(--cp-font-size-lg);
119
+ padding: 0 var(--cp-spacing-lg);
120
+ clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
121
+
122
+ &::after {
123
+ width: 8px;
124
+ height: 8px;
125
+ }
126
+ }
127
+ }
128
+
129
+ // ===== 变体 =====
130
+ @include m(outline) {
131
+ .cp-select__trigger {
132
+ background: transparent;
133
+ border-color: var(--cp-select-inactive-color, var(--cp-border));
134
+ }
135
+ }
136
+
137
+ @include m(filled) {
138
+ .cp-select__trigger {
139
+ background: var(--cp-bg-elevated);
140
+ border-color: var(--cp-select-inactive-color, var(--cp-border));
141
+
142
+ &:hover:not(.is-disabled) {
143
+ background: rgba(var(--cp-color-primary-rgb), 0.05);
144
+ }
145
+
146
+ &:focus:not(.is-disabled) {
147
+ background: color-mix(in srgb, var(--cp-color-primary) 8%, transparent);
148
+ }
149
+ }
150
+ }
151
+
152
+ @include m(ghost) {
153
+ .cp-select__trigger {
154
+ background: transparent;
155
+ border-color: transparent;
156
+ border-bottom-color: var(--cp-border);
157
+ clip-path: none;
158
+
159
+ &::after {
160
+ display: none;
161
+ }
162
+
163
+ &:hover:not(.is-disabled) {
164
+ border-bottom-color: var(--cp-color-primary);
165
+ }
166
+
167
+ &:focus:not(.is-disabled) {
168
+ border-bottom-color: var(--cp-color-primary);
169
+ box-shadow: 0 2px 0 0 var(--cp-color-primary);
170
+ }
171
+ }
172
+ }
173
+
174
+ // ===== 形状 =====
175
+ @include m(shape-no-clip) {
176
+ .cp-select__trigger {
177
+ clip-path: none;
178
+
179
+ &::after {
180
+ display: none;
181
+ }
182
+ }
183
+ }
184
+
185
+ @include m(shape-round) {
186
+ .cp-select__trigger {
187
+ clip-path: none;
188
+ border-radius: var(--cp-radius-lg);
189
+
190
+ &::after {
191
+ display: none;
192
+ }
193
+ }
194
+ }
195
+
196
+ // ===== 状态 =====
197
+ @include when(disabled) {
198
+ .cp-select__trigger {
199
+ cursor: not-allowed;
200
+ opacity: 0.5;
201
+ filter: grayscale(0.5);
202
+ }
203
+ }
204
+
205
+ @include when(active) {
206
+ .cp-select__trigger {
207
+ border-color: var(--cp-color-primary);
208
+ box-shadow: 0 0 10px var(--cp-color-primary-light);
209
+
210
+ &::after {
211
+ background: var(--cp-color-primary);
212
+ opacity: 1;
213
+ }
214
+ }
215
+
216
+ .cp-select__arrow {
217
+ color: var(--cp-color-primary);
218
+ }
219
+ }
220
+
221
+ // ===== 自定义颜色 =====
222
+ @include when(custom-color) {
223
+ .cp-select__trigger {
224
+ &:hover:not(.is-disabled) {
225
+ border-color: var(--cp-select-custom-color);
226
+
227
+ &::after {
228
+ background: var(--cp-select-custom-color);
229
+ }
230
+ }
231
+
232
+ &:focus:not(.is-disabled) {
233
+ border-color: var(--cp-select-custom-color);
234
+ box-shadow: 0 0 10px var(--cp-select-custom-color-light), inset 0 0 5px var(--cp-select-custom-color-light);
235
+
236
+ &::after {
237
+ background: var(--cp-select-custom-color);
238
+ box-shadow: 0 0 5px var(--cp-select-custom-color);
239
+ }
240
+ }
241
+ }
242
+
243
+ &.is-active .cp-select__trigger {
244
+ border-color: var(--cp-select-custom-color);
245
+ box-shadow: 0 0 10px var(--cp-select-custom-color-light);
246
+
247
+ &::after {
248
+ background: var(--cp-select-custom-color);
249
+ }
250
+ }
251
+
252
+ &.is-active .cp-select__arrow {
253
+ color: var(--cp-select-custom-color);
254
+ }
255
+
256
+ .cp-select__option.is-selected {
257
+ color: var(--cp-select-custom-color);
258
+
259
+ &::before {
260
+ background: var(--cp-select-custom-color);
261
+ }
262
+ }
263
+ }
264
+
265
+ // ===== 自定义尺寸 =====
266
+ @include when(custom-size) {
267
+ .cp-select__trigger {
268
+ height: var(--cp-select-height);
269
+ }
270
+ }
271
+
272
+ // ===== 内部元素 =====
273
+ @include e(prefix) {
274
+ display: inline-flex;
275
+ align-items: center;
276
+ margin-right: var(--cp-spacing-sm);
277
+ color: var(--cp-text-secondary);
278
+ font-size: 1.1em;
279
+ }
280
+
281
+ @include e(inline-input) {
282
+ flex: 1;
283
+ min-width: 0;
284
+ height: 100%;
285
+ padding: 0;
286
+ background: transparent;
287
+ border: none;
288
+ color: var(--cp-text-primary);
289
+ font-family: inherit;
290
+ font-size: inherit;
291
+ outline: none;
292
+ cursor: pointer;
293
+ transition: opacity var(--cp-select-clear-duration, 150ms) ease, transform var(--cp-select-clear-duration, 150ms) ease, letter-spacing var(--cp-select-clear-duration, 150ms) ease;
294
+
295
+ &::placeholder {
296
+ color: var(--cp-select-placeholder-color, var(--cp-text-muted));
297
+ }
298
+
299
+ @include when(active) {
300
+ cursor: text;
301
+ }
302
+ }
303
+
304
+ @include e(value) {
305
+ flex: 1;
306
+ overflow: hidden;
307
+ text-overflow: ellipsis;
308
+ white-space: nowrap;
309
+ user-select: none;
310
+ transition: opacity var(--cp-select-clear-duration, 150ms) ease, transform var(--cp-select-clear-duration, 150ms) ease, letter-spacing var(--cp-select-clear-duration, 150ms) ease;
311
+
312
+ @include when(placeholder) {
313
+ color: var(--cp-select-placeholder-color, var(--cp-text-muted));
314
+ }
315
+ }
316
+
317
+ // 清除动画状态
318
+ @include when(clearing) {
319
+ .cp-select__value,
320
+ .cp-select__inline-input {
321
+ opacity: 0;
322
+ transform: scaleX(0.8);
323
+ letter-spacing: -0.5em;
324
+ transform-origin: left center;
325
+ }
326
+ }
327
+
328
+ @include e(clear) {
329
+ display: inline-flex;
330
+ align-items: center;
331
+ margin-left: var(--cp-spacing-xs);
332
+ color: var(--cp-text-muted);
333
+ font-size: 1em;
334
+ cursor: pointer;
335
+ transition: all 0.2s ease;
336
+
337
+ &:hover {
338
+ color: var(--cp-text-secondary);
339
+ transform: rotate(90deg);
340
+ }
341
+
342
+ svg {
343
+ width: 1em;
344
+ height: 1em;
345
+ }
346
+ }
347
+
348
+ @include e(arrow) {
349
+ display: inline-flex;
350
+ align-items: center;
351
+ margin-left: var(--cp-spacing-sm);
352
+ color: var(--cp-text-muted);
353
+ font-size: 0.9em;
354
+ transition: transform 0.2s ease, color 0.2s ease;
355
+
356
+ &.is-reverse {
357
+ transform: rotate(180deg);
358
+ }
359
+
360
+ svg {
361
+ width: 1.2em;
362
+ height: 1.2em;
363
+ }
364
+ }
365
+
366
+ // ===== 弹层 =====
367
+ // position: fixed —— 配合 @floating-ui/dom fixed strategy,避开 transformed ancestor 影响
368
+ @include e(popper) {
369
+ position: fixed;
370
+ z-index: 2000;
371
+ background: var(--cp-bg-elevated);
372
+ border: 1px solid var(--cp-border);
373
+ box-shadow:
374
+ 0 4px 16px rgba(0, 0, 0, 0.4),
375
+ 0 0 1px var(--cp-color-primary),
376
+ inset 0 0 20px color-mix(in srgb, var(--cp-color-primary) 3%, transparent);
377
+ backdrop-filter: blur(8px);
378
+ overflow: visible;
379
+
380
+ // 切角样式
381
+ clip-path: polygon(
382
+ 8px 0, 100% 0,
383
+ 100% calc(100% - 8px), calc(100% - 8px) 100%,
384
+ 0 100%, 0 8px
385
+ );
386
+
387
+ // 入场动画
388
+ animation: cp-select-fade-in 0.2s ease-out;
389
+ transform-origin: top center;
390
+
391
+ @include m(top) {
392
+ transform-origin: bottom center;
393
+ }
394
+
395
+ // 标记角 (右上 & 左下)
396
+ &::before {
397
+ content: '';
398
+ position: absolute;
399
+ top: 0;
400
+ right: 0;
401
+ width: 12px;
402
+ height: 12px;
403
+ border-right: 2px solid var(--cp-color-primary);
404
+ border-top: 2px solid var(--cp-color-primary);
405
+ opacity: 0.8;
406
+ z-index: 1;
407
+ }
408
+
409
+ &::after {
410
+ content: '';
411
+ position: absolute;
412
+ bottom: 0;
413
+ left: 0;
414
+ width: 12px;
415
+ height: 12px;
416
+ border-left: 2px solid var(--cp-color-primary);
417
+ border-bottom: 2px solid var(--cp-color-primary);
418
+ opacity: 0.8;
419
+ z-index: 1;
420
+ }
421
+
422
+ // 形状变体
423
+ &.cp-select--shape-no-clip {
424
+ clip-path: none;
425
+ }
426
+
427
+ &.cp-select--shape-round {
428
+ clip-path: none;
429
+ border-radius: var(--cp-radius-lg);
430
+
431
+ &::before,
432
+ &::after {
433
+ display: none;
434
+ }
435
+ }
436
+ }
437
+
438
+ // ===== 过滤搜索 =====
439
+ @include e(filter) {
440
+ padding: var(--cp-spacing-sm);
441
+ border-bottom: 1px solid var(--cp-border);
442
+ }
443
+
444
+ @include e(filter-input) {
445
+ width: 100%;
446
+ padding: var(--cp-spacing-xs) var(--cp-spacing-sm);
447
+ background: var(--cp-bg-base);
448
+ border: 1px solid var(--cp-border);
449
+ color: var(--cp-text-primary);
450
+ font-family: inherit;
451
+ font-size: var(--cp-font-size-sm);
452
+ outline: none;
453
+ transition: border-color 0.2s ease;
454
+
455
+ &:focus {
456
+ border-color: var(--cp-color-primary);
457
+ }
458
+
459
+ &::placeholder {
460
+ color: var(--cp-text-muted);
461
+ }
462
+ }
463
+
464
+ // ===== 选项列表 =====
465
+ @include e(options) {
466
+ list-style: none;
467
+ margin: 0;
468
+ padding: var(--cp-spacing-xs) 0;
469
+ overflow-y: auto;
470
+ max-height: inherit;
471
+
472
+ // scrollbar 跟随 primary 颜色变量
473
+ scrollbar-width: thin;
474
+ scrollbar-color: color-mix(in srgb, var(--cp-color-primary) 40%, transparent) rgba(26, 26, 36, 0.8);
475
+
476
+ &::-webkit-scrollbar {
477
+ width: 6px;
478
+ height: 6px;
479
+ }
480
+
481
+ &::-webkit-scrollbar-track {
482
+ background: rgba(26, 26, 36, 0.8);
483
+ }
484
+
485
+ &::-webkit-scrollbar-thumb {
486
+ background: color-mix(in srgb, var(--cp-color-primary) 40%, transparent);
487
+ border-radius: 3px;
488
+
489
+ &:hover {
490
+ background: color-mix(in srgb, var(--cp-color-primary) 60%, transparent);
491
+ }
492
+ }
493
+ }
494
+
495
+ @include e(option) {
496
+ position: relative;
497
+ display: flex;
498
+ align-items: center;
499
+ justify-content: space-between;
500
+ padding: var(--cp-spacing-sm) var(--cp-spacing-md);
501
+ color: var(--cp-text-secondary);
502
+ cursor: pointer;
503
+ transition: all 0.15s ease;
504
+ white-space: nowrap;
505
+
506
+ // 左侧装饰线 (选中时)
507
+ &::before {
508
+ content: '';
509
+ position: absolute;
510
+ left: 0;
511
+ top: 50%;
512
+ transform: translateY(-50%);
513
+ width: 2px;
514
+ height: 60%;
515
+ background: transparent;
516
+ transition: background 0.15s ease;
517
+ }
518
+
519
+ &:hover:not(.is-disabled),
520
+ &.is-hover:not(.is-disabled) {
521
+ background: color-mix(in srgb, var(--cp-color-primary) 8%, transparent);
522
+ color: var(--cp-text-primary);
523
+ }
524
+
525
+ &.is-selected {
526
+ color: var(--cp-color-primary);
527
+ font-weight: 500;
528
+
529
+ &::before {
530
+ background: var(--cp-color-primary);
531
+ }
532
+ }
533
+
534
+ &.is-disabled {
535
+ color: var(--cp-text-muted);
536
+ cursor: not-allowed;
537
+ opacity: 0.5;
538
+ }
539
+ }
540
+
541
+ @include e(check) {
542
+ display: inline-flex;
543
+ align-items: center;
544
+ color: var(--cp-color-primary);
545
+ font-size: 1em;
546
+
547
+ svg {
548
+ width: 1em;
549
+ height: 1em;
550
+ }
551
+ }
552
+
553
+ @include e(empty) {
554
+ padding: var(--cp-spacing-lg) var(--cp-spacing-md);
555
+ text-align: center;
556
+ color: var(--cp-text-muted);
557
+ font-size: var(--cp-font-size-sm);
558
+ }
559
+ }
560
+
561
+ // 过渡动画
562
+ .cp-select-fade-enter-active {
563
+ animation: cp-select-fade-in 0.2s ease-out;
564
+ }
565
+
566
+ .cp-select-fade-leave-active {
567
+ animation: cp-select-fade-out 0.15s ease-in;
568
+ }