cardbuddy 0.6.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 (167) hide show
  1. package/README.md +211 -0
  2. package/dist/cli.js +76 -0
  3. package/dist/config.js +63 -0
  4. package/dist/core.js +2 -0
  5. package/dist/preview-editor/assets/apple-touch-icon-BQcES9QK.png +0 -0
  6. package/dist/preview-editor/assets/default-image-wzZYQ86K.png +0 -0
  7. package/dist/preview-editor/assets/favicon-16-Cg6Nrosk.png +0 -0
  8. package/dist/preview-editor/assets/favicon-32-B_1744sp.png +0 -0
  9. package/dist/preview-editor/assets/index-BYB0hngG.js +72 -0
  10. package/dist/preview-editor/assets/index-CpBZEQDy.css +1 -0
  11. package/dist/preview-editor/assets/site-icon-CFMif8z4.png +0 -0
  12. package/dist/preview-editor/assets/svg-symbols-B2exBrAr.svg +118 -0
  13. package/dist/preview-editor/index.html +17 -0
  14. package/dist/server-core/_vendor/finmall-env.mjs +96 -0
  15. package/dist/server-core/assetProxy.js +154 -0
  16. package/dist/server-core/bbox.js +153 -0
  17. package/dist/server-core/browser.js +108 -0
  18. package/dist/server-core/buildDataFromSchema.js +50 -0
  19. package/dist/server-core/cardFiles.js +188 -0
  20. package/dist/server-core/cardHistory.js +156 -0
  21. package/dist/server-core/cardImage.js +85 -0
  22. package/dist/server-core/cardImportMeta.js +139 -0
  23. package/dist/server-core/cardListCache.js +68 -0
  24. package/dist/server-core/cardOpenFolder.js +135 -0
  25. package/dist/server-core/cardSave.js +127 -0
  26. package/dist/server-core/cardSidecar.js +72 -0
  27. package/dist/server-core/cardSync.js +259 -0
  28. package/dist/server-core/cardValidate.js +134 -0
  29. package/dist/server-core/index.js +82 -0
  30. package/dist/server-core/logger.js +241 -0
  31. package/dist/server-core/nodeModels.js +52 -0
  32. package/dist/server-core/renderStatus.js +207 -0
  33. package/dist/server-core/screenshot.js +123 -0
  34. package/dist/server-core/sliceStatic.js +44 -0
  35. package/dist/standalone.js +447 -0
  36. package/dist/vendored/App.vue +2330 -0
  37. package/dist/vendored/api.js +142 -0
  38. package/dist/vendored/assets/apple-touch-icon.png +0 -0
  39. package/dist/vendored/assets/default-image.png +0 -0
  40. package/dist/vendored/assets/favicon-16.png +0 -0
  41. package/dist/vendored/assets/favicon-32.png +0 -0
  42. package/dist/vendored/assets/logo.png +0 -0
  43. package/dist/vendored/assets/site-icon.png +0 -0
  44. package/dist/vendored/assets/svg-symbols.svg +118 -0
  45. package/dist/vendored/assets/svgIcons/icons.svg +54 -0
  46. package/dist/vendored/assets/svgIcons/index.js +39 -0
  47. package/dist/vendored/components/AbsoluteLayout.vue +42 -0
  48. package/dist/vendored/components/AlertCardInstance.vue +58 -0
  49. package/dist/vendored/components/AlertCardLayer.vue +59 -0
  50. package/dist/vendored/components/ApiPayloadTree.vue +168 -0
  51. package/dist/vendored/components/AppToast.vue +37 -0
  52. package/dist/vendored/components/Button.vue +37 -0
  53. package/dist/vendored/components/Canvas.vue +65 -0
  54. package/dist/vendored/components/CardGallery.vue +243 -0
  55. package/dist/vendored/components/CardPreview.vue +72 -0
  56. package/dist/vendored/components/CardSelect.vue +200 -0
  57. package/dist/vendored/components/CheckGroup.vue +131 -0
  58. package/dist/vendored/components/Column.vue +25 -0
  59. package/dist/vendored/components/ComponentPalette.vue +294 -0
  60. package/dist/vendored/components/ConfirmDialog.vue +39 -0
  61. package/dist/vendored/components/CustomPlaceholder.vue +33 -0
  62. package/dist/vendored/components/DatePickerOverlay.vue +345 -0
  63. package/dist/vendored/components/DebugPanel.vue +806 -0
  64. package/dist/vendored/components/DeviceOverlay.vue +70 -0
  65. package/dist/vendored/components/Divider.vue +22 -0
  66. package/dist/vendored/components/Dropdown.vue +191 -0
  67. package/dist/vendored/components/EventEditor.vue +247 -0
  68. package/dist/vendored/components/GridLayout.vue +67 -0
  69. package/dist/vendored/components/HoverGuides.vue +122 -0
  70. package/dist/vendored/components/Icon.vue +34 -0
  71. package/dist/vendored/components/Image.vue +34 -0
  72. package/dist/vendored/components/Input.vue +90 -0
  73. package/dist/vendored/components/JsonTree.vue +516 -0
  74. package/dist/vendored/components/ListLayout.vue +68 -0
  75. package/dist/vendored/components/LogValue.vue +51 -0
  76. package/dist/vendored/components/Map.vue +110 -0
  77. package/dist/vendored/components/MultiColumn.vue +49 -0
  78. package/dist/vendored/components/MultiText.vue +58 -0
  79. package/dist/vendored/components/NodeInspector.vue +295 -0
  80. package/dist/vendored/components/PickerOverlay.vue +131 -0
  81. package/dist/vendored/components/ProgressSlider.vue +167 -0
  82. package/dist/vendored/components/PropControl.vue +241 -0
  83. package/dist/vendored/components/PropTree.vue +128 -0
  84. package/dist/vendored/components/RadioButton.vue +74 -0
  85. package/dist/vendored/components/RemotePreview.vue +171 -0
  86. package/dist/vendored/components/RenderTree.vue +437 -0
  87. package/dist/vendored/components/Root.vue +30 -0
  88. package/dist/vendored/components/Row.vue +25 -0
  89. package/dist/vendored/components/SelectionOverlay.vue +105 -0
  90. package/dist/vendored/components/StructureTree.vue +949 -0
  91. package/dist/vendored/components/SvgCode.vue +19 -0
  92. package/dist/vendored/components/SvgSymbols.vue +30 -0
  93. package/dist/vendored/components/Switch.vue +38 -0
  94. package/dist/vendored/components/Text.vue +32 -0
  95. package/dist/vendored/components/Video.vue +70 -0
  96. package/dist/vendored/components/ViewContainer.vue +52 -0
  97. package/dist/vendored/components/base.js +12 -0
  98. package/dist/vendored/components/icons.js +47 -0
  99. package/dist/vendored/components/index.js +58 -0
  100. package/dist/vendored/components/setters/SetBgPosition.vue +64 -0
  101. package/dist/vendored/components/setters/SetBgSize.vue +90 -0
  102. package/dist/vendored/components/setters/SetCode.vue +90 -0
  103. package/dist/vendored/components/setters/SetColor.vue +244 -0
  104. package/dist/vendored/components/setters/SetCustomSelect.vue +58 -0
  105. package/dist/vendored/components/setters/SetExpr.vue +107 -0
  106. package/dist/vendored/components/setters/SetGradient.vue +125 -0
  107. package/dist/vendored/components/setters/SetGrid9.vue +68 -0
  108. package/dist/vendored/components/setters/SetIconSelect.vue +67 -0
  109. package/dist/vendored/components/setters/SetIfForm.vue +61 -0
  110. package/dist/vendored/components/setters/SetImage.vue +43 -0
  111. package/dist/vendored/components/setters/SetList.vue +139 -0
  112. package/dist/vendored/components/setters/SetNumber.vue +118 -0
  113. package/dist/vendored/components/setters/SetNumberStyle.vue +113 -0
  114. package/dist/vendored/components/setters/SetPadding.vue +77 -0
  115. package/dist/vendored/components/setters/SetSegment.vue +160 -0
  116. package/dist/vendored/components/setters/SetSelect.vue +51 -0
  117. package/dist/vendored/components/setters/SetSwitch.vue +49 -0
  118. package/dist/vendored/components/setters/SetText.vue +52 -0
  119. package/dist/vendored/components/setters/props.js +23 -0
  120. package/dist/vendored/fidelity/baseline-messageOverview.json +87 -0
  121. package/dist/vendored/fidelity/calibration.json +29 -0
  122. package/dist/vendored/fidelity/fidelity-messageOverview-after.html +114 -0
  123. package/dist/vendored/fidelity/fidelity-messageOverview-after.json +272 -0
  124. package/dist/vendored/fidelity/fidelity-messageOverview.html +185 -0
  125. package/dist/vendored/fidelity/fidelity-messageOverview.json +336 -0
  126. package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +262 -0
  127. package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +502 -0
  128. package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +201 -0
  129. package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +417 -0
  130. package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +125 -0
  131. package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +338 -0
  132. package/dist/vendored/index.html +16 -0
  133. package/dist/vendored/main.js +36 -0
  134. package/dist/vendored/meta/action-meta.json +141 -0
  135. package/dist/vendored/meta/component-meta.json +2714 -0
  136. package/dist/vendored/meta/directive-meta.json +40 -0
  137. package/dist/vendored/meta/style-meta.json +1086 -0
  138. package/dist/vendored/runtime/StyleParser.js +179 -0
  139. package/dist/vendored/runtime/adapter.js +166 -0
  140. package/dist/vendored/runtime/alert-card.js +125 -0
  141. package/dist/vendored/runtime/app-toast.js +33 -0
  142. package/dist/vendored/runtime/assets.js +16 -0
  143. package/dist/vendored/runtime/canvas-context.js +141 -0
  144. package/dist/vendored/runtime/card-runtime.js +289 -0
  145. package/dist/vendored/runtime/clipboard-node.js +83 -0
  146. package/dist/vendored/runtime/clipboard.js +29 -0
  147. package/dist/vendored/runtime/evaluate.js +152 -0
  148. package/dist/vendored/runtime/event-model.js +300 -0
  149. package/dist/vendored/runtime/hoverGuide.js +31 -0
  150. package/dist/vendored/runtime/jsapi-mock.js +256 -0
  151. package/dist/vendored/runtime/node-model.js +217 -0
  152. package/dist/vendored/runtime/property.js +364 -0
  153. package/dist/vendored/runtime/selectionOverlay.js +53 -0
  154. package/dist/vendored/runtime/toPreview.js +648 -0
  155. package/dist/vendored/standalone-main.js +36 -0
  156. package/dist/vendored/standalone.html +12 -0
  157. package/dist/vendored/styles/app.css +2565 -0
  158. package/dist/vendored/styles/card-gallery.css +234 -0
  159. package/dist/vendored/styles/card-select.css +281 -0
  160. package/dist/vendored/styles/components.css +383 -0
  161. package/dist/vendored/styles/dropdown.css +337 -0
  162. package/dist/vendored/styles/json-tree.css +308 -0
  163. package/dist/vendored/styles/node-inspector.css +1003 -0
  164. package/dist/vendored/styles/setters.css +962 -0
  165. package/dist/vendored/styles/standalone.css +27 -0
  166. package/dist/vendored/styles/structure-tree.css +320 -0
  167. package/package.json +42 -0
