@bpmn-nova/react 0.3.1-preview

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.
@@ -0,0 +1,1435 @@
1
+ /* @bpmn-nova/internal/theme */
2
+ [data-nova-theme] {
3
+ accent-color: var(--nova-color-primary);
4
+ }
5
+
6
+ [data-nova-theme="light"] {
7
+ --nova-color-canvas: #f8f9fb;
8
+ --nova-color-surface: #ffffff;
9
+ --nova-color-surface-raised: #ffffff;
10
+ --nova-color-surface-subtle: #f7f8fb;
11
+ --nova-color-surface-muted: #f0f2f7;
12
+ --nova-color-text: #1f2430;
13
+ --nova-color-text-secondary: #596477;
14
+ --nova-color-text-muted: #7d8798;
15
+ --nova-color-text-inverse: #ffffff;
16
+ --nova-color-border: #e1e5ec;
17
+ --nova-color-border-strong: #cbd2dd;
18
+ --nova-color-divider: #e9ecf2;
19
+ --nova-color-primary: #635bff;
20
+ --nova-color-primary-hover: #5149e8;
21
+ --nova-color-primary-soft: #f0efff;
22
+ --nova-color-focus-ring: rgba(82, 92, 214, .52);
23
+ --nova-color-edge: #9aa8bb;
24
+ --nova-color-grid-dot: rgba(128, 139, 157, .22);
25
+ --nova-color-backdrop: rgba(20, 26, 39, .38);
26
+ --nova-shadow-sm: 0 1px 3px rgba(31, 40, 65, .10);
27
+ --nova-shadow-md: 0 8px 24px rgba(31, 40, 65, .13);
28
+ --nova-shadow-lg: 0 18px 52px rgba(22, 29, 48, .20);
29
+ --nova-tone-primary-foreground: #5149e8;
30
+ --nova-tone-primary-background: #f0efff;
31
+ --nova-tone-primary-border: #c9c6ff;
32
+ --nova-tone-primary-strong: #635bff;
33
+ --nova-tone-success-foreground: #19875b;
34
+ --nova-tone-success-background: #eaf8f1;
35
+ --nova-tone-success-border: #bde6d3;
36
+ --nova-tone-success-strong: #22a06b;
37
+ --nova-tone-danger-foreground: #c93f4b;
38
+ --nova-tone-danger-background: #fff0f1;
39
+ --nova-tone-danger-border: #f2b9bf;
40
+ --nova-tone-danger-strong: #df4b55;
41
+ --nova-tone-warning-foreground: #a36b13;
42
+ --nova-tone-warning-background: #fff6e8;
43
+ --nova-tone-warning-border: #ecd2a4;
44
+ --nova-tone-warning-strong: #c48218;
45
+ --nova-tone-info-foreground: #3665c5;
46
+ --nova-tone-info-background: #eef3ff;
47
+ --nova-tone-info-border: #c7d5f5;
48
+ --nova-tone-info-strong: #527bd4;
49
+ --nova-tone-neutral-foreground: #667186;
50
+ --nova-tone-neutral-background: #f1f3f6;
51
+ --nova-tone-neutral-border: #dce1e8;
52
+ --nova-tone-neutral-strong: #8791a3;
53
+ --nova-tone-user-task-foreground: #c77b12;
54
+ --nova-tone-user-task-background: #fff4e5;
55
+ --nova-tone-user-task-border: #efd4ac;
56
+ --nova-tone-user-task-strong: #efa63a;
57
+ --nova-tone-service-task-foreground: #2f7ec4;
58
+ --nova-tone-service-task-background: #edf6ff;
59
+ --nova-tone-service-task-border: #c7def2;
60
+ --nova-tone-service-task-strong: #4e9ce7;
61
+ --nova-tone-script-task-foreground: #7351c6;
62
+ --nova-tone-script-task-background: #f2efff;
63
+ --nova-tone-script-task-border: #d5caef;
64
+ --nova-tone-script-task-strong: #9268dc;
65
+ --nova-tone-rule-task-foreground: #8255cc;
66
+ --nova-tone-rule-task-background: #f4efff;
67
+ --nova-tone-rule-task-border: #d9c9f0;
68
+ --nova-tone-rule-task-strong: #9268dc;
69
+ --nova-tone-message-task-foreground: #238b8e;
70
+ --nova-tone-message-task-background: #eaf9f8;
71
+ --nova-tone-message-task-border: #bfe2e0;
72
+ --nova-tone-message-task-strong: #36a6a8;
73
+ --nova-tone-manual-task-foreground: #c46c56;
74
+ --nova-tone-manual-task-background: #fff0ec;
75
+ --nova-tone-manual-task-border: #edc7bc;
76
+ --nova-tone-manual-task-strong: #d67c67;
77
+ }
78
+
79
+ [data-nova-theme="dark"] {
80
+ --nova-color-canvas: #10131a;
81
+ --nova-color-surface: #171b24;
82
+ --nova-color-surface-raised: #202633;
83
+ --nova-color-surface-subtle: #141821;
84
+ --nova-color-surface-muted: #252b38;
85
+ --nova-color-text: #edf1f7;
86
+ --nova-color-text-secondary: #bdc6d5;
87
+ --nova-color-text-muted: #8f9aad;
88
+ --nova-color-text-inverse: #11151d;
89
+ --nova-color-border: #303847;
90
+ --nova-color-border-strong: #465164;
91
+ --nova-color-divider: #29313f;
92
+ --nova-color-primary: #918cff;
93
+ --nova-color-primary-hover: #aaa6ff;
94
+ --nova-color-primary-soft: #2a2852;
95
+ --nova-color-focus-ring: rgba(150, 145, 255, .72);
96
+ --nova-color-edge: #657188;
97
+ --nova-color-grid-dot: rgba(154, 167, 188, .18);
98
+ --nova-color-backdrop: rgba(2, 5, 10, .68);
99
+ --nova-shadow-sm: 0 1px 3px rgba(0, 0, 0, .28);
100
+ --nova-shadow-md: 0 10px 30px rgba(0, 0, 0, .34);
101
+ --nova-shadow-lg: 0 22px 64px rgba(0, 0, 0, .48);
102
+ --nova-tone-primary-foreground: #b6b3ff;
103
+ --nova-tone-primary-background: #2a2852;
104
+ --nova-tone-primary-border: #555097;
105
+ --nova-tone-primary-strong: #918cff;
106
+ --nova-tone-success-foreground: #71d6ab;
107
+ --nova-tone-success-background: #17382d;
108
+ --nova-tone-success-border: #2b6550;
109
+ --nova-tone-success-strong: #42bd88;
110
+ --nova-tone-danger-foreground: #ff9aa3;
111
+ --nova-tone-danger-background: #42232a;
112
+ --nova-tone-danger-border: #7a3b45;
113
+ --nova-tone-danger-strong: #f06c78;
114
+ --nova-tone-warning-foreground: #edbd6d;
115
+ --nova-tone-warning-background: #3c301d;
116
+ --nova-tone-warning-border: #71582b;
117
+ --nova-tone-warning-strong: #d99d3d;
118
+ --nova-tone-info-foreground: #98b8ff;
119
+ --nova-tone-info-background: #202f50;
120
+ --nova-tone-info-border: #3a568d;
121
+ --nova-tone-info-strong: #7298ee;
122
+ --nova-tone-neutral-foreground: #aeb8c8;
123
+ --nova-tone-neutral-background: #252b36;
124
+ --nova-tone-neutral-border: #414a59;
125
+ --nova-tone-neutral-strong: #8f9aad;
126
+ --nova-tone-user-task-foreground: #f0bd70;
127
+ --nova-tone-user-task-background: #3d301e;
128
+ --nova-tone-user-task-border: #6b522b;
129
+ --nova-tone-user-task-strong: #dea24b;
130
+ --nova-tone-service-task-foreground: #8dc8ff;
131
+ --nova-tone-service-task-background: #1d3349;
132
+ --nova-tone-service-task-border: #345b7d;
133
+ --nova-tone-service-task-strong: #62a9e8;
134
+ --nova-tone-script-task-foreground: #bea8ff;
135
+ --nova-tone-script-task-background: #30284c;
136
+ --nova-tone-script-task-border: #594985;
137
+ --nova-tone-script-task-strong: #9a7be0;
138
+ --nova-tone-rule-task-foreground: #c9a5ff;
139
+ --nova-tone-rule-task-background: #342648;
140
+ --nova-tone-rule-task-border: #624680;
141
+ --nova-tone-rule-task-strong: #a775dd;
142
+ --nova-tone-message-task-foreground: #79d2d2;
143
+ --nova-tone-message-task-background: #183738;
144
+ --nova-tone-message-task-border: #2c6264;
145
+ --nova-tone-message-task-strong: #4db7b9;
146
+ --nova-tone-manual-task-foreground: #f0a995;
147
+ --nova-tone-manual-task-background: #3e2925;
148
+ --nova-tone-manual-task-border: #72493f;
149
+ --nova-tone-manual-task-strong: #dc876f;
150
+ }
151
+
152
+ /* @bpmn-nova/internal/icons */
153
+ .nova-icon { width: 16px; height: 16px; display: inline-grid; place-items: center; flex: none; color: currentColor; line-height: 0; transform-origin: 50% 50%; }
154
+ .nova-icon.nova-icon-xs { width: 12px; height: 12px; }
155
+ .nova-icon.nova-icon-sm { width: 14px; height: 14px; }
156
+ .nova-icon.nova-icon-md { width: 16px; height: 16px; }
157
+ .nova-icon > .nova-icon-svg { width: 100%; height: 100%; display: block; overflow: visible; fill: none; stroke: currentColor; vector-effect: non-scaling-stroke; }
158
+ .nova-icon[data-icon-missing="true"] { visibility: hidden; }
159
+
160
+ /* @bpmn-nova/internal/export-svg */
161
+ .nova-svg-export-preview {
162
+ position: absolute;
163
+ inset: 0;
164
+ z-index: 140;
165
+ display: grid;
166
+ place-items: center;
167
+ padding: 24px;
168
+ box-sizing: border-box;
169
+ background: var(--nova-color-backdrop, rgba(20, 26, 39, .38));
170
+ color: var(--nova-color-text, #1f2430);
171
+ font-family: var(--nova-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", sans-serif);
172
+ opacity: 1;
173
+ transition: opacity .18s ease;
174
+ }
175
+ .nova-svg-export-preview.is-entering,
176
+ .nova-svg-export-preview.is-closing { opacity: 0; }
177
+ .nova-svg-export-dialog {
178
+ width: min(1120px, 100%);
179
+ height: min(820px, 100%);
180
+ min-height: 420px;
181
+ display: grid;
182
+ grid-template-rows: auto auto minmax(0, 1fr) auto auto;
183
+ overflow: hidden;
184
+ border: 1px solid var(--nova-color-border, #e1e5ec);
185
+ border-radius: 16px;
186
+ background: var(--nova-color-surface, #fff);
187
+ box-shadow: var(--nova-shadow-lg, 0 18px 52px rgba(22, 29, 48, .2));
188
+ transform: translateY(0) scale(1);
189
+ transition: transform .2s cubic-bezier(.2, .8, .2, 1);
190
+ }
191
+ .nova-svg-export-preview.is-entering .nova-svg-export-dialog,
192
+ .nova-svg-export-preview.is-closing .nova-svg-export-dialog { transform: translateY(10px) scale(.985); }
193
+ .nova-svg-export-header,
194
+ .nova-svg-export-toolbar,
195
+ .nova-svg-export-footer { display: flex; align-items: center; gap: 12px; padding: 14px 18px; }
196
+ .nova-svg-export-header { justify-content: space-between; border-bottom: 1px solid var(--nova-color-divider, #e9ecf2); }
197
+ .nova-svg-export-heading { display: grid; gap: 3px; }
198
+ .nova-svg-export-heading strong { font-size: 17px; }
199
+ .nova-svg-export-heading span { color: var(--nova-color-text-muted); font-size: 12px; }
200
+ .nova-svg-export-close { width: 34px; height: 34px; border: 0; border-radius: 9px; background: transparent; color: var(--nova-color-text-muted); font-size: 24px; line-height: 1; cursor: pointer; }
201
+ .nova-svg-export-close:hover { background: var(--nova-color-surface-muted); color: var(--nova-color-text); }
202
+ .nova-svg-export-toolbar { justify-content: space-between; flex-wrap: wrap; background: var(--nova-color-surface-subtle); border-bottom: 1px solid var(--nova-color-divider); }
203
+ .nova-svg-export-theme,
204
+ .nova-svg-export-viewport-tools { display: inline-flex; align-items: center; gap: 3px; padding: 3px; border-radius: 9px; background: var(--nova-color-surface); border: 1px solid var(--nova-color-border); }
205
+ .nova-svg-export-theme button,
206
+ .nova-svg-export-viewport-tools button { min-height: 28px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: var(--nova-color-text-secondary); cursor: pointer; }
207
+ .nova-svg-export-theme button.is-active { background: var(--nova-color-primary-soft); color: var(--nova-color-primary); font-weight: 650; }
208
+ .nova-svg-export-theme button:focus-visible,
209
+ .nova-svg-export-viewport-tools button:focus-visible,
210
+ .nova-svg-export-actions button:focus-visible,
211
+ .nova-svg-export-close:focus-visible,
212
+ .nova-svg-export-viewport:focus-visible { outline: 2px solid var(--nova-color-focus-ring); outline-offset: 2px; }
213
+ .nova-svg-export-transparent { display: inline-flex; align-items: center; gap: 7px; color: var(--nova-color-text-secondary); font-size: 12px; cursor: pointer; }
214
+ .nova-svg-export-viewport-tools span { min-width: 46px; text-align: center; color: var(--nova-color-text-muted); font-size: 11px; }
215
+ .nova-svg-export-body { position: relative; min-height: 0; overflow: hidden; background: var(--nova-color-canvas); }
216
+ .nova-svg-export-viewport { position: absolute; inset: 0; overflow: hidden; cursor: grab; touch-action: none; background-color: var(--nova-color-canvas); background-image: linear-gradient(45deg, color-mix(in srgb, var(--nova-color-border) 35%, transparent) 25%, transparent 25%), linear-gradient(-45deg, color-mix(in srgb, var(--nova-color-border) 35%, transparent) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, color-mix(in srgb, var(--nova-color-border) 35%, transparent) 75%), linear-gradient(-45deg, transparent 75%, color-mix(in srgb, var(--nova-color-border) 35%, transparent) 75%); background-size: 20px 20px; background-position: 0 0, 0 10px, 10px -10px, -10px 0; }
217
+ .nova-svg-export-viewport.is-dragging { cursor: grabbing; }
218
+ .nova-svg-export-stage { position: absolute; left: 0; top: 0; width: 1px; height: 1px; transform-origin: 0 0; will-change: transform; }
219
+ .nova-svg-export-image { display: block; max-width: none; user-select: none; pointer-events: none; box-shadow: 0 6px 24px rgba(0, 0, 0, .14); }
220
+ .nova-svg-export-state { position: absolute; inset: 0; display: grid; place-content: center; justify-items: center; gap: 12px; background: color-mix(in srgb, var(--nova-color-surface) 88%, transparent); color: var(--nova-color-text-secondary); }
221
+ .nova-svg-export-state[hidden] { display: none; }
222
+ .nova-svg-export-state.is-error { color: var(--nova-tone-danger-foreground); }
223
+ .nova-svg-export-spinner { width: 24px; height: 24px; border: 2px solid var(--nova-color-border); border-top-color: var(--nova-color-primary); border-radius: 50%; animation: nova-svg-export-spin .8s linear infinite; }
224
+ .nova-svg-export-state.is-error .nova-svg-export-spinner { display: none; }
225
+ @keyframes nova-svg-export-spin { to { transform: rotate(360deg); } }
226
+ .nova-svg-export-warnings { max-height: 110px; overflow: auto; padding: 10px 18px; border-top: 1px solid var(--nova-tone-warning-border); background: var(--nova-tone-warning-background); color: var(--nova-tone-warning-foreground); font-size: 11px; }
227
+ .nova-svg-export-warnings[hidden] { display: none; }
228
+ .nova-svg-export-warnings strong { display: block; margin-bottom: 4px; }
229
+ .nova-svg-export-warnings ul { margin: 0; padding-left: 18px; }
230
+ .nova-svg-export-footer { justify-content: space-between; border-top: 1px solid var(--nova-color-divider); }
231
+ .nova-svg-export-summary { min-width: 0; overflow: hidden; color: var(--nova-color-text-muted); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
232
+ .nova-svg-export-actions { display: flex; gap: 8px; }
233
+ .nova-svg-export-actions button { min-height: 34px; padding: 0 14px; border: 1px solid var(--nova-color-border); border-radius: 9px; background: var(--nova-color-surface); color: var(--nova-color-text-secondary); cursor: pointer; }
234
+ .nova-svg-export-actions button.is-primary { border-color: var(--nova-color-primary); background: var(--nova-color-primary); color: var(--nova-color-text-inverse, #fff); }
235
+ .nova-svg-export-actions button:disabled { opacity: .48; cursor: not-allowed; }
236
+ @media (max-width: 720px) {
237
+ .nova-svg-export-preview { padding: 10px; }
238
+ .nova-svg-export-dialog { width: 100%; height: 100%; min-height: 0; border-radius: 12px; }
239
+ .nova-svg-export-toolbar { align-items: flex-start; }
240
+ .nova-svg-export-viewport-tools { order: 3; width: 100%; justify-content: center; }
241
+ .nova-svg-export-summary { display: none; }
242
+ .nova-svg-export-footer { justify-content: flex-end; }
243
+ }
244
+ @media (prefers-reduced-motion: reduce) {
245
+ .nova-svg-export-preview,
246
+ .nova-svg-export-dialog { transition: none; }
247
+ .nova-svg-export-spinner { animation: none; }
248
+ }
249
+
250
+ /* @bpmn-nova/internal/renderer-svg */
251
+ .mb-diagram-host,
252
+ .mb-runtime-timeline-host {
253
+ --mb-primary: var(--nova-color-primary, #635bff);
254
+ --mb-primary-strong: var(--nova-color-primary-hover, #5149e8);
255
+ --mb-primary-soft: var(--nova-color-primary-soft, #f0efff);
256
+ --mb-text: var(--nova-color-text, #1f2430);
257
+ --mb-muted: var(--nova-color-text-muted, #7d8798);
258
+ --mb-subtle: var(--nova-color-text-muted, #a3aab7);
259
+ --mb-border: var(--nova-color-border, #e1e5ec);
260
+ --mb-border-strong: var(--nova-color-border-strong, #cbd2dd);
261
+ --mb-edge: var(--nova-color-edge, #9aa8bb);
262
+ --mb-success: var(--nova-tone-success-strong, #22a06b);
263
+ --mb-success-soft: var(--nova-tone-success-background, #eaf8f1);
264
+ --mb-danger: var(--nova-tone-danger-strong, #df4b55);
265
+ --mb-danger-soft: var(--nova-tone-danger-background, #fff0f1);
266
+ --mb-warning: var(--nova-tone-warning-strong, #c48218);
267
+ --mb-warning-soft: var(--nova-tone-warning-background, #fff6e8);
268
+ --mb-card: var(--nova-color-surface, #ffffff);
269
+ --mb-grid-dot: var(--nova-color-grid-dot, rgba(128, 139, 157, .22));
270
+ }
271
+
272
+ .mb-diagram-host {
273
+ position: relative;
274
+ width: 100%;
275
+ height: 100%;
276
+ min-height: 0;
277
+ overflow: hidden;
278
+ background: var(--nova-color-canvas, #f8f9fb);
279
+ user-select: none;
280
+ color: var(--mb-text);
281
+ font-family: var(--nova-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif);
282
+ text-rendering: optimizeLegibility;
283
+ -webkit-font-smoothing: auto;
284
+ }
285
+ .mb-diagram-viewport {
286
+ position: absolute;
287
+ inset: 0;
288
+ overflow: hidden;
289
+ cursor: default;
290
+ background-color: var(--nova-color-canvas, #fafbfc);
291
+ background-image: radial-gradient(circle, var(--mb-grid-dot) 1px, transparent 1.1px);
292
+ background-size: 20px 20px;
293
+ }
294
+ .mb-diagram-viewport.is-grid-hidden { background-image: none; }
295
+ .mb-diagram-viewport::before {
296
+ content: '';
297
+ position: absolute;
298
+ inset: 0;
299
+ pointer-events: none;
300
+ background: radial-gradient(circle at 48% 42%, color-mix(in srgb, var(--mb-primary) 4%, transparent), transparent 38%);
301
+ }
302
+ .mb-diagram-viewport.is-panning { cursor: grabbing; }
303
+ .mb-diagram-viewport.is-pan-ready { cursor: grab; }
304
+ .mb-diagram-viewport.is-selecting { cursor: crosshair; }
305
+ .mb-diagram-viewport[data-interaction-mode="marquee"] { cursor: crosshair; }
306
+ .mb-diagram-viewport[data-interaction-mode="pan"] { cursor: grab; }
307
+ .mb-diagram-viewport[data-interaction-mode="pan"].is-panning { cursor: grabbing; }
308
+ .mb-selection-marquee {
309
+ position: absolute;
310
+ z-index: 45;
311
+ border: 1px solid var(--nova-color-primary);
312
+ border-radius: 3px;
313
+ background: color-mix(in srgb, var(--nova-color-primary) 9%, transparent);
314
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--nova-color-surface) 42%, transparent);
315
+ pointer-events: none;
316
+ }
317
+ .mb-selection-marquee[hidden] { display: none; }
318
+ .mb-diagram-world {
319
+ position: absolute;
320
+ left: 0;
321
+ top: 0;
322
+ width: 1px;
323
+ height: 1px;
324
+ overflow: visible;
325
+ transform-origin: 0 0;
326
+ /* The logical canvas is unbounded. Individual SVG layers are dynamically
327
+ enveloped around visible/content coordinates instead of using a finite
328
+ 5200×3200 surface. */
329
+ transform-style: flat;
330
+ }
331
+ .mb-edge-layer,
332
+ .mb-runtime-transition-layer,
333
+ .mb-guide-layer,
334
+ .mb-edge-label-layer { position: absolute; overflow: visible; }
335
+ .mb-node-layer { position: absolute; left: 0; top: 0; width: 1px; height: 1px; overflow: visible; }
336
+ .mb-edge-layer { overflow: visible; z-index: 10; shape-rendering: geometricPrecision; text-rendering: geometricPrecision; }
337
+ .mb-runtime-transition-layer { overflow: visible; z-index: 13; shape-rendering: geometricPrecision; text-rendering: geometricPrecision; pointer-events: none; }
338
+ .mb-guide-layer { overflow: visible; z-index: 15; pointer-events: none; }
339
+ .mb-node-layer { z-index: 20; pointer-events: none; }
340
+ .mb-node-layer > * { pointer-events: auto; }
341
+ .mb-edge-label-layer { z-index: 30; pointer-events: none; shape-rendering: geometricPrecision; text-rendering: geometricPrecision; }
342
+
343
+ /* Magnetic alignment guides */
344
+ .mb-alignment-guide {
345
+ stroke: color-mix(in srgb, var(--nova-color-primary) 72%, transparent);
346
+ stroke-width: 1;
347
+ stroke-dasharray: 5 5;
348
+ vector-effect: non-scaling-stroke;
349
+ pointer-events: none;
350
+ }
351
+ .mb-alignment-guide.kind-center { stroke: color-mix(in srgb, var(--nova-color-primary) 82%, transparent); }
352
+ .mb-alignment-guide.kind-edge { stroke: color-mix(in srgb, var(--nova-tone-info-strong) 65%, transparent); }
353
+
354
+ /* Edges */
355
+ .mb-edge-path {
356
+ stroke: var(--mb-edge);
357
+ stroke-width: 1.8;
358
+ stroke-linecap: round;
359
+ stroke-linejoin: round;
360
+ vector-effect: non-scaling-stroke;
361
+ transition: stroke .14s ease, stroke-width .14s ease;
362
+ }
363
+ .mb-edge-hit {
364
+ stroke: transparent;
365
+ stroke-width: 16;
366
+ pointer-events: stroke;
367
+ cursor: pointer;
368
+ vector-effect: non-scaling-stroke;
369
+ }
370
+ .mb-edge-group:hover .mb-edge-path { stroke: var(--nova-color-border-strong); stroke-width: 2.2; }
371
+ .mb-edge-group.is-selected .mb-edge-path { stroke: var(--mb-primary); stroke-width: 2.6; }
372
+ .mb-edge-group.status-completed .mb-edge-path { stroke: var(--mb-success); stroke-width: 2.3; }
373
+ .mb-edge-group.status-active .mb-edge-path { stroke: var(--mb-primary); stroke-width: 2.7; stroke-dasharray: 8 6; animation: mb-dash .9s linear infinite; }
374
+ .mb-edge-group.status-failed .mb-edge-path { stroke: var(--mb-danger); }
375
+ .mb-edge-group[data-tone] .mb-edge-path { stroke: var(--nova-runtime-tone-strong); }
376
+ .mb-edge-group.type-messageFlow .mb-edge-path { stroke-dasharray: 8 7; }
377
+ .mb-edge-group.type-association .mb-edge-path { stroke-dasharray: 2 6; marker-end: none; }
378
+ @keyframes mb-dash { to { stroke-dashoffset: -14; } }
379
+
380
+ .mb-runtime-transition { pointer-events: auto; cursor: pointer; }
381
+ .mb-runtime-transition-hit { stroke: transparent; stroke-width: 12; pointer-events: stroke; vector-effect: non-scaling-stroke; fill: none; }
382
+ .mb-runtime-transition-path { stroke: var(--nova-runtime-tone-strong, var(--nova-tone-neutral-strong)); stroke-width: 2.2; stroke-dasharray: 8 6; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; fill: none; animation: mb-runtime-transition-flow .85s linear infinite; }
383
+ .mb-runtime-transition.is-history { opacity: .34; }
384
+ .mb-runtime-transition.is-latest { opacity: 1; }
385
+ .mb-runtime-transition:focus { outline: none; }
386
+ .mb-runtime-transition:hover .mb-runtime-transition-path, .mb-runtime-transition:focus-visible .mb-runtime-transition-path { stroke-width: 3; filter: drop-shadow(0 0 3px color-mix(in srgb, var(--nova-runtime-tone-strong) 26%, transparent)); }
387
+ .mb-runtime-transition-label rect { fill: color-mix(in srgb, var(--nova-color-surface-raised) 98%, transparent); stroke: var(--nova-runtime-tone-border, var(--nova-tone-neutral-border)); stroke-width: 1; vector-effect: non-scaling-stroke; }
388
+ .mb-runtime-transition-label text { fill: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); font-size: var(--nova-font-size-sm, 12px); line-height: 16px; font-weight: var(--nova-font-weight-semibold, 600); pointer-events: none; }
389
+ @keyframes mb-runtime-transition-flow { to { stroke-dashoffset: -14; } }
390
+ @media (prefers-reduced-motion: reduce) {
391
+ .mb-runtime-transition-path { animation: none; }
392
+ }
393
+
394
+ .mb-edge-label-group { pointer-events: auto; cursor: text; }
395
+ .mb-edge-label-bg {
396
+ fill: var(--nova-color-surface-raised);
397
+ stroke: var(--nova-color-border);
398
+ stroke-width: .9;
399
+ vector-effect: non-scaling-stroke;
400
+ }
401
+ .mb-edge-label {
402
+ font-size: var(--nova-font-size-sm, 12px);
403
+ font-weight: var(--nova-font-weight-semibold, 600);
404
+ letter-spacing: 0;
405
+ fill: var(--nova-color-text-secondary, #596477);
406
+ pointer-events: none;
407
+ text-rendering: geometricPrecision;
408
+ }
409
+ .mb-edge-label-group.is-placeholder .mb-edge-label-bg { stroke-dasharray: 3 3; fill: var(--nova-color-surface-subtle); }
410
+ .mb-edge-label-group.is-placeholder .mb-edge-label { fill: var(--nova-color-primary); font-weight: 600; }
411
+ .mb-edge-bend { fill: var(--nova-color-surface, #fff); stroke: var(--mb-primary); stroke-width: 2; cursor: move; vector-effect: non-scaling-stroke; filter: drop-shadow(0 2px 4px color-mix(in srgb, var(--nova-color-text) 15%, transparent)); }
412
+ .mb-edge-label-editor-wrap { width: 100%; height: 100%; display: grid; place-items: center; }
413
+ .mb-edge-label-editor { pointer-events: auto; }
414
+ .mb-edge-label-input {
415
+ width: 156px;
416
+ height: 28px;
417
+ box-sizing: border-box;
418
+ border: 1.5px solid var(--mb-primary);
419
+ border-radius: 7px;
420
+ padding: 0 9px;
421
+ outline: none;
422
+ background: var(--nova-color-surface, #fff);
423
+ color: var(--nova-color-text);
424
+ font-family: var(--nova-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif);
425
+ font-size: var(--nova-font-size-sm, 12px);
426
+ font-weight: var(--nova-font-weight-semibold, 600);
427
+ line-height: 18px;
428
+ box-shadow: var(--nova-shadow-md), 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 11%, transparent);
429
+ }
430
+
431
+ /* Base nodes */
432
+ .mb-node {
433
+ position: absolute;
434
+ box-sizing: border-box;
435
+ cursor: pointer;
436
+ color: var(--mb-text);
437
+ outline: none;
438
+ z-index: 5;
439
+ }
440
+ .mb-node-task,
441
+ .mb-node-container {
442
+ overflow: visible;
443
+ background: var(--mb-card);
444
+ border: 1px solid var(--mb-border);
445
+ border-radius: 13px;
446
+ box-shadow: var(--nova-shadow-sm);
447
+ transition: box-shadow .14s ease, border-color .14s ease, transform .14s ease;
448
+ }
449
+ .mb-node-task:hover,
450
+ .mb-node-container:hover { border-color: var(--nova-color-border-strong); box-shadow: var(--nova-shadow-md); }
451
+ .mb-node.is-selected.mb-node-task,
452
+ .mb-node.is-selected.mb-node-container {
453
+ border-color: var(--mb-primary);
454
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 10%, transparent), var(--nova-shadow-md);
455
+ }
456
+ .mb-node[data-tone].mb-node-task { border-color: var(--nova-runtime-tone-border); }
457
+ .mb-node[data-tone="primary"].mb-node-task { box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 9%, transparent), var(--nova-shadow-md); }
458
+ .mb-node-accent { position: absolute; left: -1px; top: 18px; bottom: 18px; width: 3px; border-radius: 0 5px 5px 0; background: var(--nova-color-primary); opacity: .8; }
459
+ .mb-node-task > .mb-node-accent { top: 12px; bottom: 12px; }
460
+ .mb-node-type-userTask .mb-node-accent { background: var(--nova-tone-user-task-strong, #efa63a); }
461
+ .mb-node-type-serviceTask .mb-node-accent { background: var(--nova-tone-service-task-strong, #4e9ce7); }
462
+ .mb-node-type-businessRuleTask .mb-node-accent { background: var(--nova-tone-script-task-strong, #9268dc); }
463
+ .mb-node-type-sendTask .mb-node-accent,
464
+ .mb-node-type-receiveTask .mb-node-accent { background: var(--nova-tone-message-task-strong, #36a6a8); }
465
+ .mb-node-type-manualTask .mb-node-accent { background: var(--nova-tone-manual-task-strong, #d67c67); }
466
+ .mb-node-type-callActivity .mb-node-accent { background: var(--nova-tone-success-strong); }
467
+
468
+ .mb-node-header { display: flex; align-items: center; gap: 11px; height: 100%; padding: 0 15px 0 16px; box-sizing: border-box; }
469
+ .mb-node-task > .mb-node-header { gap: 12px; padding: 0 14px; }
470
+ .mb-node-icon {
471
+ display: grid;
472
+ place-items: center;
473
+ width: 34px;
474
+ height: 34px;
475
+ flex: 0 0 34px;
476
+ border-radius: 10px;
477
+ background: var(--nova-color-primary-soft, #f0efff);
478
+ color: var(--nova-color-primary);
479
+ font-size: var(--nova-font-size-lg, 16px);
480
+ font-weight: var(--nova-font-weight-bold, 700);
481
+ letter-spacing: -1px;
482
+ }
483
+ .mb-node-task > .mb-node-header .mb-node-icon { width: 36px; height: 36px; flex-basis: 36px; }
484
+ .mb-node-type-userTask .mb-node-icon { background: var(--nova-tone-user-task-background, #fff4e5); color: var(--nova-tone-user-task-foreground, #c77b12); }
485
+ .mb-node-type-serviceTask .mb-node-icon { background: var(--nova-tone-service-task-background, #edf6ff); color: var(--nova-tone-service-task-foreground, #2f7ec4); }
486
+ .mb-node-type-scriptTask .mb-node-icon { background: var(--nova-tone-script-task-background, #f2efff); color: var(--nova-tone-script-task-foreground, #7351c6); font-size: var(--nova-font-size-sm, 12px); letter-spacing: -1px; }
487
+ .mb-node-type-businessRuleTask .mb-node-icon { background: var(--nova-tone-rule-task-background, #f4efff); color: var(--nova-tone-rule-task-foreground, #8255cc); }
488
+ .mb-node-type-manualTask .mb-node-icon { background: var(--nova-tone-manual-task-background, #fff0ec); color: var(--nova-tone-manual-task-foreground, #c46c56); }
489
+ .mb-node-type-sendTask .mb-node-icon,
490
+ .mb-node-type-receiveTask .mb-node-icon { background: var(--nova-tone-message-task-background, #eaf9f8); color: var(--nova-tone-message-task-foreground, #238b8e); }
491
+ .mb-node-title-wrap { min-width: 0; flex: 1; }
492
+ .mb-node-runtime-copy { display: grid; align-content: center; min-width: 0; box-sizing: border-box; padding-right: 22px; }
493
+ .mb-node-title { font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-bold, 700); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--nova-color-text, #2a303c); }
494
+ .mb-node-subtitle { margin-top: 4px; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; color: var(--mb-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
495
+ .mb-node-task > .mb-node-header .mb-node-title { font-size: var(--nova-font-size-lg, 16px); line-height: 22px; font-weight: var(--nova-font-weight-bold, 700); }
496
+ .mb-node-task > .mb-node-header .mb-node-subtitle { margin-top: 2px; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
497
+ .mb-diagram-host:not([data-mode="instance"]) .mb-diagram-viewport.is-low-detail .mb-node-subtitle { display: none; }
498
+ .mb-diagram-host[data-mode="instance"] .mb-diagram-viewport.is-low-detail .mb-runtime-summary { display: none; }
499
+ .mb-diagram-host[data-mode="instance"] .mb-diagram-viewport.is-low-detail .mb-runtime-action-summary { display: none; }
500
+ .mb-diagram-viewport.is-overview .mb-edge-label-group:not(.is-selected),
501
+ .mb-diagram-viewport.is-overview .mb-node:not(.is-selected) .mb-node-floating-label { display: none; }
502
+ .mb-activity-markers { position: absolute; left: 50%; bottom: 2px; transform: translateX(-50%); display: inline-flex; align-items: center; gap: 4px; color: var(--nova-color-text-secondary); line-height: 0; }
503
+ .mb-activity-marker { width: 12px; height: 12px; display: grid; place-items: center; }
504
+ .mb-activity-marker-icon { width: 12px; height: 12px; display: block; overflow: visible; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
505
+ .mb-node-type-callActivity { border-width: 2px; }
506
+ .mb-node-container { background: color-mix(in srgb, var(--nova-color-surface) 88%, transparent); border-style: dashed; border-color: var(--nova-color-border-strong); }
507
+ .mb-node-type-transaction { border-style: double; border-width: 3px; }
508
+ .mb-node-type-eventSubProcess { border-style: dotted; }
509
+
510
+ /* Events */
511
+ .mb-node-event,
512
+ .mb-node-boundary { display: grid; place-items: center; z-index: 7; }
513
+ .mb-event-shape {
514
+ width: 46px;
515
+ height: 46px;
516
+ box-sizing: border-box;
517
+ display: grid;
518
+ place-items: center;
519
+ border-radius: 50%;
520
+ border: 2px solid var(--nova-color-text-muted);
521
+ background: var(--nova-color-surface, #fff);
522
+ color: var(--nova-color-text-secondary);
523
+ box-shadow: var(--nova-shadow-sm);
524
+ position: relative;
525
+ }
526
+ .mb-node-boundary .mb-event-shape { width: 40px; height: 40px; border-width: 2px; }
527
+ .mb-event-shape[data-stage="intermediate"],
528
+ .mb-node-boundary .mb-event-shape { box-shadow: inset 0 0 0 3px var(--nova-color-surface), inset 0 0 0 4.5px var(--nova-color-text-muted, #8796a9), var(--nova-shadow-sm); }
529
+ .mb-event-shape[data-stage="end"] { border-width: 4px; border-color: var(--nova-color-text-secondary); }
530
+ .mb-event-shape.is-noninterrupting { border-style: dashed; box-shadow: inset 0 0 0 3px var(--nova-color-surface), inset 0 0 0 4.5px var(--nova-color-text-muted, #8796a9), var(--nova-shadow-sm); }
531
+ .mb-event-glyph { font-size: 18px; font-weight: var(--nova-font-weight-bold, 700); line-height: 1; }
532
+ .mb-node-type-terminateEndEvent .mb-event-glyph { font-size: 20px; }
533
+ .mb-node.status-completed .mb-event-shape { border-color: var(--mb-success); color: var(--mb-success); background: var(--mb-success-soft); }
534
+ .mb-node.status-active .mb-event-shape { border-color: var(--mb-primary); color: var(--mb-primary); background: var(--mb-primary-soft); }
535
+ .mb-node[data-tone] .mb-event-shape { border-color: var(--nova-runtime-tone-strong); color: var(--nova-runtime-tone-foreground); background: var(--nova-runtime-tone-background); }
536
+
537
+ /* Gateways */
538
+ .mb-node-gateway { display: grid; place-items: center; z-index: 7; }
539
+ .mb-gateway-shape {
540
+ width: 49px;
541
+ height: 49px;
542
+ transform: rotate(45deg);
543
+ border: 1.8px solid var(--nova-tone-warning-strong);
544
+ border-radius: 7px;
545
+ background: var(--nova-tone-warning-background);
546
+ display: grid;
547
+ place-items: center;
548
+ box-shadow: var(--nova-shadow-sm);
549
+ }
550
+ .mb-gateway-symbol { transform: rotate(-45deg); font-size: 24px; font-weight: var(--nova-font-weight-bold, 700); color: var(--nova-tone-warning-foreground); line-height: 1; }
551
+ .mb-gateway-role-badge { position: absolute; z-index: 9; top: -8px; right: -8px; min-width: 18px; height: 18px; border: 2px solid var(--nova-color-surface); border-radius: 9px; padding: 0 4px; display: grid; place-items: center; color: var(--nova-color-text-inverse, #fff); background: var(--nova-tone-neutral-strong); box-shadow: var(--nova-shadow-sm); font-size: var(--nova-font-size-xs, 10px); font-weight: var(--nova-font-weight-bold, 700); line-height: 1; pointer-events: none; }
552
+ .mb-gateway-role-badge.is-incomplete { background: var(--nova-tone-warning-strong, #c48218); }
553
+ .mb-gateway-role-badge.is-conflict { background: var(--nova-tone-danger-strong); }
554
+ .mb-gateway-role-badge.is-ambiguous { background: var(--nova-tone-neutral-strong); }
555
+ .mb-node-type-complexGateway .mb-gateway-symbol { font-size: 20px; }
556
+ .mb-node.status-completed .mb-gateway-shape { border-color: var(--mb-success); background: var(--mb-success-soft); }
557
+ .mb-node.status-active .mb-gateway-shape { border-color: var(--mb-primary); background: var(--mb-primary-soft); }
558
+ .mb-node[data-tone] .mb-gateway-shape { border-color: var(--nova-runtime-tone-strong); background: var(--nova-runtime-tone-background); }
559
+
560
+ .mb-node-floating-label {
561
+ position: absolute;
562
+ left: 50%;
563
+ top: calc(100% + 6px);
564
+ transform: translateX(-50%);
565
+ white-space: nowrap;
566
+ max-width: 180px;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ font-size: var(--nova-font-size-sm, 12px);
570
+ line-height: 16px;
571
+ font-weight: var(--nova-font-weight-semibold, 600);
572
+ color: var(--nova-color-text-secondary);
573
+ pointer-events: none;
574
+ }
575
+
576
+ /* Data / artifacts */
577
+ .mb-node-data,
578
+ .mb-node-dataStore { display: grid; place-items: center; }
579
+ .mb-data-object-shape {
580
+ width: 50px;
581
+ height: 62px;
582
+ border: 1.7px solid var(--nova-color-text-muted);
583
+ border-radius: 4px;
584
+ background: var(--nova-color-surface, #fff);
585
+ position: relative;
586
+ display: grid;
587
+ place-items: center;
588
+ color: var(--nova-color-text-muted, #77879a);
589
+ }
590
+ .mb-data-object-shape::after {
591
+ content: '';
592
+ position: absolute;
593
+ right: -1.7px;
594
+ top: -1.7px;
595
+ width: 15px;
596
+ height: 15px;
597
+ background: linear-gradient(45deg, var(--nova-color-surface) 48%, var(--nova-color-text-muted) 49%, var(--nova-color-text-muted) 55%, var(--nova-color-divider, #eef1f5) 56%);
598
+ border-top-right-radius: 3px;
599
+ }
600
+ .mb-data-object-lines { font-size: 18px; }
601
+ .mb-data-store-shape {
602
+ width: 56px;
603
+ height: 50px;
604
+ border: 1.7px solid var(--nova-color-text-muted);
605
+ border-radius: 50% / 14%;
606
+ background: var(--nova-color-surface, #fff);
607
+ display: grid;
608
+ place-items: center;
609
+ color: var(--nova-color-text-muted, #77879a);
610
+ position: relative;
611
+ }
612
+ .mb-data-store-shape::before,
613
+ .mb-data-store-shape::after { content: ''; position: absolute; left: -1px; right: -1px; height: 9px; border-radius: 50%; border-top: 1.5px solid var(--nova-color-text-muted); }
614
+ .mb-data-store-shape::before { top: 9px; }
615
+ .mb-data-store-shape::after { top: 19px; }
616
+ .mb-node-annotation { border-left: 2px solid var(--nova-color-text-muted); border-top: 1px solid transparent; border-bottom: 1px solid transparent; }
617
+ .mb-annotation-shape { height: 100%; display: flex; align-items: center; padding: 0 15px; box-sizing: border-box; color: var(--nova-color-text-secondary); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
618
+ .mb-node-group { border: 1.5px dashed var(--nova-color-border-strong); border-radius: 16px; z-index: 1; }
619
+ .mb-container-caption { position: absolute; left: 12px; top: 9px; padding: 3px 7px; border-radius: 6px; background: var(--nova-color-canvas, #f8f9fb); color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; font-weight: var(--nova-font-weight-semibold, 600); }
620
+
621
+ /* Participants / lanes */
622
+ .mb-node-participant,
623
+ .mb-node-lane { border: 1.5px solid var(--nova-color-border-strong); border-radius: 10px; background: color-mix(in srgb, var(--nova-color-surface) 32%, transparent); z-index: 0; }
624
+ .mb-node-lane { border-radius: 7px; border-color: var(--nova-color-border); background: color-mix(in srgb, var(--nova-color-surface) 18%, transparent); }
625
+ .mb-swimlane-rail { position: absolute; overflow: hidden; background: color-mix(in srgb, var(--nova-color-surface-subtle) 78%, transparent); }
626
+ .mb-swimlane-title { position: absolute; left: 50%; top: 50%; writing-mode: horizontal-tb; transform-origin: center; overflow: hidden; color: var(--nova-color-text-secondary); text-align: center; text-overflow: ellipsis; white-space: nowrap; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-bold, 700); letter-spacing: .5px; }
627
+ .mb-swimlane-label-side > .mb-swimlane-rail { left: 0; top: 0; bottom: 0; width: 38px; border-right: 1px solid var(--nova-color-border-strong); border-radius: 9px 0 0 9px; }
628
+ .mb-node-lane.mb-swimlane-label-side > .mb-swimlane-rail { border-radius: 6px 0 0 6px; }
629
+ .mb-swimlane-label-side > .mb-swimlane-rail > .mb-swimlane-title { width: max-content; transform: translate(-50%, -50%) rotate(-90deg); }
630
+ .mb-swimlane-label-top > .mb-swimlane-rail { left: 0; top: 0; right: 0; height: 38px; border-bottom: 1px solid var(--nova-color-border-strong); border-radius: 9px 9px 0 0; }
631
+ .mb-node-lane.mb-swimlane-label-top > .mb-swimlane-rail { border-radius: 6px 6px 0 0; }
632
+ .mb-swimlane-label-top > .mb-swimlane-rail > .mb-swimlane-title { width: calc(100% - 24px); transform: translate(-50%, -50%); }
633
+
634
+ .mb-resize-handle {
635
+ position: absolute;
636
+ z-index: 75;
637
+ width: 9px;
638
+ height: 9px;
639
+ box-sizing: border-box;
640
+ border: 1.5px solid var(--mb-primary);
641
+ border-radius: 2px;
642
+ background: var(--nova-color-surface, #fff);
643
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--nova-color-surface) 78%, transparent);
644
+ }
645
+ .mb-resize-nw { left: -5px; top: -5px; cursor: nwse-resize; }
646
+ .mb-resize-n { left: 50%; top: -5px; transform: translateX(-50%); cursor: ns-resize; }
647
+ .mb-resize-ne { right: -5px; top: -5px; cursor: nesw-resize; }
648
+ .mb-resize-e { right: -5px; top: 50%; transform: translateY(-50%); cursor: ew-resize; }
649
+ .mb-resize-se { right: -5px; bottom: -5px; cursor: nwse-resize; }
650
+ .mb-resize-s { left: 50%; bottom: -5px; transform: translateX(-50%); cursor: ns-resize; }
651
+ .mb-resize-sw { left: -5px; bottom: -5px; cursor: nesw-resize; }
652
+ .mb-resize-w { left: -5px; top: 50%; transform: translateY(-50%); cursor: ew-resize; }
653
+ .mb-lane-divider {
654
+ position: absolute;
655
+ left: -1px;
656
+ right: -1px;
657
+ bottom: -5px;
658
+ z-index: 72;
659
+ height: 10px;
660
+ cursor: ns-resize;
661
+ }
662
+ .mb-lane-divider::after {
663
+ content: '';
664
+ position: absolute;
665
+ left: 8px;
666
+ right: 8px;
667
+ top: 4px;
668
+ height: 2px;
669
+ border-radius: 2px;
670
+ background: var(--mb-primary);
671
+ opacity: 0;
672
+ transition: opacity .12s ease;
673
+ }
674
+ .mb-node-lane:hover > .mb-lane-divider::after,
675
+ .mb-node-lane.is-selected > .mb-lane-divider::after { opacity: .78; }
676
+
677
+ /* Ports + context actions */
678
+ .mb-port {
679
+ position: absolute;
680
+ z-index: 40;
681
+ width: 11px;
682
+ height: 11px;
683
+ border-radius: 50%;
684
+ border: 2px solid var(--nova-color-border-strong);
685
+ background: var(--nova-color-surface, #fff);
686
+ padding: 0;
687
+ opacity: 0;
688
+ transition: opacity .12s ease, border-color .12s ease, transform .12s ease, background .12s ease;
689
+ }
690
+ .mb-node:hover .mb-port,
691
+ .mb-node.is-selected .mb-port,
692
+ .mb-node.is-connect-target .mb-port { opacity: 1; }
693
+ .mb-port:hover { border-color: var(--mb-primary); }
694
+ .mb-port-left { left: -6px; top: 50%; transform: translateY(-50%); }
695
+ .mb-port-right { right: -6px; top: 50%; transform: translateY(-50%); }
696
+ .mb-port-top { left: 50%; top: -6px; transform: translateX(-50%); }
697
+ .mb-port-bottom { left: 50%; bottom: -6px; transform: translateX(-50%); }
698
+ .mb-port-left:hover,
699
+ .mb-port-right:hover { transform: translateY(-50%) scale(1.2); }
700
+ .mb-port-top:hover,
701
+ .mb-port-bottom:hover { transform: translateX(-50%) scale(1.2); }
702
+ .mb-node.is-connecting-source .mb-port-right { opacity: 1; border-color: var(--mb-primary); background: var(--mb-primary); box-shadow: 0 0 0 4px color-mix(in srgb, var(--nova-color-primary) 12%, transparent); }
703
+ .mb-port-target {
704
+ width: 12px;
705
+ height: 12px;
706
+ opacity: 1;
707
+ border-color: var(--mb-primary);
708
+ background: var(--nova-color-surface, #fff);
709
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 10%, transparent);
710
+ }
711
+ .mb-port-target:hover { background: var(--mb-primary); box-shadow: 0 0 0 5px color-mix(in srgb, var(--nova-color-primary) 14%, transparent); }
712
+ .mb-node-actions { position: absolute; right: -42px; top: 50%; transform: translateY(-50%); display: grid; gap: 7px; z-index: 60; }
713
+ .mb-action-btn {
714
+ width: 30px;
715
+ height: 30px;
716
+ border: 1px solid var(--nova-color-border);
717
+ border-radius: 9px;
718
+ background: var(--nova-color-surface, #fff);
719
+ color: var(--nova-color-text-secondary);
720
+ padding: 0;
721
+ display: grid;
722
+ place-items: center;
723
+ box-shadow: var(--nova-shadow-md);
724
+ cursor: pointer;
725
+ transition: transform .12s ease, background .12s ease, color .12s ease, border-color .12s ease;
726
+ }
727
+ .mb-action-btn:hover { transform: translateY(-1px); border-color: var(--nova-color-border-strong); color: var(--nova-color-text); }
728
+ .mb-action-primary { background: var(--mb-primary); color: var(--nova-color-text-inverse, #fff); border-color: var(--mb-primary); }
729
+ .mb-action-primary:hover { background: var(--mb-primary-strong); color: var(--nova-color-text-inverse, #fff); border-color: var(--mb-primary-strong); }
730
+ .mb-action-enter { color: var(--mb-primary); border-color: var(--nova-tone-primary-border); background: var(--nova-color-primary-soft); }
731
+ .mb-action-enter:hover { color: var(--nova-color-text-inverse, #fff); border-color: var(--mb-primary); background: var(--mb-primary); }
732
+ .mb-action-connect.is-active {
733
+ background: var(--mb-primary);
734
+ color: var(--nova-color-text-inverse, #fff);
735
+ border-color: var(--mb-primary);
736
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--nova-color-primary) 12%, transparent), var(--nova-shadow-md);
737
+ }
738
+ .mb-action-connect.is-active:hover { background: var(--mb-primary-strong); color: var(--nova-color-text-inverse, #fff); border-color: var(--mb-primary-strong); }
739
+ .mb-action-danger:hover { background: var(--nova-tone-danger-background); color: var(--nova-tone-danger-foreground); border-color: var(--nova-tone-danger-border); }
740
+ .mb-scope-empty { position: absolute; inset: 0; z-index: 4; display: grid; place-content: center; justify-items: center; gap: 6px; pointer-events: none; color: var(--nova-color-text-muted); }
741
+ .mb-scope-empty[hidden] { display: none; }
742
+ .mb-scope-empty strong { color: var(--nova-color-primary); font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-semibold, 600); }
743
+ .mb-scope-empty span { font-size: 10px; }
744
+
745
+ /* Connect-existing mode: candidate targets are explicit and geometry-agnostic. */
746
+ .mb-diagram-host.is-connecting .mb-node { transition: opacity .12s ease, box-shadow .14s ease, border-color .14s ease; }
747
+ .mb-node.is-connect-target { cursor: crosshair; }
748
+ .mb-node.is-connect-target.mb-node-task,
749
+ .mb-node.is-connect-target.mb-node-container {
750
+ border-color: var(--nova-tone-primary-border);
751
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 8%, transparent), var(--nova-shadow-md);
752
+ }
753
+ .mb-node.is-connect-target.mb-node-task:hover,
754
+ .mb-node.is-connect-target.mb-node-container:hover {
755
+ border-color: var(--mb-primary);
756
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--nova-color-primary) 12%, transparent), var(--nova-shadow-md);
757
+ }
758
+ .mb-node.is-connect-target .mb-event-shape,
759
+ .mb-node.is-connect-target .mb-gateway-shape {
760
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--nova-color-primary) 10%, transparent), var(--nova-shadow-md);
761
+ }
762
+ .mb-node.is-connect-target:hover .mb-event-shape,
763
+ .mb-node.is-connect-target:hover .mb-gateway-shape {
764
+ border-color: var(--mb-primary);
765
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--nova-color-primary) 14%, transparent), var(--nova-shadow-md);
766
+ }
767
+ .mb-connect-mode-hint {
768
+ position: absolute;
769
+ right: 38px;
770
+ top: calc(100% + 10px);
771
+ white-space: nowrap;
772
+ padding: 5px 9px;
773
+ border: 1px solid var(--nova-tone-primary-border);
774
+ border-radius: 7px;
775
+ background: color-mix(in srgb, var(--nova-color-surface-raised) 97%, transparent);
776
+ color: var(--nova-tone-primary-foreground);
777
+ font-size: var(--nova-font-size-sm, 12px);
778
+ font-weight: var(--nova-font-weight-semibold, 600);
779
+ line-height: 1;
780
+ box-shadow: var(--nova-shadow-md);
781
+ pointer-events: none;
782
+ z-index: 70;
783
+ }
784
+
785
+ /* Quick-add menu */
786
+ .mb-quick-menu {
787
+ position: absolute;
788
+ width: 292px;
789
+ max-height: 412px;
790
+ overflow: hidden;
791
+ border: 1px solid var(--nova-color-border, #e0e4eb);
792
+ border-radius: 14px;
793
+ background: color-mix(in srgb, var(--nova-color-surface) 98.5%, transparent);
794
+ box-shadow: var(--nova-shadow-lg);
795
+ z-index: 120;
796
+ backdrop-filter: blur(12px);
797
+ }
798
+ .mb-quick-menu-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 13px 9px 14px; }
799
+ .mb-quick-menu-title { font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-bold, 700); color: var(--nova-color-text); }
800
+ .mb-quick-menu-subtitle { margin-top: 2px; font-size: var(--nova-font-size-xs, 10px); line-height: 14px; color: var(--nova-color-text-muted); }
801
+ .mb-quick-menu-close { width: 26px; height: 26px; border: 0; border-radius: 7px; padding: 0; display: grid; place-items: center; background: var(--nova-color-surface-muted); color: var(--nova-color-text-muted); cursor: pointer; }
802
+ .mb-quick-menu-search { display: block; width: calc(100% - 24px); height: 34px; margin: 0 12px 8px; box-sizing: border-box; border: 1px solid var(--nova-color-border); border-radius: 8px; padding: 0 10px; outline: none; background: var(--nova-color-surface-subtle); color: var(--nova-color-text); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
803
+ .mb-quick-menu-search:focus { border-color: var(--nova-tone-primary-border); background: var(--nova-color-surface, #fff); box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 8%, transparent); }
804
+ .mb-quick-menu-body { max-height: 324px; overflow-y: auto; padding: 0 8px 10px; }
805
+ .mb-quick-menu-section-title { padding: 8px 7px 5px; color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; font-weight: var(--nova-font-weight-bold, 700); text-transform: uppercase; letter-spacing: .5px; }
806
+ .mb-quick-menu-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
807
+ .mb-quick-menu-item { min-width: 0; height: 38px; display: flex; align-items: center; gap: 8px; border: 0; border-radius: 8px; padding: 0 8px; background: transparent; color: var(--nova-color-text-secondary); cursor: pointer; text-align: left; }
808
+ .mb-quick-menu-item:hover { background: var(--nova-color-primary-soft); color: var(--nova-tone-primary-foreground); }
809
+ .mb-mini-type { width: 22px; height: 22px; flex: 0 0 22px; display: grid; place-items: center; border-radius: 6px; background: var(--nova-tone-neutral-background); color: var(--nova-tone-neutral-foreground); font-size: var(--nova-font-size-sm, 12px); font-weight: var(--nova-font-weight-bold, 700); }
810
+ .mb-mini-kind-gateway { background: var(--nova-tone-warning-background); color: var(--nova-tone-warning-foreground); transform: rotate(45deg); border-radius: 5px; }
811
+ .mb-mini-kind-gateway + .mb-quick-menu-item-text { margin-left: 1px; }
812
+ .mb-mini-kind-event, .mb-mini-kind-boundary { border-radius: 50%; background: var(--nova-tone-info-background); color: var(--nova-tone-info-foreground); }
813
+ .mb-mini-kind-task { background: var(--nova-color-primary-soft, #eef0ff); color: var(--nova-tone-primary-foreground); }
814
+ .mb-quick-menu-item-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); }
815
+ .mb-quick-menu .is-hidden { display: none !important; }
816
+
817
+ /* Runtime */
818
+ .mb-runtime-status-icon { position: absolute; z-index: 6; right: 8px; top: 8px; width: 20px; height: 20px; display: grid; place-items: center; box-sizing: border-box; border: 0; border-radius: 50%; padding: 0; background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); }
819
+ button.mb-runtime-status-icon { cursor: pointer; }
820
+ button.mb-runtime-status-icon:hover, button.mb-runtime-status-icon:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 15%, transparent); }
821
+ .mb-runtime-status-icon .nova-icon { width: 14px; height: 14px; }
822
+ .mb-runtime-summary { display: block; width: 100%; min-width: 0; border: 0; padding: 0; background: transparent; text-align: left; font-family: inherit; cursor: default; }
823
+ button.mb-runtime-summary { cursor: pointer; }
824
+ button.mb-runtime-summary:hover, button.mb-runtime-summary:focus-visible { color: var(--mb-primary); outline: none; text-decoration: underline; text-underline-offset: 2px; }
825
+ .mb-runtime-action-summary { display: block; width: 100%; min-width: 0; margin-top: 1px; overflow: hidden; border: 0; padding: 0; color: var(--nova-color-text-secondary, #596477); background: transparent; text-align: left; text-overflow: ellipsis; white-space: nowrap; font-family: inherit; font-size: var(--nova-font-size-xs, 10px); line-height: 14px; cursor: default; }
826
+ button.mb-runtime-action-summary { cursor: pointer; }
827
+ button.mb-runtime-action-summary:hover, button.mb-runtime-action-summary:focus-visible { color: var(--mb-primary); outline: none; text-decoration: underline; text-underline-offset: 2px; }
828
+ .mb-diagram-host[data-mode="viewer"] .mb-diagram-viewport,
829
+ .mb-diagram-host[data-mode="instance"] .mb-diagram-viewport { cursor: grab; }
830
+ .mb-runtime-details-layer { --mb-runtime-details-drag-offset: 0px; --mb-runtime-details-backdrop-progress: 1; position: absolute; inset: 0; z-index: 70; overflow: hidden; pointer-events: none; }
831
+ .mb-runtime-details-layer.has-backdrop::before { content: ''; position: absolute; inset: 0; z-index: 0; background: var(--nova-color-backdrop); backdrop-filter: blur(1px); opacity: 0; pointer-events: none; transition: opacity 180ms ease; }
832
+ .mb-runtime-details-layer.has-backdrop.is-open::before, .mb-runtime-details-layer.has-backdrop.is-settling::before, .mb-runtime-details-layer.has-backdrop.is-dragging::before { opacity: var(--mb-runtime-details-backdrop-progress); }
833
+ .mb-runtime-details-layer.has-backdrop.is-dragging::before { transition: none; }
834
+ .mb-runtime-details-layer.placement-bottom.has-backdrop, .mb-runtime-details-layer.placement-center.has-backdrop { pointer-events: auto; }
835
+ .mb-runtime-details-popover { position: absolute; box-sizing: border-box; min-width: 300px; max-width: 360px; max-height: 360px; display: grid; grid-template-rows: auto auto minmax(0, 1fr); overflow: hidden; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 12px; outline: none; background: color-mix(in srgb, var(--nova-color-surface-raised) 99%, transparent); color: var(--mb-text); box-shadow: var(--nova-shadow-lg); pointer-events: auto; user-select: text; }
836
+ .mb-runtime-details-motion-panel { z-index: 1; opacity: 1; transform: translate3d(0, 0, 0) scale(1); transform-origin: center; transition: opacity 160ms ease, transform 160ms cubic-bezier(.2, .8, .2, 1); }
837
+ .mb-runtime-details-layer.placement-popover.is-entering .mb-runtime-details-motion-panel, .mb-runtime-details-layer.placement-popover.is-closing .mb-runtime-details-motion-panel, .mb-runtime-details-layer.placement-center.is-entering .mb-runtime-details-motion-panel, .mb-runtime-details-layer.placement-center.is-closing .mb-runtime-details-motion-panel { opacity: 0; transform: translate3d(0, 6px, 0) scale(.98); }
838
+ .mb-runtime-details-layer.placement-popover.is-closing .mb-runtime-details-motion-panel, .mb-runtime-details-layer.placement-center.is-closing .mb-runtime-details-motion-panel { transition-duration: 140ms; transition-timing-function: ease-in; }
839
+ .mb-runtime-details-layer.placement-bottom .mb-runtime-details-popover { width: 100%; min-width: 0; max-width: none; max-height: var(--mb-runtime-details-max-height, 75%); border-right: 0; border-bottom: 0; border-left: 0; border-radius: 16px 16px 0 0; padding-bottom: env(safe-area-inset-bottom, 0); box-shadow: var(--nova-shadow-lg); }
840
+ .mb-runtime-details-layer.placement-bottom .mb-runtime-details-motion-panel { transform: translate3d(0, var(--mb-runtime-details-drag-offset), 0); transition: opacity 180ms ease, transform 260ms cubic-bezier(.2, .8, .2, 1); }
841
+ .mb-runtime-details-layer.placement-bottom.is-entering .mb-runtime-details-motion-panel, .mb-runtime-details-layer.placement-bottom.is-closing .mb-runtime-details-motion-panel { opacity: .98; transform: translate3d(0, 100%, 0); }
842
+ .mb-runtime-details-layer.placement-bottom.is-closing .mb-runtime-details-motion-panel { transition-duration: 160ms, 220ms; transition-timing-function: ease-in; }
843
+ .mb-runtime-details-layer.placement-bottom.is-dragging .mb-runtime-details-motion-panel { transition: none; }
844
+ .mb-runtime-details-layer.placement-bottom.is-settling .mb-runtime-details-motion-panel { transition-duration: 180ms; transition-timing-function: cubic-bezier(.2, .8, .2, 1); }
845
+ .mb-runtime-details-layer.is-entering .mb-runtime-details-motion-panel, .mb-runtime-details-layer.has-backdrop.is-entering::before { transition: none; }
846
+ .mb-runtime-details-drag-handle { position: absolute; z-index: 4; top: 0; left: 50%; width: 80px; height: 44px; border: 0; padding: 0; transform: translateX(-50%); touch-action: none; user-select: none; cursor: grab; }
847
+ .mb-runtime-details-drag-handle::before { content: ''; position: absolute; top: 7px; left: 50%; width: 34px; height: 4px; border-radius: 999px; background: var(--nova-color-border-strong, #d9dee7); transform: translateX(-50%); transition: background-color 140ms ease, width 140ms ease; }
848
+ .mb-runtime-details-drag-handle:hover::before { width: 40px; background: var(--nova-color-text-muted); }
849
+ .mb-runtime-details-layer.is-dragging .mb-runtime-details-drag-handle { cursor: grabbing; }
850
+ .mb-runtime-details-drag-active, .mb-runtime-details-drag-active * { user-select: none !important; cursor: grabbing !important; }
851
+ .mb-runtime-details-layer.placement-bottom .mb-runtime-details-head { padding-top: 20px; }
852
+ .mb-runtime-details-layer.placement-bottom .mb-runtime-details-body, .mb-runtime-details-layer.placement-center .mb-runtime-details-body { max-height: none; }
853
+ .mb-runtime-details-layer.placement-center .mb-runtime-details-popover { min-width: 0; }
854
+ @media (prefers-reduced-motion: reduce) { .mb-runtime-details-popover, .mb-runtime-details-layer.has-backdrop::before, .mb-runtime-details-motion-panel { animation: none !important; transition: none !important; } }
855
+ .mb-runtime-details-head { position: relative; min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 14px 48px 12px 14px; border-bottom: 1px solid var(--nova-color-divider, #edf0f4); }
856
+ .mb-runtime-details-heading { min-width: 0; display: grid; gap: 2px; }
857
+ .mb-runtime-details-heading strong { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--nova-font-size-lg, 16px); line-height: 22px; font-weight: var(--nova-font-weight-bold, 700); }
858
+ .mb-runtime-details-heading span { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
859
+ .mb-runtime-details-head > em { padding: 2px 8px; border-radius: 999px; background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-style: normal; white-space: nowrap; }
860
+ .mb-runtime-details-close { position: absolute; top: 10px; right: 10px; width: 28px; height: 28px; display: grid; place-items: center; border: 0; border-radius: 7px; padding: 0; background: transparent; color: var(--nova-color-text-muted); cursor: pointer; }
861
+ .mb-runtime-details-close:hover, .mb-runtime-details-close:focus-visible { outline: none; background: var(--nova-color-primary-soft); color: var(--mb-primary); }
862
+ .mb-runtime-details-progress { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 12px; background: var(--nova-color-surface-subtle); color: var(--nova-color-text-secondary, #667085); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
863
+ .mb-runtime-details-progress strong { color: var(--mb-primary); font-size: var(--nova-font-size-md, 14px); }
864
+ .mb-runtime-details-body { min-height: 0; max-height: 280px; overflow-y: auto; overscroll-behavior: contain; padding: 8px; scrollbar-width: thin; scrollbar-color: var(--nova-color-border-strong, #d9dee7) transparent; }
865
+ .mb-runtime-details-round { margin: 8px 6px 4px; color: var(--nova-color-text-secondary, #596477); font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-semibold, 600); }
866
+ .mb-runtime-details-person { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 10px; padding: 9px 6px; border-radius: 8px; }
867
+ .mb-runtime-details-person + .mb-runtime-details-person { border-top: 1px solid var(--nova-color-divider); }
868
+ .mb-runtime-details-avatar { width: 32px; height: 32px; display: grid; place-items: center; overflow: hidden; border-radius: 50%; background: var(--nova-color-primary-soft, #f0efff); color: var(--mb-primary); font-size: var(--nova-font-size-sm, 12px); font-weight: var(--nova-font-weight-semibold, 600); }
869
+ .mb-runtime-details-avatar img { width: 100%; height: 100%; object-fit: cover; }
870
+ .mb-runtime-details-person-copy { min-width: 0; display: grid; gap: 2px; }
871
+ .mb-runtime-details-person-title { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; }
872
+ .mb-runtime-details-person-title strong { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-semibold, 600); }
873
+ .mb-runtime-details-person-title em { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-style: normal; }
874
+ .mb-runtime-details-person-title em[data-tone] { color: var(--nova-runtime-tone-foreground); }
875
+ .mb-runtime-details-person time, .mb-runtime-details-transition span { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
876
+ .mb-runtime-details-person p, .mb-runtime-details-transition p { margin: 2px 0 0; color: var(--nova-color-text-secondary, #596477); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; white-space: normal; overflow-wrap: anywhere; }
877
+ .mb-runtime-action { display: grid; gap: 6px; margin: 6px; padding: 9px 10px; border: 1px solid var(--nova-runtime-tone-border, var(--nova-color-border)); border-radius: 9px; background: var(--nova-runtime-tone-background, var(--nova-color-surface-subtle)); }
878
+ .mb-runtime-action-head { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 8px; }
879
+ .mb-runtime-action-heading { min-width: 0; display: flex; align-items: center; gap: 7px; }
880
+ .mb-runtime-action-heading strong { overflow: hidden; color: var(--nova-color-text-secondary); text-overflow: ellipsis; white-space: nowrap; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
881
+ .mb-runtime-action-heading em { border-radius: 999px; padding: 1px 6px; color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); background: var(--nova-color-surface-raised); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; font-style: normal; white-space: nowrap; }
882
+ .mb-runtime-action-head time { color: var(--nova-color-text-muted, #929bac); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; white-space: nowrap; }
883
+ .mb-runtime-action-targets { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
884
+ .mb-runtime-action-content { min-width: 0; display: grid; gap: 7px; }
885
+ .mb-runtime-action-paragraph { margin: 0; color: var(--nova-color-text-secondary); white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
886
+ .mb-runtime-action-media { min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
887
+ .mb-runtime-asset-image { width: 76px; height: 58px; overflow: hidden; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 7px; padding: 0; display: grid; place-items: center; color: var(--nova-color-text-muted); background: var(--nova-color-surface-muted, #f2f4f7); cursor: pointer; }
888
+ .mb-runtime-asset-image img { width: 100%; height: 100%; display: block; object-fit: cover; }
889
+ .mb-runtime-asset-image:hover, .mb-runtime-asset-image:focus-visible { border-color: var(--mb-primary); outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 10%, transparent); }
890
+ .mb-runtime-asset-file { min-width: 0; max-width: 100%; flex: 0 1 320px; min-height: 44px; box-sizing: border-box; border: 1px solid var(--nova-color-border, #e0e4eb); border-radius: 7px; padding: 6px 8px; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; color: var(--nova-color-text-secondary); background: var(--nova-color-surface, #fff); text-decoration: none; }
891
+ .mb-runtime-asset-file:hover, .mb-runtime-asset-file:focus-visible { border-color: var(--mb-primary); outline: none; color: var(--mb-primary); }
892
+ .mb-runtime-asset-file-copy { min-width: 0; display: grid; }
893
+ .mb-runtime-asset-file-copy strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
894
+ .mb-runtime-asset-file-copy small, .mb-runtime-asset-state { color: var(--nova-color-text-muted, #929bac); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
895
+ .mb-runtime-asset-file.is-loading, .mb-runtime-asset-file.is-unavailable, .mb-runtime-asset-image.is-unavailable { pointer-events: none; cursor: default; opacity: .72; }
896
+ .mb-runtime-asset-unsupported, .mb-runtime-asset-more { border-radius: 6px; padding: 4px 7px; color: var(--nova-tone-danger-foreground); background: var(--nova-tone-danger-background); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
897
+ .mb-runtime-asset-more { align-self: stretch; min-width: 30px; display: grid; place-items: center; color: var(--nova-color-text-secondary, #667085); background: var(--nova-color-divider, #eef1f5); }
898
+ .mb-runtime-details-transition { display: grid; gap: 2px; margin: 6px; padding: 8px 10px; border-radius: 8px; background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); }
899
+ .mb-runtime-details-transition strong { font-size: var(--nova-font-size-md, 14px); line-height: 20px; }
900
+ .mb-runtime-details-empty { padding: 22px 12px; color: var(--mb-muted); text-align: center; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
901
+ .mb-runtime-transition-details { grid-template-rows: auto minmax(0, 1fr) auto; }
902
+ .mb-runtime-transition-actor { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 10px; padding: 9px 6px; }
903
+ .mb-runtime-transition-actor time { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
904
+ .mb-runtime-transition-warning { margin: 6px; padding: 8px 10px; border-radius: 8px; background: var(--mb-warning-soft); color: var(--mb-warning); }
905
+ .mb-runtime-transition-warning p { margin: 0; font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
906
+ .mb-runtime-transition-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 8px 12px; border-top: 1px solid var(--nova-color-divider, #edf0f4); }
907
+ .mb-runtime-transition-actions button { min-height: 28px; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 6px; padding: 0 10px; background: var(--nova-color-surface, #fff); color: var(--nova-color-text-secondary, #596477); font: inherit; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; cursor: pointer; }
908
+ .mb-runtime-transition-actions button:hover, .mb-runtime-transition-actions button:focus-visible { border-color: var(--mb-primary); outline: none; color: var(--mb-primary); }
909
+ .mb-runtime-transition-actions button:disabled { opacity: .45; cursor: not-allowed; }
910
+ .mb-runtime-asset-preview { position: absolute; inset: 0; z-index: 95; padding: 24px; display: grid; place-items: center; background: var(--nova-color-backdrop); backdrop-filter: blur(2px); pointer-events: auto; }
911
+ .mb-runtime-asset-preview-dialog { position: relative; width: min(760px, 100%); max-height: 100%; overflow: hidden; border-radius: 12px; display: grid; grid-template-rows: auto minmax(0, 1fr); background: var(--nova-color-surface-raised); box-shadow: var(--nova-shadow-lg); }
912
+ .mb-runtime-asset-preview-head { position: relative; min-width: 0; min-height: 48px; padding: 13px 48px 11px 14px; display: flex; align-items: center; border-bottom: 1px solid var(--nova-color-divider); }
913
+ .mb-runtime-asset-preview-head strong { overflow: hidden; color: var(--nova-color-text); text-overflow: ellipsis; white-space: nowrap; font-size: var(--nova-font-size-md, 14px); }
914
+ .mb-runtime-asset-preview-body { min-height: 180px; overflow: auto; display: grid; place-items: center; background: var(--nova-color-surface-muted, #f4f5f8); }
915
+ .mb-runtime-asset-preview-body img { max-width: 100%; max-height: calc(100vh - 120px); display: block; object-fit: contain; }
916
+ .mb-runtime-asset-preview-state { color: var(--nova-color-text-muted, #7f899a); font-size: var(--nova-font-size-sm, 12px); }
917
+
918
+ /* Runtime timeline projection */
919
+ .mb-runtime-timeline-host { position: relative; width: 100%; height: 100%; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; background: var(--nova-color-surface-subtle, #f7f8fb); color: var(--mb-text); font-family: var(--nova-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif); scrollbar-width: thin; scrollbar-color: var(--nova-color-border-strong, #d9dee7) transparent; }
920
+ .mb-runtime-timeline-host::-webkit-scrollbar { width: 4px; }.mb-runtime-timeline-host::-webkit-scrollbar-thumb { border-radius: 999px; background: var(--nova-color-border-strong, #d9dee7); }
921
+ .mb-runtime-timeline { width: 100%; min-height: 100%; box-sizing: border-box; margin: 0; padding: 18px 16px 40px; background: var(--nova-color-surface, #fff); }
922
+ .mb-runtime-timeline-header { display: grid; gap: 2px; padding: 0 0 16px; border-bottom: 1px solid var(--nova-color-divider, #edf0f5); }
923
+ .mb-runtime-timeline-header strong { font-size: var(--nova-font-size-lg, 16px); line-height: 22px; font-weight: var(--nova-font-weight-bold, 700); }.mb-runtime-timeline-header span { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
924
+ .mb-runtime-timeline-list { padding-top: 10px; }
925
+ .mb-runtime-timeline-item { position: relative; min-width: 0; display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 10px; padding: 7px 0; }
926
+ .mb-runtime-timeline-item:not(:last-child)::before { content: ''; position: absolute; left: 16px; top: 38px; bottom: -10px; width: 2px; border-radius: 2px; background: var(--nova-color-divider); }
927
+ .mb-runtime-timeline-rail { position: relative; z-index: 1; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); }
928
+ .mb-runtime-timeline-content { min-width: 0; display: grid; gap: 4px; }
929
+ .mb-runtime-timeline-card { width: 100%; min-width: 0; overflow: visible; border: 0; border-radius: 0; display: grid; color: inherit; background: transparent; box-shadow: none; }
930
+ .mb-runtime-timeline-card-main { width: 100%; min-width: 0; border: 0; border-radius: 8px; padding: 5px 7px; display: grid; gap: 3px; color: inherit; background: transparent; text-align: left; font: inherit; cursor: pointer; transition: background-color .14s ease, box-shadow .14s ease; }
931
+ .mb-runtime-timeline-card-main:hover { background: var(--nova-color-primary-soft, #f5f6ff); }
932
+ .mb-runtime-timeline-card-main:focus-visible { outline: none; background: var(--nova-color-primary-soft, #f5f6ff); box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--nova-color-primary) 22%, transparent); }
933
+ .mb-runtime-timeline-card-main:active { background: color-mix(in srgb, var(--nova-color-primary-soft) 84%, var(--nova-color-primary)); }
934
+ .mb-runtime-timeline-card-main.is-pointer-focus-restored:focus-visible { background: transparent; box-shadow: none; }
935
+ .mb-runtime-timeline-heading, .mb-runtime-timeline-meta { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 10px; }
936
+ .mb-runtime-timeline-heading strong { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-semibold, 600); }.mb-runtime-timeline-heading strong small { margin-left: 6px; color: var(--mb-muted); font-size: var(--nova-font-size-xs, 10px); font-weight: var(--nova-font-weight-regular, 400); }.mb-runtime-timeline-heading em { color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-style: normal; white-space: nowrap; }
937
+ .mb-runtime-timeline-meta { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }.mb-runtime-timeline-meta span { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }.mb-runtime-timeline-meta time { color: var(--nova-color-text-muted); white-space: nowrap; }
938
+ .mb-runtime-timeline-condition { justify-self: start; border: 1px solid var(--nova-color-border); border-radius: 999px; padding: 1px 7px; color: var(--nova-color-text-secondary); background: var(--nova-color-surface, #fff); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
939
+ .mb-runtime-timeline-item.is-predicted { opacity: .68; }
940
+ .mb-runtime-timeline-participants { margin: 0 7px; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }.mb-runtime-timeline-participants summary { color: var(--nova-color-primary, #5967cf); cursor: pointer; }.mb-runtime-timeline-participant-list { padding: 5px 0 0; display: flex; flex-wrap: wrap; gap: 5px; }.mb-runtime-timeline-participant-list span { border-radius: 999px; padding: 2px 7px; color: var(--nova-color-text-secondary, #596477); background: var(--nova-color-surface-muted); }
941
+ .mb-runtime-timeline-actions { margin: 2px 7px 0; border-radius: 8px; padding: 7px 8px; display: grid; gap: 0; background: var(--nova-color-surface-subtle, #f7f8fb); }
942
+ .mb-runtime-timeline-action { min-width: 0; border: 0; border-radius: 0; padding: 7px 0; display: grid; gap: 5px; background: transparent; box-shadow: none; }
943
+ .mb-runtime-timeline-actions > .mb-runtime-timeline-action { padding-top: 0; padding-bottom: 0; }
944
+ .mb-runtime-timeline-action-head { min-width: 0; display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 7px; }
945
+ .mb-runtime-timeline-action-head strong { border-radius: 999px; padding: 1px 7px; color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; font-weight: var(--nova-font-weight-semibold, 600); }
946
+ .mb-runtime-timeline-action-head span { overflow: hidden; color: var(--nova-color-text-muted); text-overflow: ellipsis; white-space: nowrap; font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
947
+ .mb-runtime-timeline-action-history { margin-top: 6px; border-top: 1px solid var(--nova-color-divider, #e7eaf0); padding-top: 6px; color: var(--nova-color-primary, #5967cf); font-size: var(--nova-font-size-xs, 10px); line-height: 16px; }
948
+ .mb-runtime-timeline-action-history > summary { outline: none; cursor: pointer; }
949
+ .mb-runtime-timeline-action-history > summary:hover, .mb-runtime-timeline-action-history > summary:focus-visible { outline: none; color: var(--mb-primary); text-decoration: underline; text-underline-offset: 2px; }
950
+ .mb-runtime-timeline-action-history-body { margin-top: 5px; display: grid; gap: 0; color: var(--mb-text); }
951
+ .mb-runtime-timeline-action-history-body .mb-runtime-timeline-action + .mb-runtime-timeline-action { border-top: 1px solid var(--nova-color-divider, #e7eaf0); }
952
+ .mb-runtime-action-content.is-compact .mb-runtime-action-paragraph { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }
953
+ .mb-runtime-action-content.is-compact .mb-runtime-asset-image { width: 60px; height: 46px; }
954
+ .mb-runtime-action-content.is-compact .mb-runtime-asset-file { min-height: 38px; flex-basis: 260px; }
955
+ .mb-runtime-timeline-transition-card { width: 100%; border: 0; border-radius: 9px; padding: 4px; display: grid; gap: 3px; color: var(--nova-runtime-tone-foreground, var(--nova-tone-neutral-foreground)); background: var(--nova-runtime-tone-background, var(--nova-tone-neutral-background)); }
956
+ .mb-runtime-timeline-transition-main { width: 100%; border: 0; border-radius: 7px; padding: 5px 6px; display: grid; gap: 2px; color: inherit; background: transparent; text-align: left; font: inherit; cursor: pointer; }
957
+ .mb-runtime-timeline-transition-main:hover, .mb-runtime-timeline-transition-main:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-runtime-tone-strong) 12%, transparent); }
958
+ .mb-runtime-timeline-transition-main.is-pointer-focus-restored:focus-visible { box-shadow: none; }
959
+ .mb-runtime-timeline-transition-main strong { font-size: var(--nova-font-size-md, 14px); line-height: 20px; }
960
+ .mb-runtime-timeline-transition-main span, .mb-runtime-timeline-transition-card p { margin: 0; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
961
+ .mb-runtime-timeline-group { margin: 8px 0; border: 0; border-radius: 12px; background: var(--nova-color-surface-subtle); overflow: hidden; }.mb-runtime-timeline-group-summary { min-height: 48px; padding: 0 12px; display: grid; grid-template-columns: 24px minmax(0, 1fr) auto; align-items: center; gap: 8px; color: var(--nova-color-text-secondary); cursor: pointer; }.mb-runtime-timeline-group-summary strong { font-size: var(--nova-font-size-md, 14px); line-height: 20px; }.mb-runtime-timeline-group-summary span { color: var(--mb-muted); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }.mb-runtime-timeline-group-body { padding: 4px 10px 10px; border-top: 1px solid var(--nova-color-divider); }.mb-runtime-timeline-item.is-group-child { grid-template-columns: 28px minmax(0, 1fr); }.mb-runtime-timeline-item.is-group-child .mb-runtime-timeline-rail { width: 28px; height: 28px; border-radius: 8px; }.mb-runtime-timeline-item.is-group-child::before { left: 13px; top: 32px; }
962
+ .mb-runtime-timeline-empty { padding: 60px 20px; color: var(--mb-muted); text-align: center; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
963
+ .mb-runtime-details-layer.is-timeline.placement-popover .mb-runtime-details-popover { border-radius: 12px; box-shadow: var(--nova-shadow-lg); }
964
+ @media (max-width: 720px) { .mb-runtime-action-media .mb-runtime-asset-file { flex-basis: 100%; }.mb-runtime-timeline { width: 100%; padding: 14px 12px 32px; }.mb-runtime-timeline-header { padding-left: 2px; }.mb-runtime-timeline-item { grid-template-columns: 32px minmax(0, 1fr); gap: 8px; }.mb-runtime-timeline-rail { width: 32px; height: 32px; }.mb-runtime-timeline-item:not(:last-child)::before { left: 15px; top: 36px; }.mb-runtime-timeline-meta { grid-template-columns: minmax(0, 1fr); gap: 0; }.mb-runtime-timeline-meta time { justify-self: start; } }
965
+ .mb-node-svg-icon {
966
+ display: block;
967
+ width: 1em;
968
+ height: 1em;
969
+ fill: none;
970
+ stroke: currentColor;
971
+ stroke-width: 1.7;
972
+ stroke-linecap: round;
973
+ stroke-linejoin: round;
974
+ vector-effect: non-scaling-stroke;
975
+ }
976
+
977
+ .mb-node-icon,
978
+ .mb-event-glyph,
979
+ .mb-gateway-symbol {
980
+ display: grid;
981
+ place-items: center;
982
+ }
983
+
984
+ .mb-node-custom-content {
985
+ position: relative;
986
+ z-index: 1;
987
+ min-width: 0;
988
+ height: 100%;
989
+ }
990
+
991
+ /* @bpmn-nova/internal/palette */
992
+ .nova-palette { height: 100%; overflow: auto; padding: 10px; color: var(--nova-color-text, #243047); background: var(--nova-color-surface, #fff); }
993
+ .nova-palette-section { border-bottom: 1px solid var(--nova-color-divider, #edf0f5); padding: 3px 0 8px; }
994
+ .nova-palette-section-toggle { width: 100%; min-height: 34px; border: 0; background: transparent; display: grid; grid-template-columns: 16px 1fr auto; align-items: center; gap: 6px; color: inherit; cursor: pointer; text-align: left; }
995
+ .nova-palette-section-toggle strong { font-size: var(--nova-font-size-md, 14px); line-height: 20px; font-weight: var(--nova-font-weight-semibold, 600); }
996
+ .nova-palette-section-toggle small { color: var(--nova-color-text-muted, #8791a5); font-size: 10px; }
997
+ .nova-palette-chevron { color: var(--nova-color-text-muted, #7c879b); transform: rotate(0); transition: transform .16s ease; }
998
+ .nova-palette-section.is-collapsed .nova-palette-chevron { transform: rotate(-90deg); }
999
+ .nova-palette-section.is-collapsed .nova-palette-items { display: none; }
1000
+ .nova-palette-items { display: grid; gap: 5px; }
1001
+ .nova-palette-item { width: 100%; min-height: 46px; padding: 6px 8px; border: 1px solid transparent; border-radius: 8px; background: transparent; display: grid; grid-template-columns: 30px 1fr; align-items: center; gap: 8px; color: inherit; text-align: left; cursor: grab; }
1002
+ .nova-palette-item:hover { background: var(--nova-color-primary-soft, #f5f7ff); border-color: var(--nova-tone-primary-border, #dfe4ff); }
1003
+ .nova-palette-item:active { cursor: grabbing; }
1004
+ .nova-palette-item-icon { width: 28px; height: 28px; border-radius: 7px; background: var(--nova-color-primary-soft, #eef1ff); color: var(--nova-color-primary, #4e5bd5); display: grid; place-items: center; }
1005
+ .nova-palette-item-icon svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
1006
+ .nova-palette-item-copy { min-width: 0; display: grid; gap: 2px; }
1007
+ .nova-palette-item-copy strong { font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); }
1008
+ .nova-palette-item-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--nova-color-text-muted, #919aad); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1009
+
1010
+ /* @bpmn-nova/internal/properties-renderer */
1011
+ .nova-properties { min-height: 100%; color: var(--nova-color-text); background: var(--nova-color-surface); color-scheme: inherit; }
1012
+ .properties-head { position: sticky; top: 0; z-index: 5; padding: 15px 16px 12px; border-bottom: 1px solid var(--nova-color-divider, #e7eaf1); background: color-mix(in srgb, var(--nova-color-surface) 97%, transparent); backdrop-filter: blur(10px); }
1013
+ .properties-title-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1014
+ .properties-title { min-width: 0; overflow: hidden; color: var(--nova-color-text, #202b3f); font-size: var(--nova-font-size-lg, 16px); font-weight: var(--nova-font-weight-bold, 700); line-height: 22px; text-overflow: ellipsis; white-space: nowrap; }
1015
+ .properties-profile-switch { width: max-content; margin-top: 12px; padding: 2px; border-radius: 7px; display: grid; grid-template-columns: 1fr 1fr; background: var(--nova-color-surface-muted, #f0f2f7); }
1016
+ .properties-title-row > .properties-profile-switch { flex: none; margin-top: 0; }
1017
+ .properties-profile-switch button { min-height: 28px; border: 0; border-radius: 5px; padding: 0 11px; color: var(--nova-color-text-muted, #7b8597); background: transparent; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; cursor: pointer; }
1018
+ .properties-profile-switch button.is-active { color: var(--nova-tone-primary-foreground, #3543b8); background: var(--nova-color-surface, #fff); box-shadow: var(--nova-shadow-sm); }
1019
+ .properties-body { padding: 0 12px 24px; }
1020
+ .properties-empty { padding: 32px 12px; color: var(--nova-color-text-muted, #929bad); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; text-align: center; }
1021
+ .properties-multi-summary { margin: 18px 2px; border: 1px solid var(--nova-color-border, #e4e7ef); border-radius: 12px; padding: 18px 16px; color: var(--nova-color-text-secondary); background: var(--nova-color-surface-subtle, #fafbff); text-align: center; }
1022
+ .properties-multi-icon { width: 38px; height: 38px; margin: 0 auto 10px; border-radius: 10px; display: grid; place-items: center; color: var(--nova-tone-primary-foreground); background: var(--nova-tone-primary-background); }
1023
+ .properties-multi-icon .nova-icon { width: 20px; height: 20px; }
1024
+ .properties-multi-summary > strong { font-size: var(--nova-font-size-md, 14px); line-height: 20px; }
1025
+ .properties-multi-summary > p { margin: 5px 0 12px; color: var(--nova-color-text-muted, #7d8799); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
1026
+ .properties-multi-counts { display: flex; flex-wrap: wrap; justify-content: center; gap: 5px; }
1027
+ .properties-multi-counts > span { border-radius: 12px; padding: 3px 8px; color: var(--nova-color-text-secondary, #687386); background: var(--nova-color-surface-muted); font-size: 10px; line-height: 16px; }
1028
+ .properties-multi-counts strong { color: var(--nova-tone-primary-foreground, #4f5dcc); }
1029
+ .properties-multi-summary > button { width: 100%; height: 34px; margin-top: 14px; border: 1px solid var(--nova-tone-primary-border); border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; color: var(--nova-tone-primary-foreground, #4f5dcc); background: var(--nova-color-primary-soft, #f0f1ff); font-size: var(--nova-font-size-sm, 12px); font-weight: var(--nova-font-weight-semibold, 600); cursor: pointer; }
1030
+ .properties-multi-summary > button:hover { border-color: var(--nova-color-primary); background: color-mix(in srgb, var(--nova-color-primary-soft) 88%, var(--nova-color-primary)); }
1031
+ .properties-group { border-bottom: 1px solid var(--nova-color-divider, #edf0f5); }
1032
+ .properties-group-toggle { width: 100%; min-height: 42px; border: 0; padding: 0 3px; background: transparent; display: flex; align-items: center; gap: 7px; color: var(--nova-color-text-secondary, #3b465a); text-align: left; cursor: pointer; }
1033
+ .properties-group-toggle strong { flex: 1; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); }
1034
+ .properties-chevron { color: var(--nova-color-text-muted, #8490a4); transform: rotate(0); transition: transform .15s; }
1035
+ .properties-group.is-collapsed .properties-chevron { transform: rotate(-90deg); }
1036
+ .properties-count { min-width: 18px; padding: 2px 5px; border-radius: 9px; color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #eef1ff); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; text-align: center; }
1037
+ .properties-group-content { padding: 0 3px 14px; }
1038
+ .properties-group.is-collapsed .properties-group-content { display: none; }
1039
+ .properties-group-description, .property-note, .property-inline-hint { color: var(--nova-color-text-muted, #8791a3); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1040
+ .properties-group-description { margin: 0 0 8px; }
1041
+ .property-note, .property-inline-hint { margin: 5px 0 0; }
1042
+ .property-field { margin: 0 0 11px; }
1043
+ .property-label { display: block; margin-bottom: 5px; color: var(--nova-color-text-secondary, #5d687b); font-size: var(--nova-font-size-sm, 12px); font-weight: var(--nova-font-weight-medium, 500); line-height: 18px; }
1044
+ .property-required { color: var(--nova-tone-danger-strong, #d84d5a); }
1045
+ .property-error { margin: 5px 0 0; color: var(--nova-tone-danger-strong, #d84d5a); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1046
+ .property-control, .property-readonly { box-sizing: border-box; width: 100%; min-height: 36px; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 7px; padding: 8px 9px; color: var(--nova-color-text, #2e394d); background: var(--nova-color-surface, #fff); font: inherit; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; outline: none; }
1047
+ .property-control:focus { border-color: var(--nova-tone-primary-border, #98a4ef); box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 10%, transparent); }
1048
+ textarea.property-control { resize: vertical; }
1049
+ .property-readonly { color: var(--nova-color-text-muted, #778195); background: var(--nova-color-surface-subtle, #f7f8fa); }
1050
+ .property-variant-valid .property-readonly { border-color: var(--nova-tone-success-border, #cce8dc); color: var(--nova-tone-success-foreground, #2f7c61); background: var(--nova-tone-success-background, #f1faf6); }
1051
+ .property-variant-incomplete .property-readonly { border-color: var(--nova-tone-warning-border, #f0d7aa); color: var(--nova-tone-warning-foreground, #9a6514); background: var(--nova-tone-warning-background, #fff9ee); }
1052
+ .property-variant-conflict .property-readonly { border-color: var(--nova-tone-danger-border, #efc5ca); color: var(--nova-tone-danger-foreground, #b33f4b); background: var(--nova-tone-danger-background, #fff5f6); }
1053
+ .property-variant-ambiguous .property-readonly { border-color: var(--nova-color-border, #dfe3eb); color: var(--nova-color-text-secondary, #687489); background: var(--nova-color-surface-subtle, #f7f8fa); }
1054
+ .property-select { position: relative; min-width: 0; color: var(--nova-color-text, #2e394d); }
1055
+ .property-select.is-open { z-index: 12; }
1056
+ .property-select-native { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); clip-path: inset(50%); white-space: nowrap; opacity: 0; pointer-events: none; }
1057
+ .property-select-trigger { box-sizing: border-box; width: 100%; min-height: 36px; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 8px; padding: 0 8px 0 10px; display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--nova-color-text, #2e394d); background: var(--nova-color-surface, #fff); font: inherit; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; text-align: left; outline: none; cursor: pointer; transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease; }
1058
+ .property-select-trigger:hover { border-color: var(--nova-color-border-strong, #c8cedb); background: var(--nova-color-surface, #fdfdff); }
1059
+ .property-select-trigger:focus-visible, .property-select.is-open .property-select-trigger { border-color: var(--nova-tone-primary-border, #98a4ef); box-shadow: 0 0 0 3px color-mix(in srgb, var(--nova-color-primary) 10%, transparent); }
1060
+ .property-select-trigger:disabled { color: var(--nova-color-text-muted, #929bad); background: var(--nova-color-surface-muted, #f5f6f8); cursor: not-allowed; }
1061
+ .property-select-value { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1062
+ .property-select-chevron { flex: none; color: var(--nova-color-text-muted, #7f899a); transition: transform .15s ease; }
1063
+ .property-select.is-open .property-select-chevron { transform: rotate(180deg); }
1064
+ .property-select-popover { position: absolute; top: calc(100% + 6px); right: 0; left: 0; z-index: 30; box-sizing: border-box; max-height: 240px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--nova-color-border, #dfe3ec); border-radius: 10px; padding: 5px; color: var(--nova-color-text-secondary); background: color-mix(in srgb, var(--nova-color-surface-raised) 99%, transparent); box-shadow: var(--nova-shadow-lg); scrollbar-width: thin; scrollbar-color: var(--nova-color-border-strong, #cbd1dc) transparent; }
1065
+ .property-select.is-above .property-select-popover { top: auto; bottom: calc(100% + 6px); }
1066
+ .property-select-popover[hidden] { display: none; }
1067
+ .property-select-option { width: 100%; min-height: 34px; border: 0; border-radius: 7px; padding: 0 8px 0 9px; display: flex; align-items: center; justify-content: space-between; gap: 9px; color: var(--nova-color-text-secondary, #4f5a6d); background: transparent; font: inherit; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; text-align: left; outline: none; cursor: pointer; }
1068
+ .property-select-option > span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1069
+ .property-select-option:hover, .property-select-option.is-active { color: var(--nova-tone-primary-foreground, #3442b8); background: var(--nova-color-primary-soft, #f1f3ff); }
1070
+ .property-select-option.is-selected { color: var(--nova-tone-primary-foreground, #3e4bc2); background: var(--nova-color-primary-soft); font-weight: var(--nova-font-weight-semibold, 600); }
1071
+ .property-select-check { flex: none; color: var(--nova-color-primary, #5361d6); opacity: 0; }
1072
+ .property-select-option.is-selected .property-select-check { opacity: 1; }
1073
+ .property-select-empty { padding: 12px 8px; color: var(--nova-color-text-muted, #929bad); font-size: 10px; text-align: center; }
1074
+ .property-select-compact .property-select-trigger { min-height: 32px; border-radius: 6px; padding-inline: 6px; font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1075
+ .property-select-compact .property-select-popover { min-width: 120px; }
1076
+ .property-select-compact .property-select-option { min-height: 32px; font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1077
+ .property-switch { min-height: 30px; border: 0; background: transparent; display: flex; align-items: center; gap: 7px; color: var(--nova-color-text-muted, #7b8597); cursor: pointer; }
1078
+ .property-switch span { width: 30px; height: 17px; border-radius: 10px; background: var(--nova-color-border-strong, #cbd1dc); position: relative; }
1079
+ .property-switch span::after { content: ''; position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%; background: var(--nova-color-surface, #fff); transition: transform .15s; }
1080
+ .property-switch.is-on span { background: var(--nova-color-primary, #5361d6); }
1081
+ .property-switch.is-on span::after { transform: translateX(13px); }
1082
+ .property-switch strong { font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-medium, 500); }
1083
+ .property-action, .property-row-add { width: 100%; min-height: 34px; border: 1px solid var(--nova-color-border, #dfe3ec); border-radius: 7px; display: flex; align-items: center; justify-content: center; gap: 6px; color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #f8f9ff); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; cursor: pointer; }
1084
+ .property-action.is-danger { color: var(--nova-tone-danger-foreground); background: var(--nova-tone-danger-background, #fff7f8); border-color: var(--nova-tone-danger-border, #f0cdd1); }
1085
+ .property-table { display: grid; gap: 5px; }
1086
+ .property-table-head, .property-table-row { display: grid; grid-template-columns: repeat(var(--property-columns), minmax(0,1fr)) 24px; gap: 4px; align-items: center; }
1087
+ .property-table-head { color: var(--nova-color-text-muted, #8993a5); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1088
+ .property-table-input { min-width: 0; height: 32px; border: 1px solid var(--nova-color-border, #e0e4ec); border-radius: 5px; padding: 0 6px; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
1089
+ .property-row-remove { width: 24px; height: 24px; border: 0; padding: 0; display: grid; place-items: center; color: var(--nova-tone-danger-foreground); background: transparent; cursor: pointer; }
1090
+ .property-smart-select { position: relative; }
1091
+ .property-smart-icon { position: absolute; right: 9px; top: 50%; color: var(--nova-color-text-muted, #8993a5); pointer-events: none; transform: translateY(-50%); }
1092
+ .property-range { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1093
+ .property-empty-row { padding: 10px; border: 1px dashed var(--nova-color-border, #dfe3eb); border-radius: 6px; color: var(--nova-color-text-muted, #929bad); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; text-align: center; }
1094
+ .property-node-list { display: grid; gap: 7px; }
1095
+ .property-node-ref { box-sizing: border-box; width: 100%; min-width: 0; min-height: 50px; border: 1px solid var(--nova-color-border, #dfe3eb); border-radius: 10px; padding: 7px 9px; display: grid; grid-template-columns: 28px minmax(0,1fr) 14px; align-items: center; gap: 9px; color: var(--nova-color-text-secondary, #5d687b); background: var(--nova-color-surface, #fff); font: inherit; text-align: left; outline: none; cursor: pointer; transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease; }
1096
+ .property-node-ref:hover, .property-node-ref:focus-visible { border-color: var(--nova-tone-primary-border, #cbd2ff); background: var(--nova-color-primary-soft, #f8f9ff); box-shadow: 0 0 0 2px color-mix(in srgb, var(--nova-color-primary) 12%, transparent); }
1097
+ .property-node-ref-icon { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; color: var(--nova-tone-primary-foreground, #4f5bc8); background: var(--nova-color-primary-soft, #eef0ff); transition: color .15s ease, background-color .15s ease; }
1098
+ .property-node-ref-copy { min-width: 0; display: grid; gap: 3px; }
1099
+ .property-node-ref-copy strong, .property-node-ref-copy small { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1100
+ .property-node-ref-copy strong { color: var(--nova-color-text, #2e394d); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); }
1101
+ .property-node-ref-copy small { color: var(--nova-color-text-muted, #8791a3); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1102
+ .property-node-ref-locate { color: var(--nova-color-text-muted, #8791a3); transition: color .15s ease, transform .15s ease; }
1103
+ .property-node-ref:hover .property-node-ref-locate, .property-node-ref:focus-visible .property-node-ref-locate { color: var(--nova-color-primary, #5361d6); transform: translate(1px, -1px); }
1104
+ .property-flow-list { display: grid; gap: 7px; }
1105
+ .property-flow-ref { width: 100%; min-height: 48px; border: 1px solid var(--nova-color-border); border-radius: 10px; padding: 7px 9px; display: grid; grid-template-columns: 22px minmax(0,1fr) 14px; align-items: center; gap: 8px; color: var(--nova-color-text-secondary); background: var(--nova-color-surface, #fff); text-align: left; cursor: pointer; }
1106
+ .property-flow-ref:hover, .property-flow-ref:focus-visible { border-color: var(--nova-tone-primary-border, #cbd2ff); background: var(--nova-color-primary-soft, #f8f9ff); outline: none; box-shadow: 0 0 0 2px color-mix(in srgb, var(--nova-color-primary) 12%, transparent); }
1107
+ .property-flow-index { width: 22px; height: 22px; border-radius: 7px; display: grid; place-items: center; color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #eef0ff); font-size: 10px; font-weight: 700; }
1108
+ .property-flow-copy { min-width: 0; display: grid; gap: 3px; }
1109
+ .property-flow-copy strong, .property-flow-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1110
+ .property-flow-copy strong { font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
1111
+ .property-flow-copy small { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1112
+ .property-branch-list { display: grid; gap: 10px; }
1113
+ .property-branch-card { position: relative; overflow: hidden; border: 1px solid var(--nova-color-border); border-radius: 12px; padding: 11px; display: grid; gap: 10px; background: linear-gradient(180deg, var(--nova-color-surface, #fff) 0%, var(--nova-color-surface-subtle, #fbfcff) 100%); box-shadow: var(--nova-shadow-sm); transition: border-color .16s ease, box-shadow .16s ease; }
1114
+ .property-branch-card::before { content: ''; position: absolute; inset: 0 auto 0 0; width: 3px; background: var(--nova-color-border-strong); }
1115
+ .property-branch-card:hover { border-color: var(--nova-color-border-strong); box-shadow: var(--nova-shadow-md); }
1116
+ .property-branch-card.is-default { border-color: var(--nova-tone-primary-border, #cbd2ff); background: linear-gradient(180deg, var(--nova-color-surface, #fff) 0%, var(--nova-color-primary-soft, #f7f8ff) 100%); }
1117
+ .property-branch-card.is-default::before { background: var(--nova-color-primary, #5967d8); }
1118
+ .property-branch-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
1119
+ .property-branch-identity { min-width: 0; display: flex; align-items: center; gap: 8px; }
1120
+ .property-branch-identity > span { flex: none; width: 26px; height: 26px; border-radius: 8px; display: grid; place-items: center; color: var(--nova-tone-primary-foreground, #4f5bc8); background: var(--nova-color-primary-soft, #eef0ff); font-size: var(--nova-font-size-xs, 10px); font-weight: var(--nova-font-weight-bold, 700); }
1121
+ .property-branch-identity > div { min-width: 0; display: grid; gap: 3px; }
1122
+ .property-branch-identity strong { color: var(--nova-color-text); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); }
1123
+ .property-branch-identity small { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }
1124
+ .property-branch-locate { flex: none; height: 30px; border: 1px solid var(--nova-color-border); border-radius: 7px; padding: 0 8px; display: flex; align-items: center; gap: 4px; color: var(--nova-color-text-secondary); background: var(--nova-color-surface, #fff); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; cursor: pointer; }
1125
+ .property-branch-locate .nova-icon { color: var(--nova-color-primary); }.property-branch-locate:hover { border-color: var(--nova-tone-primary-border); color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #f5f6ff); }
1126
+ .property-branch-condition { display: grid; gap: 8px; }
1127
+ .property-branch-condition.is-single-field { grid-template-columns: minmax(0,1fr); }
1128
+ .property-branch-condition label { display: grid; gap: 4px; }
1129
+ .property-branch-condition label > span { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; font-weight: var(--nova-font-weight-semibold, 600); }
1130
+ .property-branch-condition .property-control { min-height: 36px; border-color: var(--nova-color-border); border-radius: 7px; padding: 8px; background: color-mix(in srgb, var(--nova-color-surface) 90%, transparent); font-size: var(--nova-font-size-sm, 12px); }
1131
+ .property-branch-condition textarea.property-control { min-height: 54px; resize: vertical; font-family: Menlo, Consolas, "Liberation Mono", monospace; font-size: var(--nova-font-size-sm, 12px); line-height: 18px; }
1132
+ .property-branch-foot { border-top: 1px solid var(--nova-color-divider, #edf0f5); padding-top: 9px; display: flex; align-items: center; gap: 8px; }
1133
+ .property-branch-foot.is-target-only { justify-content: flex-end; }
1134
+ .property-branch-default { flex: none; height: 28px; border: 1px solid var(--nova-color-border, #e0e4ec); border-radius: 14px; padding: 0 8px; display: flex; align-items: center; gap: 5px; color: var(--nova-color-text-muted); background: var(--nova-color-surface, #fff); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; cursor: pointer; }
1135
+ .property-branch-default input { position: absolute; opacity: 0; pointer-events: none; }
1136
+ .property-branch-default i { width: 8px; height: 8px; border: 1px solid var(--nova-color-border-strong); border-radius: 50%; background: var(--nova-color-surface, #fff); box-shadow: inset 0 0 0 2px var(--nova-color-surface, #fff); }
1137
+ .property-branch-default.is-active { border-color: var(--nova-tone-primary-border, #cbd2ff); color: var(--nova-tone-primary-foreground, #4f5bc8); background: var(--nova-color-primary-soft, #eef0ff); font-weight: var(--nova-font-weight-semibold, 600); }
1138
+ .property-branch-default.is-active i { border-color: var(--nova-color-primary, #5967d8); background: var(--nova-color-primary, #5967d8); }
1139
+ .property-branch-target { min-width: 0; flex: 1; display: grid; grid-template-columns: auto minmax(0,1fr) auto; align-items: center; gap: 5px; }
1140
+ .property-branch-target small { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); line-height: 14px; }.property-branch-target strong { overflow: hidden; color: var(--nova-color-text-secondary); font-size: var(--nova-font-size-sm, 12px); line-height: 18px; font-weight: var(--nova-font-weight-semibold, 600); text-overflow: ellipsis; white-space: nowrap; }.property-branch-target > span { color: var(--nova-color-primary); font-size: var(--nova-font-size-sm, 12px); }
1141
+
1142
+ /* @bpmn-nova/internal/studio */
1143
+ .nova-studio-shell { --nova-left-width: 244px; --nova-right-width: 360px; --nova-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; --nova-font-size-xs: 10px; --nova-font-size-sm: 12px; --nova-font-size-md: 14px; --nova-font-size-lg: 16px; --nova-font-weight-regular: 400; --nova-font-weight-medium: 500; --nova-font-weight-semibold: 600; --nova-font-weight-bold: 700; position: relative; isolation: isolate; width: 100%; height: 100%; min-height: 520px; overflow: hidden; display: grid; grid-template-rows: 58px minmax(0, 1fr); color: var(--nova-color-text, #263148); background: var(--nova-color-canvas, #f6f7fb); font-family: var(--nova-font-family); }
1144
+ .nova-studio-header { min-width: 0; border-bottom: 1px solid var(--nova-color-divider, #e4e8f0); background: var(--nova-color-surface, #fff); display: grid; grid-template-columns: minmax(180px, auto) auto minmax(0, 1fr); align-items: center; gap: 18px; padding: 0 12px 0 14px; }
1145
+ .nova-studio-brand { min-width: 0; display: flex; align-items: center; gap: 10px; }
1146
+ .nova-studio-brand-mark { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: var(--nova-color-text-inverse, #fff); background: linear-gradient(145deg, var(--nova-color-primary, #5362da), var(--nova-color-primary-hover)); font-size: var(--nova-font-size-md); font-weight: var(--nova-font-weight-bold); box-shadow: var(--nova-shadow-sm); }
1147
+ .nova-studio-brand-copy { min-width: 0; display: grid; gap: 2px; }
1148
+ .nova-studio-brand-copy strong { color: var(--nova-tone-primary-foreground, #3443b8); font-size: var(--nova-font-size-md); line-height: 20px; font-weight: var(--nova-font-weight-bold); letter-spacing: -.01em; }
1149
+ .nova-studio-brand-copy span { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--nova-color-text-muted, #7c8799); font-size: var(--nova-font-size-xs); line-height: 14px; }
1150
+ .nova-studio-center-controls { min-width: 0; justify-self: center; display: flex; align-items: center; gap: 8px; }
1151
+ .nova-studio-mode-switch { height: 36px; border: 1px solid var(--nova-color-divider, #e6e8ef); border-radius: 10px; padding: 3px; display: flex; align-items: center; gap: 2px; background: var(--nova-color-surface-muted, #f4f5f8); box-shadow: inset 0 1px 2px rgba(35,43,68,.03); }
1152
+ .nova-studio-mode-switch button { height: 28px; border: 0; border-radius: 7px; padding: 0 12px; display: flex; align-items: center; gap: 5px; color: var(--nova-color-text-muted, #8a93a4); background: transparent; font-size: var(--nova-font-size-sm); line-height: 18px; white-space: nowrap; cursor: pointer; }
1153
+ .nova-studio-mode-switch button.is-active { color: var(--nova-tone-primary-foreground, #4f5dd1); background: var(--nova-color-surface, #fff); font-weight: var(--nova-font-weight-semibold); box-shadow: var(--nova-shadow-sm); }
1154
+ .nova-studio-projection-switch { height: 32px; border: 1px solid var(--nova-color-border, #e2e6ef); border-radius: 8px; padding: 2px; display: flex; align-items: center; gap: 2px; background: var(--nova-color-surface, #fff); }
1155
+ .nova-studio-projection-switch.is-hidden { display: none; }
1156
+ .nova-studio-projection-switch button { height: 26px; border: 0; border-radius: 6px; padding: 0 9px; color: var(--nova-color-text-muted, #7c8799); background: transparent; font-size: var(--nova-font-size-sm); line-height: 18px; white-space: nowrap; cursor: pointer; }
1157
+ .nova-studio-projection-switch button:hover { color: var(--nova-tone-primary-foreground, #4d59ca); background: var(--nova-color-primary-soft, #f4f5ff); }.nova-studio-projection-switch button.is-active { color: var(--nova-tone-primary-foreground, #4654c8); background: var(--nova-color-primary-soft, #eef0ff); font-weight: var(--nova-font-weight-semibold); }
1158
+ .nova-studio-tools { min-width: 0; overflow: visible; display: flex; align-items: center; justify-content: flex-end; gap: 5px; }
1159
+ .nova-studio-tools::-webkit-scrollbar { display: none; }
1160
+ .nova-studio-tool-divider { flex: none; width: 1px; height: 20px; margin: 0 2px; background: var(--nova-color-divider, #e4e8f0); }
1161
+ .nova-studio-tool { flex: none; min-height: 32px; border: 1px solid var(--nova-color-border, #e2e6ef); border-radius: 7px; padding: 0 10px; display: inline-flex; align-items: center; justify-content: center; gap: 5px; color: var(--nova-color-text-secondary, #4c586d); background: var(--nova-color-surface, #fff); font-size: var(--nova-font-size-sm); line-height: 18px; white-space: nowrap; cursor: pointer; }
1162
+ .nova-studio-tool:focus { outline: none; }.nova-studio-tool:focus-visible { outline: 2px solid var(--nova-color-focus-ring, #aeb7ff); outline-offset: 1px; }
1163
+ .nova-studio-tool.is-icon { width: 31px; padding: 0; font-size: 14px; }
1164
+ .nova-studio-tool:hover, .nova-studio-tool.is-active { border-color: var(--nova-tone-primary-border, #bec6ff); color: var(--nova-tone-primary-foreground, #3948c5); background: var(--nova-color-primary-soft, #f2f4ff); }
1165
+ .nova-studio-tool.is-magic { border-color: var(--nova-tone-primary-border, #d9ddff); color: var(--nova-tone-primary-foreground, #4654c8); background: var(--nova-color-primary-soft, #f4f5ff); font-weight: var(--nova-font-weight-semibold); }
1166
+ .nova-studio-tool.is-primary { border-color: var(--nova-color-primary); color: var(--nova-color-text-inverse, #fff); background: var(--nova-color-primary, #5361d6); }
1167
+ .nova-studio-tool.is-primary:hover { border-color: var(--nova-color-primary-hover); color: var(--nova-color-text-inverse, #fff); background: var(--nova-color-primary-hover); }
1168
+ .nova-studio-tool:disabled { opacity: .4; cursor: default; }
1169
+ .nova-studio-export-menu { position: relative; flex: none; }
1170
+ .nova-studio-export-menu > .nova-studio-tool { display: inline-flex; align-items: center; gap: 7px; }
1171
+ .nova-studio-export-popover { position: absolute; z-index: 90; top: calc(100% + 8px); right: 0; width: 220px; padding: 6px; border: 1px solid var(--nova-color-border); border-radius: 11px; background: var(--nova-color-surface-raised); box-shadow: var(--nova-shadow-md); }
1172
+ .nova-studio-export-popover.is-hidden { display: none; }
1173
+ .nova-studio-export-option { width: 100%; display: grid; grid-template-columns: 28px minmax(0, 1fr); grid-template-rows: auto auto; column-gap: 9px; padding: 9px; border: 0; border-radius: 8px; background: transparent; color: var(--nova-color-text); text-align: left; cursor: pointer; }
1174
+ .nova-studio-export-option:hover { background: var(--nova-color-surface-muted); }
1175
+ .nova-studio-export-option:focus-visible { outline: 2px solid var(--nova-color-focus-ring); outline-offset: -2px; }
1176
+ .nova-studio-export-option > .nova-icon { grid-row: 1 / span 2; align-self: center; color: var(--nova-color-primary); }
1177
+ .nova-studio-export-option strong { font-size: var(--nova-font-size-sm, 12px); }
1178
+ .nova-studio-export-option small { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs, 10px); }
1179
+ .nova-studio-export-option.is-hidden { display: none; }
1180
+ .nova-studio-import-input { display: none; }
1181
+ .nova-studio-beautify-split { position: relative; flex: none; display: flex; }
1182
+ .nova-studio-beautify-split .nova-studio-beautify { border-radius: 7px 0 0 7px; }
1183
+ .nova-studio-beautify-split .nova-studio-beautify-caret { width: 27px; border-left: 0; border-radius: 0 7px 7px 0; padding: 0; }
1184
+ .nova-studio-beautify-menu { position: absolute; z-index: 30; top: calc(100% + 8px); right: 0; width: 224px; border: 1px solid var(--nova-color-border, #e5e7ee); border-radius: 12px; padding: 12px; color: var(--nova-color-text-secondary, #3d4659); background: var(--nova-color-surface, #fff); box-shadow: var(--nova-shadow-lg); }
1185
+ .nova-studio-beautify-menu.is-hidden, .nova-studio-canvas-floating-head.is-hidden, .is-hidden-by-mode { display: none !important; }
1186
+ .nova-studio-beautify-title { margin-bottom: 9px; font-size: 12px; font-weight: 700; line-height: 18px; }
1187
+ .nova-studio-density { height: 32px; border-radius: 7px; padding: 3px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 2px; background: var(--nova-color-surface-muted, #f2f3f6); }
1188
+ .nova-studio-density button { border: 0; border-radius: 5px; color: var(--nova-color-text-secondary, #687386); background: transparent; font-size: var(--nova-font-size-sm); line-height: 18px; cursor: pointer; }
1189
+ .nova-studio-density button.is-active { color: var(--nova-tone-primary-foreground, #4d59ca); background: var(--nova-color-surface, #fff); font-weight: var(--nova-font-weight-semibold); box-shadow: var(--nova-shadow-sm); }
1190
+ .nova-studio-beautify-actions { margin-top: 9px; display: grid; gap: 3px; }
1191
+ .nova-studio-beautify-action { min-height: 48px; border: 0; border-radius: 8px; padding: 7px 8px; display: grid; grid-template-columns: 27px 1fr; grid-template-rows: 16px 15px; column-gap: 8px; color: var(--nova-color-text-secondary, #465166); background: transparent; text-align: left; cursor: pointer; }
1192
+ .nova-studio-beautify-action:hover { color: var(--nova-tone-primary-foreground, #4654c8); background: var(--nova-color-primary-soft, #f4f5ff); }
1193
+ .nova-studio-beautify-action > .nova-studio-beautify-action-icon { grid-row: 1 / 3; width: 25px; height: 25px; border-radius: 7px; display: grid; place-items: center; color: var(--nova-color-primary, #5361d6); background: var(--nova-color-primary-soft, #eef0ff); }
1194
+ .nova-studio-beautify-action-icon > .nova-icon-svg { width: 14px; height: 14px; }
1195
+ .nova-studio-beautify-action strong { font-size: var(--nova-font-size-sm); font-weight: var(--nova-font-weight-semibold); line-height: 18px; }.nova-studio-beautify-action small { color: #778195; color: var(--nova-color-text-muted, #778195); font-size: var(--nova-font-size-xs); line-height: 14px; }
1196
+ .nova-studio-body { min-width: 0; min-height: 0; display: grid; grid-template-columns: var(--nova-left-width) minmax(320px, 1fr) var(--nova-right-width); }
1197
+ .nova-studio-body.is-readonly { grid-template-columns: minmax(320px, 1fr) var(--nova-right-width); }
1198
+ .nova-studio-body.is-readonly .nova-studio-left { display: none; }
1199
+ .nova-studio-left, .nova-studio-right, .nova-studio-canvas-column, .nova-studio-canvas { min-width: 0; min-height: 0; overflow: hidden; }
1200
+ .nova-studio-left { border-right: 1px solid var(--nova-color-divider, #e4e8f0); background: var(--nova-color-surface, #fff); overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; }
1201
+ .nova-studio-right { border-left: 1px solid var(--nova-color-divider, #e4e8f0); background: var(--nova-color-surface, #fff); overflow: auto; }
1202
+ .nova-studio-left, .nova-studio-right { scrollbar-width: thin; scrollbar-color: #d9dee7 transparent; scrollbar-color: var(--nova-color-border-strong, #d9dee7) transparent; }
1203
+ .nova-studio-left::-webkit-scrollbar, .nova-studio-right::-webkit-scrollbar { width: 4px; height: 4px; }
1204
+ .nova-studio-left::-webkit-scrollbar-track, .nova-studio-right::-webkit-scrollbar-track { background: transparent; }
1205
+ .nova-studio-left::-webkit-scrollbar-thumb, .nova-studio-right::-webkit-scrollbar-thumb { min-height: 40px; background: #d9dee7; background: var(--nova-color-border-strong, #d9dee7); border-radius: 999px; }
1206
+ .nova-studio-left::-webkit-scrollbar-thumb:hover, .nova-studio-right::-webkit-scrollbar-thumb:hover { background: #c1c9d5; background: var(--nova-color-text-muted); }
1207
+ .nova-studio-left::-webkit-scrollbar-button, .nova-studio-right::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
1208
+ .nova-studio-canvas-column { display: grid; grid-template-rows: minmax(0, 1fr) 35px; background: var(--nova-color-canvas, #f7f8fc); }
1209
+ .nova-studio-canvas-stage { position: relative; min-width: 0; min-height: 0; overflow: hidden; }
1210
+ .nova-studio-canvas { position: relative; }
1211
+ .nova-studio-canvas-stage > .nova-studio-canvas { width: 100%; height: 100%; }
1212
+ .nova-selection-toolbar {
1213
+ position: absolute;
1214
+ z-index: 24;
1215
+ min-height: 38px;
1216
+ border: 1px solid var(--nova-color-border, #dfe3ed);
1217
+ border-radius: 10px;
1218
+ padding: 4px;
1219
+ display: flex;
1220
+ align-items: center;
1221
+ gap: 3px;
1222
+ color: var(--nova-color-text-secondary, #536071);
1223
+ background: color-mix(in srgb, var(--nova-color-surface) 98%, transparent);
1224
+ box-shadow: var(--nova-shadow-md);
1225
+ pointer-events: auto;
1226
+ }
1227
+ .nova-selection-toolbar[hidden] { display: none; }
1228
+ .nova-pointer-toolbar {
1229
+ position: absolute;
1230
+ z-index: 23;
1231
+ top: 10px;
1232
+ right: 10px;
1233
+ height: 36px;
1234
+ border: 1px solid var(--nova-color-border, #dfe3ed);
1235
+ border-radius: 10px;
1236
+ padding: 3px;
1237
+ display: flex;
1238
+ align-items: center;
1239
+ gap: 2px;
1240
+ color: var(--nova-color-text-secondary);
1241
+ background: color-mix(in srgb, var(--nova-color-surface) 96%, transparent);
1242
+ box-shadow: var(--nova-shadow-md);
1243
+ pointer-events: auto;
1244
+ }
1245
+ .nova-pointer-mode { height: 28px; border: 0; border-radius: 7px; padding: 0 8px; display: inline-flex; align-items: center; gap: 5px; color: inherit; background: transparent; font-size: var(--nova-font-size-sm); font-weight: var(--nova-font-weight-semibold); cursor: pointer; }
1246
+ .nova-pointer-mode:hover { color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #f3f4ff); }
1247
+ .nova-pointer-mode.is-active { color: var(--nova-tone-primary-foreground, #4050c4); background: var(--nova-color-primary-soft, #eceeff); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--nova-color-primary) 10%, transparent); }
1248
+ .nova-pointer-mode:focus-visible { outline: 2px solid var(--nova-color-focus-ring, rgba(82,92,214,.52)); outline-offset: 1px; }
1249
+ .nova-context-menu {
1250
+ position: absolute;
1251
+ z-index: 50;
1252
+ width: 226px;
1253
+ max-height: calc(100% - 16px);
1254
+ border: 1px solid var(--nova-color-border, #dfe3ec);
1255
+ border-radius: 12px;
1256
+ padding: 6px;
1257
+ overflow: visible;
1258
+ color: var(--nova-color-text-secondary, #4d586c);
1259
+ background: color-mix(in srgb, var(--nova-color-surface) 99%, transparent);
1260
+ box-shadow: var(--nova-shadow-lg);
1261
+ font-size: 12px;
1262
+ pointer-events: auto;
1263
+ }
1264
+ .nova-context-menu[hidden] { display: none; }
1265
+ .nova-context-item {
1266
+ width: 100%;
1267
+ min-height: 38px;
1268
+ border: 0;
1269
+ border-radius: 8px;
1270
+ padding: 0 9px;
1271
+ display: flex;
1272
+ align-items: center;
1273
+ gap: 9px;
1274
+ color: inherit;
1275
+ background: transparent;
1276
+ font: inherit;
1277
+ font-weight: var(--nova-font-weight-medium);
1278
+ text-align: left;
1279
+ white-space: nowrap;
1280
+ cursor: pointer;
1281
+ }
1282
+ .nova-context-item > .nova-icon { flex: none; width: 18px; height: 18px; color: var(--nova-color-primary, #6875cf); }
1283
+ .nova-context-item > .nova-icon-svg { width: 18px; height: 18px; shape-rendering: geometricPrecision; }
1284
+ .nova-context-item:hover, .nova-context-item:focus-visible { color: var(--nova-tone-primary-foreground, #3f4dc2); background: var(--nova-color-primary-soft); outline: none; }
1285
+ .nova-context-item.is-active { color: var(--nova-tone-primary-foreground, #3f4dc2); background: var(--nova-color-primary-soft, #eceeff); font-weight: var(--nova-font-weight-semibold); }
1286
+ .nova-context-item.is-danger { color: var(--nova-tone-danger-foreground, #c14c59); }
1287
+ .nova-context-item.is-danger > .nova-icon { color: var(--nova-tone-danger-strong, #cf5664); }
1288
+ .nova-context-item.is-danger:hover, .nova-context-item.is-danger:focus-visible { color: var(--nova-tone-danger-foreground, #ad3443); background: var(--nova-tone-danger-background, #fff0f2); }
1289
+ .nova-context-item:disabled { color: var(--nova-color-text-muted, #aeb5c1); background: transparent; cursor: not-allowed; }
1290
+ .nova-context-item:disabled > .nova-icon { color: var(--nova-color-text-muted, #bdc3cd); }
1291
+ .nova-context-label { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1292
+ .nova-context-separator { height: 1px; margin: 5px 7px; background: var(--nova-color-divider, #e9ebf1); }
1293
+ .nova-context-submenu { position: relative; }
1294
+ .nova-context-submenu > .nova-context-item > .nova-icon:last-child { width: 12px; height: 12px; color: var(--nova-color-text-muted, #9aa3b2); transform: rotate(-90deg); }
1295
+ .nova-context-submenu-panel {
1296
+ position: absolute;
1297
+ z-index: 1;
1298
+ top: -6px;
1299
+ left: calc(100% + 7px);
1300
+ width: 218px;
1301
+ border: 1px solid var(--nova-color-border, #dfe3ec);
1302
+ border-radius: 11px;
1303
+ padding: 6px;
1304
+ overflow-x: hidden;
1305
+ overflow-y: auto;
1306
+ background: var(--nova-color-surface, #fff);
1307
+ box-shadow: var(--nova-shadow-lg);
1308
+ }
1309
+ .nova-context-submenu-panel[hidden] { display: none; }
1310
+ .nova-context-submenu.is-flipped > .nova-context-submenu-panel { right: calc(100% + 7px); left: auto; }
1311
+ .nova-context-submenu-panel { scrollbar-width: thin; scrollbar-color: var(--nova-color-border-strong, #d9dee7) transparent; }
1312
+ .nova-context-submenu-panel::-webkit-scrollbar { width: 4px; }
1313
+ .nova-context-submenu-panel::-webkit-scrollbar-thumb { background: var(--nova-color-border-strong, #d9dee7); border-radius: 999px; }
1314
+ @media (max-width: 1080px) {
1315
+ .nova-pointer-mode > span:last-child { display: none; }
1316
+ .nova-pointer-mode { width: 28px; padding: 0; justify-content: center; }
1317
+ }
1318
+ .nova-selection-action {
1319
+ min-width: 30px;
1320
+ height: 30px;
1321
+ border: 0;
1322
+ border-radius: 7px;
1323
+ padding: 0 7px;
1324
+ display: inline-flex;
1325
+ align-items: center;
1326
+ justify-content: center;
1327
+ gap: 5px;
1328
+ color: inherit;
1329
+ background: transparent;
1330
+ font: inherit;
1331
+ font-size: var(--nova-font-size-sm);
1332
+ font-weight: var(--nova-font-weight-semibold);
1333
+ white-space: nowrap;
1334
+ cursor: pointer;
1335
+ }
1336
+ .nova-selection-action:hover { color: var(--nova-tone-primary-foreground, #4654c8); background: var(--nova-color-primary-soft, #f0f1ff); }
1337
+ .nova-selection-action:focus-visible { outline: 2px solid var(--nova-color-focus-ring, rgba(82,92,214,.52)); outline-offset: 1px; }
1338
+ .nova-selection-action:disabled { color: var(--nova-color-text-muted, #b1b8c5); background: transparent; cursor: not-allowed; }
1339
+ .nova-selection-action.has-label { color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #f1f2ff); }
1340
+ .nova-selection-action.has-label:hover { color: var(--nova-color-primary-hover); background: color-mix(in srgb, var(--nova-color-primary-soft) 88%, var(--nova-color-primary)); }
1341
+ .nova-selection-separator { width: 1px; height: 20px; margin: 0 2px; background: var(--nova-color-divider, #e6e8ef); }
1342
+ .nova-selection-menu { position: relative; }
1343
+ .nova-selection-menu > summary { list-style: none; cursor: pointer; }
1344
+ .nova-selection-menu > summary::-webkit-details-marker { display: none; }
1345
+ .nova-selection-menu > summary .nova-icon:last-child { width: 9px; height: 9px; transition: transform .14s ease; }
1346
+ .nova-selection-menu[open] > summary .nova-icon:last-child { transform: rotate(180deg); }
1347
+ .nova-selection-menu.is-disabled > summary { color: var(--nova-color-text-muted, #b1b8c5); cursor: not-allowed; }
1348
+ .nova-selection-popover {
1349
+ position: absolute;
1350
+ left: 0;
1351
+ bottom: calc(100% + 9px);
1352
+ width: 218px;
1353
+ border: 1px solid var(--nova-color-border);
1354
+ border-radius: 10px;
1355
+ padding: 5px;
1356
+ display: grid;
1357
+ grid-template-columns: repeat(3, 1fr);
1358
+ gap: 5px;
1359
+ background: var(--nova-color-surface, #fff);
1360
+ box-shadow: var(--nova-shadow-lg);
1361
+ }
1362
+ .nova-selection-toolbar.is-below .nova-selection-popover { top: calc(100% + 9px); bottom: auto; }
1363
+ .nova-selection-popover .nova-selection-action {
1364
+ width: 66px;
1365
+ height: 56px;
1366
+ padding: 5px 3px 4px;
1367
+ flex-direction: column;
1368
+ gap: 3px;
1369
+ color: var(--nova-color-text-secondary, #596477);
1370
+ font-size: 10px;
1371
+ font-weight: 600;
1372
+ line-height: 14px;
1373
+ }
1374
+ .nova-selection-popover .nova-selection-action:hover { color: var(--nova-tone-primary-foreground, #4654c8); background: var(--nova-color-primary-soft, #f0f1ff); }
1375
+ .nova-selection-popover .nova-icon { width: 20px; height: 20px; }
1376
+ .nova-selection-popover .nova-icon-svg { width: 20px; height: 20px; shape-rendering: geometricPrecision; }
1377
+ @media (max-width: 1080px) {
1378
+ .nova-selection-action.has-label > span:last-child { display: none; }
1379
+ .nova-selection-action.has-label { min-width: 30px; padding: 0 7px; }
1380
+ }
1381
+ .nova-studio-canvas-floating-head { position: absolute; z-index: 8; top: 10px; left: 14px; right: 14px; min-width: 0; display: flex; align-items: center; gap: 8px; pointer-events: none; }
1382
+ .nova-studio-editing-mode { flex: none; height: 36px; border: 1px solid var(--nova-color-border, #e1e5ef); border-radius: 10px; padding: 0 10px; display: flex; align-items: center; gap: 6px; color: var(--nova-tone-primary-foreground); background: color-mix(in srgb, var(--nova-color-surface) 94%, transparent); font-size: var(--nova-font-size-sm); line-height: 18px; font-weight: var(--nova-font-weight-semibold); box-shadow: 0 5px 16px rgba(37,45,72,.10); box-shadow: var(--nova-shadow-md); }
1383
+ .nova-studio-editing-mode-label { color: var(--nova-tone-primary-foreground); font-size: var(--nova-font-size-sm); line-height: 18px; white-space: nowrap; }
1384
+ .nova-studio-scope-back { flex: none; height: 36px; border: 1px solid var(--nova-tone-primary-border, #d9ddff); border-radius: 10px; padding: 0 10px; display: inline-flex; align-items: center; gap: 5px; color: var(--nova-tone-primary-foreground); background: var(--nova-color-primary-soft, #f0f1ff); font-size: var(--nova-font-size-sm); line-height: 18px; font-weight: var(--nova-font-weight-semibold); white-space: nowrap; cursor: pointer; pointer-events: auto; box-shadow: 0 5px 16px rgba(37,45,72,.10); box-shadow: var(--nova-shadow-md); transition: color .14s ease, background .14s ease, border-color .14s ease; }
1385
+ .nova-studio-scope-back[hidden] { display: none; }
1386
+ .nova-studio-scope-back:hover { color: var(--nova-color-primary-hover); border-color: var(--nova-color-primary); background: color-mix(in srgb, var(--nova-color-primary-soft) 88%, var(--nova-color-primary)); }
1387
+ .nova-studio-scope-nav { flex: 0 1 auto; min-width: 54px; max-width: min(520px, calc(100% - 190px)); height: 36px; border: 1px solid var(--nova-color-border, #e1e5ef); border-radius: 10px; padding: 0 7px; display: flex; align-items: center; gap: 2px; overflow: hidden; color: var(--nova-color-text-muted); background: color-mix(in srgb, var(--nova-color-surface) 94%, transparent); box-shadow: 0 5px 16px rgba(37,45,72,.10); box-shadow: var(--nova-shadow-md); pointer-events: auto; }
1388
+ .nova-studio-scope-nav button { flex: 1 1 auto; min-width: 0; max-width: 150px; height: 28px; border: 0; border-radius: 7px; padding: 0 6px; overflow: hidden; color: var(--nova-tone-primary-foreground); background: transparent; font-size: var(--nova-font-size-sm); line-height: 18px; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; transition: color .14s ease, background .14s ease; }
1389
+ .nova-studio-scope-nav button:hover { color: var(--nova-tone-primary-foreground, #3f4dc2); background: var(--nova-color-primary-soft, #f0f1ff); }
1390
+ .nova-studio-scope-current { flex: 0 1 auto; min-width: 36px; max-width: 180px; overflow: hidden; color: var(--nova-color-text-secondary); font-size: var(--nova-font-size-sm); line-height: 18px; font-weight: var(--nova-font-weight-semibold); text-overflow: ellipsis; white-space: nowrap; }
1391
+ .nova-studio-scope-separator { flex: none; width: 12px; height: 12px; color: var(--nova-color-text-muted); transform: rotate(-90deg); }
1392
+ .nova-studio-scope-back:focus-visible, .nova-studio-scope-nav button:focus-visible { outline: 2px solid var(--nova-color-focus-ring, rgba(82,92,214,.55)); outline-offset: 1px; }
1393
+ .nova-studio-statusbar { min-width: 0; border-top: 1px solid var(--nova-color-border); padding: 0 9px 0 12px; display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--nova-color-text-muted); background: color-mix(in srgb, var(--nova-color-surface) 96%, transparent); }
1394
+ .nova-studio-status-left, .nova-studio-viewport-tools { display: flex; align-items: center; gap: 7px; }
1395
+ .nova-studio-status-left { min-width: 0; font-size: var(--nova-font-size-xs); line-height: 14px; }
1396
+ .nova-studio-status-left span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1397
+ .nova-studio-status-left i { flex: none; width: 7px; height: 7px; border-radius: 50%; }
1398
+ .nova-studio-status-left i.is-ok { background: var(--nova-tone-success-strong); }.nova-studio-status-left i.is-warning { background: var(--nova-tone-warning-strong); }.nova-studio-status-left i.is-error { background: var(--nova-tone-danger-strong); }
1399
+ .nova-studio-viewport-tools { flex: none; gap: 3px; }
1400
+ .nova-studio-viewport-tools.is-hidden { display: none; }
1401
+ .nova-studio-viewport-tools button { min-width: 26px; height: 26px; border: 1px solid var(--nova-color-border, #e2e6ef); border-radius: 5px; padding: 0 6px; display: grid; place-items: center; color: var(--nova-color-text-secondary); background: var(--nova-color-surface, #fff); font-size: var(--nova-font-size-sm); cursor: pointer; }
1402
+ .nova-studio-viewport-tools button:hover { color: var(--nova-tone-primary-foreground, #3f4dc2); background: var(--nova-color-primary-soft); }
1403
+ .nova-studio-viewport-tools button.is-text { font-size: var(--nova-font-size-xs); }
1404
+ .nova-studio-viewport-tools button.is-fit { font-size: 12px; }
1405
+ .nova-studio-zoom-text { min-width: 40px; font-size: var(--nova-font-size-xs); line-height: 14px; text-align: center; }
1406
+ .nova-studio-status-divider { width: 1px; height: 17px; margin: 0 4px; background: var(--nova-color-divider); }
1407
+ .nova-studio-readonly-panel { min-height: 100%; background: var(--nova-color-surface, #fff); }
1408
+ .nova-studio-readonly-header { position: relative; border-bottom: 1px solid var(--nova-color-divider); padding: 18px 16px 14px; display: grid; gap: 4px; }
1409
+ .nova-studio-readonly-header strong { padding-right: 65px; color: var(--nova-color-text); font-size: var(--nova-font-size-md); line-height: 20px; }.nova-studio-readonly-header span { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs); line-height: 14px; }.nova-studio-readonly-header em { position: absolute; top: 17px; right: 14px; border-radius: 10px; padding: 3px 8px; color: var(--nova-color-primary, #5361d6); background: var(--nova-color-primary-soft, #eef0ff); font-size: var(--nova-font-size-xs); line-height: 14px; font-style: normal; }
1410
+ .nova-studio-readonly-body { padding: 12px 15px; display: grid; gap: 10px; }
1411
+ .nova-studio-readonly-row { display: grid; gap: 4px; }.nova-studio-readonly-row span { color: var(--nova-color-text-muted); font-size: var(--nova-font-size-xs); line-height: 14px; }.nova-studio-readonly-row strong { min-height: 32px; border: 1px solid var(--nova-color-border); border-radius: 7px; padding: 0 9px; display: flex; align-items: center; color: var(--nova-color-text-secondary, #4d586c); background: var(--nova-color-surface-subtle, #fafbfc); font-size: var(--nova-font-size-sm); line-height: 18px; font-weight: var(--nova-font-weight-medium); }
1412
+ @media (max-width: 1120px) {
1413
+ .nova-studio-shell { --nova-left-width: 210px; --nova-right-width: 320px; }
1414
+ .nova-studio-header { grid-template-columns: minmax(150px, auto) minmax(0,1fr); gap: 10px; }
1415
+ .nova-studio-mode-switch { display: none; }
1416
+ .nova-studio-projection-switch { display: flex; }
1417
+ .nova-studio-brand-copy span { max-width: 115px; }
1418
+ }
1419
+ @media (max-width: 820px) {
1420
+ .nova-studio-shell { --nova-left-width: 186px; --nova-right-width: 280px; }
1421
+ .nova-studio-brand-copy span { display: none; }
1422
+ }
1423
+ @media (max-width: 720px) {
1424
+ .nova-studio-shell { grid-template-rows: 54px minmax(0,1fr); }
1425
+ .nova-studio-header { grid-template-columns: auto minmax(0,1fr); padding-left: 9px; }
1426
+ .nova-studio-brand-copy { display: none; }
1427
+ .nova-studio-body { grid-template-columns: 1fr; }
1428
+ .nova-studio-body.is-readonly { grid-template-columns: 1fr; }
1429
+ .nova-studio-left, .nova-studio-right { display: none; }
1430
+ .nova-studio-center-controls { display: none; }
1431
+ .nova-studio-projection-switch { display: none; }
1432
+ .nova-studio-body.is-timeline .nova-studio-canvas-column { grid-template-rows: minmax(0, 1fr); }
1433
+ .nova-studio-body.is-timeline .nova-studio-statusbar { display: none; }
1434
+ }
1435
+