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,962 @@
1
+ /**
2
+ * 属性设置器(setters/*.vue)统一样式。
3
+ *
4
+ * 复刻编辑器右侧「属性 & 事件」面板的控件形态,但换成本工程的深色配色。
5
+ * 全部为全局类(st- 前缀),不使用 scoped —— 与 node-inspector.css 保持同一约定。
6
+ */
7
+
8
+ /* ------------------------------ 通用输入 ------------------------------ */
9
+
10
+ .st-input,
11
+ .st-textarea {
12
+ width: 100%;
13
+ min-width: 0;
14
+ box-sizing: border-box; /* 与 .ni-input 一致:高度含 border */
15
+ height: var(--ctrl-sm); /* 28px:节点属性面板输入框统一高度,与 .ni-input 对齐,消除 28/32 混排 */
16
+ padding: 6px 12px;
17
+ background: var(--bg-input);
18
+ border: 1px solid var(--border-strong);
19
+ border-radius: 6px;
20
+ color: var(--text);
21
+ font-size: 12px;
22
+ font-family: inherit;
23
+ outline: none;
24
+ transition: border-color 0.15s, box-shadow 0.15s;
25
+ }
26
+ .st-textarea {
27
+ height: auto;
28
+ min-height: 96px; /* 约 4 行 */
29
+ padding: 6px 12px;
30
+ line-height: 1.5;
31
+ resize: none; /* 隐藏原生拖拽手柄,统一外观 */
32
+ }
33
+ .st-input:focus,
34
+ .st-textarea:focus {
35
+ border-color: var(--accent-border);
36
+ box-shadow: 0 0 0 2px var(--accent-soft);
37
+ }
38
+ .st-input:disabled,
39
+ .st-textarea:disabled {
40
+ opacity: 0.5;
41
+ cursor: not-allowed;
42
+ }
43
+ .st-input::placeholder,
44
+ .st-textarea::placeholder {
45
+ color: var(--text-faint);
46
+ }
47
+
48
+ /* 原生 select 深色化 */
49
+ .st-select {
50
+ width: 100%;
51
+ min-width: 0;
52
+ box-sizing: border-box;
53
+ height: var(--ctrl-sm); /* 28px:与 .ni-input 统一(st-select 当前为孤儿类,SetSelect 已改用 Dropdown sm=28) */
54
+ padding: 0 24px 0 12px;
55
+ background: var(--bg-input)
56
+ url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23949aab' d='M0 0h10L5 6z'/%3E%3C/svg%3E")
57
+ no-repeat right 8px center;
58
+ border: 1px solid var(--border-strong);
59
+ border-radius: 6px;
60
+ color: var(--text);
61
+ font-size: 12px;
62
+ font-family: inherit;
63
+ outline: none;
64
+ appearance: none;
65
+ cursor: pointer;
66
+ }
67
+ .st-select:focus {
68
+ border-color: var(--accent-border);
69
+ }
70
+ .st-select option {
71
+ background: var(--bg-panel);
72
+ color: var(--text);
73
+ }
74
+
75
+ /* ------------------------------ 数字输入 ------------------------------ */
76
+
77
+ .st-number {
78
+ display: flex;
79
+ align-items: center;
80
+ width: 100%;
81
+ min-width: 0;
82
+ box-sizing: border-box;
83
+ height: var(--ctrl-sm); /* 28px:与 .ni-input 统一(数字框带步进/预设,结构不同于普通 input,保留 st-number 但收口 28) */
84
+ background: var(--bg-input);
85
+ border: 1px solid var(--border-strong);
86
+ border-radius: 6px;
87
+ overflow: hidden;
88
+ transition: border-color 0.15s;
89
+ }
90
+ .st-number:focus-within {
91
+ border-color: var(--accent-border);
92
+ }
93
+ .st-number__field {
94
+ flex: 1 1 auto;
95
+ min-width: 0;
96
+ height: 100%;
97
+ padding: 0 10px;
98
+ background: transparent;
99
+ border: 0;
100
+ color: var(--text);
101
+ font-size: 12px;
102
+ font-family: inherit;
103
+ outline: none;
104
+ }
105
+ .st-number__field::placeholder {
106
+ color: var(--text-faint);
107
+ }
108
+ /* 单位 / 后缀 */
109
+ .st-number__symbol {
110
+ flex: 0 0 auto;
111
+ min-width: 24px;
112
+ height: 100%;
113
+ padding: 0 8px;
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ border-left: 1px solid var(--border);
118
+ background: var(--overlay-tint);
119
+ color: var(--text-dim);
120
+ font-size: 11px;
121
+ user-select: none;
122
+ }
123
+ .st-number__symbol--btn {
124
+ cursor: pointer;
125
+ }
126
+ .st-number__symbol--btn:hover {
127
+ background: var(--bg-hover);
128
+ color: var(--text);
129
+ }
130
+ /* 预设值下拉箭头 */
131
+ .st-number__caret {
132
+ flex: 0 0 auto;
133
+ width: 20px;
134
+ height: 100%;
135
+ display: inline-flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ border-left: 1px solid var(--border);
139
+ color: var(--text-faint);
140
+ cursor: pointer;
141
+ }
142
+ .st-number__caret:hover {
143
+ background: var(--bg-hover);
144
+ color: var(--text);
145
+ }
146
+ /* 禁用态(如 @/auto 单位下输入框只读) */
147
+ .st-number__field:disabled {
148
+ cursor: not-allowed;
149
+ opacity: 0.55;
150
+ }
151
+
152
+ /* 下拉浮层容器:与 .st-number 同宽、相对定位,浮层挂在它下面而不被 .st-number 的
153
+ overflow:hidden 裁切。此前 .st-pop / .st-pop__item 完全没有样式,单位切换菜单不可见。 */
154
+ .st-number-wrap,
155
+ .st-numberstyle {
156
+ position: relative;
157
+ width: 100%;
158
+ min-width: 0;
159
+ }
160
+ /* 点击空白处关闭浮层的透明遮罩(z-index 低于 .st-pop,不挡住菜单本身) */
161
+ .st-pop-mask {
162
+ position: fixed;
163
+ inset: 0;
164
+ z-index: var(--z-overlay);
165
+ }
166
+ .st-pop {
167
+ position: absolute;
168
+ top: calc(100% + 4px);
169
+ right: 0;
170
+ z-index: var(--z-pop);
171
+ min-width: 80px;
172
+ padding: 6px;
173
+ background: var(--bg-panel);
174
+ border: 1px solid var(--border);
175
+ border-radius: 6px;
176
+ box-shadow: var(--shadow-3);
177
+ }
178
+ .st-pop__item {
179
+ padding: 8px 12px;
180
+ font-size: 13px;
181
+ line-height: 1;
182
+ color: var(--text-dim);
183
+ border-radius: 4px;
184
+ cursor: pointer;
185
+ white-space: nowrap;
186
+ user-select: none;
187
+ transition: background 0.12s, color 0.12s;
188
+ }
189
+ .st-pop__item:hover {
190
+ background: var(--bg-hover);
191
+ color: var(--text);
192
+ }
193
+ .st-pop__item--on {
194
+ color: var(--accent);
195
+ background: var(--accent-soft);
196
+ }
197
+
198
+ /* ------------------------------ 分段选择 ------------------------------ */
199
+
200
+ .st-seg {
201
+ display: flex;
202
+ align-items: stretch;
203
+ width: 100%;
204
+ min-width: 0;
205
+ border-radius: 2px;
206
+ /* overflow: hidden; */
207
+ border: 1px solid var(--border);
208
+ }
209
+ .st-seg__item {
210
+ flex: 1 1 0;
211
+ min-width: 0;
212
+ /* 整框含 1px 边框须 = 28px(--ctrl-sm):故 item 内容高 = 28 - 2(上下边框) = 26px。
213
+ 属性面板内嵌分段切换(TabSelect/字体/对齐 等)为 2–4 项紧凑开关,与标签字号 12、周边行高协调。 */
214
+ height: calc(var(--ctrl-sm) - 2px);
215
+ display: inline-flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ gap: 3px;
219
+ padding: 0 4px;
220
+ background: var(--bg-input);
221
+ border-left: 1px solid var(--border);
222
+ color: var(--text-dim);
223
+ font-size: 11px;
224
+ line-height: 1;
225
+ cursor: pointer;
226
+ user-select: none;
227
+ white-space: nowrap;
228
+ /* overflow: hidden; */
229
+ transition: background 0.12s, color 0.12s;
230
+ }
231
+ .st-seg__item:first-child {
232
+ border-left: 0;
233
+ border-top-left-radius: 2px;
234
+ border-bottom-left-radius: 2px;
235
+ }
236
+ .st-seg__item:last-child {
237
+ border-top-right-radius: 2px;
238
+ border-bottom-right-radius: 2px;
239
+ }
240
+ .st-seg__item:hover {
241
+ background: var(--bg-hover);
242
+ color: var(--text);
243
+ }
244
+ .st-seg__item--on {
245
+ background: var(--accent-soft);
246
+ color: var(--accent);
247
+ position: relative;
248
+
249
+ &:after {
250
+ content: '';
251
+ position: absolute;
252
+ top: -1px;
253
+ left: -1px;
254
+ width: 100%;
255
+ height: 100%;
256
+ border-radius: 2px;
257
+ border: 1px solid var(--accent-border);
258
+ }
259
+ }
260
+ .st-seg__item--on:hover {
261
+ background: var(--accent-soft);
262
+ color: var(--accent);
263
+ }
264
+ .st-seg__icon {
265
+ width: 14px;
266
+ height: 14px;
267
+ display: block;
268
+ fill: none;
269
+ stroke: currentColor;
270
+ stroke-width: 1.4;
271
+ stroke-linecap: round;
272
+ }
273
+
274
+ /* ------------------------------ 开关 ------------------------------ */
275
+
276
+ .st-switch {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ gap: 8px;
280
+ cursor: pointer;
281
+ user-select: none;
282
+ }
283
+ .st-switch__track {
284
+ width: 34px;
285
+ height: 18px;
286
+ border-radius: 999px;
287
+ background: var(--bg-hover);
288
+ border: 1px solid var(--border-strong);
289
+ position: relative;
290
+ transition: background 0.16s, border-color 0.16s;
291
+ flex: 0 0 auto;
292
+ }
293
+ .st-switch__knob {
294
+ position: absolute;
295
+ top: 1px;
296
+ left: 1px;
297
+ width: 14px;
298
+ height: 14px;
299
+ border-radius: 50%;
300
+ background: var(--text-dim);
301
+ transition: transform 0.16s, background 0.16s;
302
+ }
303
+ .st-switch--on .st-switch__track {
304
+ background: var(--accent-soft);
305
+ border-color: var(--accent-border);
306
+ }
307
+ .st-switch--on .st-switch__knob {
308
+ transform: translateX(16px);
309
+ background: var(--accent);
310
+ }
311
+ .st-switch__text {
312
+ font-size: 11px;
313
+ color: var(--text-dim);
314
+ }
315
+
316
+ /* --------------------------- 图片 / 背景图 --------------------------- */
317
+
318
+ .st-image {
319
+ width: 100%;
320
+ min-width: 0;
321
+ }
322
+ .st-image__row {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 6px;
326
+ }
327
+
328
+ /* 通用重置图标按钮(颜色 / 图片等清空用,替代 × 字符) */
329
+ .st-ic {
330
+ width: 14px;
331
+ height: 14px;
332
+ display: block;
333
+ fill: none;
334
+ stroke: currentColor;
335
+ stroke-width: 1.4;
336
+ stroke-linecap: round;
337
+ stroke-linejoin: round;
338
+ }
339
+ .st-image__clear,
340
+ .st-color__clear {
341
+ flex: 0 0 auto;
342
+ width: 26px;
343
+ height: 26px;
344
+ display: inline-flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ padding: 0;
348
+ border: 1px solid var(--border);
349
+ border-radius: 6px;
350
+ background: var(--bg-input);
351
+ color: var(--text-dim);
352
+ cursor: pointer;
353
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
354
+ }
355
+ .st-image__clear:hover,
356
+ .st-color__clear:hover {
357
+ background: var(--bg-hover);
358
+ color: var(--text);
359
+ border-color: var(--border-strong);
360
+ }
361
+
362
+ /* 背景图位置 / 大小:X·Y 双数值区规范间距 */
363
+ .st-bgpos {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: 8px;
367
+ width: 100%;
368
+ min-width: 0;
369
+ }
370
+ .st-bgpos__xy,
371
+ .st-bgsize__xy {
372
+ display: flex;
373
+ gap: 8px;
374
+ }
375
+ .st-bgpos__xy > *,
376
+ .st-bgsize__xy > * {
377
+ flex: 1 1 0;
378
+ min-width: 0;
379
+ }
380
+ .st-bgsize {
381
+ display: flex;
382
+ flex-direction: column;
383
+ gap: 8px;
384
+ width: 100%;
385
+ min-width: 0;
386
+ }
387
+
388
+ /* ------------------------------ 颜色 ------------------------------ */
389
+
390
+ .st-color {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 4px;
394
+ width: 100%;
395
+ min-width: 0;
396
+ }
397
+ .st-color__top {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 6px;
401
+ }
402
+ .st-color__swatch {
403
+ flex: 0 0 auto;
404
+ width: 28px;
405
+ height: 28px;
406
+ padding: 0;
407
+ border: 1px solid var(--border-strong);
408
+ border-radius: 5px;
409
+ cursor: pointer;
410
+ position: relative;
411
+ overflow: hidden;
412
+ background: var(--bg-input);
413
+ }
414
+ .st-color__swatch:disabled {
415
+ cursor: not-allowed;
416
+ opacity: 0.6;
417
+ }
418
+ .st-color__checker {
419
+ position: absolute;
420
+ inset: 0;
421
+ /* 棋盘格:展示透明度 */
422
+ background-image:
423
+ linear-gradient(45deg, var(--text-faint) 25%, transparent 25%),
424
+ linear-gradient(-45deg, var(--text-faint) 25%, transparent 25%),
425
+ linear-gradient(45deg, transparent 75%, var(--text-faint) 75%),
426
+ linear-gradient(-45deg, transparent 75%, var(--text-faint) 75%);
427
+ background-size: 8px 8px;
428
+ background-position: 0 0, 0 4px, 4px -4px, -4px 0;
429
+ }
430
+ .st-color__fill {
431
+ position: absolute;
432
+ inset: 0;
433
+ border-radius: 4px;
434
+ }
435
+ /* 第三方颜色选择器弹层(Teleport 到 body,避免被滚动容器裁切) */
436
+ .st-color__pop {
437
+ max-width: calc(100vw - 16px);
438
+ background: var(--bg-panel);
439
+ border: 1px solid var(--border-strong);
440
+ border-radius: 8px;
441
+ box-shadow: 0 16px 48px var(--shadow-card);
442
+ overflow: hidden;
443
+ }
444
+ .st-color__pop .vc-sketch {
445
+ box-shadow: none;
446
+ border-radius: 0;
447
+ background: var(--bg-panel);
448
+ width: 100% !important;
449
+ box-sizing: border-box;
450
+ }
451
+ .st-color__text {
452
+ flex: 1 1 auto;
453
+ min-width: 0;
454
+ }
455
+ /* 透明度滑块行 */
456
+ .st-color__alpha-row {
457
+ display: flex;
458
+ align-items: center;
459
+ gap: 6px;
460
+ }
461
+ .st-color__alpha-label {
462
+ flex: 0 0 36px;
463
+ font-size: 11px;
464
+ color: var(--text-dim);
465
+ }
466
+ .st-color__alpha-slider {
467
+ flex: 1 1 auto;
468
+ height: 14px;
469
+ -webkit-appearance: none;
470
+ appearance: none;
471
+ border-radius: 7px;
472
+ background: linear-gradient(to right,
473
+ transparent 0%,
474
+ var(--text) 100%);
475
+ outline: none;
476
+ opacity: .7;
477
+ transition: opacity .15s;
478
+ }
479
+ .st-color__alpha-slider:hover { opacity: 1; }
480
+ .st-color__alpha-slider::-webkit-slider-thumb {
481
+ -webkit-appearance: none;
482
+ width: 14px;
483
+ height: 14px;
484
+ border-radius: 50%;
485
+ background: var(--on-accent);
486
+ border: 2px solid var(--border-strong);
487
+ box-shadow: 0 1px 3px rgba(0,0,0,.3);
488
+ cursor: pointer;
489
+ }
490
+ .st-color__alpha-slider::-moz-range-thumb {
491
+ width: 14px;
492
+ height: 14px;
493
+ border-radius: 50%;
494
+ background: var(--on-accent);
495
+ border: 2px solid var(--border-strong);
496
+ box-shadow: 0 1px 3px rgba(0,0,0,.3);
497
+ cursor: pointer;
498
+ }
499
+ .st-color__alpha-val {
500
+ flex: 0 0 32px;
501
+ font-size: 11px;
502
+ color: var(--text-dim);
503
+ text-align: right;
504
+ }
505
+
506
+ /* ------------------------------ 九宫格 ------------------------------ */
507
+
508
+ .st-grid9 {
509
+ display: grid;
510
+ grid-template-columns: repeat(3, 1fr);
511
+ gap: 4px;
512
+ padding: 6px;
513
+ background: var(--bg-input);
514
+ border: 1px solid var(--border);
515
+ border-radius: 5px;
516
+ width: 100%;
517
+ }
518
+ .st-grid9__cell {
519
+ height: 20px;
520
+ display: flex;
521
+ align-items: center;
522
+ justify-content: center;
523
+ cursor: pointer;
524
+ border-radius: 3px;
525
+ }
526
+ .st-grid9__dot {
527
+ width: 14px;
528
+ height: 14px;
529
+ border: 1px solid var(--border-strong);
530
+ border-radius: 2px;
531
+ transition: background 0.12s, border-color 0.12s;
532
+ }
533
+ .st-grid9__cell:hover .st-grid9__dot {
534
+ border-color: var(--accent-border);
535
+ background: var(--accent-soft);
536
+ }
537
+ .st-grid9__cell--on .st-grid9__dot {
538
+ background: var(--accent);
539
+ border-color: var(--accent);
540
+ }
541
+
542
+ /* ------------------------------ 内边距四向 ------------------------------ */
543
+
544
+ .st-pad {
545
+ display: grid;
546
+ grid-template-columns: 1fr 1fr;
547
+ gap: 6px;
548
+ width: 100%;
549
+ }
550
+
551
+ /* ------------------------------ 渐变 ------------------------------ */
552
+
553
+ .st-gradient {
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 6px;
557
+ width: 100%;
558
+ }
559
+ .st-gradient__preview {
560
+ height: 20px;
561
+ border-radius: 4px;
562
+ border: 1px solid var(--border);
563
+ }
564
+ .st-gradient__stop {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 6px;
568
+ }
569
+ .st-gradient__del {
570
+ flex: 0 0 auto;
571
+ width: 22px;
572
+ height: 22px;
573
+ border: 1px solid var(--border);
574
+ background: var(--bg-input);
575
+ color: var(--text-faint);
576
+ border-radius: 4px;
577
+ cursor: pointer;
578
+ font-size: 12px;
579
+ line-height: 1;
580
+ }
581
+ .st-gradient__del:hover {
582
+ border-color: var(--danger);
583
+ color: var(--danger);
584
+ }
585
+
586
+ /* ------------------------------ 通用小按钮 ------------------------------ */
587
+
588
+ .st-minibtn {
589
+ height: 24px;
590
+ padding: 0 10px;
591
+ background: var(--bg-input);
592
+ border: 1px dashed var(--border-strong);
593
+ border-radius: 5px;
594
+ color: var(--text-dim);
595
+ font-size: 11px;
596
+ cursor: pointer;
597
+ white-space: nowrap;
598
+ transition: color 0.12s, border-color 0.12s;
599
+ }
600
+ .st-minibtn:hover {
601
+ color: var(--accent);
602
+ border-color: var(--accent-border);
603
+ }
604
+
605
+ /* ------------------------------ 图标选择 ------------------------------ */
606
+
607
+ .st-iconsel {
608
+ display: flex;
609
+ align-items: center;
610
+ gap: 6px;
611
+ width: 100%;
612
+ }
613
+ .st-iconsel__preview {
614
+ flex: 0 0 auto;
615
+ width: 28px;
616
+ height: 28px;
617
+ display: inline-flex;
618
+ align-items: center;
619
+ justify-content: center;
620
+ background: var(--bg-input);
621
+ border: 1px solid var(--border);
622
+ border-radius: 5px;
623
+ color: var(--text);
624
+ }
625
+ .st-iconsel__grid {
626
+ display: grid;
627
+ grid-template-columns: repeat(8, 1fr);
628
+ gap: 4px;
629
+ max-height: 168px;
630
+ overflow: auto;
631
+ padding: 6px;
632
+ background: var(--bg-input);
633
+ border: 1px solid var(--border);
634
+ border-radius: 5px;
635
+ width: 100%;
636
+ margin-top: 6px;
637
+ }
638
+ .st-iconsel__cell {
639
+ height: 26px;
640
+ display: inline-flex;
641
+ align-items: center;
642
+ justify-content: center;
643
+ border-radius: 4px;
644
+ cursor: pointer;
645
+ color: var(--text-dim);
646
+ }
647
+ .st-iconsel__cell:hover {
648
+ background: var(--bg-hover);
649
+ color: var(--text);
650
+ }
651
+ .st-iconsel__cell--on {
652
+ background: var(--accent-soft);
653
+ color: var(--accent);
654
+ box-shadow: inset 0 0 0 1px var(--accent-border);
655
+ }
656
+
657
+ /* ------------------------------ 常用样式(CustomSelect) ------------------------------ */
658
+
659
+ .st-customsel {
660
+ display: flex;
661
+ flex-wrap: wrap;
662
+ gap: 6px;
663
+ width: 100%;
664
+ }
665
+ .st-customsel__item {
666
+ padding: 3px 8px;
667
+ background: var(--bg-input);
668
+ border: 1px solid var(--border);
669
+ border-radius: 5px;
670
+ cursor: pointer;
671
+ font-size: 12px;
672
+ line-height: 18px;
673
+ }
674
+ .st-customsel__item:hover {
675
+ border-color: var(--accent-border);
676
+ }
677
+
678
+ /* ------------------------------ 列表(List) ------------------------------ */
679
+
680
+ .st-list {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 6px;
684
+ width: 100%;
685
+ }
686
+ .st-list__item {
687
+ border: 1px solid var(--border);
688
+ border-radius: 6px;
689
+ background: var(--overlay-tint);
690
+ overflow: hidden;
691
+ }
692
+ .st-list__head {
693
+ display: flex;
694
+ align-items: center;
695
+ gap: 6px;
696
+ padding: 4px 8px;
697
+ background: var(--overlay-tint);
698
+ border-bottom: 1px solid var(--border);
699
+ font-size: 11px;
700
+ color: var(--text-dim);
701
+ cursor: pointer;
702
+ user-select: none;
703
+ }
704
+ .st-list__title {
705
+ flex: 1 1 auto;
706
+ min-width: 0;
707
+ overflow: hidden;
708
+ text-overflow: ellipsis;
709
+ white-space: nowrap;
710
+ color: var(--text);
711
+ }
712
+ .st-list__op {
713
+ flex: 0 0 auto;
714
+ width: 22px;
715
+ height: 22px;
716
+ border: 0;
717
+ background: transparent;
718
+ color: var(--text-faint);
719
+ cursor: pointer;
720
+ border-radius: 4px;
721
+ font-size: 14px;
722
+ line-height: 1;
723
+ }
724
+ .st-list__op:hover {
725
+ background: var(--bg-hover);
726
+ color: var(--text);
727
+ }
728
+ .st-list__op--del:hover {
729
+ background: var(--danger-soft);
730
+ color: var(--danger);
731
+ }
732
+ .st-list__body {
733
+ padding: 6px 8px;
734
+ }
735
+ .st-list__empty {
736
+ font-size: 11px;
737
+ color: var(--text-faint);
738
+ padding: 4px 0;
739
+ }
740
+
741
+ /* 列表项内字段行:与 ptree__row 对齐的紧凑布局 */
742
+ .st-list__row {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 8px;
746
+ padding: 3px 0;
747
+ }
748
+ .st-list__label {
749
+ flex: 0 0 72px;
750
+ font-size: 11px;
751
+ color: var(--text-dim);
752
+ text-align: right;
753
+ white-space: nowrap;
754
+ overflow: hidden;
755
+ text-overflow: ellipsis;
756
+ line-height: 1;
757
+ }
758
+ .st-list__control {
759
+ flex: 1 1 auto;
760
+ min-width: 0;
761
+ }
762
+
763
+ /* --------------------------- 代码编辑器(SetCode) --------------------------- */
764
+
765
+ .st-code {
766
+ display: flex;
767
+ flex-direction: column;
768
+ gap: 4px;
769
+ min-width: 0;
770
+ }
771
+
772
+ .st-code__editor {
773
+ min-height: 140px;
774
+ max-height: 340px;
775
+ overflow: auto;
776
+ box-sizing: border-box;
777
+ padding: 8px 10px;
778
+ background: var(--bg-input);
779
+ border: 1px solid var(--border-strong);
780
+ border-radius: 6px;
781
+ color: var(--text);
782
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
783
+ font-size: 12px;
784
+ line-height: 1.6;
785
+ tab-size: 2;
786
+ white-space: pre;
787
+ outline: none;
788
+ }
789
+
790
+ .st-code__editor:focus {
791
+ border-color: var(--accent);
792
+ }
793
+
794
+ .st-code__editor.is-disabled {
795
+ opacity: 0.6;
796
+ pointer-events: none;
797
+ }
798
+
799
+ .st-code__foot {
800
+ display: flex;
801
+ align-items: center;
802
+ gap: 10px;
803
+ font-size: 11px;
804
+ line-height: normal;
805
+ color: var(--text-faint);
806
+ }
807
+
808
+ /* .pc-body 为垂直居中开关把 line-height 置 0,此处需恢复,否则提示文字行高坍缩为 0 高度 */
809
+ .st-code__hint {
810
+ line-height: normal;
811
+ }
812
+
813
+ .st-code__warn {
814
+ margin-left: auto;
815
+ color: var(--code-warn);
816
+ }
817
+
818
+ /* Prism 高亮配色(变量驱动,随主题切换;暗色默认=原硬编码值) */
819
+ .st-code__editor .token.comment,
820
+ .st-code__editor .token.prolog,
821
+ .st-code__editor .token.doctype,
822
+ .st-code__editor .token.cdata { color: var(--code-comment); }
823
+ .st-code__editor .token.punctuation { color: var(--code-punc); }
824
+ .st-code__editor .token.property,
825
+ .st-code__editor .token.tag,
826
+ .st-code__editor .token.boolean,
827
+ .st-code__editor .token.number,
828
+ .st-code__editor .token.constant,
829
+ .st-code__editor .token.symbol { color: var(--code-prop); }
830
+ .st-code__editor .token.selector,
831
+ .st-code__editor .token.attr-name,
832
+ .st-code__editor .token.string,
833
+ .st-code__editor .token.char,
834
+ .st-code__editor .token.builtin { color: var(--code-str); }
835
+ .st-code__editor .token.operator,
836
+ .st-code__editor .token.entity,
837
+ .st-code__editor .token.url { color: var(--code-num); }
838
+ .st-code__editor .token.keyword { color: var(--code-kw); }
839
+ .st-code__editor .token.function,
840
+ .st-code__editor .token.class-name { color: var(--code-fn); }
841
+ .st-code__editor .token.regex,
842
+ .st-code__editor .token.important,
843
+ .st-code__editor .token.variable { color: var(--code-var); }
844
+
845
+ /* ------------------------------ 变量表达式编辑器(SetExpr) ------------------------------ */
846
+ /* 容器可拖拽调高度(右下角原生手柄),边框/圆角与通用控件一致 */
847
+ .st-expr {
848
+ position: relative;
849
+ display: flex;
850
+ flex-direction: column;
851
+ resize: vertical;
852
+ overflow: hidden;
853
+ min-height: 96px;
854
+ height: 120px;
855
+ border: 1px solid var(--border);
856
+ border-radius: var(--radius-sm, 6px);
857
+ background: var(--bg-input);
858
+ }
859
+ .st-expr:focus-within { border-color: var(--accent); }
860
+ .st-expr--disabled { opacity: 0.6; cursor: not-allowed; }
861
+ .st-expr__editor {
862
+ flex: 1 1 auto;
863
+ overflow: auto;
864
+ padding: 8px 10px;
865
+ outline: none;
866
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
867
+ font-size: 13px;
868
+ line-height: 1.5;
869
+ color: var(--text);
870
+ white-space: pre-wrap;
871
+ word-break: break-word;
872
+ }
873
+ .st-expr__editor.is-disabled { pointer-events: none; }
874
+ .st-expr__foot {
875
+ flex: 0 0 auto;
876
+ display: flex;
877
+ justify-content: flex-end;
878
+ padding: 2px 8px;
879
+ font-size: 11px;
880
+ color: var(--text-dim);
881
+ border-top: 1px solid var(--border);
882
+ background: var(--bg-soft);
883
+ user-select: none;
884
+ line-height: 1.5;
885
+ }
886
+ .st-expr__hint { white-space: nowrap; line-height: normal; }
887
+ /* 空内容时的占位提示(覆盖在编辑器上方,不进入 CodeJar 托管的 DOM) */
888
+ .st-expr__ph {
889
+ position: absolute;
890
+ top: 0;
891
+ left: 0;
892
+ right: 0;
893
+ padding: 8px 10px;
894
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
895
+ font-size: 13px;
896
+ line-height: 1.5;
897
+ color: var(--text-faint);
898
+ white-space: pre-wrap;
899
+ word-break: break-word;
900
+ pointer-events: none;
901
+ }
902
+ /* 复用 SetCode 的 Prism 配色 */
903
+ .st-expr__editor .token.comment,
904
+ .st-expr__editor .token.prolog,
905
+ .st-expr__editor .token.doctype,
906
+ .st-expr__editor .token.cdata { color: var(--code-comment); }
907
+ .st-expr__editor .token.punctuation { color: var(--code-punc); }
908
+ .st-expr__editor .token.property,
909
+ .st-expr__editor .token.tag,
910
+ .st-expr__editor .token.boolean,
911
+ .st-expr__editor .token.number,
912
+ .st-expr__editor .token.constant,
913
+ .st-expr__editor .token.symbol { color: var(--code-prop); }
914
+ .st-expr__editor .token.selector,
915
+ .st-expr__editor .token.attr-name,
916
+ .st-expr__editor .token.string,
917
+ .st-expr__editor .token.char,
918
+ .st-expr__editor .token.builtin { color: var(--code-str); }
919
+ .st-expr__editor .token.operator,
920
+ .st-expr__editor .token.entity,
921
+ .st-expr__editor .token.url { color: var(--code-num); }
922
+ .st-expr__editor .token.keyword { color: var(--code-kw); }
923
+ .st-expr__editor .token.function,
924
+ .st-expr__editor .token.class-name { color: var(--code-fn); }
925
+ .st-expr__editor .token.regex,
926
+ .st-expr__editor .token.important,
927
+ .st-expr__editor .token.variable { color: var(--code-var); }
928
+ /* 表达式特有的 $ 绑定变量:独立青色,凸显数据来源 */
929
+ .st-expr__editor .token.binding-var { color: var(--code-binding); }
930
+
931
+ /* ------------------------------ 只读 / 兜底 ------------------------------ */
932
+
933
+ /* 条件表达式(IfForm):纵向堆叠,规范间距 */
934
+ .st-ifform {
935
+ display: flex;
936
+ flex-direction: column;
937
+ gap: 8px;
938
+ width: 100%;
939
+ min-width: 0;
940
+ }
941
+
942
+ .st-raw {
943
+ width: 100%;
944
+ min-width: 0;
945
+ font-size: 11px;
946
+ color: var(--text-dim);
947
+ word-break: break-all;
948
+ background: var(--bg-input);
949
+ border: 1px dashed var(--border);
950
+ border-radius: 5px;
951
+ padding: 4px 8px;
952
+ }
953
+ .st-raw__type {
954
+ color: var(--text-faint);
955
+ margin-right: 4px;
956
+ }
957
+
958
+ /* Inspector / 抽屉内 setter 升一档(28 → 32),与节点面板控件高度对齐 */
959
+ .ni-body .st-input,
960
+ .ee-detail-body .st-input {
961
+ height: var(--ctrl-md);
962
+ }