cardbuddy 0.7.0 → 0.9.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.
Files changed (36) hide show
  1. package/README.md +21 -0
  2. package/dist/cli.js +5 -0
  3. package/dist/preview-editor/assets/index-CrcrVs4F.css +1 -0
  4. package/dist/preview-editor/assets/index-DnpHHKWl.js +80 -0
  5. package/dist/preview-editor/index.html +2 -2
  6. package/dist/server-core/codeBridge.js +359 -0
  7. package/dist/server-core/index.js +27 -2
  8. package/dist/server-core/logStream.js +275 -0
  9. package/dist/standalone.js +33 -6
  10. package/dist/vendored/App.vue +28 -19
  11. package/dist/vendored/ansi.js +185 -0
  12. package/dist/vendored/api.js +164 -28
  13. package/dist/vendored/components/ApiCallPanel.vue +13 -1
  14. package/dist/vendored/components/ApiPayloadTree.vue +34 -1
  15. package/dist/vendored/components/CardGallery.vue +2 -2
  16. package/dist/vendored/components/ComponentPalette.vue +46 -39
  17. package/dist/vendored/components/ConfirmDialog.vue +2 -2
  18. package/dist/vendored/components/DebugPanel.vue +420 -69
  19. package/dist/vendored/components/EventEditor.vue +29 -3
  20. package/dist/vendored/components/LogValue.vue +2 -1
  21. package/dist/vendored/components/NodeInspector.vue +1 -1
  22. package/dist/vendored/components/PropControl.vue +6 -2
  23. package/dist/vendored/components/RemotePreview.vue +3 -1
  24. package/dist/vendored/components/StructureTree.vue +2 -0
  25. package/dist/vendored/components/setters/SetCode.vue +111 -3
  26. package/dist/vendored/styles/app.css +529 -96
  27. package/dist/vendored/styles/card-gallery.css +4 -11
  28. package/dist/vendored/styles/card-select.css +0 -15
  29. package/dist/vendored/styles/dropdown.css +3 -15
  30. package/dist/vendored/styles/json-tree.css +1 -1
  31. package/dist/vendored/styles/node-inspector.css +204 -131
  32. package/dist/vendored/styles/setters.css +91 -2
  33. package/dist/vendored/styles/structure-tree.css +27 -12
  34. package/package.json +1 -1
  35. package/dist/preview-editor/assets/index-BlscexDE.js +0 -79
  36. package/dist/preview-editor/assets/index-dlbSPb5W.css +0 -1
@@ -10,8 +10,9 @@
10
10
  display: flex;
11
11
  align-items: center;
12
12
  justify-content: center;
13
- /* 遮罩完全透明:不遮挡预览区,仅面板自身浮于其上 */
14
- background: transparent;
13
+ /* 半透明遮罩:与确认框 / 组件面板等全局模态统一(--scrim-modal + 轻 blur) */
14
+ background: var(--scrim-modal);
15
+ backdrop-filter: blur(var(--scrim-modal-blur));
15
16
  }
16
17
 
17
18
  .ni-panel {
@@ -33,28 +34,28 @@
33
34
  display: flex;
34
35
  align-items: center;
35
36
  justify-content: space-between;
36
- padding: 12px 16px;
37
+ padding: 10px 16px;
37
38
  border-bottom: 1px solid var(--border);
38
39
  flex-shrink: 0;
39
40
  }
40
41
 
41
42
  .ni-title {
42
- font-size: 16px;
43
+ font-size: 13px;
43
44
  font-weight: 600;
44
45
  color: var(--text);
45
46
  }
46
47
 
47
48
  .ni-close {
48
- width: var(--ctrl-sm);
49
- height: var(--ctrl-sm);
49
+ width: 22px;
50
+ height: 22px;
50
51
  display: inline-flex;
51
52
  align-items: center;
52
53
  justify-content: center;
53
- background: var(--bg-input);
54
- border: 1px solid var(--border-strong);
54
+ background: none;
55
+ border: none;
55
56
  border-radius: 6px;
56
- color: var(--text-dim);
57
- font-size: 18px;
57
+ color: var(--text-faint);
58
+ font-size: 15px;
58
59
  cursor: pointer;
59
60
  line-height: 1;
60
61
  transition: background 0.15s, color 0.15s;
@@ -87,8 +88,8 @@
87
88
  min-height: 0;
88
89
  overflow-y: auto;
89
90
  /* 仅给内容留 16px 横向间距,滚动条(右侧)紧贴面板边缘;
90
- 底部 76px 预留给悬浮的 .ni-foot,避免内容被遮挡 */
91
- padding: 0 16px 76px;
91
+ 底栏已改普通贴底 flex 行(不再悬浮),留 12px 收尾呼吸即可 */
92
+ padding: 0 16px 12px;
92
93
  }