@@ -0,0 +1,1003 @@
1
+ /**
2
+ * 节点属性面板样式(NodeInspector.vue)
3
+ * 单一样式来源,避免与 scoped 冲突。
4
+ */
5
+
6
+ .ni-overlay {
7
+ position: fixed;
8
+ inset: 0;
9
+ z-index: var(--z-appmodal);
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ /* 遮罩完全透明:不遮挡预览区,仅面板自身浮于其上 */
14
+ background: transparent;
15
+ }
16
+
17
+ .ni-panel {
18
+ width: 560px;
19
+ max-width: 94vw;
20
+ height: 80vh;
21
+ min-height: 420px;
22
+ display: flex;
23
+ flex-direction: column;
24
+ background: var(--bg-panel);
25
+ border: 1px solid var(--border-strong);
26
+ border-radius: 10px;
27
+ box-shadow: var(--shadow-4);
28
+ position: relative;
29
+ overflow: hidden;
30
+ }
31
+
32
+ .ni-head {
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: space-between;
36
+ padding: 12px 16px;
37
+ border-bottom: 1px solid var(--border);
38
+ flex-shrink: 0;
39
+ }
40
+
41
+ .ni-title {
42
+ font-size: 16px;
43
+ font-weight: 600;
44
+ color: var(--text);
45
+ }
46
+
47
+ .ni-close {
48
+ width: var(--ctrl-sm);
49
+ height: var(--ctrl-sm);
50
+ display: inline-flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ background: var(--bg-input);
54
+ border: 1px solid var(--border-strong);
55
+ border-radius: 6px;
56
+ color: var(--text-dim);
57
+ font-size: 18px;
58
+ cursor: pointer;
59
+ line-height: 1;
60
+ transition: background 0.15s, color 0.15s;
61
+ }
62
+
63
+ .ni-close::before {
64
+ content: '✕';
65
+ }
66
+
67
+ .ni-close:hover {
68
+ background: var(--bg-hover);
69
+ color: var(--text);
70
+ }
71
+
72
+ .ni-body {
73
+ flex: 1 1 auto;
74
+ min-height: 0;
75
+ display: flex;
76
+ flex-direction: column;
77
+ /* 去掉左右内边距,让 .ni-scroll 撑满面板;滚动条因此紧贴最外层边缘 */
78
+ padding: 16px 0;
79
+ }
80
+
81
+ .ni-body .ni-empty {
82
+ padding: 0 16px;
83
+ }
84
+
85
+ .ni-scroll {
86
+ flex: 1 1 auto;
87
+ min-height: 0;
88
+ overflow-y: auto;
89
+ /* 仅给内容留 16px 横向间距,滚动条(右侧)紧贴面板边缘;
90
+ 底部 76px 预留给悬浮的 .ni-foot,避免内容被遮挡 */
91
+ padding: 0 16px 76px;
92
+ }
93
+
94
+ .ni-body > .ni-sec {
95
+ margin-bottom: 12px;
96
+ }
97
+
98
+ .ni-body > .ni-sec:last-child {
99
+ margin-bottom: 0;
100
+ }
101
+
102
+ .ni-sec-head {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 8px;
106
+ font-size: 14px;
107
+ font-weight: 600;
108
+ color: var(--text);
109
+ margin-bottom: 12px;
110
+ cursor: pointer;
111
+ user-select: none;
112
+ }
113
+
114
+ /* 统一折叠箭头(ni-caret / ptree__caret / st__caret 共用同一形态):
115
+ 右尖三角,收起朝右、展开旋转 90° 朝下,尺寸 10px、与文字基线对齐。 */
116
+ .ni-caret,
117
+ .ptree__caret {
118
+ display: inline-flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ flex: 0 0 12px;
122
+ width: 12px;
123
+ height: 12px;
124
+ font-size: 10px;
125
+ line-height: 1;
126
+ color: var(--text-dim);
127
+ transition: transform 0.15s ease;
128
+ user-select: none;
129
+ }
130
+
131
+ .ni-caret.is-open,
132
+ .ptree__caret.is-open {
133
+ transform: rotate(90deg);
134
+ }
135
+
136
+ .ni-sec-body {
137
+ margin-bottom: 0;
138
+ }
139
+
140
+ .ni-empty {
141
+ margin: 0;
142
+ font-size: 12px;
143
+ color: var(--text-faint);
144
+ }
145
+
146
+ /* 基本信息:标签 + 控件横向 */
147
+ .ni-field-row {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 10px;
151
+ margin-bottom: 12px;
152
+ }
153
+
154
+ .ni-field-row .ni-field-label {
155
+ flex: 0 0 88px;
156
+ font-size: 12px;
157
+ font-weight: 500;
158
+ color: var(--text-dim);
159
+ text-align: right;
160
+ white-space: nowrap;
161
+ overflow: hidden;
162
+ text-overflow: ellipsis;
163
+ }
164
+
165
+ .ni-field-row .ni-input {
166
+ flex: 1 1 auto;
167
+ min-width: 0;
168
+ }
169
+
170
+ .ni-input {
171
+ box-sizing: border-box;
172
+ width: 100%; /* 撑满父元素:修复 st-input → ni-input 换类后遗失的 100% 宽度(地址框等文本输入不再回落浏览器默认内宽) */
173
+ min-width: 0; /* 配合 flex 容器(如 .st-image__row 的清空按钮并排)不被 min-content 撑爆 */
174
+ height: var(--ctrl-sm); /* 28px:节点属性面板输入框统一高度,与 setter 输入家族(st-input 已换 ni-input)一致,消除 28/32 混排 */
175
+ font-size: 12px;
176
+ padding: 6px 12px;
177
+ background: var(--bg-input);
178
+ color: var(--text);
179
+ border: 1px solid var(--border-strong);
180
+ border-radius: 6px;
181
+ outline: none;
182
+ transition: border-color 0.15s;
183
+ }
184
+
185
+ .ni-input:focus {
186
+ border-color: var(--accent);
187
+ }
188
+
189
+ select.ni-input {
190
+ height: var(--ctrl-sm);
191
+ }
192
+
193
+ /* 属性行:标签 + 控件 + 删除 */
194
+ .ni-prop-row {
195
+ display: flex;
196
+ align-items: flex-start;
197
+ gap: 12px;
198
+ padding: 8px 12px;
199
+ border: 1px solid var(--border);
200
+ border-radius: 8px;
201
+ margin-bottom: 8px;
202
+ background: var(--bg-panel);
203
+ }
204
+
205
+ .ni-prop-label {
206
+ flex: 0 0 88px;
207
+ padding-top: 5px;
208
+ font-size: 12px;
209
+ color: var(--text);
210
+ font-weight: 500;
211
+ white-space: nowrap;
212
+ overflow: hidden;
213
+ text-overflow: ellipsis;
214
+ }
215
+
216
+ .ni-prop-control {
217
+ flex: 1 1 auto;
218
+ min-width: 0;
219
+ }
220
+
221
+ .ni-prop-del {
222
+ flex: 0 0 auto;
223
+ width: 24px;
224
+ height: 24px;
225
+ display: inline-flex;
226
+ align-items: center;
227
+ justify-content: center;
228
+ margin-top: 2px;
229
+ padding: 0;
230
+ border: none;
231
+ background: transparent;
232
+ color: var(--danger);
233
+ border-radius: 5px;
234
+ cursor: pointer;
235
+ font-size: 13px;
236
+ line-height: 1;
237
+ transition: background 0.15s;
238
+ }
239
+
240
+ .ni-prop-del:hover {
241
+ background: var(--danger-soft);
242
+ }
243
+
244
+ /* 新增行 */
245
+ .ni-addrow {
246
+ display: flex;
247
+ align-items: center;
248
+ gap: 8px;
249
+ margin-top: 8px;
250
+ }
251
+
252
+ .ni-addrow select {
253
+ flex: 1 1 auto;
254
+ min-width: 0;
255
+ }
256
+
257
+ .ni-addbtn {
258
+ flex: 0 0 auto;
259
+ height: var(--ctrl-sm);
260
+ padding: 0 12px;
261
+ font-size: 13px;
262
+ border: 1px dashed var(--border-strong);
263
+ background: transparent;
264
+ color: var(--text-dim);
265
+ border-radius: 6px;
266
+ cursor: pointer;
267
+ transition: color 0.15s, border-color 0.15s;
268
+ }
269
+
270
+ .ni-addbtn:disabled {
271
+ opacity: 0.5;
272
+ cursor: not-allowed;
273
+ }
274
+
275
+ .ni-addbtn:not(:disabled):hover {
276
+ color: var(--accent);
277
+ border-color: var(--accent);
278
+ }
279
+
280
+ /* 指令 / 事件只读行 */
281
+ .ni-rows {
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 4px;
285
+ }
286
+
287
+ .ni-row {
288
+ display: flex;
289
+ align-items: flex-start;
290
+ gap: 8px;
291
+ font-size: 12px;
292
+ padding: 6px 10px;
293
+ border-radius: 6px;
294
+ background: var(--bg-input);
295
+ }
296
+
297
+ .ni-key {
298
+ color: var(--text-dim);
299
+ flex: 0 0 auto;
300
+ max-width: 168px;
301
+ overflow: hidden;
302
+ text-overflow: ellipsis;
303
+ white-space: nowrap;
304
+ }
305
+
306
+ .ni-val {
307
+ flex: 1 1 auto;
308
+ min-width: 0;
309
+ color: var(--text);
310
+ word-break: break-all;
311
+ }
312
+
313
+ .ni-tag {
314
+ margin-left: auto;
315
+ font-size: 12px;
316
+ padding: 2px 8px;
317
+ background: var(--bg-soft);
318
+ border-radius: 4px;
319
+ color: var(--accent);
320
+ }
321
+
322
+ .ni-editbtn {
323
+ margin-left: auto;
324
+ height: var(--ctrl-sm);
325
+ padding: 0 10px;
326
+ font-size: 12px;
327
+ border: 1px solid var(--border-strong);
328
+ background: var(--bg-input);
329
+ color: var(--text-dim);
330
+ border-radius: 6px;
331
+ cursor: pointer;
332
+ transition: color 0.15s, border-color 0.15s;
333
+ }
334
+
335
+ .ni-editbtn:hover {
336
+ color: var(--text);
337
+ border-color: var(--accent);
338
+ }
339
+
340
+ /* 标题里的 className */
341
+ .ni-cls {
342
+ font-style: normal;
343
+ font-size: 11px;
344
+ color: var(--text-faint);
345
+ margin-left: 6px;
346
+ }
347
+
348
+ .ni-static {
349
+ font-size: 13px;
350
+ color: var(--text);
351
+ }
352
+
353
+ /* 事件列表 */
354
+ .ni-event-list {
355
+ display: flex;
356
+ flex-direction: column;
357
+ gap: 6px;
358
+ }
359
+
360
+ .ni-event-row {
361
+ display: flex;
362
+ align-items: center;
363
+ gap: 8px;
364
+ padding: 7px 10px;
365
+ background: var(--bg-input);
366
+ border-radius: 7px;
367
+ }
368
+
369
+ .ni-event-name {
370
+ font-size: 12px;
371
+ color: var(--text);
372
+ }
373
+
374
+ /* 属性树(PropTree 递归渲染) */
375
+ .ptree {
376
+ display: flex;
377
+ flex-direction: column;
378
+ gap: var(--space-3); /* 12px:节点设置面板「组和组之间」纵向间距,须 > 控件内 .pc(6px),确立「组间 > 组内核」层级 */
379
+ }
380
+
381
+ .ptree__group {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 4px;
385
+ }
386
+
387
+ .ptree__group-head {
388
+ display: flex;
389
+ align-items: center;
390
+ gap: 8px;
391
+ padding: 8px 10px;
392
+ border-radius: 6px;
393
+ background: var(--bg-input);
394
+ cursor: pointer;
395
+ user-select: none;
396
+ transition: background 0.15s;
397
+ }
398
+
399
+ .ptree:not(.ptree--plain) .ptree__group-head:hover {
400
+ background: var(--bg-hover);
401
+ }
402
+
403
+ .ptree__group-name {
404
+ flex: 1 1 auto;
405
+ min-width: 0;
406
+ font-size: 13px;
407
+ font-weight: 600;
408
+ color: var(--text);
409
+ white-space: nowrap;
410
+ overflow: hidden;
411
+ text-overflow: ellipsis;
412
+ }
413
+
414
+ .ptree__group-count {
415
+ flex: 0 0 auto;
416
+ font-size: 11px;
417
+ color: var(--text-faint);
418
+ }
419
+
420
+ /* 嵌套分组(第二级及更深)淡化头背景,靠左竖线区分层级 */
421
+ .ptree__group-body > .ptree__group > .ptree__group-head {
422
+ background: transparent;
423
+ padding-left: 2px;
424
+ font-weight: 500;
425
+ }
426
+ .ptree:not(.ptree--plain) .ptree__group-body > .ptree__group > .ptree__group-head:hover {
427
+ background: var(--bg-hover);
428
+ }
429
+
430
+ .ptree__group-body {
431
+ padding: 6px 0 2px 10px;
432
+ margin-left: 6px;
433
+ border-left: 1px solid var(--border);
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 4px;
437
+ }
438
+
439
+ .ptree__row {
440
+ display: flex;
441
+ align-items: center;
442
+ gap: 10px;
443
+ /* min-height 而非 height:含「常量/变量/图片」来源切换的两行行(来源 tab + 控件)
444
+ 需自然撑高避免溢出与邻行重叠;单行行(标签 + 控件)仍精确 32px,与手册高行式节奏一致。 */
445
+ min-height: var(--ctrl-md);
446
+ padding: 0 8px;
447
+ border-radius: 6px;
448
+ }
449
+
450
+ .ptree:not(.ptree--plain) .ptree__row:hover {
451
+ background: var(--bg-hover);
452
+ }
453
+
454
+ .ptree__label {
455
+ flex: 0 0 96px;
456
+ font-size: 12px;
457
+ color: var(--text-dim);
458
+ white-space: nowrap;
459
+ overflow: hidden;
460
+ text-overflow: ellipsis;
461
+ }
462
+
463
+ .ptree__control {
464
+ flex: 1 1 auto;
465
+ min-width: 0;
466
+ }
467
+
468
+ /* 底部:悬浮操作条,不占布局高度(内容可滚到其下方) */
469
+ .ni-foot {
470
+ position: absolute;
471
+ left: 0;
472
+ right: 0;
473
+ bottom: 0;
474
+ z-index: 1;
475
+ display: flex;
476
+ align-items: center;
477
+ justify-content: space-between;
478
+ gap: 10px;
479
+ padding: 12px 16px;
480
+ background: var(--bg-panel);
481
+ border-top: 1px solid var(--border);
482
+ box-shadow: 0 -8px 24px var(--shadow-card);
483
+ }
484
+
485
+ .ni-tip {
486
+ font-size: 12px;
487
+ color: var(--text-faint);
488
+ line-height: 1.5;
489
+ }
490
+
491
+ .ni-foot-btns {
492
+ display: flex;
493
+ gap: 8px;
494
+ flex-shrink: 0;
495
+ }
496
+
497
+ .ni-btn {
498
+ white-space: nowrap;
499
+ height: var(--ctrl-sm);
500
+ padding: 0 16px;
501
+ font-size: 13px;
502
+ border-radius: 6px;
503
+ border: 1px solid var(--accent);
504
+ background: var(--accent);
505
+ color: var(--on-accent);
506
+ cursor: pointer;
507
+ transition: opacity 0.15s;
508
+ }
509
+
510
+ .ni-btn:hover {
511
+ opacity: 0.92;
512
+ }
513
+
514
+ .ni-btn--ghost {
515
+ background: transparent;
516
+ color: var(--text);
517
+ border-color: var(--border-strong);
518
+ }
519
+
520
+ .ni-btn--ghost:hover {
521
+ border-color: var(--accent);
522
+ color: var(--accent);
523
+ opacity: 1;
524
+ }
525
+
526
+ /* ===================== 事件页签(开关式:事件列表 + 开关 + 动作参数) ===================== */
527
+
528
+ .ni-evt-list {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 4px;
532
+ }
533
+
534
+ .ni-evt {
535
+ border: 1px solid var(--border);
536
+ border-radius: 8px;
537
+ overflow: hidden;
538
+ background: var(--bg-panel);
539
+ }
540
+
541
+ .ni-evt-head {
542
+ display: flex;
543
+ align-items: center;
544
+ gap: 10px;
545
+ padding: 12px 14px;
546
+ }
547
+
548
+ .ni-evt-name {
549
+ flex: 0 0 auto;
550
+ font-size: 13px;
551
+ font-weight: 500;
552
+ color: var(--text);
553
+ white-space: nowrap;
554
+ }
555
+
556
+ .ni-evt-desc {
557
+ flex: 1 1 auto;
558
+ min-width: 0;
559
+ font-size: 12px;
560
+ color: var(--text-faint);
561
+ white-space: nowrap;
562
+ overflow: hidden;
563
+ text-overflow: ellipsis;
564
+ }
565
+
566
+ /* 开关 */
567
+ .ni-switch {
568
+ flex: 0 0 auto;
569
+ position: relative;
570
+ width: 36px;
571
+ height: 20px;
572
+ padding: 0;
573
+ margin: 0;
574
+ border: none;
575
+ border-radius: 10px;
576
+ background: var(--border-strong);
577
+ cursor: pointer;
578
+ transition: background 0.18s;
579
+ flex-shrink: 0;
580
+ }
581
+
582
+ .ni-switch.is-on {
583
+ background: var(--accent);
584
+ }
585
+
586
+ .ni-switch__dot {
587
+ position: absolute;
588
+ top: 2px;
589
+ left: 2px;
590
+ width: 16px;
591
+ height: 16px;
592
+ border-radius: 50%;
593
+ background: var(--on-accent);
594
+ transition: transform 0.18s;
595
+ }
596
+
597
+ .ni-switch.is-on .ni-switch__dot {
598
+ transform: translateX(16px);
599
+ }
600
+
601
+ .ni-evt-body {
602
+ padding: 4px 12px 12px;
603
+ border-top: 1px solid var(--border);
604
+ }
605
+
606
+ .ni-evt-body .ni-field-row {
607
+ margin-top: 12px;
608
+ margin-bottom: 0;
609
+ }
610
+
611
+ .ni-evt-body .ni-field-row:first-child {
612
+ margin-top: 10px;
613
+ }
614
+
615
+ .ni-evt-body .ptree {
616
+ margin-top: 8px;
617
+ }
618
+
619
+ /* 整行铺开的控件(代码编辑器) */
620
+ .ptree__row--block {
621
+ flex-direction: column;
622
+ align-items: stretch;
623
+ gap: 4px;
624
+ }
625
+
626
+ .ptree__row--block .ptree__label {
627
+ flex: 0 0 auto;
628
+ padding-top: 0;
629
+ }
630
+
631
+ /* 小屏适配 */
632
+ @media (max-width: 600px) {
633
+ .ni-panel {
634
+ width: 100vw;
635
+ max-width: 100vw;
636
+ height: 100vh;
637
+ border-radius: 0;
638
+ }
639
+
640
+ .ni-prop-label {
641
+ flex: 0 0 72px;
642
+ }
643
+ }
644
+
645
+ /* ===================== 事件编辑抽屉(EventEditor.vue,右侧滑出) ===================== */
646
+ /* 100vh × calc(100vw - 预览面板宽度);上下排布,上方事件开关列表 + 下方动作/脚本编辑区;
647
+ 抽屉主体不产生滚动条,脚本编辑区填满剩余高度。 */
648
+
649
+ .ee-overlay {
650
+ position: fixed;
651
+ top: 0;
652
+ right: 0;
653
+ bottom: 0;
654
+ /* 左缘 = 当前预览面板宽度(由 App 根节点注入的 --preview-width 实时驱动),
655
+ 不再写死 375px;面板宽度随之 = 100vw − 预览面板宽度,随分隔条拖拽动态变化 */
656
+ left: var(--preview-width, 375px);
657
+ z-index: var(--z-appmodal);
658
+ /* 透明:手机区(左侧预览面板)保持可见且可交互,不遮罩 */
659
+ background: transparent;
660
+ }
661
+
662
+ /* 抽屉主体:右侧贴边、满高、宽度 = 视口减去手机宽度 */
663
+ .ee-panel {
664
+ position: absolute;
665
+ top: 0;
666
+ right: 0;
667
+ bottom: 0;
668
+ width: 100%;
669
+ max-width: 720px;
670
+ height: 100vh;
671
+ display: flex;
672
+ flex-direction: column;
673
+ background: var(--bg-panel);
674
+ border-left: 1px solid var(--border-strong);
675
+ box-shadow: var(--shadow-5);
676
+ overflow: hidden;
677
+ }
678
+
679
+ /* 从右往左滑入/滑出(DebugPanel 中 <Transition name="ee-drawer"> 驱动) */
680
+ .ee-drawer-enter-active,
681
+ .ee-drawer-leave-active {
682
+ transition: transform 0.26s cubic-bezier(0.22, 0.61, 0.36, 1);
683
+ }
684
+ .ee-drawer-enter-from,
685
+ .ee-drawer-leave-to {
686
+ transform: translateX(100%);
687
+ }
688
+
689
+ .ee-head {
690
+ display: flex;
691
+ align-items: center;
692
+ justify-content: space-between;
693
+ padding: 12px 20px;
694
+ border-bottom: 1px solid var(--border);
695
+ flex-shrink: 0;
696
+ }
697
+
698
+ .ee-title {
699
+ font-size: 16px;
700
+ font-weight: 600;
701
+ color: var(--text);
702
+ }
703
+
704
+ .ee-cls {
705
+ font-style: normal;
706
+ font-size: 11px;
707
+ color: var(--text-faint);
708
+ margin-left: 6px;
709
+ }
710
+
711
+ .ee-close {
712
+ width: var(--ctrl-sm);
713
+ height: var(--ctrl-sm);
714
+ display: inline-flex;
715
+ align-items: center;
716
+ justify-content: center;
717
+ background: var(--bg-input);
718
+ border: 1px solid var(--border-strong);
719
+ border-radius: 6px;
720
+ color: var(--text-dim);
721
+ font-size: 18px;
722
+ cursor: pointer;
723
+ line-height: 1;
724
+ transition: background 0.15s, color 0.15s;
725
+ }
726
+
727
+ .ee-close::before { content: '✕'; }
728
+ .ee-close:hover { background: var(--bg-hover); color: var(--text); }
729
+
730
+ /* 主体:上事件开关列表 + 下动作/脚本编辑区,纵向上下排布,不滚动 */
731
+ .ee-body {
732
+ flex: 1 1 auto;
733
+ min-height: 0;
734
+ display: flex;
735
+ flex-direction: column;
736
+ overflow: hidden;
737
+ }
738
+
739
+ /* 上方事件开关列表:有界高度(最多约 40%),内部独立滚动,不再单列占宽 */
740
+ .ee-side {
741
+ flex: 0 0 auto;
742
+ max-height: 40%;
743
+ min-width: 0;
744
+ display: flex;
745
+ flex-direction: column;
746
+ border-bottom: 1px solid var(--border);
747
+ overflow-y: auto;
748
+ padding: 12px 16px;
749
+ line-height: 28px;
750
+ }
751
+
752
+ .ee-evt-list {
753
+ display: flex;
754
+ flex-direction: column;
755
+ gap: 4px;
756
+ }
757
+
758
+ .ee-evt {
759
+ display: flex;
760
+ 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);
767
+ cursor: pointer;
768
+ transition: background 0.15s, border-color 0.15s;
769
+ }
770
+
771
+ .ee-evt:hover {
772
+ background: var(--bg-hover);
773
+ }
774
+
775
+ .ee-evt-name {
776
+ flex: 1 1 auto;
777
+ min-width: 0;
778
+ font-size: 13px;
779
+ font-weight: 500;
780
+ color: var(--text);
781
+ white-space: nowrap;
782
+ overflow: hidden;
783
+ text-overflow: ellipsis;
784
+ }
785
+
786
+ /* 下方详情区:填满剩余高度,底部 76px 预留给悬浮的 .ee-foot */
787
+ .ee-detail {
788
+ flex: 1 1 auto;
789
+ min-width: 0;
790
+ display: flex;
791
+ flex-direction: column;
792
+ /* 底部 76px 预留给悬浮的 .ee-foot,避免详情最末内容被遮挡 */
793
+ padding: 16px 24px 76px;
794
+ overflow: hidden;
795
+ }
796
+
797
+ .ee-detail-head {
798
+ flex: 0 0 auto;
799
+ }
800
+
801
+ .ee-detail-body {
802
+ flex: 1 1 auto;
803
+ min-height: 0;
804
+ display: flex;
805
+ flex-direction: column;
806
+ margin-top: 10px;
807
+ overflow: hidden;
808
+ }
809
+
810
+ /* 让脚本编辑区(Code 控件)撑满详情区剩余高度 */
811
+ .ee-detail-body .ptree {
812
+ flex: 1 1 auto;
813
+ min-height: 0;
814
+ }
815
+ /* 事件面板的设置项在 UI 层为并列关系(非树结构),不需要每行左右内缩 */
816
+ .ee-detail-body .ptree__row {
817
+ padding: 0;
818
+ }
819
+ .ee-detail-body .ptree__row--block {
820
+ flex: 1 1 auto;
821
+ min-height: 0;
822
+ }
823
+ .ee-detail-body .st-code {
824
+ flex: 1 1 auto;
825
+ min-height: 0;
826
+ gap: 2px;
827
+ }
828
+ .ee-detail-body .st-code__foot {
829
+ flex: 0 0 auto;
830
+ font-size: 11px;
831
+ line-height: normal;
832
+ padding: 4px 2px 2px;
833
+ }
834
+
835
+ .ee-detail-body .ptree__row--block .ptree__control {
836
+ display: flex;
837
+ flex-direction: column;
838
+ min-height: 0;
839
+ }
840
+ .ee-detail-body .ptree__row--block .ptree__control > .pc {
841
+ flex: 1 1 auto;
842
+ min-height: 0;
843
+ }
844
+ .ee-detail-body .pc-body {
845
+ flex: 1 1 auto;
846
+ min-height: 0;
847
+ display: flex;
848
+ flex-direction: column;
849
+ }
850
+ .ee-detail-body .pc-body > .st-code {
851
+ flex: 1 1 auto;
852
+ min-height: 0;
853
+ }
854
+ .ee-detail-body .st-code__editor {
855
+ flex: 1 1 auto;
856
+ min-height: 120px;
857
+ max-height: none;
858
+ }
859
+
860
+ .ee-detail-empty {
861
+ margin: auto;
862
+ text-align: center;
863
+ }
864
+
865
+ .ee-empty {
866
+ margin: 0;
867
+ font-size: 12px;
868
+ color: var(--text-faint);
869
+ }
870
+
871
+ .ee-field-row {
872
+ display: flex;
873
+ align-items: center;
874
+ gap: 10px;
875
+ }
876
+
877
+ .ee-field-label {
878
+ flex: 0 0 80px;
879
+ font-size: 12px;
880
+ color: var(--text-dim);
881
+ text-align: right;
882
+ white-space: nowrap;
883
+ overflow: hidden;
884
+ text-overflow: ellipsis;
885
+ }
886
+
887
+ .ee-input {
888
+ flex: 1 1 auto;
889
+ min-width: 0;
890
+ box-sizing: border-box;
891
+ font-size: 12px;
892
+ padding: 6px 10px;
893
+ background: var(--bg-input);
894
+ color: var(--text);
895
+ border: 1px solid var(--border-strong);
896
+ border-radius: 6px;
897
+ outline: none;
898
+ transition: border-color 0.15s;
899
+ }
900
+
901
+ .ee-input:focus { border-color: var(--accent); }
902
+
903
+ select.ee-input { height: 32px; }
904
+
905
+ .ee-evt-desc {
906
+ margin: 8px 0 0;
907
+ font-size: 11px;
908
+ color: var(--text-faint);
909
+ line-height: 1.4;
910
+ }
911
+
912
+ /* 开关 */
913
+ .ee-switch {
914
+ flex: 0 0 auto;
915
+ position: relative;
916
+ width: 36px;
917
+ height: 20px;
918
+ padding: 0;
919
+ margin: 0;
920
+ border: none;
921
+ border-radius: 10px;
922
+ background: var(--border-strong);
923
+ cursor: pointer;
924
+ transition: background 0.18s;
925
+ }
926
+
927
+ .ee-switch.is-on { background: var(--accent); }
928
+
929
+ .ee-switch__dot {
930
+ position: absolute;
931
+ top: 2px;
932
+ left: 2px;
933
+ width: 16px;
934
+ height: 16px;
935
+ border-radius: 50%;
936
+ background: var(--on-accent);
937
+ transition: transform 0.18s;
938
+ }
939
+
940
+ .ee-switch.is-on .ee-switch__dot { transform: translateX(16px); }
941
+
942
+ .ee-evt-orphan {
943
+ flex: 0 0 auto;
944
+ margin: 10px 0 0;
945
+ font-size: 11px;
946
+ color: var(--warn);
947
+ }
948
+
949
+ /* 底栏 */
950
+ /* 底部:悬浮操作条,不占布局高度(内容可滚到其下方) */
951
+ .ee-foot {
952
+ position: absolute;
953
+ left: 0;
954
+ right: 0;
955
+ bottom: 0;
956
+ z-index: 1;
957
+ display: flex;
958
+ align-items: center;
959
+ justify-content: space-between;
960
+ gap: 10px;
961
+ padding: 12px 24px;
962
+ background: var(--bg-panel);
963
+ border-top: 1px solid var(--border);
964
+ box-shadow: 0 -8px 24px var(--shadow-card);
965
+ }
966
+
967
+ .ee-tip {
968
+ font-size: 11px;
969
+ color: var(--text-faint);
970
+ line-height: 1.4;
971
+ }
972
+
973
+ .ee-foot-btns {
974
+ display: flex;
975
+ gap: 8px;
976
+ flex-shrink: 0;
977
+ }
978
+
979
+ .ee-btn {
980
+ white-space: nowrap;
981
+ height: var(--ctrl-sm);
982
+ padding: 0 16px;
983
+ font-size: 13px;
984
+ border-radius: 6px;
985
+ border: 1px solid var(--accent);
986
+ background: var(--accent);
987
+ color: var(--on-accent);
988
+ cursor: pointer;
989
+ transition: opacity 0.15s;
990
+ }
991
+
992
+ .ee-btn:hover { opacity: 0.92; }
993
+
994
+ .ee-btn--ghost {
995
+ background: transparent;
996
+ color: var(--text);
997
+ border-color: var(--border-strong);
998
+ }
999
+
1000
+ .ee-btn--ghost:hover {
1001
+ background: var(--bg-hover);
1002
+ opacity: 1;
1003
+ }