cardbuddy 0.9.1 → 0.11.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.
- package/README.md +21 -6
- package/dist/cli.js +17 -6
- package/dist/config.js +20 -2
- package/dist/portGuard.js +293 -0
- package/dist/preview-editor/assets/index-B4VZgNSK.css +1 -0
- package/dist/preview-editor/assets/index-jl4YJzKv.js +180 -0
- package/dist/preview-editor/index.html +2 -2
- package/dist/server-core/_vendor/finmall-env.mjs +4 -4
- package/dist/server-core/ai-chat.js +3710 -0
- package/dist/server-core/assetProxy.js +3 -22
- package/dist/server-core/buildDataFromSchema.js +36 -4
- package/dist/server-core/cardFiles.js +95 -2
- package/dist/server-core/cardImage.js +14 -0
- package/dist/server-core/cardListCache.js +0 -17
- package/dist/server-core/cardSave.js +2 -0
- package/dist/server-core/cardValidate.js +3 -0
- package/dist/server-core/index.js +6 -5
- package/dist/server-core/logStream.js +1 -6
- package/dist/server-core/sliceUpload.js +8 -1
- package/dist/standalone.js +24 -8
- package/dist/vendored/App.vue +405 -125
- package/dist/vendored/api.js +4 -4
- package/dist/vendored/assets/svgIcons/icons.svg +28 -0
- package/dist/vendored/components/AiSettings.vue +392 -0
- package/dist/vendored/components/CardGallery.vue +51 -5
- package/dist/vendored/components/ChatComposer.vue +413 -0
- package/dist/vendored/components/ChatMessage.vue +383 -0
- package/dist/vendored/components/ChatPanel.vue +937 -0
- package/dist/vendored/components/ComponentPalette.vue +1 -1
- package/dist/vendored/components/DebugPanel.vue +732 -90
- package/dist/vendored/components/Dropdown.vue +4 -2
- package/dist/vendored/components/MarkdownBody.vue +64 -0
- package/dist/vendored/components/NewCardDialog.vue +132 -0
- package/dist/vendored/components/NumberStepper.vue +125 -0
- package/dist/vendored/components/ProgressSlider.vue +9 -1
- package/dist/vendored/components/RemotePreview.vue +1 -1
- package/dist/vendored/components/StructureTree.vue +2 -2
- package/dist/vendored/main.js +1 -0
- package/dist/vendored/runtime/adapter.js +1 -1
- package/dist/vendored/runtime/ai-api.js +165 -0
- package/dist/vendored/runtime/clipboard-node.js +0 -5
- package/dist/vendored/runtime/markdown.js +140 -0
- package/dist/vendored/skills/.manifest.json +1101 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/autofix_schema.py +249 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/check_topology.py +678 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/derive_data_json.py +81 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/paths.py +105 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/validate_schema.py +624 -0
- package/dist/vendored/skills/finmall-card-sync/scripts/api_batch_sync.mjs +900 -0
- package/dist/vendored/skills/finmall-card-sync/scripts/slice_upload.mjs +699 -0
- package/dist/vendored/skills/shared/finmall-config.mjs +124 -0
- package/dist/vendored/styles/ai-chat.css +1850 -0
- package/dist/vendored/styles/app.css +725 -213
- package/dist/vendored/styles/card-gallery.css +48 -10
- package/dist/vendored/styles/card-select.css +13 -6
- package/dist/vendored/styles/dropdown.css +1 -2
- package/dist/vendored/styles/json-tree.css +3 -3
- package/dist/vendored/styles/node-inspector.css +13 -289
- package/dist/vendored/styles/setters.css +48 -49
- package/dist/vendored/styles/structure-tree.css +6 -11
- package/package.json +1 -1
- package/dist/preview-editor/assets/index-B9MOriNv.js +0 -80
- package/dist/preview-editor/assets/index-CwD14gm3.css +0 -1
- package/dist/vendored/assets/logo.png +0 -0
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
--info-border: rgba(107, 131, 247, 0.45);
|
|
55
55
|
/* 强调色填充上的文字(按钮实心态等) */
|
|
56
56
|
--on-accent: #0F1115;
|
|
57
|
+
/* 流式高光(Codex 同款文字横扫):aithink 折叠态「最新一行」预览的亮带色,扫过处提亮 */
|
|
58
|
+
--stream-shine: #ffffff;
|
|
57
59
|
/* 层级阴影与遮罩(弹层 / 抽屉 / 卡片框 / 滚动容器 / 模态遮罩) */
|
|
58
60
|
--radius: 8px;
|
|
59
61
|
--radius-sm: 6px;
|
|
@@ -115,7 +117,13 @@
|
|
|
115
117
|
--code-fn: #d2a8ff;
|
|
116
118
|
--code-var: #ffa657;
|
|
117
119
|
--code-binding: #56d4dd;
|
|
118
|
-
|
|
120
|
+
/* === 变量类型标签配色(--type-*):变量列表类型 chip 专用 === */
|
|
121
|
+
/* 暗色沿用代码高亮调色板,与代码区同类型字面量同色呼应 */
|
|
122
|
+
--type-string: var(--code-str);
|
|
123
|
+
--type-number: var(--code-num);
|
|
124
|
+
--type-boolean: var(--code-kw);
|
|
125
|
+
--type-array: var(--code-fn);
|
|
126
|
+
--type-object: var(--code-prop);
|
|
119
127
|
/* === CardBuddy UI 尺寸与节奏规范手册 §四(单一来源,尺寸/节奏不随主题变)== */
|
|
120
128
|
/* 间距 8 pt 网格 */
|
|
121
129
|
--space-0: 0;
|
|
@@ -158,6 +166,11 @@
|
|
|
158
166
|
--icon-lg: 20px;
|
|
159
167
|
--icon-xl: 24px;
|
|
160
168
|
--stroke: 1.75;
|
|
169
|
+
/* 发丝线粗细:页面里所有「分割线 / 单边分隔描边」的统一尺寸(dpr 自适应见下方媒体查询)。
|
|
170
|
+
普通屏 1px;dpr ≥ 2 时收到 0.5px(= 1 个物理像素),线条更锐利不发虚。
|
|
171
|
+
控件四边描边(border: 1px solid …)不算分割线,仍固定 1px 以保持控件视觉重量;
|
|
172
|
+
卡片内容组件(.ce_divider 等自动生成样式)与画布参考线(.ce-guide--*)同样不跟随。 */
|
|
173
|
+
--hairline: 1px;
|
|
161
174
|
/* 阴影形状(颜色交给配色手册) */
|
|
162
175
|
--shadow-1: 0 1px 2px var(--shadow-card);
|
|
163
176
|
--shadow-2: 0 4px 12px var(--shadow-card);
|
|
@@ -177,74 +190,95 @@
|
|
|
177
190
|
--z-toast-app: 2100;
|
|
178
191
|
}
|
|
179
192
|
|
|
193
|
+
/* dpr ≥ 2 → 发丝线收到半像素。(min-resolution: 2dppx) 与 devicePixelRatio >= 2 等价,
|
|
194
|
+
浏览器缩放、拖到不同密度屏幕时由浏览器自动重算,无需 JS 介入也不会有首帧闪动;
|
|
195
|
+
-webkit-min-device-pixel-ratio 兜住不认 resolution 的旧 Safari。 */
|
|
196
|
+
@media (min-resolution: 2dppx), (-webkit-min-device-pixel-ratio: 2) {
|
|
197
|
+
:root {
|
|
198
|
+
--hairline: 0.5px;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
180
202
|
/* 浅色主题:以白色为基色调,复用同名变量整体切换。仅覆盖配色变量,布局不变。 */
|
|
181
203
|
:root[data-theme='light'] {
|
|
182
|
-
|
|
204
|
+
/* 中性阶梯统一走 Slate 蓝灰族(与《深浅主题配色规范手册》§〇.3 对齐):
|
|
205
|
+
stage 最沉 → app → panel(白) → input/hover/soft 逐级提亮,避免旧值「中性脏灰 + 蓝灰边框」
|
|
206
|
+
两个灰族混用导致的发灰发脏;控件填充收到近白,白面板上不再糊灰块。 */
|
|
207
|
+
--bg-app: #f4f6fa;
|
|
183
208
|
--bg-bar: #ffffff;
|
|
184
209
|
--bg-panel: #ffffff;
|
|
185
|
-
--bg-stage: #
|
|
186
|
-
--bg-input: #
|
|
187
|
-
--bg-hover: #
|
|
188
|
-
--bg-active: #
|
|
189
|
-
--bg-pop: rgba(255, 255, 255, 0.
|
|
190
|
-
--bg-soft: #
|
|
191
|
-
--border: #
|
|
192
|
-
--border-strong: #
|
|
193
|
-
--text: #
|
|
194
|
-
--text-dim: #
|
|
195
|
-
|
|
210
|
+
--bg-stage: #e9edf4;
|
|
211
|
+
--bg-input: #f6f8fb;
|
|
212
|
+
--bg-hover: #f1f4f9;
|
|
213
|
+
--bg-active: #e4e9f2;
|
|
214
|
+
--bg-pop: rgba(255, 255, 255, 0.98);
|
|
215
|
+
--bg-soft: #eef2f8;
|
|
216
|
+
--border: #e2e8f0;
|
|
217
|
+
--border-strong: #cbd5e1;
|
|
218
|
+
--text: #1e293b;
|
|
219
|
+
--text-dim: #475569;
|
|
220
|
+
/* faint 收到 slate-500/600 之间:白底 5.4:1、stage 底 4.6:1,11px 元信息不发虚也不糊
|
|
221
|
+
(旧 #8a93a3 白底仅 ~3.1:1) */
|
|
222
|
+
--text-faint: #5f6b7d;
|
|
196
223
|
--accent: #4F6BF2;
|
|
197
224
|
--accent-2: #3D57D9;
|
|
198
|
-
--accent-soft: rgba(79, 107, 242, 0.
|
|
199
|
-
--accent-border: rgba(79, 107, 242, 0.
|
|
225
|
+
--accent-soft: rgba(79, 107, 242, 0.1);
|
|
226
|
+
--accent-border: rgba(79, 107, 242, 0.35);
|
|
200
227
|
--accent-hover: #3D57D9;
|
|
201
228
|
--danger: #EF4444;
|
|
202
|
-
--danger-soft: rgba(239, 68, 68, 0.
|
|
229
|
+
--danger-soft: rgba(239, 68, 68, 0.1);
|
|
203
230
|
--danger-hover: #DC2626;
|
|
204
231
|
--warn: #F59E0B;
|
|
205
|
-
--warn-soft: rgba(245, 158, 11, 0.
|
|
232
|
+
--warn-soft: rgba(245, 158, 11, 0.12);
|
|
206
233
|
--warn-border: rgba(245, 158, 11, 0.4);
|
|
207
234
|
--warn-hover: #D97706;
|
|
208
235
|
--on-warn: #0F1115;
|
|
209
236
|
--ok: #10B981;
|
|
210
|
-
--ok-soft: rgba(16, 185, 129, 0.
|
|
237
|
+
--ok-soft: rgba(16, 185, 129, 0.12);
|
|
211
238
|
--ok-border: rgba(16, 185, 129, 0.4);
|
|
212
|
-
|
|
213
|
-
|
|
239
|
+
/* 语义深色变体与各自基色同族:绿=emerald-700、琥珀=amber-700、红=red-700,
|
|
240
|
+
不再混用 GitHub green / brick red 等外来色相(白底对比均 ≥ 4.5:1) */
|
|
241
|
+
--ok-strong: #047857;
|
|
242
|
+
--ok-solid: #047857;
|
|
214
243
|
--on-ok: #ffffff;
|
|
215
244
|
--info: #4F6BF2;
|
|
216
|
-
--info-soft: rgba(79, 107, 242, 0.
|
|
217
|
-
--info-border: rgba(79, 107, 242, 0.
|
|
245
|
+
--info-soft: rgba(79, 107, 242, 0.1);
|
|
246
|
+
--info-border: rgba(79, 107, 242, 0.35);
|
|
218
247
|
--on-accent: #ffffff;
|
|
248
|
+
/* 流式高光:浅底上用深靛蓝亮带扫过 aithink「最新一行」预览,深浅两主题同一套交互语言 */
|
|
249
|
+
--stream-shine: #3142b8;
|
|
219
250
|
--radius: 8px;
|
|
220
251
|
--radius-sm: 6px;
|
|
221
|
-
|
|
222
|
-
--shadow-
|
|
223
|
-
--shadow-
|
|
224
|
-
--shadow-
|
|
225
|
-
--
|
|
226
|
-
--scrim
|
|
252
|
+
/* 阴影收到手册量级(card 0.08~0.12):旧 0.16 配 8~24px 模糊会在白底上糊出一圈灰雾 */
|
|
253
|
+
--shadow-pop: rgba(15, 23, 42, 0.14);
|
|
254
|
+
--shadow-card: rgba(15, 23, 42, 0.1);
|
|
255
|
+
--shadow-drawer: rgba(15, 23, 42, 0.12);
|
|
256
|
+
--shadow-toast: rgba(15, 23, 42, 0.1);
|
|
257
|
+
--scrim: rgba(15, 23, 42, 0.4);
|
|
258
|
+
--scrim-soft: rgba(15, 23, 42, 0.3);
|
|
227
259
|
--scrim-faint: rgba(15, 23, 42, 0.22);
|
|
228
|
-
--bar-grad: linear-gradient(180deg, #ffffff, #
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
--
|
|
232
|
-
--
|
|
233
|
-
--
|
|
234
|
-
--
|
|
235
|
-
--
|
|
236
|
-
--api-item-
|
|
237
|
-
--
|
|
238
|
-
--
|
|
239
|
-
--
|
|
240
|
-
--tag-
|
|
241
|
-
--tag-
|
|
242
|
-
--
|
|
243
|
-
--
|
|
244
|
-
--log-warn-
|
|
245
|
-
--
|
|
246
|
-
--
|
|
247
|
-
--scroll-thumb
|
|
260
|
+
--bar-grad: linear-gradient(180deg, #ffffff, #f6f8fc);
|
|
261
|
+
/* 高亮 / 描边类半透明统一挂到主色 #4F6BF2(79,107,242)上,替换旧的电光蓝 #5b6cff(91,108,255),
|
|
262
|
+
与按钮 / 选中态同一色相,浅色下不再跳色 */
|
|
263
|
+
--splitter: #4F6BF2;
|
|
264
|
+
--splitter-grip: rgba(15, 23, 42, 0.18);
|
|
265
|
+
--overlay-tint: rgba(15, 23, 42, 0.03);
|
|
266
|
+
--overlay-tint-strong: rgba(15, 23, 42, 0.08);
|
|
267
|
+
--err-item-fg: #b91c1c;
|
|
268
|
+
--api-item-fg: #3d57d9;
|
|
269
|
+
--api-item-border: rgba(79, 107, 242, 0.22);
|
|
270
|
+
--api-item-bg: rgba(79, 107, 242, 0.06);
|
|
271
|
+
--copy-ok: #047857;
|
|
272
|
+
--tag-ok-fg: #047857;
|
|
273
|
+
--tag-ok-bg: rgba(16, 185, 129, 0.1);
|
|
274
|
+
--tag-warn-fg: #b45309;
|
|
275
|
+
--tag-warn-bg: rgba(245, 158, 11, 0.1);
|
|
276
|
+
--log-warn-fg: #b45309;
|
|
277
|
+
--log-warn-bg: rgba(245, 158, 11, 0.1);
|
|
278
|
+
--log-warn-border: rgba(245, 158, 11, 0.35);
|
|
279
|
+
--scroll-thumb: rgba(15, 23, 42, 0.16);
|
|
280
|
+
--scroll-thumb-hover: rgba(15, 23, 42, 0.28);
|
|
281
|
+
--scroll-thumb-idle: rgba(15, 23, 42, 0.08);
|
|
248
282
|
/* 语法高亮配色:浅色主题参考 GitHub Light / VSCode Light+,保证白底上的可读性 */
|
|
249
283
|
--jt-key: #953800;
|
|
250
284
|
--jt-string: #0a3069;
|
|
@@ -252,15 +286,15 @@
|
|
|
252
286
|
--jt-boolean: #cf222e;
|
|
253
287
|
--jt-null: #57606a;
|
|
254
288
|
--jt-faint: #6b7280;
|
|
255
|
-
--jt-ring: rgba(
|
|
289
|
+
--jt-ring: rgba(79, 107, 242, 0.28);
|
|
256
290
|
--jt-del-fg: #cf222e;
|
|
257
291
|
--jt-del-bg: rgba(207, 34, 46, 0.12);
|
|
258
|
-
--jt-add-bg: rgba(
|
|
259
|
-
--st-label: #
|
|
292
|
+
--jt-add-bg: rgba(79, 107, 242, 0.1);
|
|
293
|
+
--st-label: #1e293b;
|
|
260
294
|
--st-id: #64748b;
|
|
261
295
|
--st-badge-bg: #4F6BF2;
|
|
262
296
|
--st-badge-fg: #ffffff;
|
|
263
|
-
--st-hl-bg: rgba(79, 107, 242, 0.
|
|
297
|
+
--st-hl-bg: rgba(79, 107, 242, 0.14);
|
|
264
298
|
--code-comment: #6e7781;
|
|
265
299
|
--code-punc: #6e7781;
|
|
266
300
|
--code-prop: #953800;
|
|
@@ -270,7 +304,13 @@
|
|
|
270
304
|
--code-fn: #8250df;
|
|
271
305
|
--code-var: #953800;
|
|
272
306
|
--code-binding: #0d9488;
|
|
273
|
-
--code
|
|
307
|
+
/* 类型 chip 专用色在亮色下单独校正(不影响代码高亮 --code-*):
|
|
308
|
+
- string:--code-str 藏青与 --code-num 蓝同属蓝调易混,改走绿系;
|
|
309
|
+
- boolean / array:--code-kw 红、--code-fn 紫在 10px 小字上对比不足 AA(4.5:1),各压深一档;
|
|
310
|
+
- number / object 亮色下已达标,继续复用 --code-*。 */
|
|
311
|
+
--type-string: #116329;
|
|
312
|
+
--type-boolean: #a40e26;
|
|
313
|
+
--type-array: #6639ba;
|
|
274
314
|
}
|
|
275
315
|
|
|
276
316
|
* {
|
|
@@ -305,6 +345,7 @@ body {
|
|
|
305
345
|
}
|
|
306
346
|
#app {
|
|
307
347
|
height: 100vh;
|
|
348
|
+
overflow: hidden;
|
|
308
349
|
}
|
|
309
350
|
|
|
310
351
|
/* 全局滚动条(仅 Firefox):FF 不识别 ::-webkit-scrollbar,也不支持悬停分档/过渡,取中间档常显。
|
|
@@ -366,7 +407,7 @@ body {
|
|
|
366
407
|
padding: 0 16px;
|
|
367
408
|
height: 48px;
|
|
368
409
|
background: var(--bar-grad);
|
|
369
|
-
border-bottom:
|
|
410
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
370
411
|
flex: 0 0 auto;
|
|
371
412
|
}
|
|
372
413
|
.app__logo {
|
|
@@ -421,7 +462,11 @@ body {
|
|
|
421
462
|
}
|
|
422
463
|
.app__btn--icon {
|
|
423
464
|
height: var(--ctrl-md);
|
|
424
|
-
|
|
465
|
+
/* 纯图标按钮(无文字)视觉取正方:宽随 aspect-ratio 跟高度走、图标居中,
|
|
466
|
+
不再出现 33×28 这类扁矩形;顶栏覆写高度为 --ctrl-sm 后仍自动保持正方 */
|
|
467
|
+
aspect-ratio: 1;
|
|
468
|
+
padding: 0;
|
|
469
|
+
justify-content: center;
|
|
425
470
|
}
|
|
426
471
|
/* 开关型图标按钮的「开启」态(如右侧接口调用面板开关):用主题色标示当前已展开 */
|
|
427
472
|
.app__btn--active {
|
|
@@ -533,49 +578,54 @@ body {
|
|
|
533
578
|
background: var(--accent);
|
|
534
579
|
color: var(--on-accent);
|
|
535
580
|
border-color: var(--accent);
|
|
536
|
-
/* box-shadow: 0 0 0 2px var(--accent-soft); */
|
|
537
581
|
}
|
|
538
582
|
.app__btn--history-save.is-dirty:not(:disabled):hover {
|
|
539
583
|
background: var(--accent-2);
|
|
540
584
|
border-color: var(--accent-2);
|
|
541
585
|
}
|
|
542
|
-
/* 发布按钮(写回 FinMall 前的发布动作),与本地保存/远端分组区分 */
|
|
543
|
-
.app__btn--publish {
|
|
544
|
-
display: inline-flex;
|
|
545
|
-
align-items: center;
|
|
546
|
-
gap: 5px;
|
|
547
|
-
height: var(--ctrl-md);
|
|
548
|
-
padding: 0 12px;
|
|
549
|
-
color: var(--info);
|
|
550
|
-
border-color: var(--info-border);
|
|
551
|
-
background: var(--info-soft);
|
|
552
|
-
}
|
|
553
|
-
.app__btn--publish:hover:not(:disabled) {
|
|
554
|
-
background: var(--info);
|
|
555
|
-
color: var(--on-accent);
|
|
556
|
-
border-color: var(--info);
|
|
557
|
-
}
|
|
558
|
-
.app__btn--publish:disabled {
|
|
559
|
-
opacity: 0.5;
|
|
560
|
-
cursor: default;
|
|
561
|
-
}
|
|
562
|
-
/* 已保存但读回校验不符:橙色警示,提示「交易成功但内容未落库」 */
|
|
563
|
-
.app__btn--publish.app__btn--warn {
|
|
564
|
-
color: var(--warn);
|
|
565
|
-
border-color: var(--warn-border);
|
|
566
|
-
background: var(--warn-soft);
|
|
567
|
-
}
|
|
568
|
-
.app__btn--publish.app__btn--warn:hover:not(:disabled) {
|
|
569
|
-
background: var(--warn);
|
|
570
|
-
color: var(--on-accent);
|
|
571
|
-
border-color: var(--warn);
|
|
572
|
-
}
|
|
573
586
|
.app__bar-actions {
|
|
574
587
|
margin-left: auto; /* 把这一组推到顶栏最右侧 */
|
|
575
588
|
display: flex;
|
|
576
589
|
align-items: center;
|
|
577
590
|
gap: 12px; /* 与 .app__bar 的 gap 保持一致 */
|
|
578
591
|
}
|
|
592
|
+
/* 顶栏窄屏降级:先收按钮文案、再收徽标与版本号、最后压缩卡片选择器,
|
|
593
|
+
保证窄窗口下右侧整组控件不被裁掉(此前 ≤1024px 时右缘溢出、按钮点不到) */
|
|
594
|
+
@media (max-width: 1180px) {
|
|
595
|
+
.app__op-group > .app__btn {
|
|
596
|
+
padding: 0 8px;
|
|
597
|
+
}
|
|
598
|
+
.app__op-group > .app__btn > span {
|
|
599
|
+
display: none; /* 撤销/重做/保存/复制 转纯图标,语义由 title 兜底 */
|
|
600
|
+
}
|
|
601
|
+
.app__btn--remote {
|
|
602
|
+
padding: 0 8px;
|
|
603
|
+
}
|
|
604
|
+
.app__btn--remote > span {
|
|
605
|
+
display: none;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
@media (max-width: 1024px) {
|
|
609
|
+
.app__bar {
|
|
610
|
+
gap: 8px;
|
|
611
|
+
padding: 0 10px;
|
|
612
|
+
}
|
|
613
|
+
.app__bar-actions {
|
|
614
|
+
gap: 8px;
|
|
615
|
+
}
|
|
616
|
+
.app__logo-version {
|
|
617
|
+
display: none;
|
|
618
|
+
}
|
|
619
|
+
.app__badge {
|
|
620
|
+
padding: 2px 6px;
|
|
621
|
+
}
|
|
622
|
+
.app__badge-text {
|
|
623
|
+
display: none; /* 只留状态色圆点,悬停 title 仍给完整文案 */
|
|
624
|
+
}
|
|
625
|
+
.csel-combo {
|
|
626
|
+
min-width: 120px;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
579
629
|
/* 本地开发服务设置入口(前后端分离 Phase 2) */
|
|
580
630
|
.app__dev-svc {
|
|
581
631
|
position: relative;
|
|
@@ -610,54 +660,90 @@ body {
|
|
|
610
660
|
color: var(--danger);
|
|
611
661
|
border-color: var(--danger);
|
|
612
662
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
663
|
+
/* 设置浮层:与全应用轻量浮层同一语言——--bg-panel 实底、发丝线分栏头、--radius-lg 圆角、
|
|
664
|
+
--shadow-3 投影;锚定顶栏「连接」按钮下方,进出场复用统一 pop 弹性动画(缩放原点右上)。 */
|
|
665
|
+
.app__dev-svc-mask {
|
|
666
|
+
position: fixed;
|
|
667
|
+
inset: 0;
|
|
668
|
+
z-index: var(--z-overlay);
|
|
616
669
|
}
|
|
617
670
|
.app__dev-svc-panel {
|
|
618
671
|
position: absolute;
|
|
619
672
|
top: calc(100% + 8px);
|
|
620
673
|
right: 0;
|
|
621
|
-
z-index: var(--z-
|
|
622
|
-
width:
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
border:
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
color: var(--text, #e6e9ef);
|
|
674
|
+
z-index: var(--z-pop);
|
|
675
|
+
width: 300px;
|
|
676
|
+
background: var(--bg-panel);
|
|
677
|
+
border: 1px solid var(--border-strong);
|
|
678
|
+
border-radius: var(--radius-lg);
|
|
679
|
+
box-shadow: var(--shadow-3);
|
|
680
|
+
color: var(--text);
|
|
629
681
|
text-align: left;
|
|
682
|
+
overflow: hidden;
|
|
683
|
+
transform-origin: top right;
|
|
684
|
+
}
|
|
685
|
+
.app__dev-svc-head {
|
|
686
|
+
display: flex;
|
|
687
|
+
align-items: center;
|
|
688
|
+
justify-content: space-between;
|
|
689
|
+
gap: 8px;
|
|
690
|
+
padding: 7px 8px 7px 12px;
|
|
691
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
630
692
|
}
|
|
631
693
|
.app__dev-svc-title {
|
|
632
|
-
font-size:
|
|
694
|
+
font-size: 12px;
|
|
633
695
|
font-weight: 600;
|
|
634
|
-
|
|
696
|
+
color: var(--text);
|
|
697
|
+
}
|
|
698
|
+
/* 头部关闭按钮:与节点面板 / 组件面板关闭按钮同规格(22px 弱按钮) */
|
|
699
|
+
.app__dev-svc-close {
|
|
700
|
+
width: 22px;
|
|
701
|
+
height: 22px;
|
|
702
|
+
display: inline-flex;
|
|
703
|
+
align-items: center;
|
|
704
|
+
justify-content: center;
|
|
705
|
+
background: none;
|
|
706
|
+
border: none;
|
|
707
|
+
border-radius: 6px;
|
|
708
|
+
color: var(--text-faint);
|
|
709
|
+
font-size: 14px;
|
|
710
|
+
line-height: 1;
|
|
711
|
+
cursor: pointer;
|
|
712
|
+
transition: background 0.15s, color 0.15s;
|
|
713
|
+
}
|
|
714
|
+
.app__dev-svc-close::before {
|
|
715
|
+
content: '✕';
|
|
716
|
+
}
|
|
717
|
+
.app__dev-svc-close:hover {
|
|
718
|
+
background: var(--bg-hover);
|
|
719
|
+
color: var(--text);
|
|
720
|
+
}
|
|
721
|
+
.app__dev-svc-body {
|
|
722
|
+
display: flex;
|
|
723
|
+
flex-direction: column;
|
|
724
|
+
gap: 12px;
|
|
725
|
+
padding: 12px;
|
|
635
726
|
}
|
|
636
727
|
.app__dev-svc-row {
|
|
637
728
|
display: flex;
|
|
638
729
|
align-items: center;
|
|
639
730
|
justify-content: space-between;
|
|
640
|
-
gap:
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
color: var(--text-dim, #9aa3b2);
|
|
731
|
+
gap: 8px;
|
|
732
|
+
font-size: 11px;
|
|
733
|
+
color: var(--text-dim);
|
|
644
734
|
}
|
|
645
735
|
.app__dev-svc-row--col {
|
|
646
736
|
flex-direction: column;
|
|
647
737
|
align-items: stretch;
|
|
738
|
+
gap: 6px;
|
|
648
739
|
}
|
|
649
|
-
|
|
650
|
-
margin-bottom: 4px;
|
|
651
|
-
}
|
|
652
|
-
/* 与节点编辑面板 setter(setters.css .st-input / .st-textarea)保持完全一致:
|
|
653
|
-
--bg-input 底色、--border 边框、5px 圆角、focus 切 --accent-border 边框 + --accent-soft 光环。 */
|
|
740
|
+
/* 输入框与节点属性面板输入家族同规格:28px 高、--bg-input 底、focus 主色描边 + 光环 */
|
|
654
741
|
.app__dev-svc-row input[type='text'],
|
|
655
|
-
.app__dev-svc-row input[type='password']
|
|
656
|
-
.app__dev-svc-row textarea {
|
|
742
|
+
.app__dev-svc-row input[type='password'] {
|
|
657
743
|
width: 100%;
|
|
658
744
|
min-width: 0;
|
|
659
|
-
height: var(--ctrl-
|
|
660
|
-
padding: 0
|
|
745
|
+
height: var(--ctrl-sm);
|
|
746
|
+
padding: 0 10px;
|
|
661
747
|
background: var(--bg-input);
|
|
662
748
|
border: 1px solid var(--border);
|
|
663
749
|
border-radius: var(--radius-sm);
|
|
@@ -667,45 +753,38 @@ body {
|
|
|
667
753
|
outline: none;
|
|
668
754
|
transition: border-color 0.15s, box-shadow 0.15s;
|
|
669
755
|
}
|
|
670
|
-
.app__dev-svc-row textarea {
|
|
671
|
-
height: auto;
|
|
672
|
-
min-height: 84px;
|
|
673
|
-
padding: 6px 8px;
|
|
674
|
-
line-height: 1.5;
|
|
675
|
-
resize: none;
|
|
676
|
-
}
|
|
677
756
|
.app__dev-svc-row input[type='text']:focus,
|
|
678
|
-
.app__dev-svc-row input[type='password']:focus
|
|
679
|
-
.app__dev-svc-row textarea:focus {
|
|
757
|
+
.app__dev-svc-row input[type='password']:focus {
|
|
680
758
|
border-color: var(--accent-border);
|
|
681
759
|
box-shadow: 0 0 0 2px var(--accent-soft);
|
|
682
760
|
}
|
|
683
|
-
.app__dev-svc-row input::placeholder
|
|
684
|
-
.app__dev-svc-row textarea::placeholder {
|
|
761
|
+
.app__dev-svc-row input::placeholder {
|
|
685
762
|
color: var(--text-faint);
|
|
686
763
|
}
|
|
687
764
|
.app__dev-svc-row .switch {
|
|
688
765
|
flex: 0 0 auto;
|
|
689
766
|
}
|
|
767
|
+
/* 未生效提示:琥珀色软底注记块,替代裸文字,警告语义一眼可辨 */
|
|
768
|
+
.app__dev-svc-hint {
|
|
769
|
+
margin: 0;
|
|
770
|
+
padding: 6px 8px;
|
|
771
|
+
border-radius: var(--radius-sm);
|
|
772
|
+
background: var(--warn-soft);
|
|
773
|
+
color: var(--warn);
|
|
774
|
+
font-size: 11px;
|
|
775
|
+
line-height: 1.55;
|
|
776
|
+
}
|
|
690
777
|
.app__dev-svc-actions {
|
|
691
778
|
display: flex;
|
|
692
779
|
gap: 8px;
|
|
693
|
-
margin-top: 4px;
|
|
694
780
|
justify-content: flex-end;
|
|
695
781
|
}
|
|
696
|
-
.app__dev-svc-hint {
|
|
697
|
-
margin: 8px 0 0;
|
|
698
|
-
font-size: 11px;
|
|
699
|
-
line-height: 1.5;
|
|
700
|
-
color: var(--warn, #e0a23a);
|
|
701
|
-
}
|
|
702
782
|
/* 部署态未配置本地服务:顶部提示条 */
|
|
703
783
|
.app__nosvc-banner {
|
|
704
784
|
padding: 8px 14px;
|
|
705
785
|
font-size: 13px;
|
|
706
786
|
color: var(--warn, #e0a23a);
|
|
707
787
|
background: var(--warn-soft, rgba(224, 162, 58, 0.12));
|
|
708
|
-
/* border-bottom: 1px solid var(--warn-border, rgba(224, 162, 58, 0.35)); */
|
|
709
788
|
}
|
|
710
789
|
/* 「已断开」提示条:红色(连接彻底失败 / 服务已停止),区别于未配置的琥珀色 */
|
|
711
790
|
.app__nosvc-banner--disconnected {
|
|
@@ -877,6 +956,45 @@ body {
|
|
|
877
956
|
0%, 100% { opacity: 1; }
|
|
878
957
|
50% { opacity: 0.3; }
|
|
879
958
|
}
|
|
959
|
+
/* 校验通过:徽标局部庆祝动画 */
|
|
960
|
+
.app__badge.is-celebrating { animation: app-badge-pop 0.5s ease; }
|
|
961
|
+
@keyframes app-badge-pop {
|
|
962
|
+
0% { transform: scale(1); }
|
|
963
|
+
35% { transform: scale(1.18); }
|
|
964
|
+
100% { transform: scale(1); }
|
|
965
|
+
}
|
|
966
|
+
.app__confetti {
|
|
967
|
+
position: fixed;
|
|
968
|
+
pointer-events: none;
|
|
969
|
+
z-index: 9999;
|
|
970
|
+
}
|
|
971
|
+
.app__confetti-bit {
|
|
972
|
+
position: absolute;
|
|
973
|
+
left: 0;
|
|
974
|
+
top: 0;
|
|
975
|
+
border-radius: 0;
|
|
976
|
+
/* 玻璃刻面:一角亮白高光 → 主色 → 暗刻面,半透明;clip-path 裁出尖锐碎片 */
|
|
977
|
+
background: linear-gradient(135deg,
|
|
978
|
+
rgba(255, 255, 255, 0.95) 0%,
|
|
979
|
+
var(--c, #52c41a) 42%,
|
|
980
|
+
color-mix(in srgb, var(--c, #52c41a) 62%, #000) 100%);
|
|
981
|
+
clip-path: var(--clip, polygon(50% 0%, 0% 100%, 100% 100%));
|
|
982
|
+
opacity: var(--o, 0.9);
|
|
983
|
+
transform: translate(-50%, -50%);
|
|
984
|
+
animation: app-confetti-fly 0.7s ease-out forwards;
|
|
985
|
+
/* 细微暗边,让半透明玻璃在浅色顶栏上也立得住 */
|
|
986
|
+
filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.18));
|
|
987
|
+
}
|
|
988
|
+
@keyframes app-confetti-fly {
|
|
989
|
+
0% {
|
|
990
|
+
opacity: var(--o, 0.9);
|
|
991
|
+
transform: translate(calc(-50% + var(--sx, 0px)), calc(-50% + var(--sy, 0px))) rotate(0deg) scale(0.4);
|
|
992
|
+
}
|
|
993
|
+
100% {
|
|
994
|
+
opacity: 0;
|
|
995
|
+
transform: translate(calc(-50% + var(--sx, 0px) + var(--tx)), calc(-50% + var(--sy, 0px) + var(--ty))) rotate(var(--rot)) scale(1);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
880
998
|
.app__icon {
|
|
881
999
|
width: 15px;
|
|
882
1000
|
height: 15px;
|
|
@@ -906,6 +1024,7 @@ body {
|
|
|
906
1024
|
flex-direction: column;
|
|
907
1025
|
min-width: 0;
|
|
908
1026
|
min-height: 0;
|
|
1027
|
+
border-left: var(--hairline) solid var(--border);
|
|
909
1028
|
}
|
|
910
1029
|
.workside__bar {
|
|
911
1030
|
flex: 0 0 auto;
|
|
@@ -970,6 +1089,7 @@ body {
|
|
|
970
1089
|
left: calc(var(--preview-width) - 3px);
|
|
971
1090
|
width: 6px;
|
|
972
1091
|
cursor: col-resize;
|
|
1092
|
+
touch-action: none; /* 防止触控板/触摸滚动抢走 pointermove,保证拖拽捕获生效 */
|
|
973
1093
|
z-index: var(--z-sticky);
|
|
974
1094
|
transition: background 0.15s ease;
|
|
975
1095
|
}
|
|
@@ -1015,7 +1135,7 @@ body {
|
|
|
1015
1135
|
align-items: center;
|
|
1016
1136
|
gap: 4px;
|
|
1017
1137
|
padding: 0 8px;
|
|
1018
|
-
border-bottom:
|
|
1138
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
1019
1139
|
}
|
|
1020
1140
|
.canvas-bar__spacer {
|
|
1021
1141
|
flex: 1 1 auto;
|
|
@@ -1064,6 +1184,10 @@ body {
|
|
|
1064
1184
|
.canvas-bar__swatch--gray {
|
|
1065
1185
|
background: #f0f0f0;
|
|
1066
1186
|
}
|
|
1187
|
+
/* 近黑而非纯 #000:留出一点灰阶,深色卡片边缘与阴影仍能分辨 */
|
|
1188
|
+
.canvas-bar__swatch--black {
|
|
1189
|
+
background: #1c1c1e;
|
|
1190
|
+
}
|
|
1067
1191
|
.canvas-bar__swatch--checker {
|
|
1068
1192
|
background-color: #ffffff;
|
|
1069
1193
|
background-image:
|
|
@@ -1138,13 +1262,22 @@ body {
|
|
|
1138
1262
|
border: none;
|
|
1139
1263
|
padding: 0 10px;
|
|
1140
1264
|
}
|
|
1141
|
-
.statusbar .app__btn--connected { color: var(--ok); }
|
|
1142
1265
|
.statusbar .app__btn--reconnecting { color: var(--warn); }
|
|
1143
1266
|
.statusbar .app__btn--disconnected { color: var(--danger); }
|
|
1144
1267
|
.statusbar .app__btn--warn { color: var(--warn); }
|
|
1268
|
+
/* 连接成功回落状态栏默认色(铁律:仅 warn / danger 着语义色);顶栏「连接」按钮的绿色不受影响。
|
|
1269
|
+
hover 同statusbar 读数语言:极淡底色 + 提亮文字,不引入 ok 语义色。 */
|
|
1270
|
+
.statusbar .app__btn--connected {
|
|
1271
|
+
color: var(--text-dim);
|
|
1272
|
+
}
|
|
1273
|
+
.statusbar .app__btn--connected:hover:not(:disabled) {
|
|
1274
|
+
background: var(--bg-hover);
|
|
1275
|
+
color: var(--text);
|
|
1276
|
+
border-color: transparent;
|
|
1277
|
+
}
|
|
1145
1278
|
/* 连接指示器现为可点按钮(开合底部「服务日志」面板):保持状态栏读数观感
|
|
1146
|
-
(无边框 /
|
|
1147
|
-
|
|
1279
|
+
(无边框 / 无圆角、不设选中态),hover 仅加极淡底色提示可点。
|
|
1280
|
+
配色同状态栏铁律:仅重连(warn)/ 断开(danger)/ 未配置(warn)着语义色,连接成功用默认色。 */
|
|
1148
1281
|
button.statusbar__conn {
|
|
1149
1282
|
cursor: pointer;
|
|
1150
1283
|
font: inherit;
|
|
@@ -1198,6 +1331,9 @@ button.statusbar__conn {
|
|
|
1198
1331
|
.phone__screen--bg-gray {
|
|
1199
1332
|
background: #f0f0f0;
|
|
1200
1333
|
}
|
|
1334
|
+
.phone__screen--bg-black {
|
|
1335
|
+
background: #1c1c1e;
|
|
1336
|
+
}
|
|
1201
1337
|
.phone__screen::-webkit-scrollbar {
|
|
1202
1338
|
display: none; /* WebKit:隐藏滚动条(仍可滚动) */
|
|
1203
1339
|
}
|
|
@@ -1247,10 +1383,11 @@ button.statusbar__conn {
|
|
|
1247
1383
|
flex: 1 1 auto;
|
|
1248
1384
|
display: flex;
|
|
1249
1385
|
flex-direction: column;
|
|
1250
|
-
/*
|
|
1251
|
-
|
|
1386
|
+
/* 中栏最小宽度:由 App 以 --debug-min 下发(= floor(屏宽/3)),与右栏拖拽夹取同一口径。
|
|
1387
|
+
此前这里写 33.333vw(小数)而 JS 夹取用 floor(innerWidth/3)(取整),极限位置差出 ~1px
|
|
1388
|
+
→ 两栏行内溢出、接缝脱离光标产生跳动;统一由 JS 下发后消除(未下发时回落 33.333vw)。 */
|
|
1389
|
+
min-width: var(--debug-min, 33.333vw);
|
|
1252
1390
|
background: var(--bg-panel);
|
|
1253
|
-
border-left: 1px solid var(--border);
|
|
1254
1391
|
}
|
|
1255
1392
|
|
|
1256
1393
|
/* 右侧常驻「接口调用」面板:默认 360px 宽,可经中右分隔条拖拽调节(最小 320px,
|
|
@@ -1259,12 +1396,15 @@ button.statusbar__conn {
|
|
|
1259
1396
|
.apipanel {
|
|
1260
1397
|
flex: 0 0 auto;
|
|
1261
1398
|
width: var(--api-panel-width, 360px);
|
|
1262
|
-
min-width
|
|
1399
|
+
/* 320px 下限由 App 的 apiPanelBounds 统一夹取(单一来源):这里再写死 min-width 会在
|
|
1400
|
+
窄窗口 / 预览列拖宽时与中栏 min-width 相加撑破两栏容器,把面板推出视口 → 拖到极限跳动 */
|
|
1401
|
+
min-width: 0;
|
|
1402
|
+
max-width: 100%;
|
|
1263
1403
|
display: flex;
|
|
1264
1404
|
flex-direction: column;
|
|
1265
1405
|
min-height: 0;
|
|
1266
1406
|
background: var(--bg-panel);
|
|
1267
|
-
border-left:
|
|
1407
|
+
border-left: var(--hairline) solid var(--border);
|
|
1268
1408
|
}
|
|
1269
1409
|
.apipanel__head {
|
|
1270
1410
|
flex: 0 0 auto;
|
|
@@ -1274,7 +1414,7 @@ button.statusbar__conn {
|
|
|
1274
1414
|
/* 与调试面板 tab 条同高(12px 上下 padding + 13px 字号 ≈ 42px),保证三条栏顶线对齐 */
|
|
1275
1415
|
height: 40px;
|
|
1276
1416
|
padding: 0 12px;
|
|
1277
|
-
border-bottom:
|
|
1417
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
1278
1418
|
}
|
|
1279
1419
|
.apipanel__title {
|
|
1280
1420
|
font-size: 13px;
|
|
@@ -1353,7 +1493,7 @@ button.statusbar__conn {
|
|
|
1353
1493
|
}
|
|
1354
1494
|
.debug__tabs {
|
|
1355
1495
|
display: flex;
|
|
1356
|
-
border-bottom:
|
|
1496
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
1357
1497
|
}
|
|
1358
1498
|
.debug__tab {
|
|
1359
1499
|
flex: 1;
|
|
@@ -1364,7 +1504,6 @@ button.statusbar__conn {
|
|
|
1364
1504
|
color: var(--text-dim);
|
|
1365
1505
|
font-size: 13px;
|
|
1366
1506
|
cursor: pointer;
|
|
1367
|
-
/* border-bottom: 2px solid transparent; */
|
|
1368
1507
|
transition: color 0.15s;
|
|
1369
1508
|
position: relative;
|
|
1370
1509
|
}
|
|
@@ -1373,7 +1512,6 @@ button.statusbar__conn {
|
|
|
1373
1512
|
}
|
|
1374
1513
|
.debug__tab--active {
|
|
1375
1514
|
color: var(--accent);
|
|
1376
|
-
/* border-bottom-color: var(--accent); */
|
|
1377
1515
|
|
|
1378
1516
|
&::after {
|
|
1379
1517
|
content: '';
|
|
@@ -1399,7 +1537,6 @@ button.statusbar__conn {
|
|
|
1399
1537
|
position: relative;
|
|
1400
1538
|
flex: 1 1 auto;
|
|
1401
1539
|
overflow: auto;
|
|
1402
|
-
/* padding: 12px 16px; */
|
|
1403
1540
|
}
|
|
1404
1541
|
.debug__meta {
|
|
1405
1542
|
margin: 0;
|
|
@@ -1458,7 +1595,7 @@ button.statusbar__conn {
|
|
|
1458
1595
|
margin: auto -12px 0;
|
|
1459
1596
|
padding: 10px 12px;
|
|
1460
1597
|
background: var(--bg-panel);
|
|
1461
|
-
border-top:
|
|
1598
|
+
border-top: var(--hairline) solid var(--border);
|
|
1462
1599
|
color: var(--text-faint);
|
|
1463
1600
|
font-size: 12px;
|
|
1464
1601
|
line-height: 1.6;
|
|
@@ -1479,7 +1616,7 @@ button.statusbar__conn {
|
|
|
1479
1616
|
/* hidden 避免面板自身出现滚动条(滚动交给 .statepanel__tree) */
|
|
1480
1617
|
overflow: hidden;
|
|
1481
1618
|
background: var(--bg-panel);
|
|
1482
|
-
border-top:
|
|
1619
|
+
border-top: var(--hairline) solid var(--border-strong);
|
|
1483
1620
|
}
|
|
1484
1621
|
.statepanel__head {
|
|
1485
1622
|
flex: 0 0 auto;
|
|
@@ -1488,7 +1625,7 @@ button.statusbar__conn {
|
|
|
1488
1625
|
gap: 8px;
|
|
1489
1626
|
height: var(--ctrl-lg);
|
|
1490
1627
|
padding: 0 12px;
|
|
1491
|
-
border-bottom:
|
|
1628
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
1492
1629
|
font-size: 13px;
|
|
1493
1630
|
color: var(--text);
|
|
1494
1631
|
}
|
|
@@ -1561,11 +1698,6 @@ button.statusbar__conn {
|
|
|
1561
1698
|
padding: 8px 12px 10px;
|
|
1562
1699
|
}
|
|
1563
1700
|
|
|
1564
|
-
/* 状态栏「运行态」指示器:复用问题/事件指示器的统一语言(无边框/无圆角/无 hover 背景块)。
|
|
1565
|
-
展开时仅文字着 accent 色,与 is-log 一致,作为「面板已打开」的轻量提示。 */
|
|
1566
|
-
.statusbar__item--prob.is-open {
|
|
1567
|
-
color: var(--accent);
|
|
1568
|
-
}
|
|
1569
1701
|
.debug__tag {
|
|
1570
1702
|
display: inline-block;
|
|
1571
1703
|
padding: 1px 8px;
|
|
@@ -1610,7 +1742,7 @@ button.statusbar__conn {
|
|
|
1610
1742
|
border-radius: 0;
|
|
1611
1743
|
/* 左侧红条标示错误归属;行底透明避免整片红块,hover 才整行染 danger 色 */
|
|
1612
1744
|
border-left: 2px solid var(--danger);
|
|
1613
|
-
border-bottom:
|
|
1745
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
1614
1746
|
background: transparent;
|
|
1615
1747
|
color: var(--err-item-fg);
|
|
1616
1748
|
font-size: 11px;
|
|
@@ -1656,12 +1788,6 @@ button.statusbar__conn {
|
|
|
1656
1788
|
font-weight: 600;
|
|
1657
1789
|
opacity: 0.85;
|
|
1658
1790
|
}
|
|
1659
|
-
.debug__pre {
|
|
1660
|
-
margin: 4px 0 0;
|
|
1661
|
-
white-space: pre-wrap;
|
|
1662
|
-
font-size: 11px;
|
|
1663
|
-
color: var(--text-dim);
|
|
1664
|
-
}
|
|
1665
1791
|
|
|
1666
1792
|
/* 接口调用条目:方法名 + 最右侧复制图标 */
|
|
1667
1793
|
.debug__api-row {
|
|
@@ -1759,40 +1885,28 @@ button.statusbar__conn {
|
|
|
1759
1885
|
}
|
|
1760
1886
|
.apt__children {
|
|
1761
1887
|
padding-left: 16px;
|
|
1762
|
-
border-left:
|
|
1888
|
+
border-left: var(--hairline) solid var(--border);
|
|
1763
1889
|
margin-left: 4px;
|
|
1764
1890
|
}
|
|
1765
1891
|
.apt__close {
|
|
1766
1892
|
padding: 1px 4px 1px 20px;
|
|
1767
1893
|
color: var(--text-faint);
|
|
1768
1894
|
}
|
|
1769
|
-
.debug__scope {
|
|
1770
|
-
margin: 0;
|
|
1771
|
-
font-size: 11px;
|
|
1772
|
-
line-height: 1.5;
|
|
1773
|
-
white-space: pre-wrap;
|
|
1774
|
-
color: var(--text-dim);
|
|
1775
|
-
}
|
|
1776
1895
|
|
|
1777
|
-
/*
|
|
1896
|
+
/* 变量 mock 二级视图 / 运行态:JSON 内容区 + 底部操作按钮
|
|
1778
1897
|
容器铺满调试面板主体(绝对定位贴合 body 内边距区域),内部用 flex 列布局,
|
|
1779
1898
|
JSON 树占据剩余空间并可独立滚动,底部操作按钮始终钉在底部——
|
|
1780
1899
|
数据较少时不再上浮,数据较多时树内部滚动而按钮不随之移动。 */
|
|
1781
1900
|
.debug__scope-wrap {
|
|
1782
1901
|
position: absolute;
|
|
1783
1902
|
/* right:0 让 JSON 树滚动条紧贴面板最右边(与其他 tab 用 body padding 作
|
|
1784
|
-
16px 滚动框不同,本 tab 滚动交给内部 .debug__scope-
|
|
1903
|
+
16px 滚动框不同,本 tab 滚动交给内部 .debug__scope-raw,需要贴边);
|
|
1785
1904
|
left:16px 与 body 的 16px 内边距对齐,让树内容左缘与其他 tab 一致。 */
|
|
1786
1905
|
inset: 0;
|
|
1787
1906
|
display: flex;
|
|
1788
1907
|
flex-direction: column;
|
|
1789
1908
|
min-height: 0;
|
|
1790
1909
|
}
|
|
1791
|
-
.debug__scope-tree {
|
|
1792
|
-
flex: 1 1 auto;
|
|
1793
|
-
min-height: 0;
|
|
1794
|
-
overflow: auto;
|
|
1795
|
-
}
|
|
1796
1910
|
.debug__scope-foot {
|
|
1797
1911
|
position: absolute;
|
|
1798
1912
|
bottom: 10px;
|
|
@@ -1806,7 +1920,8 @@ button.statusbar__conn {
|
|
|
1806
1920
|
background: var(--bg-bar);
|
|
1807
1921
|
border: 1px solid var(--border);
|
|
1808
1922
|
border-radius: 10px;
|
|
1809
|
-
|
|
1923
|
+
/* 阴影走 token:深色 0.28 不变,浅色收到 0.10,白底上不再糊一团灰雾 */
|
|
1924
|
+
box-shadow: 0 6px 18px var(--shadow-toast);
|
|
1810
1925
|
}
|
|
1811
1926
|
.debug__copied {
|
|
1812
1927
|
margin: 0 4px 0 8px;
|
|
@@ -1852,13 +1967,13 @@ button.statusbar__conn {
|
|
|
1852
1967
|
}
|
|
1853
1968
|
/* 按钮分组间的竖向分隔线 */
|
|
1854
1969
|
.debug__sep {
|
|
1855
|
-
width:
|
|
1970
|
+
width: var(--hairline);
|
|
1856
1971
|
height: 16px;
|
|
1857
1972
|
margin: 0 2px;
|
|
1858
1973
|
background: var(--border-strong);
|
|
1859
1974
|
}
|
|
1860
1975
|
|
|
1861
|
-
/*
|
|
1976
|
+
/* 变量 mock 的 Raw JSON 编辑器:直接复用 .debug__scope-wrap 的绝对定位盒(inset 已占满 body 内容区),
|
|
1862
1977
|
不再额外设 height:100%——否则 top/inset 的 bottom 与 height 冲突,盒子会比内容区高 10px,
|
|
1863
1978
|
底部「应用/取消」按钮被挤出可视区、需滚动才见。这里仅保留 flex 列布局语义:
|
|
1864
1979
|
编辑器占剩余空间并内部滚动,底部操作按钮始终钉在底部。 */
|
|
@@ -1880,8 +1995,6 @@ button.statusbar__conn {
|
|
|
1880
1995
|
padding: 12px 14px;
|
|
1881
1996
|
background: var(--bg-input);
|
|
1882
1997
|
color: var(--text);
|
|
1883
|
-
/* border: 1px solid var(--border-strong); */
|
|
1884
|
-
/* border-radius: 8px; */
|
|
1885
1998
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
1886
1999
|
font-size: 12px;
|
|
1887
2000
|
line-height: 1.6;
|
|
@@ -1890,34 +2003,439 @@ button.statusbar__conn {
|
|
|
1890
2003
|
overflow: auto;
|
|
1891
2004
|
outline: none;
|
|
1892
2005
|
}
|
|
1893
|
-
/*
|
|
1894
|
-
|
|
1895
|
-
} */
|
|
1896
|
-
/* CodeJar 托管的原始 JSON 编辑器:Prism(json) 语法高亮配色(与 SetCode 暗色面板一致) */
|
|
2006
|
+
/* CodeJar 托管的 JSON 编辑器(mock Raw 视图 + 变量弹窗默认值代码区):
|
|
2007
|
+
Prism(json) 语法高亮配色(与 SetCode 暗色面板一致) */
|
|
1897
2008
|
.debug__raw-editor .token.property,
|
|
1898
2009
|
.debug__raw-editor .token.tag,
|
|
1899
2010
|
.debug__raw-editor .token.boolean,
|
|
1900
2011
|
.debug__raw-editor .token.number,
|
|
1901
2012
|
.debug__raw-editor .token.constant,
|
|
1902
|
-
.debug__raw-editor .token.symbol
|
|
2013
|
+
.debug__raw-editor .token.symbol,
|
|
2014
|
+
.vars-dlg__code .token.property,
|
|
2015
|
+
.vars-dlg__code .token.tag,
|
|
2016
|
+
.vars-dlg__code .token.boolean,
|
|
2017
|
+
.vars-dlg__code .token.number,
|
|
2018
|
+
.vars-dlg__code .token.constant,
|
|
2019
|
+
.vars-dlg__code .token.symbol { color: var(--code-prop); }
|
|
1903
2020
|
.debug__raw-editor .token.selector,
|
|
1904
2021
|
.debug__raw-editor .token.attr-name,
|
|
1905
2022
|
.debug__raw-editor .token.string,
|
|
1906
2023
|
.debug__raw-editor .token.char,
|
|
1907
|
-
.debug__raw-editor .token.builtin
|
|
2024
|
+
.debug__raw-editor .token.builtin,
|
|
2025
|
+
.vars-dlg__code .token.selector,
|
|
2026
|
+
.vars-dlg__code .token.attr-name,
|
|
2027
|
+
.vars-dlg__code .token.string,
|
|
2028
|
+
.vars-dlg__code .token.char,
|
|
2029
|
+
.vars-dlg__code .token.builtin { color: var(--code-str); }
|
|
1908
2030
|
.debug__raw-editor .token.operator,
|
|
1909
2031
|
.debug__raw-editor .token.entity,
|
|
1910
|
-
.debug__raw-editor .token.url
|
|
1911
|
-
.
|
|
2032
|
+
.debug__raw-editor .token.url,
|
|
2033
|
+
.vars-dlg__code .token.operator,
|
|
2034
|
+
.vars-dlg__code .token.entity,
|
|
2035
|
+
.vars-dlg__code .token.url { color: var(--code-num); }
|
|
2036
|
+
.debug__raw-editor .token.punctuation,
|
|
2037
|
+
.vars-dlg__code .token.punctuation { color: var(--code-punc); }
|
|
1912
2038
|
.debug__raw-editor .token.keyword,
|
|
1913
|
-
.debug__raw-editor .token.null
|
|
2039
|
+
.debug__raw-editor .token.null,
|
|
2040
|
+
.vars-dlg__code .token.keyword,
|
|
2041
|
+
.vars-dlg__code .token.null { color: var(--code-kw); }
|
|
1914
2042
|
.debug__raw-editor .token.function,
|
|
1915
|
-
.debug__raw-editor .token.class-name
|
|
1916
|
-
.
|
|
2043
|
+
.debug__raw-editor .token.class-name,
|
|
2044
|
+
.vars-dlg__code .token.function,
|
|
2045
|
+
.vars-dlg__code .token.class-name { color: var(--code-fn); }
|
|
2046
|
+
/* mock 编辑器报错提示条:与顶部提示条(.app__nosvc-banner)同语言 ——
|
|
2047
|
+
语义色软底通栏 + 图标 + 关闭钮;置于编辑器顶部,不挤占编辑区滚动 */
|
|
2048
|
+
.raw-err-bar {
|
|
1917
2049
|
flex: 0 0 auto;
|
|
1918
|
-
|
|
2050
|
+
display: flex;
|
|
2051
|
+
align-items: center;
|
|
2052
|
+
gap: 6px;
|
|
2053
|
+
/* 比顶部提示条小一号:面板内嵌条,不抢编辑区视觉 */
|
|
2054
|
+
padding: 4px 10px;
|
|
2055
|
+
color: var(--danger, #ef4444);
|
|
2056
|
+
background: var(--danger-soft, rgba(239, 68, 68, 0.12));
|
|
2057
|
+
font-size: 11px;
|
|
2058
|
+
line-height: 1.5;
|
|
2059
|
+
}
|
|
2060
|
+
.raw-err-bar__icn {
|
|
2061
|
+
flex: 0 0 12px;
|
|
2062
|
+
width: 12px;
|
|
2063
|
+
height: 12px;
|
|
2064
|
+
}
|
|
2065
|
+
.raw-err-bar__msg {
|
|
2066
|
+
flex: 1 1 auto;
|
|
2067
|
+
min-width: 0;
|
|
2068
|
+
}
|
|
2069
|
+
.raw-err-bar__close {
|
|
2070
|
+
flex: 0 0 auto;
|
|
2071
|
+
width: 18px;
|
|
2072
|
+
height: 18px;
|
|
2073
|
+
display: inline-flex;
|
|
2074
|
+
align-items: center;
|
|
2075
|
+
justify-content: center;
|
|
2076
|
+
padding: 0;
|
|
2077
|
+
border: none;
|
|
2078
|
+
border-radius: 4px;
|
|
2079
|
+
background: none;
|
|
2080
|
+
color: inherit;
|
|
2081
|
+
opacity: 0.7;
|
|
2082
|
+
font-size: 11px;
|
|
2083
|
+
line-height: 1;
|
|
2084
|
+
cursor: pointer;
|
|
2085
|
+
transition: opacity 0.12s;
|
|
2086
|
+
}
|
|
2087
|
+
.raw-err-bar__close:hover {
|
|
2088
|
+
opacity: 1;
|
|
2089
|
+
}
|
|
2090
|
+
|
|
2091
|
+
/* ===== 变量管理(原「绑定数据」tab)=====
|
|
2092
|
+
列表视图管理 schema.dictionary.inputParams;mock 编辑收进二级视图。
|
|
2093
|
+
行内信息密度优先:key 等宽 + 类型芯片 + mock 徽标 + 中文名/描述弱化,操作 hover 浮现。 */
|
|
2094
|
+
.vars {
|
|
2095
|
+
height: 100%;
|
|
2096
|
+
min-height: 0;
|
|
2097
|
+
display: flex;
|
|
2098
|
+
flex-direction: column;
|
|
2099
|
+
/* 右下角悬浮操作组的定位锚 */
|
|
2100
|
+
position: relative;
|
|
2101
|
+
}
|
|
2102
|
+
.vars__list {
|
|
2103
|
+
flex: 1 1 auto;
|
|
2104
|
+
min-height: 0;
|
|
2105
|
+
margin: 0;
|
|
2106
|
+
/* 底部留出悬浮操作组的高度,末行不被遮 */
|
|
2107
|
+
padding: 8px 8px 52px;
|
|
2108
|
+
list-style: none;
|
|
2109
|
+
overflow-y: auto;
|
|
2110
|
+
display: flex;
|
|
2111
|
+
flex-direction: column;
|
|
2112
|
+
gap: 2px;
|
|
2113
|
+
}
|
|
2114
|
+
.vars__row {
|
|
2115
|
+
display: flex;
|
|
2116
|
+
align-items: center;
|
|
2117
|
+
gap: 6px;
|
|
2118
|
+
padding: 4px 6px;
|
|
2119
|
+
border-radius: 6px;
|
|
2120
|
+
transition: background 0.12s;
|
|
2121
|
+
/* 双击编辑:禁止双击选中文本造成视觉噪声 */
|
|
2122
|
+
user-select: none;
|
|
2123
|
+
}
|
|
2124
|
+
.vars__row:hover {
|
|
2125
|
+
background: var(--bg-hover);
|
|
2126
|
+
}
|
|
2127
|
+
.vars__key {
|
|
2128
|
+
flex: 0 0 auto;
|
|
2129
|
+
max-width: 46%;
|
|
2130
|
+
overflow: hidden;
|
|
2131
|
+
text-overflow: ellipsis;
|
|
2132
|
+
white-space: nowrap;
|
|
2133
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
2134
|
+
font-size: 12px;
|
|
2135
|
+
color: var(--text);
|
|
2136
|
+
}
|
|
2137
|
+
.vars__type {
|
|
2138
|
+
flex: 0 0 auto;
|
|
2139
|
+
padding: 1px 6px;
|
|
2140
|
+
border-radius: var(--radius-pill);
|
|
2141
|
+
background: var(--bg-active);
|
|
2142
|
+
color: var(--text-dim);
|
|
2143
|
+
font-size: 10px;
|
|
2144
|
+
line-height: 1.5;
|
|
2145
|
+
}
|
|
2146
|
+
/* 类型标签按类型分浅色:色相取自 --type-*(暗色等同代码高亮调色板,亮色单独校正
|
|
2147
|
+
string 为绿系,避免与 number 蓝调撞色);软底用 color-mix 取低透明度,文字保持
|
|
2148
|
+
高对比可读。五色:string 绿 / number 蓝 / boolean 红 / array 紫 / object 橙。 */
|
|
2149
|
+
.vars__type--string {
|
|
2150
|
+
color: var(--type-string);
|
|
2151
|
+
background: color-mix(in srgb, var(--type-string) 14%, transparent);
|
|
2152
|
+
}
|
|
2153
|
+
.vars__type--number {
|
|
2154
|
+
color: var(--type-number);
|
|
2155
|
+
background: color-mix(in srgb, var(--type-number) 14%, transparent);
|
|
2156
|
+
}
|
|
2157
|
+
.vars__type--boolean {
|
|
2158
|
+
color: var(--type-boolean);
|
|
2159
|
+
background: color-mix(in srgb, var(--type-boolean) 14%, transparent);
|
|
2160
|
+
}
|
|
2161
|
+
.vars__type--array {
|
|
2162
|
+
color: var(--type-array);
|
|
2163
|
+
background: color-mix(in srgb, var(--type-array) 14%, transparent);
|
|
2164
|
+
}
|
|
2165
|
+
.vars__type--object {
|
|
2166
|
+
color: var(--type-object);
|
|
2167
|
+
background: color-mix(in srgb, var(--type-object) 14%, transparent);
|
|
2168
|
+
}
|
|
2169
|
+
/* mock 徽标:与运营平台变量列表的 m 标记同语义(已配置 mock 默认值) */
|
|
2170
|
+
.vars__mock {
|
|
2171
|
+
flex: 0 0 auto;
|
|
2172
|
+
width: 14px;
|
|
2173
|
+
height: 14px;
|
|
2174
|
+
display: inline-flex;
|
|
2175
|
+
align-items: center;
|
|
2176
|
+
justify-content: center;
|
|
2177
|
+
border-radius: 50%;
|
|
2178
|
+
background: var(--warn-soft);
|
|
2179
|
+
color: var(--warn);
|
|
2180
|
+
font-size: 9px;
|
|
2181
|
+
line-height: 1;
|
|
2182
|
+
}
|
|
2183
|
+
.vars__name {
|
|
2184
|
+
flex: 1 1 auto;
|
|
2185
|
+
min-width: 0;
|
|
2186
|
+
overflow: hidden;
|
|
2187
|
+
text-overflow: ellipsis;
|
|
2188
|
+
white-space: nowrap;
|
|
2189
|
+
color: var(--text-faint);
|
|
2190
|
+
font-size: 11px;
|
|
2191
|
+
}
|
|
2192
|
+
/* 行内操作:常占位、仅淡入淡出 —— 用 display 切换会挤动 key/name 造成 hover 跳动 */
|
|
2193
|
+
.vars__ops {
|
|
2194
|
+
flex: 0 0 auto;
|
|
2195
|
+
display: inline-flex;
|
|
2196
|
+
gap: 2px;
|
|
2197
|
+
opacity: 0;
|
|
2198
|
+
transition: opacity 0.12s;
|
|
2199
|
+
}
|
|
2200
|
+
.vars__row:hover .vars__ops,
|
|
2201
|
+
.vars__row:focus-within .vars__ops {
|
|
2202
|
+
opacity: 1;
|
|
2203
|
+
}
|
|
2204
|
+
.vars__op {
|
|
2205
|
+
width: 20px;
|
|
2206
|
+
height: 20px;
|
|
2207
|
+
display: inline-flex;
|
|
2208
|
+
align-items: center;
|
|
2209
|
+
justify-content: center;
|
|
2210
|
+
padding: 0;
|
|
2211
|
+
background: none;
|
|
2212
|
+
border: none;
|
|
2213
|
+
border-radius: 4px;
|
|
2214
|
+
color: var(--text-faint);
|
|
2215
|
+
cursor: pointer;
|
|
2216
|
+
transition: background 0.12s, color 0.12s;
|
|
2217
|
+
}
|
|
2218
|
+
.vars__op svg {
|
|
2219
|
+
width: 13px;
|
|
2220
|
+
height: 13px;
|
|
2221
|
+
display: block;
|
|
2222
|
+
}
|
|
2223
|
+
.vars__op:hover {
|
|
2224
|
+
background: var(--bg-active);
|
|
2225
|
+
color: var(--text);
|
|
2226
|
+
}
|
|
2227
|
+
.vars__op--del:hover {
|
|
2228
|
+
background: var(--danger-soft);
|
|
2229
|
+
color: var(--danger);
|
|
2230
|
+
}
|
|
2231
|
+
/* 无默认值时禁用(复制钮):压淡并保持无 hover 反馈,避免误点无响应 */
|
|
2232
|
+
.vars__op:disabled,
|
|
2233
|
+
.vars__op:disabled:hover {
|
|
2234
|
+
background: none;
|
|
2235
|
+
color: var(--text-faint);
|
|
2236
|
+
opacity: 0.35;
|
|
2237
|
+
cursor: default;
|
|
2238
|
+
}
|
|
2239
|
+
/* 复制成功的 ✓ 沿用 .debug__copy-ok 配色,按行内 13px 图标尺度收一号 */
|
|
2240
|
+
.vars__op .debug__copy-ok {
|
|
2241
|
+
font-size: 12px;
|
|
2242
|
+
}
|
|
2243
|
+
/* 右下角悬浮操作组:卡片容器 + 投影,与 mock 视图 .debug__scope-foot 同语言 */
|
|
2244
|
+
.vars__fabs {
|
|
2245
|
+
position: absolute;
|
|
2246
|
+
right: 10px;
|
|
2247
|
+
bottom: 10px;
|
|
2248
|
+
display: flex;
|
|
2249
|
+
align-items: center;
|
|
2250
|
+
gap: 8px;
|
|
2251
|
+
padding: 6px;
|
|
2252
|
+
background: var(--bg-bar);
|
|
2253
|
+
border: 1px solid var(--border);
|
|
2254
|
+
border-radius: 10px;
|
|
2255
|
+
box-shadow: 0 6px 18px var(--shadow-toast);
|
|
2256
|
+
}
|
|
2257
|
+
/* mock 二级视图头:返回 + 标题,发丝线分隔 */
|
|
2258
|
+
.vars__mockhead {
|
|
2259
|
+
flex: 0 0 auto;
|
|
2260
|
+
display: flex;
|
|
2261
|
+
align-items: center;
|
|
2262
|
+
gap: 8px;
|
|
2263
|
+
padding: 5px 10px;
|
|
2264
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
2265
|
+
}
|
|
2266
|
+
.vars__back {
|
|
2267
|
+
flex: 0 0 auto;
|
|
2268
|
+
display: inline-flex;
|
|
2269
|
+
align-items: center;
|
|
2270
|
+
gap: 4px;
|
|
2271
|
+
height: 24px;
|
|
2272
|
+
padding: 0 9px 0 7px;
|
|
2273
|
+
background: var(--bg-bar);
|
|
2274
|
+
border: 1px solid var(--border-strong);
|
|
2275
|
+
border-radius: 6px;
|
|
2276
|
+
color: var(--text);
|
|
1919
2277
|
font-size: 12px;
|
|
2278
|
+
font-weight: 500;
|
|
2279
|
+
cursor: pointer;
|
|
2280
|
+
transition: background 0.15s, color 0.15s, border-color 0.15s;
|
|
2281
|
+
}
|
|
2282
|
+
/* hover 走软 accent 三件套(与结构树徽标 / 桥接按钮激活态同语言),让「可点返回」一眼可辨 */
|
|
2283
|
+
.vars__back:hover {
|
|
2284
|
+
background: var(--accent-soft);
|
|
2285
|
+
border-color: var(--accent-border);
|
|
2286
|
+
color: var(--accent);
|
|
2287
|
+
}
|
|
2288
|
+
.vars__back svg {
|
|
2289
|
+
width: 12px;
|
|
2290
|
+
height: 12px;
|
|
2291
|
+
}
|
|
2292
|
+
.vars__mocktitle {
|
|
2293
|
+
color: var(--text-faint);
|
|
2294
|
+
font-size: 11px;
|
|
2295
|
+
}
|
|
2296
|
+
|
|
2297
|
+
/* 变量添加 / 编辑弹窗:骨架与节点属性面板同构(ni-panel / ni-head / ni-foot / ni-field-row),
|
|
2298
|
+
这里只覆写尺寸与表单特有件:宽度同 ni-panel、高度随内容、代码编辑区与必填星号。 */
|
|
2299
|
+
/* node-inspector.css 晚于本文件载入,等特异性下 .ni-panel 的 80vh 会赢,故用双类提特异性 */
|
|
2300
|
+
.ni-panel.vars-dlg {
|
|
2301
|
+
width: 560px;
|
|
2302
|
+
height: auto;
|
|
2303
|
+
min-height: 0;
|
|
2304
|
+
max-height: 80vh;
|
|
2305
|
+
}
|
|
2306
|
+
/* 必填星号:与表单错误同族 danger 色 */
|
|
2307
|
+
.vars-dlg .ni-field-label i {
|
|
2308
|
+
font-style: normal;
|
|
1920
2309
|
color: var(--danger);
|
|
2310
|
+
margin-right: 2px;
|
|
2311
|
+
}
|
|
2312
|
+
/* 默认值 / 描述行:标签与控件首行对齐(28px 控件首行基线) */
|
|
2313
|
+
.ni-field-row--top {
|
|
2314
|
+
align-items: flex-start;
|
|
2315
|
+
}
|
|
2316
|
+
.ni-field-row--top .ni-field-label {
|
|
2317
|
+
line-height: var(--ctrl-sm);
|
|
2318
|
+
}
|
|
2319
|
+
/* Dropdown 撑满控件区(ni-field-row 的 flex 规则只约束 .ni-input) */
|
|
2320
|
+
.vars-dlg__ctrl {
|
|
2321
|
+
flex: 1 1 auto;
|
|
2322
|
+
min-width: 0;
|
|
2323
|
+
}
|
|
2324
|
+
/* 类型下拉的选中值 / 选项:中文名在前、彩色类型标签在后,一行排布。
|
|
2325
|
+
标签沿用变量列表的 .vars__type--<type>(同一套 --type-* 语义色),故两处观感一致;
|
|
2326
|
+
中文名按最长的三字取等宽(3em),让后面的标签在选项列里纵向对齐,扫读更快。 */
|
|
2327
|
+
.vars-type-pick {
|
|
2328
|
+
display: flex;
|
|
2329
|
+
align-items: center;
|
|
2330
|
+
gap: 8px;
|
|
2331
|
+
min-width: 0;
|
|
2332
|
+
}
|
|
2333
|
+
.vars-type-pick .vars__type {
|
|
2334
|
+
flex: 0 0 auto;
|
|
2335
|
+
}
|
|
2336
|
+
.vars-type-pick__name {
|
|
2337
|
+
flex: 0 0 auto;
|
|
2338
|
+
min-width: 3em;
|
|
2339
|
+
overflow: hidden;
|
|
2340
|
+
white-space: nowrap;
|
|
2341
|
+
text-overflow: ellipsis;
|
|
2342
|
+
color: var(--text);
|
|
2343
|
+
}
|
|
2344
|
+
/* 默认值多行编辑区(数组 / 对象的 CodeJar 代码区、字符串的文本域)共用一把尺子:
|
|
2345
|
+
高度下限 = 8 行文本 —— 行高 12px × 1.6 = 19.2px,18px = 上下 padding 16 + 边框 2(border-box)。
|
|
2346
|
+
两者垂直内边距一致,切类型时弹窗高度不跳;min-height 同时夹住 flex 压缩与 resize 拖拽下限,
|
|
2347
|
+
内容超出后在 max-height 内滚动。 */
|
|
2348
|
+
.vars-dlg__code,
|
|
2349
|
+
.vars-dlg__str {
|
|
2350
|
+
min-height: calc(8 * 1.6 * 12px + 18px);
|
|
2351
|
+
max-height: 264px;
|
|
2352
|
+
}
|
|
2353
|
+
/* 数组 / 对象默认值:CodeJar 代码编辑区(与 mock Raw 编辑器同族,嵌入表单行) */
|
|
2354
|
+
.vars-dlg__code {
|
|
2355
|
+
flex: 1 1 auto;
|
|
2356
|
+
min-width: 0;
|
|
2357
|
+
overflow: auto;
|
|
2358
|
+
padding: 8px 12px;
|
|
2359
|
+
background: var(--bg-input);
|
|
2360
|
+
border: 1px solid var(--border-strong);
|
|
2361
|
+
border-radius: 6px;
|
|
2362
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
2363
|
+
font-size: 12px;
|
|
2364
|
+
line-height: 1.6;
|
|
2365
|
+
color: var(--text);
|
|
2366
|
+
tab-size: 2;
|
|
2367
|
+
white-space: pre;
|
|
2368
|
+
outline: none;
|
|
2369
|
+
transition: border-color 0.15s;
|
|
2370
|
+
}
|
|
2371
|
+
.vars-dlg__code:focus {
|
|
2372
|
+
border-color: var(--accent);
|
|
2373
|
+
}
|
|
2374
|
+
/* 字符串默认值:多行文本域(数字走 NumberStepper、布尔走单选,都是单行高),
|
|
2375
|
+
长文案与多行字符串能一眼看全。.ni-input 定义在 node-inspector.css(晚于本文件载入),
|
|
2376
|
+
等特异性下会赢,故用双类提特异性覆盖其 28px 定高与 6px 垂直内边距,与代码区完全同高。 */
|
|
2377
|
+
.ni-input.vars-dlg__str {
|
|
2378
|
+
height: auto;
|
|
2379
|
+
padding: 8px 12px;
|
|
2380
|
+
line-height: 1.6;
|
|
2381
|
+
resize: vertical;
|
|
2382
|
+
overflow: auto;
|
|
2383
|
+
}
|
|
2384
|
+
.vars-dlg__desc {
|
|
2385
|
+
height: auto;
|
|
2386
|
+
/* 高度下限 = 4 行文本:行高 12px(.ni-input)× 1.6 = 19.2px,14px = 上下 padding 12 + 边框 2(border-box)。
|
|
2387
|
+
min-height 同时夹住 resize: vertical 的拖拽下限,拖不小于 4 行。 */
|
|
2388
|
+
min-height: calc(4 * 1.6 * 12px + 14px);
|
|
2389
|
+
max-height: 140px;
|
|
2390
|
+
resize: vertical;
|
|
2391
|
+
line-height: 1.6;
|
|
2392
|
+
}
|
|
2393
|
+
.vars-dlg__err {
|
|
2394
|
+
margin: 2px 0 0;
|
|
2395
|
+
color: var(--danger);
|
|
2396
|
+
font-size: 11px;
|
|
2397
|
+
}
|
|
2398
|
+
/* 新增空白卡片弹窗:两字段表单,比 ni-panel 基线(560×80vh)收小;高度随内容 */
|
|
2399
|
+
.ni-panel.newcard-dlg {
|
|
2400
|
+
width: 420px;
|
|
2401
|
+
height: auto;
|
|
2402
|
+
min-height: 0;
|
|
2403
|
+
max-height: 80vh;
|
|
2404
|
+
}
|
|
2405
|
+
.newcard-dlg .ni-field-label i {
|
|
2406
|
+
font-style: normal;
|
|
2407
|
+
color: var(--danger);
|
|
2408
|
+
margin-right: 2px;
|
|
2409
|
+
}
|
|
2410
|
+
/* 表单区贴内容:去掉滚动容器为长面板预留的底部留白与末行外边距,
|
|
2411
|
+
弹窗高度 = 标题 + 两行表单(+ 报错行)+ 底栏,不留空腔 */
|
|
2412
|
+
.newcard-dlg .ni-body {
|
|
2413
|
+
padding: 14px 0;
|
|
2414
|
+
}
|
|
2415
|
+
.newcard-dlg .ni-scroll {
|
|
2416
|
+
padding: 0 16px;
|
|
2417
|
+
overflow: visible;
|
|
2418
|
+
}
|
|
2419
|
+
.newcard-dlg .ni-field-row:last-of-type {
|
|
2420
|
+
margin-bottom: 0;
|
|
2421
|
+
}
|
|
2422
|
+
.newcard-dlg__err {
|
|
2423
|
+
margin: 12px 0 0;
|
|
2424
|
+
color: var(--danger);
|
|
2425
|
+
font-size: 11px;
|
|
2426
|
+
}
|
|
2427
|
+
/* ID 撞本地已有卡片:输入框描红边,与下方红字提示成对出现。
|
|
2428
|
+
.ni-input / .ni-input:focus 定义在 node-inspector.css(晚于本文件载入),同权重会被 :focus 的
|
|
2429
|
+
accent 边盖掉,所以用 .newcard-dlg 作用域多压一级,并显式覆盖 :focus 态 */
|
|
2430
|
+
.newcard-dlg .ni-input.newcard-dlg__input--dup,
|
|
2431
|
+
.newcard-dlg .ni-input.newcard-dlg__input--dup:focus {
|
|
2432
|
+
border-color: var(--danger);
|
|
2433
|
+
}
|
|
2434
|
+
/* mock 二级视图头部右端弱提示:不抢视觉,仅解释覆盖语义 */
|
|
2435
|
+
.vars__mockhint {
|
|
2436
|
+
margin-left: auto;
|
|
2437
|
+
font-size: 11px;
|
|
2438
|
+
color: var(--text-faint);
|
|
1921
2439
|
}
|
|
1922
2440
|
|
|
1923
2441
|
/* 底部状态栏(类 VSCode 暗色状态栏,沿用主题 token,与顶栏/面板统一) */
|
|
@@ -1930,7 +2448,7 @@ button.statusbar__conn {
|
|
|
1930
2448
|
order: 3;
|
|
1931
2449
|
padding: 0 2px;
|
|
1932
2450
|
background: var(--bg-bar);
|
|
1933
|
-
border-top:
|
|
2451
|
+
border-top: var(--hairline) solid var(--border);
|
|
1934
2452
|
font-size: 12px;
|
|
1935
2453
|
color: var(--text-dim);
|
|
1936
2454
|
user-select: none;
|
|
@@ -1950,9 +2468,9 @@ button.statusbar__conn {
|
|
|
1950
2468
|
.statusbar__item--right {
|
|
1951
2469
|
color: var(--text-faint);
|
|
1952
2470
|
}
|
|
1953
|
-
/*
|
|
1954
|
-
|
|
1955
|
-
|
|
2471
|
+
/* 问题指示器:本质是一行状态栏文本读数,不是按钮——无边框 / 无圆角 / 无 hover 背景块。
|
|
2472
|
+
配色铁律:状态栏文字默认色,仅报错(danger)/ 警告(warn)态着语义色;
|
|
2473
|
+
展开、有日志等非风险态不再着色(面板可见本身即「已展开」的提示)。 */
|
|
1956
2474
|
.statusbar__item--prob {
|
|
1957
2475
|
cursor: pointer;
|
|
1958
2476
|
color: var(--text-dim);
|
|
@@ -1970,12 +2488,6 @@ button.statusbar__conn {
|
|
|
1970
2488
|
.statusbar__item--prob.is-error:hover {
|
|
1971
2489
|
color: var(--danger);
|
|
1972
2490
|
}
|
|
1973
|
-
.statusbar__item--prob.is-log {
|
|
1974
|
-
color: var(--accent);
|
|
1975
|
-
}
|
|
1976
|
-
.statusbar__item--prob.is-log:hover {
|
|
1977
|
-
color: var(--accent);
|
|
1978
|
-
}
|
|
1979
2491
|
.statusbar__item--prob.is-ok {
|
|
1980
2492
|
color: var(--text-faint);
|
|
1981
2493
|
cursor: default;
|
|
@@ -2005,7 +2517,7 @@ button.statusbar__conn {
|
|
|
2005
2517
|
max-height: 60vh;
|
|
2006
2518
|
overflow: hidden;
|
|
2007
2519
|
background: var(--bg-panel);
|
|
2008
|
-
border-top:
|
|
2520
|
+
border-top: var(--hairline) solid var(--border-strong);
|
|
2009
2521
|
}
|
|
2010
2522
|
.errpanel__head {
|
|
2011
2523
|
flex: 0 0 auto;
|
|
@@ -2014,7 +2526,7 @@ button.statusbar__conn {
|
|
|
2014
2526
|
gap: 8px;
|
|
2015
2527
|
height: var(--ctrl-lg);
|
|
2016
2528
|
padding: 0 12px;
|
|
2017
|
-
border-bottom:
|
|
2529
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
2018
2530
|
font-size: 13px;
|
|
2019
2531
|
color: var(--text);
|
|
2020
2532
|
}
|
|
@@ -2225,7 +2737,7 @@ button.statusbar__conn {
|
|
|
2225
2737
|
align-items: baseline;
|
|
2226
2738
|
gap: 8px;
|
|
2227
2739
|
padding: 2px 12px;
|
|
2228
|
-
border-bottom:
|
|
2740
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
2229
2741
|
}
|
|
2230
2742
|
.log__item:last-child {
|
|
2231
2743
|
border-bottom: none;
|
|
@@ -2303,7 +2815,7 @@ button.statusbar__conn {
|
|
|
2303
2815
|
.log__json .apt__list--nested {
|
|
2304
2816
|
margin-left: 4px;
|
|
2305
2817
|
padding-left: 14px;
|
|
2306
|
-
border-left:
|
|
2818
|
+
border-left: var(--hairline) solid var(--border);
|
|
2307
2819
|
}
|
|
2308
2820
|
.log__empty {
|
|
2309
2821
|
color: var(--text-faint);
|
|
@@ -2434,7 +2946,7 @@ button.statusbar__conn {
|
|
|
2434
2946
|
display: flex;
|
|
2435
2947
|
/* 负外边距抵消对话框左右内边距,分割线贯通左右边缘 */
|
|
2436
2948
|
margin: 18px -20px 0;
|
|
2437
|
-
border-top:
|
|
2949
|
+
border-top: var(--hairline) solid #e8e8e8;
|
|
2438
2950
|
}
|
|
2439
2951
|
.dlg__btn {
|
|
2440
2952
|
flex: 1 1 0;
|
|
@@ -2451,7 +2963,7 @@ button.statusbar__conn {
|
|
|
2451
2963
|
}
|
|
2452
2964
|
.dlg__btn--cancel {
|
|
2453
2965
|
color: #1677ff;
|
|
2454
|
-
border-right:
|
|
2966
|
+
border-right: var(--hairline) solid #e8e8e8;
|
|
2455
2967
|
}
|
|
2456
2968
|
/* cancelGrayStyle:取消按钮灰色风格 */
|
|
2457
2969
|
.dlg__btn--cancel.dlg__btn--gray {
|
|
@@ -2615,7 +3127,7 @@ button.statusbar__conn {
|
|
|
2615
3127
|
height: 44px;
|
|
2616
3128
|
padding: 0 16px;
|
|
2617
3129
|
box-sizing: border-box;
|
|
2618
|
-
border-bottom:
|
|
3130
|
+
border-bottom: var(--hairline) solid #eef0f2;
|
|
2619
3131
|
}
|
|
2620
3132
|
.pk-bar__title {
|
|
2621
3133
|
font-size: 15px;
|
|
@@ -2657,8 +3169,8 @@ button.statusbar__conn {
|
|
|
2657
3169
|
height: 40px;
|
|
2658
3170
|
transform: translateY(-50%);
|
|
2659
3171
|
background: rgba(22, 119, 255, 0.08);
|
|
2660
|
-
border-top:
|
|
2661
|
-
border-bottom:
|
|
3172
|
+
border-top: var(--hairline) solid #d6e4ff;
|
|
3173
|
+
border-bottom: var(--hairline) solid #d6e4ff;
|
|
2662
3174
|
pointer-events: none;
|
|
2663
3175
|
}
|
|
2664
3176
|
.pk-col__list {
|
|
@@ -2738,7 +3250,7 @@ button.statusbar__conn {
|
|
|
2738
3250
|
align-items: center;
|
|
2739
3251
|
justify-content: space-between;
|
|
2740
3252
|
padding: 12px 14px;
|
|
2741
|
-
border-bottom:
|
|
3253
|
+
border-bottom: var(--hairline) solid var(--border);
|
|
2742
3254
|
}
|
|
2743
3255
|
.rp-title {
|
|
2744
3256
|
font-size: 14px;
|