93
94
 
94
95
  .ni-body > .ni-sec {
@@ -103,7 +104,7 @@
103
104
  display: flex;
104
105
  align-items: center;
105
106
  gap: 8px;
106
- font-size: 14px;
107
+ font-size: 13px;
107
108
  font-weight: 600;
108
109
  color: var(--text);
109
110
  margin-bottom: 12px;
@@ -199,7 +200,7 @@ select.ni-input {
199
200
  border: 1px solid var(--border);
200
201
  border-radius: 8px;
201
202
  margin-bottom: 8px;
202
- background: var(--bg-panel);
203
+ background: transparent;
203
204
  }
204
205
 
205
206
  .ni-prop-label {
@@ -291,7 +292,8 @@ select.ni-input {
291
292
  font-size: 12px;
292
293
  padding: 6px 10px;
293
294
  border-radius: 6px;
294
- background: var(--bg-input);
295
+ background: transparent;
296
+ border: 1px solid var(--border);
295
297
  }
296
298
 
297
299
  .ni-key {
@@ -314,7 +316,7 @@ select.ni-input {
314
316
  margin-left: auto;
315
317
  font-size: 12px;
316
318
  padding: 2px 8px;
317
- background: var(--bg-soft);
319
+ background: var(--accent-soft);
318
320
  border-radius: 4px;
319
321
  color: var(--accent);
320
322
  }
@@ -325,7 +327,7 @@ select.ni-input {
325
327
  padding: 0 10px;
326
328
  font-size: 12px;
327
329
  border: 1px solid var(--border-strong);
328
- background: var(--bg-input);
330
+ background: transparent;
329
331
  color: var(--text-dim);
330
332
  border-radius: 6px;
331
333
  cursor: pointer;
@@ -362,8 +364,9 @@ select.ni-input {
362
364
  align-items: center;
363
365
  gap: 8px;
364
366
  padding: 7px 10px;
365
- background: var(--bg-input);
366
- border-radius: 7px;
367
+ background: transparent;
368
+ border: 1px solid var(--border);
369
+ border-radius: 6px;
367
370
  }
368
371
 
369
372
  .ni-event-name {
@@ -388,9 +391,9 @@ select.ni-input {
388
391
  display: flex;
389
392
  align-items: center;
390
393
  gap: 8px;
391
- padding: 8px 10px;
394
+ padding: 6px 8px;
392
395
  border-radius: 6px;
393
- background: var(--bg-input);
396
+ background: transparent;
394
397
  cursor: pointer;
395
398
  user-select: none;
396
399
  transition: background 0.15s;
@@ -403,7 +406,7 @@ select.ni-input {
403
406
  .ptree__group-name {
404
407
  flex: 1 1 auto;
405
408
  min-width: 0;
406
- font-size: 13px;
409
+ font-size: 12px;
407
410
  font-weight: 600;
408
411
  color: var(--text);
409
412
  white-space: nowrap;
@@ -452,9 +455,10 @@ select.ni-input {
452
455
  }
453
456
 
454
457
  .ptree__label {
455
- flex: 0 0 96px;
458
+ flex: 0 0 88px;
456
459
  font-size: 12px;
457
460
  color: var(--text-dim);
461
+ text-align: right;
458
462
  white-space: nowrap;
459
463
  overflow: hidden;
460
464
  text-overflow: ellipsis;
@@ -465,21 +469,16 @@ select.ni-input {
465
469
  min-width: 0;
466
470
  }
467
471
 
468
- /* 底部:悬浮操作条,不占布局高度(内容可滚到其下方) */
472
+ /* 底栏:普通 flex 行贴底,发丝线分隔,不叠悬浮阴影(与事件抽屉 .ee-foot 统一) */
469
473
  .ni-foot {
470
- position: absolute;
471
- left: 0;
472
- right: 0;
473
- bottom: 0;
474
- z-index: 1;
474
+ flex: 0 0 auto;
475
475
  display: flex;
476
476
  align-items: center;
477
477
  justify-content: space-between;
478
478
  gap: 10px;
479
- padding: 12px 16px;
480
- background: var(--bg-panel);
479
+ padding: 10px 16px;
480
+ background: var(--bg-bar);
481
481
  border-top: 1px solid var(--border);
482
- box-shadow: 0 -8px 24px var(--shadow-card);
483
482
  }
484
483
 
485
484
  .ni-tip {
@@ -497,30 +496,29 @@ select.ni-input {
497
496
  .ni-btn {
498
497
  white-space: nowrap;
499
498
  height: var(--ctrl-sm);
500
- padding: 0 16px;
501
- font-size: 13px;
499
+ padding: 0 14px;
500
+ font-size: 12px;
502
501
  border-radius: 6px;
503
- border: 1px solid var(--accent);
504
- background: var(--accent);
505
- color: var(--on-accent);
502
+ border: 1px solid var(--accent-border);
503
+ background: transparent;
504
+ color: var(--accent);
506
505
  cursor: pointer;
507
- transition: opacity 0.15s;
506
+ transition: background 0.15s, color 0.15s;
508
507
  }
509
508
 
510
509
  .ni-btn:hover {
511
- opacity: 0.92;
510
+ background: var(--accent-soft);
512
511
  }
513
512
 
514
513
  .ni-btn--ghost {
515
514
  background: transparent;
516
- color: var(--text);
515
+ color: var(--text-dim);
517
516
  border-color: var(--border-strong);
518
517
  }
519
518
 
520
519
  .ni-btn--ghost:hover {
521
- border-color: var(--accent);
522
- color: var(--accent);
523
- opacity: 1;
520
+ background: var(--bg-hover);
521
+ color: var(--text);
524
522
  }
525
523
 
526
524
  /* ===================== 事件页签(开关式:事件列表 + 开关 + 动作参数) ===================== */
@@ -535,19 +533,19 @@ select.ni-input {
535
533
  border: 1px solid var(--border);
536
534
  border-radius: 8px;
537
535
  overflow: hidden;
538
- background: var(--bg-panel);
536
+ background: transparent;
539
537
  }
540
538
 
541
539
  .ni-evt-head {
542
540
  display: flex;
543
541
  align-items: center;
544
542
  gap: 10px;
545
- padding: 12px 14px;
543
+ padding: 8px 12px;
546
544
  }
547
545
 
548
546
  .ni-evt-name {
549
547
  flex: 0 0 auto;
550
- font-size: 13px;
548
+ font-size: 12px;
551
549
  font-weight: 500;
552
550
  color: var(--text);
553
551
  white-space: nowrap;
@@ -563,39 +561,41 @@ select.ni-input {
563
561
  text-overflow: ellipsis;
564
562
  }
565
563
 
566
- /* 开关 */
564
+ /* 开关:与 setter 家族 .st-switch 同语言(发丝线轨道 + soft 开启态),不用实心 accent 填充 */
567
565
  .ni-switch {
568
566
  flex: 0 0 auto;
569
567
  position: relative;
570
- width: 36px;
571
- height: 20px;
568
+ width: 34px;
569
+ height: 18px;
572
570
  padding: 0;
573
571
  margin: 0;
574
- border: none;
575
- border-radius: 10px;
576
- background: var(--border-strong);
572
+ border: 1px solid var(--border-strong);
573
+ border-radius: 999px;
574
+ background: var(--bg-hover);
577
575
  cursor: pointer;
578
- transition: background 0.18s;
576
+ transition: background 0.16s, border-color 0.16s;
579
577
  flex-shrink: 0;
580
578
  }
581
579
 
582
580
  .ni-switch.is-on {
583
- background: var(--accent);
581
+ background: var(--accent-soft);
582
+ border-color: var(--accent-border);
584
583
  }
585
584
 
586
585
  .ni-switch__dot {
587
586
  position: absolute;
588
- top: 2px;
589
- left: 2px;
590
- width: 16px;
591
- height: 16px;
587
+ top: 1px;
588
+ left: 1px;
589
+ width: 14px;
590
+ height: 14px;
592
591
  border-radius: 50%;
593
- background: var(--on-accent);
594
- transition: transform 0.18s;
592
+ background: var(--text-dim);
593
+ transition: transform 0.16s, background 0.16s;
595
594
  }
596
595
 
597
596
  .ni-switch.is-on .ni-switch__dot {
598
597
  transform: translateX(16px);
598
+ background: var(--accent);
599
599
  }
600
600
 
601
601
  .ni-evt-body {
@@ -643,20 +643,18 @@ select.ni-input {
643
643
  }
644
644
 
645
645
  /* ===================== 事件编辑抽屉(EventEditor.vue,右侧滑出) ===================== */
646
- /* 100vh × calc(100vw - 预览面板宽度);上下排布,上方事件开关列表 + 下方动作/脚本编辑区;
647
- 抽屉主体不产生滚动条,脚本编辑区填满剩余高度。 */
646
+ /* 100vh × calc(100vw - 预览面板宽度);上下排布:顶部事件 chip 行 + 动作/脚本编辑区;
647
+ 抽屉主体不产生滚动条,脚本编辑区填满剩余高度。轻 chrome:事件列表为顶部可换行
648
+ 内联事件项行(不单独占列),底栏发丝线不叠阴影;仅抽屉最外层保留投影区分层级。 */
648
649
 
649
650
  .ee-overlay {
650
651
  position: fixed;
651
- top: 0;
652
- right: 0;
653
- bottom: 0;
654
- /* 左缘 = 当前预览面板宽度(由 App 根节点注入的 --preview-width 实时驱动),
655
- 不再写死 375px;面板宽度随之 = 100vw − 预览面板宽度,随分隔条拖拽动态变化 */
656
- left: var(--preview-width, 375px);
652
+ inset: 0;
657
653
  z-index: var(--z-appmodal);
658
- /* 透明:手机区(左侧预览面板)保持可见且可交互,不遮罩 */
659
- background: transparent;
654
+ /* 半透明遮罩:与确认框 / 组件面板等全局模态统一(--scrim-modal + 轻 blur);
655
+ 抽屉主体仍右缘贴边满高 */
656
+ background: var(--scrim-modal);
657
+ backdrop-filter: blur(var(--scrim-modal-blur));
660
658
  }
661
659
 
662
660
  /* 抽屉主体:右侧贴边、满高、宽度 = 视口减去手机宽度 */
@@ -676,13 +674,29 @@ select.ni-input {
676
674
  overflow: hidden;
677
675
  }
678
676
 
679
- /* 从右往左滑入/滑出(DebugPanel 中 <Transition name="ee-drawer"> 驱动) */
677
+ /* 进出场动画(DebugPanel 中 <Transition name="ee-drawer"> 驱动):
678
+ 遮罩只做淡入/淡出,抽屉主体单独从右往左滑入/滑出——全屏遮罩不应跟随主体平移。
679
+ 离场遮罩淡出与主体滑动同长(0.26s),保证滑动过程可见;入场遮罩淡入稍快。 */
680
680
  .ee-drawer-enter-active,
681
681
  .ee-drawer-leave-active {
682
- transition: transform 0.26s cubic-bezier(0.22, 0.61, 0.36, 1);
682
+ transition: opacity 0.18s ease;
683
+ }
684
+ .ee-drawer-leave-active {
685
+ transition: opacity 0.24s ease;
686
+ }
687
+ /* 主体滑入带一点弹性(过冲后回稳);滑出干脆不回弹 */
688
+ .ee-drawer-enter-active .ee-panel {
689
+ transition: transform 0.34s cubic-bezier(0.32, 1.32, 0.45, 1);
690
+ }
691
+ .ee-drawer-leave-active .ee-panel {
692
+ transition: transform 0.24s cubic-bezier(0.4, 0, 0.6, 1);
683
693
  }
684
694
  .ee-drawer-enter-from,
685
695
  .ee-drawer-leave-to {
696
+ opacity: 0;
697
+ }
698
+ .ee-drawer-enter-from .ee-panel,
699
+ .ee-drawer-leave-to .ee-panel {
686
700
  transform: translateX(100%);
687
701
  }
688
702
 
@@ -690,13 +704,13 @@ select.ni-input {
690
704
  display: flex;
691
705
  align-items: center;
692
706
  justify-content: space-between;
693
- padding: 12px 20px;
707
+ padding: 10px 16px;
694
708
  border-bottom: 1px solid var(--border);
695
709
  flex-shrink: 0;
696
710
  }
697
711
 
698
712
  .ee-title {
699
- font-size: 16px;
713
+ font-size: 13px;
700
714
  font-weight: 600;
701
715
  color: var(--text);
702
716
  }
@@ -714,11 +728,11 @@ select.ni-input {
714
728
  display: inline-flex;
715
729
  align-items: center;
716
730
  justify-content: center;
717
- background: var(--bg-input);
718
- border: 1px solid var(--border-strong);
731
+ background: none;
732
+ border: none;
719
733
  border-radius: 6px;
720
- color: var(--text-dim);
721
- font-size: 18px;
734
+ color: var(--text-faint);
735
+ font-size: 15px;
722
736
  cursor: pointer;
723
737
  line-height: 1;
724
738
  transition: background 0.15s, color 0.15s;
@@ -727,7 +741,7 @@ select.ni-input {
727
741
  .ee-close::before { content: '✕'; }
728
742
  .ee-close:hover { background: var(--bg-hover); color: var(--text); }
729
743
 
730
- /* 主体:上事件开关列表 + 下动作/脚本编辑区,纵向上下排布,不滚动 */
744
+ /* 主体:上事件 chip 行 + 下动作/脚本编辑区,纵向排布 */
731
745
  .ee-body {
732
746
  flex: 1 1 auto;
733
747
  min-height: 0;
@@ -736,61 +750,80 @@ select.ni-input {
736
750
  overflow: hidden;
737
751
  }
738
752
 
739
- /* 上方事件开关列表:有界高度(最多约 40%),内部独立滚动,不再单列占宽 */
753
+ /* 顶部事件条:左事件项、右帮助图标,两端对齐 + 垂直居中;
754
+ 事件过多的滚动交给 .ee-evt-list 自身,side 不滚动(避免裁切帮助弹层) */
740
755
  .ee-side {
756
+ position: relative;
741
757
  flex: 0 0 auto;
742
- max-height: 40%;
743
758
  min-width: 0;
744
759
  display: flex;
745
- flex-direction: column;
760
+ align-items: center;
761
+ justify-content: space-between;
762
+ gap: 10px;
746
763
  border-bottom: 1px solid var(--border);
747
- overflow-y: auto;
748
- padding: 12px 16px;
749
- line-height: 28px;
764
+ padding: 8px 16px;
765
+ }
766
+
767
+ .ee-side > .ee-empty {
768
+ flex: 1 1 auto;
750
769
  }
751
770
 
752
771
  .ee-evt-list {
772
+ flex: 1 1 auto;
773
+ min-width: 0;
753
774
  display: flex;
754
- flex-direction: column;
755
- gap: 4px;
775
+ flex-wrap: wrap;
776
+ gap: 2px 8px;
777
+ /* 约三行高度封顶,超出内部滚动 */
778
+ max-height: 108px;
779
+ overflow-y: auto;
756
780
  }
757
781
 
782
+ /* 事件项:内联字段组(名称 + 开关),不是按钮——无描边无胶囊,仅靠文字色与浅底表达状态:
783
+ 关闭 = 弱色名称;开启 = 常色名称;正在编辑 = 浅底 + accent 名称 */
758
784
  .ee-evt {
759
785
  display: flex;
760
786
  align-items: center;
761
- gap: 10px;
762
- height: var(--ctrl-lg);
763
- padding: 0 12px;
764
- border: 1px solid var(--border);
765
- border-radius: 8px;
766
- background: var(--bg-input);
787
+ gap: 6px;
788
+ height: 24px;
789
+ padding: 0 8px 0 6px;
790
+ border: none;
791
+ border-radius: 6px;
792
+ background: transparent;
767
793
  cursor: pointer;
768
- transition: background 0.15s, border-color 0.15s;
794
+ transition: background 0.15s;
769
795
  }
770
796
 
771
797
  .ee-evt:hover {
772
798
  background: var(--bg-hover);
773
799
  }
774
-
800
+ .ee-evt.is-on .ee-evt-name {
801
+ color: var(--text);
802
+ }
803
+ .ee-evt.is-sel {
804
+ background: var(--bg-input);
805
+ }
806
+ .ee-evt.is-sel .ee-evt-name {
807
+ color: var(--accent);
808
+ }
775
809
  .ee-evt-name {
776
810
  flex: 1 1 auto;
777
811
  min-width: 0;
778
- font-size: 13px;
812
+ font-size: 12px;
779
813
  font-weight: 500;
780
- color: var(--text);
814
+ color: var(--text-faint);
781
815
  white-space: nowrap;
782
816
  overflow: hidden;
783
817
  text-overflow: ellipsis;
784
818
  }
785
819
 
786
- /* 下方详情区:填满剩余高度,底部 76px 预留给悬浮的 .ee-foot */
820
+ /* 右侧详情区:填满剩余高度;底栏为普通 flex 行,无需预留悬浮高度 */
787
821
  .ee-detail {
788
822
  flex: 1 1 auto;
789
823
  min-width: 0;
790
824
  display: flex;
791
825
  flex-direction: column;
792
- /* 底部 76px 预留给悬浮的 .ee-foot,避免详情最末内容被遮挡 */
793
- padding: 16px 24px 76px;
826
+ padding: 12px 16px;
794
827
  overflow: hidden;
795
828
  }
796
829
 
@@ -803,7 +836,7 @@ select.ni-input {
803
836
  min-height: 0;
804
837
  display: flex;
805
838
  flex-direction: column;
806
- margin-top: 10px;
839
+ margin-top: 8px;
807
840
  overflow: hidden;
808
841
  }
809
842
 
@@ -820,6 +853,11 @@ select.ni-input {
820
853
  flex: 1 1 auto;
821
854
  min-height: 0;
822
855
  }
856
+ /* 代码行语义已由上文(动作类型 / 描述)说明,去掉独占的 label 列把整宽还给编辑器;
857
+ 语言改由编辑器右上角 JS 标签标示 */
858
+ .ee-detail-body .ptree__row--block .ptree__label {
859
+ display: none;
860
+ }
823
861
  .ee-detail-body .st-code {
824
862
  flex: 1 1 auto;
825
863
  min-height: 0;
@@ -875,7 +913,7 @@ select.ni-input {
875
913
  }
876
914
 
877
915
  .ee-field-label {
878
- flex: 0 0 80px;
916
+ flex: 0 0 64px;
879
917
  font-size: 12px;
880
918
  color: var(--text-dim);
881
919
  text-align: right;
@@ -902,23 +940,65 @@ select.ni-input {
902
940
 
903
941
  select.ee-input { height: 32px; }
904
942
 
905
- .ee-evt-desc {
906
- margin: 8px 0 0;
907
- font-size: 11px;
943
+ /* 帮助图标按钮:与事件项同排的纯图标弱按钮 */
944
+ .ee-help {
945
+ flex: 0 0 auto;
946
+ display: inline-flex;
947
+ align-items: center;
948
+ justify-content: center;
949
+ width: 22px;
950
+ height: 22px;
951
+ padding: 0;
952
+ background: none;
953
+ border: none;
954
+ border-radius: 6px;
908
955
  color: var(--text-faint);
909
- line-height: 1.4;
956
+ cursor: pointer;
957
+ transition: color 0.15s, background 0.15s;
958
+ }
959
+ .ee-help:hover {
960
+ color: var(--text);
961
+ background: var(--bg-hover);
962
+ }
963
+ /* 弹层外点击关闭:透明遮罩铺满视口 */
964
+ .ee-help__mask {
965
+ position: fixed;
966
+ inset: 0;
967
+ z-index: 6;
968
+ }
969
+ /* 使用说明弹层:锚定事件条右下角,浮于详情区之上 */
970
+ .ee-help__pop {
971
+ position: absolute;
972
+ top: calc(100% + 4px);
973
+ right: 12px;
974
+ z-index: 7;
975
+ /* 弹层锚定右上帮助图标:弹性缩放自该角生长 */
976
+ transform-origin: top right;
977
+ width: min(340px, 78%);
978
+ padding: 8px 10px;
979
+ border: 1px solid var(--border-strong);
980
+ border-radius: 8px;
981
+ background: var(--bg-panel);
982
+ box-shadow: var(--shadow-3);
983
+ }
984
+ .ee-help__text {
985
+ margin: 0;
986
+ font-size: 11px;
987
+ line-height: 1.6;
988
+ color: var(--text-dim);
989
+ white-space: pre-wrap;
910
990
  }
911
991
 
912
992
  /* 开关 */
913
993
  .ee-switch {
914
994
  flex: 0 0 auto;
915
995
  position: relative;
916
- width: 36px;
917
- height: 20px;
996
+ width: 30px;
997
+ height: 16px;
918
998
  padding: 0;
919
999
  margin: 0;
920
1000
  border: none;
921
- border-radius: 10px;
1001
+ border-radius: 8px;
922
1002
  background: var(--border-strong);
923
1003
  cursor: pointer;
924
1004
  transition: background 0.18s;
@@ -930,14 +1010,14 @@ select.ee-input { height: 32px; }
930
1010
  position: absolute;
931
1011
  top: 2px;
932
1012
  left: 2px;
933
- width: 16px;
934
- height: 16px;
1013
+ width: 12px;
1014
+ height: 12px;
935
1015
  border-radius: 50%;
936
1016
  background: var(--on-accent);
937
1017
  transition: transform 0.18s;
938
1018
  }
939
1019
 
940
- .ee-switch.is-on .ee-switch__dot { transform: translateX(16px); }
1020
+ .ee-switch.is-on .ee-switch__dot { transform: translateX(14px); }
941
1021
 
942
1022
  .ee-evt-orphan {
943
1023
  flex: 0 0 auto;
@@ -946,22 +1026,16 @@ select.ee-input { height: 32px; }
946
1026
  color: var(--warn);
947
1027
  }
948
1028
 
949
- /* 底栏 */
950
- /* 底部:悬浮操作条,不占布局高度(内容可滚到其下方) */
1029
+ /* 底栏:普通 flex 行贴底,发丝线分隔,不用悬浮阴影 */
951
1030
  .ee-foot {
952
- position: absolute;
953
- left: 0;
954
- right: 0;
955
- bottom: 0;
956
- z-index: 1;
1031
+ flex: 0 0 auto;
957
1032
  display: flex;
958
1033
  align-items: center;
959
1034
  justify-content: space-between;
960
1035
  gap: 10px;
961
- padding: 12px 24px;
962
- background: var(--bg-panel);
1036
+ padding: 10px 16px;
1037
+ background: var(--bg-bar);
963
1038
  border-top: 1px solid var(--border);
964
- box-shadow: 0 -8px 24px var(--shadow-card);
965
1039
  }
966
1040
 
967
1041
  .ee-tip {
@@ -979,25 +1053,24 @@ select.ee-input { height: 32px; }
979
1053
  .ee-btn {
980
1054
  white-space: nowrap;
981
1055
  height: var(--ctrl-sm);
982
- padding: 0 16px;
983
- font-size: 13px;
1056
+ padding: 0 14px;
1057
+ font-size: 12px;
984
1058
  border-radius: 6px;
985
- border: 1px solid var(--accent);
986
- background: var(--accent);
987
- color: var(--on-accent);
1059
+ border: 1px solid var(--accent-border);
1060
+ background: transparent;
1061
+ color: var(--accent);
988
1062
  cursor: pointer;
989
- transition: opacity 0.15s;
1063
+ transition: background 0.15s, color 0.15s;
990
1064
  }
991
1065
 
992
- .ee-btn:hover { opacity: 0.92; }
1066
+ .ee-btn:hover { background: var(--accent-soft); }
993
1067
 
994
1068
  .ee-btn--ghost {
995
1069
  background: transparent;
996
- color: var(--text);
1070
+ color: var(--text-dim);
997
1071
  border-color: var(--border-strong);
998
1072
  }
999
1073
 
1000
1074
  .ee-btn--ghost:hover {
1001
1075
  background: var(--bg-hover);
1002
- opacity: 1;
1003
1076
  }