cardbuddy 0.8.0 → 0.9.1
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.
- package/dist/cli.js +5 -0
- package/dist/preview-editor/assets/index-B9MOriNv.js +80 -0
- package/dist/preview-editor/assets/index-CwD14gm3.css +1 -0
- package/dist/preview-editor/index.html +2 -2
- package/dist/server-core/index.js +19 -0
- package/dist/server-core/logStream.js +275 -0
- package/dist/standalone.js +15 -3
- package/dist/vendored/App.vue +63 -38
- package/dist/vendored/ansi.js +185 -0
- package/dist/vendored/api.js +76 -10
- package/dist/vendored/components/CardGallery.vue +2 -2
- package/dist/vendored/components/ComponentPalette.vue +1 -1
- package/dist/vendored/components/ConfirmDialog.vue +2 -2
- package/dist/vendored/components/DebugPanel.vue +276 -31
- package/dist/vendored/components/EventEditor.vue +2 -0
- package/dist/vendored/components/NodeInspector.vue +1 -1
- package/dist/vendored/components/RemotePreview.vue +3 -1
- package/dist/vendored/components/StructureTree.vue +2 -0
- package/dist/vendored/styles/app.css +245 -49
- package/dist/vendored/styles/card-gallery.css +1 -9
- package/dist/vendored/styles/card-select.css +0 -15
- package/dist/vendored/styles/dropdown.css +0 -15
- package/dist/vendored/styles/json-tree.css +1 -1
- package/dist/vendored/styles/node-inspector.css +28 -12
- package/dist/vendored/styles/structure-tree.css +2 -0
- package/package.json +1 -1
- package/dist/preview-editor/assets/index-BQKzMPBq.js +0 -79
- package/dist/preview-editor/assets/index-D3zp47Dg.css +0 -1
|
@@ -88,6 +88,8 @@
|
|
|
88
88
|
--log-warn-border: rgba(224, 179, 65, 0.35);
|
|
89
89
|
--scroll-thumb: rgba(148, 154, 171, 0.28);
|
|
90
90
|
--scroll-thumb-hover: rgba(148, 154, 171, 0.45);
|
|
91
|
+
/* 静止档:鼠标不在滚动区域时弱化显示 */
|
|
92
|
+
--scroll-thumb-idle: rgba(148, 154, 171, 0.14);
|
|
91
93
|
/* 语法高亮配色(JSON 树 / 结构树 / 代码编辑器),随主题切换;暗色默认=原硬编码值,保证暗色外观不变 */
|
|
92
94
|
--jt-key: #9db4ff;
|
|
93
95
|
--jt-string: #8fe39a;
|
|
@@ -242,6 +244,7 @@
|
|
|
242
244
|
--log-warn-border: rgba(181, 129, 5, 0.3);
|
|
243
245
|
--scroll-thumb: rgba(0, 0, 0, 0.2);
|
|
244
246
|
--scroll-thumb-hover: rgba(0, 0, 0, 0.32);
|
|
247
|
+
--scroll-thumb-idle: rgba(0, 0, 0, 0.1);
|
|
245
248
|
/* 语法高亮配色:浅色主题参考 GitHub Light / VSCode Light+,保证白底上的可读性 */
|
|
246
249
|
--jt-key: #953800;
|
|
247
250
|
--jt-string: #0a3069;
|
|
@@ -304,23 +307,47 @@ body {
|
|
|
304
307
|
height: 100vh;
|
|
305
308
|
}
|
|
306
309
|
|
|
307
|
-
/*
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
310
|
+
/* 全局滚动条(仅 Firefox):FF 不识别 ::-webkit-scrollbar,也不支持悬停分档/过渡,取中间档常显。
|
|
311
|
+
必须隔离在 FF:Chrome 121+ 一旦命中 scrollbar-width 会改走标准滚动条,
|
|
312
|
+
忽略 ::-webkit-scrollbar 定制(含下方三档透明度与过渡)。 */
|
|
313
|
+
@supports (-moz-appearance: none) {
|
|
314
|
+
* {
|
|
315
|
+
scrollbar-width: thin;
|
|
316
|
+
scrollbar-color: var(--scroll-thumb) transparent;
|
|
317
|
+
}
|
|
311
318
|
}
|
|
312
|
-
/* 全局滚动条(WebKit
|
|
319
|
+
/* 全局滚动条(WebKit)三档透明度:
|
|
320
|
+
静止(鼠标不在滚动区域)弱化 → 鼠标进入区域回常 → 按住 thumb 再提亮;
|
|
321
|
+
background-color 过渡保证移入/移出平滑淡入淡出。页面所有滚动区域继承本规则。
|
|
322
|
+
注:区域档必须用 :has(:hover)(容器内有被悬停后代)而非容器自身 :hover ——
|
|
323
|
+
Chromium 不会因滚动容器自身 hover 状态变化重算其 ::-webkit-scrollbar-* 样式(实测无效),
|
|
324
|
+
:has(:hover) 与祖先 hover 均可正常触发重绘。 */
|
|
313
325
|
*::-webkit-scrollbar {
|
|
314
326
|
width: 8px;
|
|
315
327
|
height: 8px;
|
|
316
328
|
}
|
|
317
329
|
*::-webkit-scrollbar-thumb {
|
|
318
|
-
background: var(--scroll-thumb);
|
|
330
|
+
background: var(--scroll-thumb-idle);
|
|
319
331
|
border-radius: 8px;
|
|
332
|
+
transition: background-color 0.2s ease;
|
|
333
|
+
}
|
|
334
|
+
*:has(:hover)::-webkit-scrollbar-thumb {
|
|
335
|
+
background: var(--scroll-thumb);
|
|
336
|
+
}
|
|
337
|
+
/* 纯文本滚动区兜底:CodeJar 编辑器与原生对话框正文以文本节点为主,容器内几乎没有可命中的
|
|
338
|
+
悬停后代,仅靠 :has(:hover) 会随鼠标落在「文字 / 缩进空白」上而闪烁,故改用紧贴外层容器的 hover。 */
|
|
339
|
+
.st-expr:hover .st-expr__editor::-webkit-scrollbar-thumb,
|
|
340
|
+
.st-code:hover .st-code__editor::-webkit-scrollbar-thumb,
|
|
341
|
+
.debug__scope-raw:hover .debug__raw-editor::-webkit-scrollbar-thumb,
|
|
342
|
+
.dlg:hover .dlg__msg::-webkit-scrollbar-thumb {
|
|
343
|
+
background: var(--scroll-thumb);
|
|
320
344
|
}
|
|
321
345
|
*::-webkit-scrollbar-thumb:hover {
|
|
322
346
|
background: var(--scroll-thumb-hover);
|
|
323
347
|
}
|
|
348
|
+
*::-webkit-scrollbar-thumb:active {
|
|
349
|
+
background: var(--scroll-thumb-hover);
|
|
350
|
+
}
|
|
324
351
|
*::-webkit-scrollbar-track {
|
|
325
352
|
background: transparent;
|
|
326
353
|
}
|
|
@@ -884,7 +911,7 @@ body {
|
|
|
884
911
|
flex: 0 0 auto;
|
|
885
912
|
order: 2;
|
|
886
913
|
}
|
|
887
|
-
/* 底部弹出面板容器(运行态 / 事件 /
|
|
914
|
+
/* 底部弹出面板容器(运行态 / 事件 / 变量绑定):Teleport 目标,宽度贯穿中右两栏;
|
|
888
915
|
空容器(面板均 v-show 隐藏时)高度为 0,不占位 */
|
|
889
916
|
.workside__panels {
|
|
890
917
|
flex: 0 0 auto;
|
|
@@ -924,7 +951,7 @@ body {
|
|
|
924
951
|
justify-content: center;
|
|
925
952
|
overflow: hidden;
|
|
926
953
|
}
|
|
927
|
-
/* 画布层:直接按实际列宽/列高布局(width/height 100% 填满外框),不再使用 transform 缩放;内部
|
|
954
|
+
/* 画布层:直接按实际列宽/列高布局(width/height 100% 填满外框),不再使用 transform 缩放;内部 canvas-bar 固定高、phone-viewport 弹性填充 */
|
|
928
955
|
.phone__scaler {
|
|
929
956
|
position: relative;
|
|
930
957
|
width: 100%;
|
|
@@ -975,68 +1002,121 @@ body {
|
|
|
975
1002
|
cursor: col-resize !important;
|
|
976
1003
|
}
|
|
977
1004
|
|
|
978
|
-
/*
|
|
979
|
-
|
|
980
|
-
|
|
1005
|
+
/* 画布工具条:原 device-bar(顶 28px)与 preview-statusbar(底 28px)合并为一条 32px——
|
|
1006
|
+
把 28px 竖向空间还给手机视口,也消除「顶条 bg-bar / 底条透明」两种底色并存的割裂感。
|
|
1007
|
+
视觉语法与全局状态栏同源:透明底融入舞台(--bg-stage),仅一条发丝线收边;
|
|
1008
|
+
控件为 ghost chip(hover / 展开出 --bg-hover),读数等宽 + tabular-nums 不跳宽。
|
|
1009
|
+
左组 = 改变画布(背景 / 宽度预设),右组 = 画布现状与动作(尺寸读数 / 刷新)。 */
|
|
1010
|
+
.canvas-bar {
|
|
981
1011
|
flex: 0 0 auto;
|
|
982
1012
|
width: 100%;
|
|
983
|
-
height:
|
|
1013
|
+
height: 32px;
|
|
984
1014
|
display: flex;
|
|
985
1015
|
align-items: center;
|
|
986
|
-
gap:
|
|
987
|
-
padding: 0
|
|
988
|
-
background: var(--bg-bar);
|
|
1016
|
+
gap: 4px;
|
|
1017
|
+
padding: 0 8px;
|
|
989
1018
|
border-bottom: 1px solid var(--border);
|
|
990
1019
|
}
|
|
991
|
-
|
|
992
|
-
.device-bar__spacer {
|
|
1020
|
+
.canvas-bar__spacer {
|
|
993
1021
|
flex: 1 1 auto;
|
|
994
1022
|
}
|
|
995
|
-
|
|
1023
|
+
/* chip:两个 Dropdown 的 slot 触发器统一外观(24px 高 / 5px 圆角 / hover 出底) */
|
|
1024
|
+
.canvas-bar__chip {
|
|
1025
|
+
display: inline-flex;
|
|
1026
|
+
align-items: center;
|
|
1027
|
+
gap: 6px;
|
|
1028
|
+
height: 24px;
|
|
1029
|
+
padding: 0 8px;
|
|
1030
|
+
border-radius: 5px;
|
|
1031
|
+
color: var(--text-dim);
|
|
1032
|
+
font-size: 11.5px;
|
|
1033
|
+
white-space: nowrap;
|
|
1034
|
+
cursor: pointer;
|
|
1035
|
+
transition: background 0.15s, color 0.15s;
|
|
1036
|
+
}
|
|
1037
|
+
.canvas-bar__chip:hover,
|
|
1038
|
+
.dd--open > .dd__trigger--slot .canvas-bar__chip {
|
|
1039
|
+
background: var(--bg-hover);
|
|
1040
|
+
color: var(--text);
|
|
1041
|
+
}
|
|
1042
|
+
.canvas-bar__chev {
|
|
1043
|
+
width: 10px;
|
|
1044
|
+
height: 10px;
|
|
1045
|
+
color: var(--text-faint);
|
|
1046
|
+
}
|
|
1047
|
+
.canvas-bar__icn {
|
|
1048
|
+
flex: 0 0 auto;
|
|
1049
|
+
width: 13px;
|
|
1050
|
+
height: 13px;
|
|
1051
|
+
color: var(--text-faint);
|
|
1052
|
+
}
|
|
1053
|
+
/* 背景小样:与 .phone__screen--bg-* 同色,触发器上直接可见当前模式,不必展开下拉 */
|
|
1054
|
+
.canvas-bar__swatch {
|
|
1055
|
+
flex: 0 0 auto;
|
|
1056
|
+
width: 10px;
|
|
1057
|
+
height: 10px;
|
|
1058
|
+
border-radius: 3px;
|
|
1059
|
+
border: 1px solid var(--border-strong);
|
|
1060
|
+
}
|
|
1061
|
+
.canvas-bar__swatch--white {
|
|
1062
|
+
background: #ffffff;
|
|
1063
|
+
}
|
|
1064
|
+
.canvas-bar__swatch--gray {
|
|
1065
|
+
background: #f0f0f0;
|
|
1066
|
+
}
|
|
1067
|
+
.canvas-bar__swatch--checker {
|
|
1068
|
+
background-color: #ffffff;
|
|
1069
|
+
background-image:
|
|
1070
|
+
linear-gradient(45deg, #cfcfcf 25%, transparent 25%, transparent 75%, #cfcfcf 75%),
|
|
1071
|
+
linear-gradient(45deg, #cfcfcf 25%, transparent 25%, transparent 75%, #cfcfcf 75%);
|
|
1072
|
+
background-size: 6px 6px;
|
|
1073
|
+
background-position: 0 0, 3px 3px;
|
|
1074
|
+
}
|
|
1075
|
+
/* 尺寸读数:等宽 + tabular-nums,拖拽分隔条改宽时数字不跳宽 */
|
|
1076
|
+
.canvas-bar__size {
|
|
1077
|
+
padding: 0 4px;
|
|
1078
|
+
font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
|
|
1079
|
+
font-size: 11px;
|
|
1080
|
+
font-variant-numeric: tabular-nums;
|
|
996
1081
|
color: var(--text-faint);
|
|
997
|
-
font-size: 12px;
|
|
998
1082
|
white-space: nowrap;
|
|
999
1083
|
}
|
|
1000
|
-
|
|
1001
|
-
.statusbar__refresh {
|
|
1084
|
+
.canvas-bar__iconbtn {
|
|
1002
1085
|
flex: 0 0 auto;
|
|
1003
1086
|
display: inline-flex;
|
|
1004
1087
|
align-items: center;
|
|
1005
1088
|
justify-content: center;
|
|
1089
|
+
width: 24px;
|
|
1090
|
+
height: 24px;
|
|
1006
1091
|
padding: 0;
|
|
1007
1092
|
background: transparent;
|
|
1008
1093
|
color: var(--text-faint);
|
|
1009
1094
|
border: none;
|
|
1010
|
-
border-radius:
|
|
1095
|
+
border-radius: 5px;
|
|
1011
1096
|
cursor: pointer;
|
|
1012
|
-
transition: background 0.15s, color 0.15s
|
|
1097
|
+
transition: background 0.15s, color 0.15s;
|
|
1013
1098
|
}
|
|
1014
|
-
.
|
|
1099
|
+
.canvas-bar__iconbtn:hover:not(:disabled) {
|
|
1100
|
+
background: var(--bg-hover);
|
|
1015
1101
|
color: var(--accent);
|
|
1016
1102
|
}
|
|
1017
|
-
.
|
|
1018
|
-
transform: translateY(1px);
|
|
1019
|
-
}
|
|
1020
|
-
.statusbar__refresh:disabled {
|
|
1103
|
+
.canvas-bar__iconbtn:disabled {
|
|
1021
1104
|
opacity: 0.4;
|
|
1022
1105
|
cursor: default;
|
|
1023
1106
|
}
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
white-space: nowrap;
|
|
1107
|
+
/* 刷新中图标自转:把「点了没反应」的空白等待变成可见反馈 */
|
|
1108
|
+
.canvas-bar__iconbtn.is-loading svg {
|
|
1109
|
+
animation: canvas-bar-spin 0.8s linear infinite;
|
|
1028
1110
|
}
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
background: var(--bg-bar);
|
|
1039
|
-
border-top: 1px solid var(--border);
|
|
1111
|
+
@keyframes canvas-bar-spin {
|
|
1112
|
+
to {
|
|
1113
|
+
transform: rotate(360deg);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
/* 窄列(预览列 < 300px,含 188 预设):收起尺寸读数与 chip 文案只留图标,保证单行不挤 */
|
|
1117
|
+
.canvas-bar--tight .canvas-bar__size,
|
|
1118
|
+
.canvas-bar--tight .canvas-bar__txt {
|
|
1119
|
+
display: none;
|
|
1040
1120
|
}
|
|
1041
1121
|
/* 预览区底部状态条:本地开发服务连接状态(连接图标 + 状态文案)。
|
|
1042
1122
|
配色复用顶栏「连接」按钮的语义色类(app__btn--connected / --reconnecting / --disconnected / --warn),
|
|
@@ -1062,6 +1142,16 @@ body {
|
|
|
1062
1142
|
.statusbar .app__btn--reconnecting { color: var(--warn); }
|
|
1063
1143
|
.statusbar .app__btn--disconnected { color: var(--danger); }
|
|
1064
1144
|
.statusbar .app__btn--warn { color: var(--warn); }
|
|
1145
|
+
/* 连接指示器现为可点按钮(开合底部「服务日志」面板):保持状态栏读数观感
|
|
1146
|
+
(无边框 / 无圆角 / 语义色由 app__btn--* 提供,语义色即连接态,不设选中态),
|
|
1147
|
+
hover 仅加极淡底色提示可点。 */
|
|
1148
|
+
button.statusbar__conn {
|
|
1149
|
+
cursor: pointer;
|
|
1150
|
+
font: inherit;
|
|
1151
|
+
}
|
|
1152
|
+
.statusbar__conn:hover {
|
|
1153
|
+
background: var(--bg-hover);
|
|
1154
|
+
}
|
|
1065
1155
|
|
|
1066
1156
|
/* 颜色选择器(@ckpack/vue-color Sketch)预设区顶部分隔线:与系统边框色保持一致,
|
|
1067
1157
|
覆盖组件默认的 1px solid #eee(深色主题下刺眼)。组件样式为全局注入且非 scoped,
|
|
@@ -1902,7 +1992,7 @@ body {
|
|
|
1902
1992
|
color: var(--warn);
|
|
1903
1993
|
}
|
|
1904
1994
|
|
|
1905
|
-
/*
|
|
1995
|
+
/* 底部面板(事件 / 变量绑定):点击状态栏指示器弹出 / 收起。与运行态面板互斥,
|
|
1906
1996
|
三者共用面板高度,由头部拖拽调整(无专门拖拽节点,与预览区宽度调节同一机制),约束 [120px, 60vh]。 */
|
|
1907
1997
|
.errpanel {
|
|
1908
1998
|
flex: 0 0 auto;
|
|
@@ -2052,6 +2142,78 @@ body {
|
|
|
2052
2142
|
.errpanel__body .empty-state__hint {
|
|
2053
2143
|
max-width: 460px;
|
|
2054
2144
|
}
|
|
2145
|
+
|
|
2146
|
+
/* ——— 服务日志面板(底部第四面板):本地服务 cardbuddy 终端输出的实时镜像 ———
|
|
2147
|
+
服务端按行镜像 stdout/stderr 并保留原始 ANSI,前端 preview/ansi.js 转成内联 style,
|
|
2148
|
+
因此这里固定深色终端底 + 等宽字体:chalk 的等级色取自深色设计令牌,浅色主题下同样可读。
|
|
2149
|
+
仅在有日志时切深底(见 .errpanel__body--term 绑定),空态仍走主题底色。 */
|
|
2150
|
+
.errpanel__body--term {
|
|
2151
|
+
padding: 0;
|
|
2152
|
+
background: #14161c;
|
|
2153
|
+
color: #e8eaf0;
|
|
2154
|
+
}
|
|
2155
|
+
.svclog {
|
|
2156
|
+
padding: 6px 0 10px;
|
|
2157
|
+
font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
|
|
2158
|
+
font-size: 11.5px;
|
|
2159
|
+
line-height: 1.55;
|
|
2160
|
+
}
|
|
2161
|
+
.svclog__line {
|
|
2162
|
+
display: flex;
|
|
2163
|
+
min-height: 1.55em;
|
|
2164
|
+
padding: 0 12px;
|
|
2165
|
+
/* 长行折行而非横向滚动:底部面板高度有限,横向滚动会同时吃掉两向空间 */
|
|
2166
|
+
white-space: pre-wrap;
|
|
2167
|
+
word-break: break-word;
|
|
2168
|
+
border-left: 2px solid transparent;
|
|
2169
|
+
}
|
|
2170
|
+
.svclog__line:hover {
|
|
2171
|
+
background: rgba(255, 255, 255, 0.045);
|
|
2172
|
+
}
|
|
2173
|
+
/* 级别只作左侧色条 + 极淡底:ANSI 本身已带终端配色,不叠加二次着色以免打架 */
|
|
2174
|
+
.svclog__line--ok {
|
|
2175
|
+
border-left-color: rgba(52, 211, 153, 0.55);
|
|
2176
|
+
}
|
|
2177
|
+
.svclog__line--warn {
|
|
2178
|
+
border-left-color: var(--warn);
|
|
2179
|
+
background: rgba(251, 191, 36, 0.07);
|
|
2180
|
+
}
|
|
2181
|
+
.svclog__line--error {
|
|
2182
|
+
border-left-color: var(--danger);
|
|
2183
|
+
background: rgba(248, 113, 113, 0.08);
|
|
2184
|
+
}
|
|
2185
|
+
.svclog__text {
|
|
2186
|
+
min-width: 0;
|
|
2187
|
+
}
|
|
2188
|
+
/* 头部读数:行数 + 实时态小圆点,落在标题之后(与事件面板 tab 同一位置语言) */
|
|
2189
|
+
.svclog__meta {
|
|
2190
|
+
display: inline-flex;
|
|
2191
|
+
align-items: center;
|
|
2192
|
+
gap: 5px;
|
|
2193
|
+
margin-left: 8px;
|
|
2194
|
+
color: var(--text-faint);
|
|
2195
|
+
font-size: 11px;
|
|
2196
|
+
white-space: nowrap;
|
|
2197
|
+
}
|
|
2198
|
+
.svclog__dot {
|
|
2199
|
+
width: 6px;
|
|
2200
|
+
height: 6px;
|
|
2201
|
+
margin-left: 4px;
|
|
2202
|
+
border-radius: 50%;
|
|
2203
|
+
background: var(--text-faint);
|
|
2204
|
+
}
|
|
2205
|
+
.svclog__dot.is-live {
|
|
2206
|
+
background: var(--ok);
|
|
2207
|
+
box-shadow: 0 0 0 2px var(--ok-soft);
|
|
2208
|
+
}
|
|
2209
|
+
/* 跟随最新输出按钮:开启态 accent,暂停态弱化(与其它头部图标按钮同一规格) */
|
|
2210
|
+
.svclog__follow.is-on {
|
|
2211
|
+
color: var(--accent);
|
|
2212
|
+
}
|
|
2213
|
+
/* 复制完成瞬时反馈:与「已复制」语义一致的成功绿 */
|
|
2214
|
+
.errpanel__iconbtn.is-done {
|
|
2215
|
+
color: var(--ok);
|
|
2216
|
+
}
|
|
2055
2217
|
/* 事件面板日志:控制台风格高密度行 = 时间 | 等级 | 内容,发丝线分隔 */
|
|
2056
2218
|
.debug__list--log {
|
|
2057
2219
|
display: flex;
|
|
@@ -2930,11 +3092,45 @@ body {
|
|
|
2930
3092
|
.confirm-modal__btn--warn:hover {
|
|
2931
3093
|
background: var(--warn-hover);
|
|
2932
3094
|
}
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
3095
|
+
/* ===== 轻量浮层(帮助 / 快捷键弹层)统一进出场 =====
|
|
3096
|
+
淡入 + 轻弹性缩放(过冲回稳),缩放原点由各浮层按锚定方位自定(transform-origin);
|
|
3097
|
+
离场快速收回、不回弹。 */
|
|
3098
|
+
.pop-enter-active {
|
|
3099
|
+
transition: opacity 0.15s ease, transform 0.26s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
2936
3100
|
}
|
|
2937
|
-
.
|
|
2938
|
-
.
|
|
3101
|
+
.pop-leave-active {
|
|
3102
|
+
transition: opacity 0.12s ease, transform 0.12s ease;
|
|
3103
|
+
}
|
|
3104
|
+
.pop-enter-from,
|
|
3105
|
+
.pop-leave-to {
|
|
2939
3106
|
opacity: 0;
|
|
3107
|
+
transform: translateY(6px) scale(0.95);
|
|
3108
|
+
}
|
|
3109
|
+
/* ===== 带遮罩模态的统一进出场动画 =====
|
|
3110
|
+
适用:确认框 / 卡片网格预览 / 远端预览二维码 / 登录凭据 / 组件选择 / 节点属性等居中模态。
|
|
3111
|
+
遮罩仅淡入/淡出;弹卡片(.modal-card)微抬 + 缩放入场、原路离场。
|
|
3112
|
+
右侧抽屉(ee-drawer)保留自己的右滑语言,不复用本组。 */
|
|
3113
|
+
.modal-enter-active,
|
|
3114
|
+
.modal-leave-active {
|
|
3115
|
+
transition: opacity 0.2s ease;
|
|
3116
|
+
}
|
|
3117
|
+
.modal-leave-active {
|
|
3118
|
+
transition: opacity 0.16s ease;
|
|
3119
|
+
}
|
|
3120
|
+
.modal-enter-from,
|
|
3121
|
+
.modal-leave-to {
|
|
3122
|
+
opacity: 0;
|
|
3123
|
+
}
|
|
3124
|
+
/* 入场带一点弹性:back-out 过冲曲线让弹卡片微 overshoot 后回稳;离场干脆不回弹 */
|
|
3125
|
+
.modal-enter-active .modal-card {
|
|
3126
|
+
transition: transform 0.34s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
3127
|
+
}
|
|
3128
|
+
.modal-leave-active .modal-card {
|
|
3129
|
+
transition: transform 0.16s ease;
|
|
3130
|
+
}
|
|
3131
|
+
.modal-enter-from .modal-card {
|
|
3132
|
+
transform: translateY(14px) scale(0.94);
|
|
3133
|
+
}
|
|
3134
|
+
.modal-leave-to .modal-card {
|
|
3135
|
+
transform: translateY(6px) scale(0.98);
|
|
2940
3136
|
}
|
|
@@ -244,12 +244,4 @@
|
|
|
244
244
|
font-size: 13px;
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
-
/*
|
|
248
|
-
.cg-fade-enter-active,
|
|
249
|
-
.cg-fade-leave-active {
|
|
250
|
-
transition: opacity 0.16s ease;
|
|
251
|
-
}
|
|
252
|
-
.cg-fade-enter,
|
|
253
|
-
.cg-fade-leave-to {
|
|
254
|
-
opacity: 0;
|
|
255
|
-
}
|
|
247
|
+
/* 过渡:统一使用 app.css 的 .modal-* 进出场动画(遮罩淡入淡出 + 弹卡片抬升缩放) */
|
|
@@ -194,21 +194,6 @@
|
|
|
194
194
|
background: var(--accent-soft);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
/* 下拉列表滚动条(WebKit) */
|
|
198
|
-
.csel__list::-webkit-scrollbar {
|
|
199
|
-
width: 8px;
|
|
200
|
-
}
|
|
201
|
-
.csel__list::-webkit-scrollbar-thumb {
|
|
202
|
-
background: var(--scroll-thumb);
|
|
203
|
-
border-radius: 4px;
|
|
204
|
-
}
|
|
205
|
-
.csel__list::-webkit-scrollbar-thumb:hover {
|
|
206
|
-
background: var(--scroll-thumb-hover);
|
|
207
|
-
}
|
|
208
|
-
.csel__list::-webkit-scrollbar-track {
|
|
209
|
-
background: transparent;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
197
|
/* 弹出动画 */
|
|
213
198
|
.csel-fade-enter-active,
|
|
214
199
|
.csel-fade-leave-active {
|
|
@@ -261,21 +261,6 @@
|
|
|
261
261
|
cursor: default;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
/* 滚动条 */
|
|
265
|
-
.dd__list::-webkit-scrollbar {
|
|
266
|
-
width: 8px;
|
|
267
|
-
}
|
|
268
|
-
.dd__list::-webkit-scrollbar-thumb {
|
|
269
|
-
background: var(--scroll-thumb);
|
|
270
|
-
border-radius: 4px;
|
|
271
|
-
}
|
|
272
|
-
.dd__list::-webkit-scrollbar-thumb:hover {
|
|
273
|
-
background: var(--scroll-thumb-hover);
|
|
274
|
-
}
|
|
275
|
-
.dd__list::-webkit-scrollbar-track {
|
|
276
|
-
background: transparent;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
264
|
/* 弹出动画 */
|
|
280
265
|
.dd-fade-enter-active,
|
|
281
266
|
.dd-fade-leave-active {
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
display: flex;
|
|
11
11
|
align-items: center;
|
|
12
12
|
justify-content: center;
|
|
13
|
-
/*
|
|
14
|
-
background:
|
|
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 {
|
|
@@ -648,15 +649,12 @@ select.ni-input {
|
|
|
648
649
|
|
|
649
650
|
.ee-overlay {
|
|
650
651
|
position: fixed;
|
|
651
|
-
|
|
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
|
-
|
|
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
|
-
/*
|
|
677
|
+
/* 进出场动画(DebugPanel 中 <Transition name="ee-drawer"> 驱动):
|
|
678
|
+
遮罩只做淡入/淡出,抽屉主体单独从右往左滑入/滑出——全屏遮罩不应跟随主体平移。
|
|
679
|
+
离场遮罩淡出与主体滑动同长(0.26s),保证滑动过程可见;入场遮罩淡入稍快。 */
|
|
680
680
|
.ee-drawer-enter-active,
|
|
681
681
|
.ee-drawer-leave-active {
|
|
682
|
-
transition:
|
|
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
|
|
|
@@ -958,6 +972,8 @@ select.ee-input { height: 32px; }
|
|
|
958
972
|
top: calc(100% + 4px);
|
|
959
973
|
right: 12px;
|
|
960
974
|
z-index: 7;
|
|
975
|
+
/* 弹层锚定右上帮助图标:弹性缩放自该角生长 */
|
|
976
|
+
transform-origin: top right;
|
|
961
977
|
width: min(340px, 78%);
|
|
962
978
|
padding: 8px 10px;
|
|
963
979
|
border: 1px solid var(--border-strong);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cardbuddy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Local dev service for the CardBuddy card editor — decouples card CRUD (sync/save/validate/render-status/screenshot) from the static public editor, so the editor can be deployed to any static host while each developer runs a local service against their own card source.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|