@bramas/simulant-ui 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +5 -0
  2. package/dist/SimulatorApp.jsx +782 -174
  3. package/dist/components/AlgorithmViewer.css +268 -74
  4. package/dist/components/AlgorithmViewer.jsx +171 -66
  5. package/dist/components/BranchPicker.css +74 -32
  6. package/dist/components/BranchPicker.jsx +9 -4
  7. package/dist/components/ConfigGraphGenerator.css +180 -38
  8. package/dist/components/ConfigGraphGenerator.jsx +155 -96
  9. package/dist/components/GenericEditor.jsx +18 -44
  10. package/dist/components/Icon.jsx +54 -0
  11. package/dist/components/ModelView.css +15 -15
  12. package/dist/components/SettingsLibrary.jsx +7 -5
  13. package/dist/components/Splitter.jsx +28 -0
  14. package/dist/components/StateInspector.css +59 -33
  15. package/dist/components/StateInspector.jsx +37 -4
  16. package/dist/components/theme.js +28 -0
  17. package/dist/pico.min.css +4 -4
  18. package/dist/renderers/ring.js +19 -10
  19. package/dist/simulator.css +1553 -363
  20. package/package.json +6 -6
  21. package/src/SimulatorApp.tsx +888 -219
  22. package/src/components/AlgorithmViewer.css +268 -74
  23. package/src/components/AlgorithmViewer.tsx +188 -75
  24. package/src/components/BranchPicker.css +74 -32
  25. package/src/components/BranchPicker.tsx +9 -4
  26. package/src/components/ConfigGraphGenerator.css +180 -38
  27. package/src/components/ConfigGraphGenerator.tsx +172 -114
  28. package/src/components/GenericEditor.tsx +25 -59
  29. package/src/components/Icon.tsx +76 -0
  30. package/src/components/ModelView.css +15 -15
  31. package/src/components/SettingsLibrary.tsx +7 -5
  32. package/src/components/Splitter.tsx +55 -0
  33. package/src/components/StateInspector.css +59 -33
  34. package/src/components/StateInspector.tsx +35 -4
  35. package/src/components/theme.ts +33 -0
  36. package/src/pico.min.css +4 -4
  37. package/src/renderers/ring.ts +22 -12
  38. package/src/simulator.css +1553 -363
package/src/simulator.css CHANGED
@@ -1,30 +1,52 @@
1
- @import './pico.min.css';
2
-
3
1
  /*
4
- * Design tokens of the simulator, for both themes. The theme follows the system unless the
5
- * user picks one (`data-theme` on <html>, remembered by the page).
2
+ * The simulator's design system: tokens for both themes, base elements, controls and the page
3
+ * layout. Self-contained (no CSS framework). The theme follows the system unless the user picks
4
+ * one (`data-theme` on <html>, remembered by the page). Component styles sit next to their
5
+ * components and use these tokens.
6
6
  */
7
+
7
8
  :root {
8
- --pico-font-size: 100%;
9
+ color-scheme: light;
10
+ --sim-font: 'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
11
+ --sim-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', 'Cascadia Code', 'Consolas', 'Menlo', monospace;
12
+ --sim-radius: 10px;
13
+ --sim-radius-sm: 6px;
14
+ --sim-topbar-h: 52px;
15
+ --sim-statusbar-h: 28px;
16
+ --sim-gap: 12px;
9
17
 
18
+ --sim-bg: #f4f4f5;
10
19
  --sim-surface: #ffffff;
11
- --sim-surface-2: #f6f7f9;
12
- --sim-border: #e1e4e8;
13
- --sim-text: #1f2328;
14
- --sim-muted: #6a737d;
15
- --sim-accent: #2563eb;
16
- --sim-accent-soft: rgba(37, 99, 235, 0.1);
17
- --sim-highlight: #f5b301;
18
- --sim-highlight-soft: rgba(245, 179, 1, 0.16);
20
+ --sim-surface-2: #fafafa;
21
+ --sim-surface-3: #efeff1;
22
+ --sim-border: #e4e4e7;
23
+ --sim-border-strong: #d4d4d8;
24
+ --sim-text: #18181b;
25
+ --sim-text-2: #3f3f46;
26
+ --sim-muted: #71717a;
27
+ --sim-faint: #a1a1aa;
28
+ --sim-accent: #5b62c9;
29
+ --sim-accent-hover: #4d53b3;
30
+ --sim-accent-soft: rgba(91, 98, 201, 0.1);
31
+ --sim-accent-text: #ffffff;
32
+ --sim-focus: rgba(91, 98, 201, 0.32);
33
+ --sim-highlight: #e8a400;
34
+ --sim-highlight-soft: rgba(245, 179, 1, 0.17);
19
35
  --sim-highlight-faint: rgba(245, 179, 1, 0.07);
20
- --sim-success: #1a7f37;
21
- --sim-success-soft: #dcf5e3;
22
- --sim-failure: #cf222e;
23
- --sim-failure-soft: #fde2e1;
24
- --sim-progress: #9a6700;
25
- --sim-progress-soft: #fff4d6;
26
- --sim-radius: 10px;
27
- --sim-mono: ui-monospace, 'SF Mono', 'Consolas', 'Monaco', monospace;
36
+ --sim-success: #16803c;
37
+ --sim-success-soft: #e3f5e8;
38
+ --sim-failure: #d1242f;
39
+ --sim-failure-soft: #fdeaea;
40
+ --sim-progress: #a16207;
41
+ --sim-progress-soft: #fdf3dc;
42
+ --sim-stage: #ffffff;
43
+ --sim-stage-dot: #e4e4e7;
44
+ --sim-stage-line: #a1a1aa;
45
+ --sim-stage-muted: #71717a;
46
+ --sim-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
47
+ --sim-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
48
+ --sim-shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.2);
49
+ --sim-agent-mix: black;
28
50
 
29
51
  --tok-keyword: #0033b3;
30
52
  --tok-action: #c2410c;
@@ -38,21 +60,39 @@
38
60
  }
39
61
 
40
62
  :root[data-theme='dark'] {
41
- --sim-surface: #161b22;
42
- --sim-surface-2: #0d1117;
43
- --sim-border: #30363d;
44
- --sim-text: #e6edf3;
45
- --sim-muted: #8b949e;
46
- --sim-accent: #58a6ff;
47
- --sim-accent-soft: rgba(88, 166, 255, 0.15);
48
- --sim-highlight-soft: rgba(245, 179, 1, 0.18);
49
- --sim-highlight-faint: rgba(245, 179, 1, 0.08);
63
+ color-scheme: dark;
64
+ --sim-bg: #0c0c0e;
65
+ --sim-surface: #151517;
66
+ --sim-surface-2: #1b1b1e;
67
+ --sim-surface-3: #242428;
68
+ --sim-border: #28282c;
69
+ --sim-border-strong: #3a3a40;
70
+ --sim-text: #ececee;
71
+ --sim-text-2: #c8c8cd;
72
+ --sim-muted: #909098;
73
+ --sim-faint: #63636b;
74
+ --sim-accent: #8b90ec;
75
+ --sim-accent-hover: #a0a4f2;
76
+ --sim-accent-soft: rgba(139, 144, 236, 0.14);
77
+ --sim-accent-text: #101024;
78
+ --sim-focus: rgba(139, 144, 236, 0.4);
79
+ --sim-highlight: #f5b301;
80
+ --sim-highlight-soft: rgba(245, 179, 1, 0.17);
81
+ --sim-highlight-faint: rgba(245, 179, 1, 0.07);
50
82
  --sim-success: #3fb950;
51
- --sim-success-soft: rgba(63, 185, 80, 0.15);
83
+ --sim-success-soft: rgba(63, 185, 80, 0.14);
52
84
  --sim-failure: #f85149;
53
- --sim-failure-soft: rgba(248, 81, 73, 0.15);
85
+ --sim-failure-soft: rgba(248, 81, 73, 0.14);
54
86
  --sim-progress: #d29922;
55
- --sim-progress-soft: rgba(210, 153, 34, 0.15);
87
+ --sim-progress-soft: rgba(210, 153, 34, 0.14);
88
+ --sim-stage: #121214;
89
+ --sim-stage-dot: #232326;
90
+ --sim-stage-line: #4c4c53;
91
+ --sim-stage-muted: #909098;
92
+ --sim-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
93
+ --sim-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
94
+ --sim-shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.6);
95
+ --sim-agent-mix: white;
56
96
 
57
97
  --tok-keyword: #79c0ff;
58
98
  --tok-action: #ffa657;
@@ -67,21 +107,39 @@
67
107
 
68
108
  @media (prefers-color-scheme: dark) {
69
109
  :root:not([data-theme='light']) {
70
- --sim-surface: #161b22;
71
- --sim-surface-2: #0d1117;
72
- --sim-border: #30363d;
73
- --sim-text: #e6edf3;
74
- --sim-muted: #8b949e;
75
- --sim-accent: #58a6ff;
76
- --sim-accent-soft: rgba(88, 166, 255, 0.15);
77
- --sim-highlight-soft: rgba(245, 179, 1, 0.18);
78
- --sim-highlight-faint: rgba(245, 179, 1, 0.08);
110
+ color-scheme: dark;
111
+ --sim-bg: #0c0c0e;
112
+ --sim-surface: #151517;
113
+ --sim-surface-2: #1b1b1e;
114
+ --sim-surface-3: #242428;
115
+ --sim-border: #28282c;
116
+ --sim-border-strong: #3a3a40;
117
+ --sim-text: #ececee;
118
+ --sim-text-2: #c8c8cd;
119
+ --sim-muted: #909098;
120
+ --sim-faint: #63636b;
121
+ --sim-accent: #8b90ec;
122
+ --sim-accent-hover: #a0a4f2;
123
+ --sim-accent-soft: rgba(139, 144, 236, 0.14);
124
+ --sim-accent-text: #101024;
125
+ --sim-focus: rgba(139, 144, 236, 0.4);
126
+ --sim-highlight: #f5b301;
127
+ --sim-highlight-soft: rgba(245, 179, 1, 0.17);
128
+ --sim-highlight-faint: rgba(245, 179, 1, 0.07);
79
129
  --sim-success: #3fb950;
80
- --sim-success-soft: rgba(63, 185, 80, 0.15);
130
+ --sim-success-soft: rgba(63, 185, 80, 0.14);
81
131
  --sim-failure: #f85149;
82
- --sim-failure-soft: rgba(248, 81, 73, 0.15);
132
+ --sim-failure-soft: rgba(248, 81, 73, 0.14);
83
133
  --sim-progress: #d29922;
84
- --sim-progress-soft: rgba(210, 153, 34, 0.15);
134
+ --sim-progress-soft: rgba(210, 153, 34, 0.14);
135
+ --sim-stage: #121214;
136
+ --sim-stage-dot: #232326;
137
+ --sim-stage-line: #4c4c53;
138
+ --sim-stage-muted: #909098;
139
+ --sim-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
140
+ --sim-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
141
+ --sim-shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.6);
142
+ --sim-agent-mix: white;
85
143
 
86
144
  --tok-keyword: #79c0ff;
87
145
  --tok-action: #ffa657;
@@ -95,499 +153,1631 @@
95
153
  }
96
154
  }
97
155
 
98
- /* Layout */
156
+ /* Base */
99
157
 
100
- .sim-app {
101
- max-width: 1440px;
102
- margin: 0 auto;
103
- padding: 1rem 1.5rem 3rem;
158
+ body {
159
+ margin: 0;
160
+ background: var(--sim-bg);
104
161
  color: var(--sim-text);
162
+ font-family: var(--sim-font);
163
+ -webkit-font-smoothing: antialiased;
164
+ -moz-osx-font-smoothing: grayscale;
105
165
  }
106
166
 
107
- .sim-header {
167
+ .sim-app {
168
+ /* The page is an application window: panels scroll, the page does not. */
108
169
  display: flex;
109
- align-items: center;
110
- gap: 1rem;
111
- flex-wrap: wrap;
112
- margin-bottom: 1rem;
113
- }
114
-
115
- .sim-header h1 {
116
- margin: 0;
117
- font-size: 1.5rem;
170
+ flex-direction: column;
171
+ height: 100vh;
172
+ height: 100dvh;
173
+ min-height: 540px;
174
+ overflow: hidden;
175
+ background: var(--sim-bg);
176
+ color: var(--sim-text);
177
+ font-family: var(--sim-font);
178
+ font-size: 14px;
179
+ line-height: 1.45;
180
+ text-align: left;
118
181
  }
119
182
 
120
- .sim-header select {
121
- width: auto;
122
- min-width: 18rem;
123
- margin: 0;
183
+ .sim-app *,
184
+ .sim-app *::before,
185
+ .sim-app *::after {
186
+ box-sizing: border-box;
124
187
  }
125
188
 
126
- .sim-header .sim-spacer {
127
- flex: 1;
189
+ .sim-app [hidden] {
190
+ display: none !important;
128
191
  }
129
192
 
130
- .sim-tabs {
131
- display: inline-flex;
132
- padding: 0.2rem;
133
- gap: 0.2rem;
134
- border-radius: 999px;
135
- background: var(--sim-surface-2);
136
- border: 1px solid var(--sim-border);
193
+ .sim-app :is(h1, h2, h3, h4, h5, p, ul, ol, dl, dd, pre, figure) {
194
+ margin: 0;
137
195
  }
138
196
 
139
- .sim-app button.sim-tab {
140
- border: none;
141
- border-radius: 999px;
142
- background: transparent;
143
- color: var(--sim-muted);
197
+ .sim-app :is(h1, h2, h3, h4) {
144
198
  font-weight: 600;
145
- --pico-form-element-spacing-vertical: 0.2rem;
146
- --pico-form-element-spacing-horizontal: 0.9rem;
147
- }
148
-
149
- .sim-app button.sim-tab:hover:not(.sim-tab-current) {
150
- color: var(--sim-text);
151
- }
152
-
153
- .sim-app button.sim-tab.sim-tab-current {
154
- background: var(--sim-surface);
155
- color: var(--sim-text);
156
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
199
+ line-height: 1.25;
200
+ color: inherit;
157
201
  }
158
202
 
159
- /* The model at a glance, above the simulation: opens the model view. */
160
-
161
- .sim-app button.sim-model-strip {
162
- display: flex;
163
- flex-wrap: wrap;
164
- align-items: baseline;
165
- gap: 0.25rem 0;
166
- width: 100%;
167
- margin: 0 0 0.75rem;
168
- padding: 0.35rem 0.75rem;
169
- background: transparent;
170
- border: 1px dashed var(--sim-border);
171
- border-radius: var(--sim-radius);
203
+ .sim-app code {
204
+ font-family: var(--sim-mono);
205
+ font-size: 0.86em;
206
+ padding: 0.05em 0.35em;
207
+ border-radius: 4px;
208
+ background: var(--sim-surface-3);
172
209
  color: var(--sim-text);
173
- font-size: 0.82rem;
174
- text-align: left;
175
210
  }
176
211
 
177
- .sim-app button.sim-model-strip:hover {
178
- background: var(--sim-surface-2);
179
- border-style: solid;
212
+ .sim-app ::selection {
213
+ background: var(--sim-accent-soft);
180
214
  }
181
215
 
182
- .sim-model-strip-label {
183
- font-weight: 600;
184
- margin-right: 0.6rem;
216
+ .sim-app :focus-visible {
217
+ outline: 2px solid var(--sim-accent);
218
+ outline-offset: 1px;
185
219
  }
186
220
 
187
- .sim-model-strip-item {
188
- font-family: var(--sim-mono);
189
- font-size: 0.78rem;
221
+ .sim-svg {
222
+ flex-shrink: 0;
223
+ display: block;
190
224
  }
191
225
 
192
- .sim-model-strip-item + .sim-model-strip-item::before {
193
- content: '·';
194
- margin: 0 0.5rem;
226
+ .sim-muted {
195
227
  color: var(--sim-muted);
228
+ font-size: 0.86em;
196
229
  }
197
230
 
198
- .sim-model-strip-more {
199
- margin-left: auto;
200
- padding-left: 1rem;
201
- color: var(--sim-accent);
202
- white-space: nowrap;
231
+ .sim-spacer {
232
+ flex: 1;
203
233
  }
204
234
 
205
- .sim-card {
235
+ .sim-app kbd {
236
+ display: inline-flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ min-width: 1.5em;
240
+ height: 1.5em;
241
+ padding: 0 0.35em;
242
+ font-family: var(--sim-font);
243
+ font-size: 0.78em;
244
+ font-weight: 500;
245
+ color: var(--sim-text-2);
206
246
  background: var(--sim-surface);
207
- border: 1px solid var(--sim-border);
208
- border-radius: var(--sim-radius);
209
- padding: 0.85rem 1rem;
247
+ border: 1px solid var(--sim-border-strong);
248
+ border-bottom-width: 2px;
249
+ border-radius: 4px;
250
+ line-height: 1;
210
251
  }
211
252
 
212
- .sim-card > h3,
213
- .sim-card-title {
214
- margin: 0 0 0.75rem;
215
- font-size: 1rem;
216
- font-weight: 600;
217
- display: flex;
218
- align-items: center;
219
- gap: 0.6rem;
220
- }
253
+ /* Scrollbars, discreet */
221
254
 
222
- .sim-muted {
223
- color: var(--sim-muted);
224
- font-size: 0.85rem;
255
+ .sim-app * {
256
+ scrollbar-width: thin;
257
+ scrollbar-color: var(--sim-border-strong) transparent;
225
258
  }
226
259
 
227
- .sim-main {
228
- display: grid;
229
- grid-template-columns: 520px minmax(0, 1fr);
230
- gap: 1.25rem;
231
- align-items: start;
232
- margin-top: 1rem;
233
- }
260
+ /* Buttons: reset, then the kinds (default, primary, ghost, icon) */
234
261
 
235
- .sim-main > .sim-left {
236
- position: sticky;
237
- top: 0.75rem;
262
+ :where(.sim-app) button {
263
+ font: inherit;
264
+ color: inherit;
265
+ margin: 0;
266
+ padding: 0;
267
+ background: none;
268
+ border: 0;
269
+ cursor: pointer;
270
+ text-align: inherit;
238
271
  }
239
272
 
240
- @media (max-width: 1100px) {
241
- .sim-main { grid-template-columns: minmax(0, 1fr); }
242
- .sim-main > .sim-left { position: static; }
273
+ :where(.sim-app) button:disabled {
274
+ cursor: not-allowed;
243
275
  }
244
276
 
245
- .sim-panels {
246
- display: grid;
247
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
248
- gap: 1.25rem;
249
- margin-top: 1.25rem;
277
+ /* `:where` keeps the kinds below (and components' own buttons) in charge. */
278
+ .sim-app :where(.sim-btn, .sim-primary, .sim-ghost, button:not([class])) {
279
+ display: inline-flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ gap: 6px;
283
+ height: 30px;
284
+ padding: 0 11px;
285
+ border: 1px solid var(--sim-border-strong);
286
+ border-radius: var(--sim-radius-sm);
287
+ background: var(--sim-surface);
288
+ color: var(--sim-text);
289
+ font-size: 13px;
290
+ font-weight: 500;
291
+ white-space: nowrap;
292
+ box-shadow: var(--sim-shadow-sm);
293
+ transition: background-color 0.12s, border-color 0.12s, color 0.12s, box-shadow 0.12s;
294
+ user-select: none;
250
295
  }
251
296
 
252
- @media (max-width: 900px) {
253
- .sim-panels { grid-template-columns: minmax(0, 1fr); }
297
+ .sim-app :where(.sim-btn, button:not([class])):hover:not(:disabled) {
298
+ background: var(--sim-surface-2);
299
+ border-color: var(--sim-faint);
254
300
  }
255
301
 
256
- .sim-section {
257
- margin-top: 1.25rem;
302
+ .sim-app :where(.sim-btn, .sim-ghost, button:not([class])):active:not(:disabled) {
303
+ background: var(--sim-surface-3);
258
304
  }
259
305
 
260
- /* Buttons: compact, in three weights */
306
+ .sim-app .sim-primary {
307
+ background: var(--sim-accent);
308
+ border-color: transparent;
309
+ color: var(--sim-accent-text);
310
+ }
261
311
 
262
- .sim-app button {
263
- --pico-form-element-spacing-vertical: 0.3rem;
264
- --pico-form-element-spacing-horizontal: 0.7rem;
265
- margin: 0;
266
- width: auto;
267
- font-size: 0.9rem;
312
+ .sim-app .sim-primary:hover:not(:disabled) {
313
+ background: var(--sim-accent-hover);
268
314
  }
269
315
 
270
- .sim-app button.sim-ghost {
316
+ .sim-app .sim-ghost {
271
317
  background: transparent;
318
+ border-color: transparent;
319
+ box-shadow: none;
320
+ color: var(--sim-text-2);
321
+ }
322
+
323
+ .sim-app .sim-ghost:hover:not(:disabled) {
324
+ background: var(--sim-surface-3);
325
+ border-color: transparent;
272
326
  color: var(--sim-text);
273
- border-color: var(--sim-border);
274
327
  }
275
328
 
276
- .sim-app button.sim-ghost:hover:not(:disabled) {
277
- background: var(--sim-surface-2);
329
+ .sim-app :where(.sim-btn, .sim-primary, .sim-ghost, button:not([class])):disabled {
330
+ opacity: 0.42;
331
+ box-shadow: none;
278
332
  }
279
333
 
280
- .sim-app button.sim-icon {
281
- --pico-form-element-spacing-horizontal: 0.45rem;
282
- min-width: 2rem;
334
+ .sim-app .sim-icon {
335
+ width: 30px;
336
+ padding: 0;
337
+ flex-shrink: 0;
283
338
  }
284
339
 
285
- .sim-app button.sim-danger {
286
- color: var(--sim-failure);
340
+ .sim-app .sim-sm {
341
+ height: 26px;
342
+ font-size: 12px;
343
+ padding: 0 8px;
287
344
  }
288
345
 
289
- /* The execution toolbar */
346
+ .sim-app .sim-sm.sim-icon {
347
+ width: 26px;
348
+ padding: 0;
349
+ }
290
350
 
291
- .sim-toolbar {
292
- display: flex;
293
- align-items: center;
294
- gap: 0.75rem 1.25rem;
295
- flex-wrap: wrap;
351
+ .sim-app .sim-danger {
352
+ color: var(--sim-failure);
296
353
  }
297
354
 
298
- .sim-toolbar .sim-group {
299
- display: flex;
300
- align-items: center;
301
- gap: 0.4rem;
355
+ .sim-app .sim-ghost.sim-danger:hover:not(:disabled) {
356
+ background: var(--sim-failure-soft);
357
+ color: var(--sim-failure);
302
358
  }
303
359
 
304
- .sim-toolbar .sim-round {
305
- font-weight: 600;
306
- min-width: 5.5rem;
307
- text-align: center;
308
- font-variant-numeric: tabular-nums;
360
+ /* Fields */
361
+
362
+ .sim-app :is(input[type='text'], input[type='number'], input[type='search'], input:not([type]), select, textarea) {
363
+ font: inherit;
364
+ font-size: 13px;
365
+ color: var(--sim-text);
366
+ background: var(--sim-surface);
367
+ border: 1px solid var(--sim-border-strong);
368
+ border-radius: var(--sim-radius-sm);
369
+ height: 30px;
370
+ padding: 0 9px;
371
+ margin: 0;
372
+ width: 100%;
373
+ min-width: 0;
374
+ transition: border-color 0.12s, box-shadow 0.12s;
309
375
  }
310
376
 
311
- .sim-toolbar .sim-divider {
312
- width: 1px;
313
- align-self: stretch;
314
- background: var(--sim-border);
377
+ .sim-app textarea {
378
+ height: auto;
379
+ padding: 7px 9px;
380
+ line-height: 1.5;
381
+ resize: vertical;
315
382
  }
316
383
 
317
- .sim-step-label {
318
- font-family: var(--sim-mono);
319
- font-size: 0.8rem;
320
- color: var(--sim-muted);
384
+ .sim-app :is(input, select, textarea)::placeholder {
385
+ color: var(--sim-faint);
321
386
  }
322
387
 
323
- .sim-path {
324
- display: flex;
325
- flex-wrap: wrap;
326
- gap: 0.25rem;
327
- margin-top: 0.6rem;
328
- align-items: center;
388
+ .sim-app :is(input, select, textarea):hover {
389
+ border-color: var(--sim-faint);
329
390
  }
330
391
 
331
- .sim-path .sim-path-label {
332
- font-size: 0.8rem;
333
- color: var(--sim-muted);
334
- margin-right: 0.25rem;
392
+ .sim-app :is(input, select, textarea):focus {
393
+ outline: none;
394
+ border-color: var(--sim-accent);
395
+ box-shadow: 0 0 0 3px var(--sim-focus);
335
396
  }
336
397
 
337
- .sim-step {
398
+ .sim-app input[type='number'] {
338
399
  font-family: var(--sim-mono);
339
- font-size: 0.75rem;
340
- padding: 0.05rem 0.4rem;
341
- border-radius: 999px;
342
- border: 1px solid var(--sim-border);
343
- background: var(--sim-surface-2);
344
- color: var(--sim-text);
345
- cursor: pointer;
346
- line-height: 1.4;
400
+ font-variant-numeric: tabular-nums;
347
401
  }
348
402
 
349
- .sim-step.sim-current {
350
- border-color: var(--sim-highlight);
351
- background: var(--sim-highlight-soft);
352
- font-weight: 600;
403
+ .sim-app select {
404
+ appearance: none;
405
+ padding-right: 28px;
406
+ cursor: pointer;
407
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23909098' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
408
+ background-repeat: no-repeat;
409
+ background-position: right 8px center;
353
410
  }
354
411
 
355
- .sim-step.sim-future {
356
- opacity: 0.45;
412
+ .sim-app input[type='checkbox'] {
413
+ accent-color: var(--sim-accent);
414
+ width: 15px;
415
+ height: 15px;
416
+ margin: 0;
357
417
  }
358
418
 
359
- /* Status chips (verdicts) */
419
+ /* Status chips (verdicts, counts) */
360
420
 
361
421
  .sim-chip {
362
422
  display: inline-flex;
363
423
  align-items: center;
364
- gap: 0.3rem;
365
- font-size: 0.78rem;
366
- font-weight: 600;
367
- padding: 0.1rem 0.55rem;
424
+ gap: 6px;
425
+ height: 22px;
426
+ padding: 0 8px;
368
427
  border-radius: 999px;
428
+ font-size: 12px;
429
+ font-weight: 500;
369
430
  white-space: nowrap;
370
- background: var(--sim-surface-2);
371
- color: var(--sim-muted);
372
- border: 1px solid var(--sim-border);
431
+ background: var(--sim-surface-3);
432
+ color: var(--sim-text-2);
433
+ border: 1px solid transparent;
434
+ font-variant-numeric: tabular-nums;
373
435
  }
374
436
 
375
- .sim-chip.sim-success { background: var(--sim-success-soft); color: var(--sim-success); border-color: transparent; }
376
- .sim-chip.sim-failure { background: var(--sim-failure-soft); color: var(--sim-failure); border-color: transparent; }
377
- .sim-chip.sim-inProgress { background: var(--sim-progress-soft); color: var(--sim-progress); border-color: transparent; }
437
+ .sim-chip:is(.sim-success, .sim-failure, .sim-inProgress)::before {
438
+ content: '';
439
+ width: 7px;
440
+ height: 7px;
441
+ border-radius: 50%;
442
+ background: currentColor;
443
+ }
378
444
 
379
- /* Notices */
445
+ .sim-chip.sim-success { background: var(--sim-success-soft); color: var(--sim-success); }
446
+ .sim-chip.sim-failure { background: var(--sim-failure-soft); color: var(--sim-failure); }
447
+ .sim-chip.sim-inProgress { background: var(--sim-progress-soft); color: var(--sim-progress); }
380
448
 
381
- .sim-notice {
382
- margin: 0 0 1rem;
383
- padding: 0.6rem 0.8rem;
384
- border-radius: var(--sim-radius);
385
- font-size: 0.85rem;
386
- white-space: pre-wrap;
387
- font-family: var(--sim-mono);
388
- background: var(--sim-progress-soft);
389
- color: var(--sim-text);
390
- border: 1px solid var(--sim-progress);
391
- }
449
+ /* Segmented controls (views, tabs) */
392
450
 
393
- .sim-notice.sim-error {
394
- background: var(--sim-failure-soft);
395
- border-color: var(--sim-failure);
451
+ .sim-tabs {
452
+ display: inline-flex;
453
+ align-items: center;
454
+ padding: 3px;
455
+ gap: 2px;
456
+ border-radius: 8px;
457
+ background: var(--sim-surface-3);
396
458
  }
397
459
 
398
- .sim-settings-feedback {
399
- font-family: inherit;
400
- margin: 0;
460
+ .sim-app button.sim-tab {
461
+ display: inline-flex;
462
+ align-items: center;
463
+ gap: 6px;
464
+ height: 26px;
465
+ padding: 0 12px;
466
+ border-radius: 6px;
467
+ color: var(--sim-muted);
468
+ font-size: 13px;
469
+ font-weight: 500;
470
+ white-space: nowrap;
471
+ transition: color 0.12s, background-color 0.12s;
401
472
  }
402
473
 
403
- .sim-settings-warning {
404
- white-space: normal;
474
+ .sim-app button.sim-tab:hover:not(.sim-tab-current) {
475
+ color: var(--sim-text);
405
476
  }
406
477
 
407
- .sim-toast {
408
- position: fixed;
409
- bottom: 1.25rem;
410
- left: 50%;
411
- transform: translateX(-50%);
412
- background: var(--sim-text);
413
- color: var(--sim-surface);
414
- padding: 0.45rem 0.9rem;
415
- border-radius: 999px;
416
- font-size: 0.85rem;
417
- z-index: 100;
418
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
478
+ .sim-app button.sim-tab.sim-tab-current {
479
+ background: var(--sim-surface);
480
+ color: var(--sim-text);
481
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 0 0 1px var(--sim-border);
419
482
  }
420
483
 
421
- /* The configuration's canvas: drawings assume a white background. */
484
+ /* Panels and cards */
422
485
 
423
- .sim-canvas {
424
- display: block;
425
- background: white;
426
- border-radius: 8px;
486
+ .sim-panel {
487
+ display: flex;
488
+ flex-direction: column;
489
+ min-width: 0;
490
+ min-height: 0;
491
+ background: var(--sim-surface);
427
492
  border: 1px solid var(--sim-border);
428
- cursor: pointer;
429
- max-width: 100%;
493
+ border-radius: var(--sim-radius);
494
+ box-shadow: var(--sim-shadow-sm);
495
+ overflow: hidden;
430
496
  }
431
497
 
432
- .theme-toggle {
433
- min-width: 2.2rem;
498
+ .sim-panel-head {
499
+ display: flex;
500
+ align-items: center;
501
+ gap: 8px;
502
+ flex: none;
503
+ min-height: 42px;
504
+ padding: 6px 8px 6px 14px;
505
+ border-bottom: 1px solid var(--sim-border);
434
506
  }
435
507
 
436
- /* Forms inside the simulator */
437
-
438
- .sim-app input,
439
- .sim-app select,
440
- .sim-app textarea {
441
- --pico-form-element-spacing-vertical: 0.35rem;
442
- --pico-form-element-spacing-horizontal: 0.55rem;
443
- margin-bottom: 0;
444
- font-size: 0.9rem;
508
+ .sim-panel-head > .sim-svg {
509
+ color: var(--sim-muted);
445
510
  }
446
511
 
447
- .sim-app label {
448
- font-size: 0.85rem;
449
- margin-bottom: 0;
512
+ .sim-panel-title {
513
+ min-width: 0;
514
+ font-size: 13px;
515
+ font-weight: 600;
516
+ color: var(--sim-text);
517
+ white-space: nowrap;
518
+ overflow: hidden;
519
+ text-overflow: ellipsis;
450
520
  }
451
521
 
452
- .sim-form {
453
- display: grid;
454
- grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
455
- gap: 0.6rem 0.9rem;
522
+ /* A narrow panel shortens its title rather than losing its buttons. */
523
+ .sim-panel-head > :is(button, .sim-popover-anchor, .sim-svg) {
524
+ flex-shrink: 0;
456
525
  }
457
526
 
458
- .sim-form .sim-field-wide {
459
- grid-column: 1 / -1;
527
+ @container (max-width: 260px) {
528
+ .sim-panel-head .sim-btn-label,
529
+ .sim-panel-head .sim-panel-sub {
530
+ display: none;
531
+ }
460
532
  }
461
533
 
462
- .sim-form label {
463
- display: flex;
464
- flex-direction: column;
465
- gap: 0.2rem;
534
+ .sim-panel-sub {
535
+ /* Gives way before the title. */
536
+ flex-shrink: 100;
537
+ min-width: 0;
538
+ font-size: 12px;
539
+ color: var(--sim-muted);
540
+ overflow: hidden;
541
+ text-overflow: ellipsis;
542
+ white-space: nowrap;
466
543
  }
467
544
 
468
- .sim-form input[type='checkbox'] {
469
- margin-right: 0.4rem;
545
+ .sim-panel-body {
546
+ flex: 1;
547
+ min-height: 0;
548
+ padding: 14px;
549
+ overflow: auto;
470
550
  }
471
551
 
472
- .sim-form label:has(input[type='checkbox']) {
473
- flex-direction: row;
474
- align-items: center;
552
+ .sim-card {
553
+ background: var(--sim-surface);
554
+ border: 1px solid var(--sim-border);
555
+ border-radius: var(--sim-radius);
556
+ box-shadow: var(--sim-shadow-sm);
557
+ padding: 14px 16px;
475
558
  }
476
559
 
477
- /* Presets and saved settings */
478
-
479
- .sim-library h4 {
480
- margin: 0 0 0.35rem;
481
- font-size: 0.75rem;
560
+ .sim-card > h3,
561
+ .sim-card-title {
562
+ margin: 0 0 12px;
563
+ font-size: 14px;
482
564
  font-weight: 600;
483
- text-transform: uppercase;
484
- letter-spacing: 0.04em;
485
- color: var(--sim-muted);
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 10px;
486
568
  }
487
569
 
488
- .sim-library h4:not(:first-child) {
489
- margin-top: 0.9rem;
490
- }
570
+ /* Top bar */
491
571
 
492
- .sim-entries {
493
- list-style: none;
494
- margin: 0;
495
- padding: 0;
572
+ .sim-topbar {
573
+ position: relative;
574
+ z-index: 30;
575
+ flex: none;
576
+ display: flex;
577
+ align-items: center;
578
+ gap: 14px;
579
+ height: var(--sim-topbar-h);
580
+ padding: 0 16px;
581
+ background: var(--sim-surface);
582
+ border-bottom: 1px solid var(--sim-border);
496
583
  }
497
584
 
498
- .sim-entries li.sim-entry {
499
- list-style: none;
585
+ .sim-brand {
500
586
  display: flex;
501
587
  align-items: center;
502
- gap: 0.75rem;
503
- padding: 0.35rem 0.5rem;
504
- margin: 0;
505
- border-radius: 6px;
506
- border-left: 3px solid transparent;
588
+ gap: 9px;
589
+ min-width: 0;
590
+ color: var(--sim-text);
507
591
  }
508
592
 
509
- .sim-entries li.sim-entry:hover {
510
- background: var(--sim-surface-2);
593
+ .sim-brand-name {
594
+ font-weight: 600;
595
+ font-size: 14px;
596
+ letter-spacing: -0.01em;
511
597
  }
512
598
 
513
- .sim-entries li.sim-entry-current {
514
- border-left-color: var(--sim-accent);
515
- background: var(--sim-accent-soft);
599
+ .sim-brand-sep {
600
+ color: var(--sim-faint);
601
+ font-weight: 300;
602
+ font-size: 18px;
516
603
  }
517
604
 
518
- .sim-entry-text {
519
- display: flex;
520
- flex-direction: column;
521
- min-width: 0;
605
+ .sim-brand h1 {
606
+ font-size: 14px;
607
+ font-weight: 500;
608
+ color: var(--sim-text-2);
609
+ white-space: nowrap;
610
+ overflow: hidden;
611
+ text-overflow: ellipsis;
612
+ }
613
+
614
+ .sim-project {
615
+ display: flex;
616
+ align-items: center;
617
+ gap: 6px;
618
+ }
619
+
620
+ .sim-app .sim-project select {
621
+ width: auto;
622
+ min-width: 14rem;
623
+ max-width: 22rem;
624
+ font-family: var(--sim-mono);
625
+ font-size: 12.5px;
626
+ background-color: var(--sim-surface-2);
627
+ }
628
+
629
+ .sim-topbar-actions {
630
+ display: flex;
631
+ align-items: center;
632
+ gap: 6px;
633
+ }
634
+
635
+ /* The execution transport: navigation, playback, verdict, branches; the path below */
636
+
637
+ .sim-transport-bar {
638
+ flex: none;
639
+ padding: var(--sim-gap) var(--sim-gap) 0 0;
640
+ }
641
+
642
+ .sim-transport {
643
+ background: var(--sim-surface);
644
+ border: 1px solid var(--sim-border);
645
+ border-radius: var(--sim-radius);
646
+ box-shadow: var(--sim-shadow-md);
647
+ }
648
+
649
+ .sim-transport-row {
650
+ display: flex;
651
+ align-items: center;
652
+ flex-wrap: wrap;
653
+ gap: 8px 14px;
654
+ padding: 8px 10px;
655
+ }
656
+
657
+ .sim-group {
658
+ display: flex;
659
+ align-items: center;
660
+ gap: 4px;
661
+ }
662
+
663
+ .sim-divider {
664
+ width: 1px;
665
+ height: 22px;
666
+ background: var(--sim-border);
667
+ flex-shrink: 0;
668
+ }
669
+
670
+ .sim-round {
671
+ display: inline-flex;
672
+ align-items: baseline;
673
+ gap: 6px;
674
+ min-width: 7.5rem;
675
+ justify-content: center;
676
+ height: 30px;
677
+ align-items: center;
678
+ padding: 0 10px;
679
+ border-radius: var(--sim-radius-sm);
680
+ background: var(--sim-surface-2);
681
+ border: 1px solid var(--sim-border);
682
+ font-variant-numeric: tabular-nums;
683
+ }
684
+
685
+ .sim-round-label {
686
+ font-size: 11px;
687
+ font-weight: 600;
688
+ letter-spacing: 0.06em;
689
+ text-transform: uppercase;
690
+ color: var(--sim-muted);
691
+ }
692
+
693
+ .sim-round-value {
694
+ font-family: var(--sim-mono);
695
+ font-size: 15px;
696
+ font-weight: 600;
697
+ color: var(--sim-text);
698
+ }
699
+
700
+ .sim-round-total {
701
+ font-family: var(--sim-mono);
702
+ font-size: 12px;
703
+ color: var(--sim-faint);
704
+ }
705
+
706
+ .sim-app .sim-play {
707
+ width: 34px;
708
+ padding: 0;
709
+ }
710
+
711
+ .sim-speed {
712
+ display: flex;
713
+ align-items: center;
714
+ }
715
+
716
+ .sim-app .sim-speed select {
717
+ width: auto;
718
+ height: 26px;
719
+ font-size: 12px;
720
+ padding: 0 24px 0 8px;
721
+ background-position: right 5px center;
722
+ font-variant-numeric: tabular-nums;
723
+ }
724
+
725
+ .sim-verdict {
726
+ height: 26px;
727
+ padding: 0 10px;
728
+ font-size: 12.5px;
729
+ }
730
+
731
+ .sim-branches {
732
+ gap: 6px;
733
+ }
734
+
735
+ /* A toggle (the random branch): pressed, it takes the accent. */
736
+ .sim-app .sim-ghost.sim-toggle-on,
737
+ .sim-app .sim-ghost.sim-toggle-on:hover:not(:disabled) {
738
+ background: var(--sim-accent-soft);
739
+ color: var(--sim-accent);
740
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--sim-accent) 45%, transparent);
741
+ }
742
+
743
+ .sim-branches > .sim-svg {
744
+ color: var(--sim-muted);
745
+ }
746
+
747
+ .sim-branch {
748
+ font-size: 13px;
749
+ font-weight: 600;
750
+ white-space: nowrap;
751
+ font-variant-numeric: tabular-nums;
752
+ }
753
+
754
+ .sim-branch-of {
755
+ color: var(--sim-muted);
756
+ font-weight: 400;
757
+ }
758
+
759
+ .sim-step-label {
760
+ font-family: var(--sim-mono);
761
+ font-size: 12px;
762
+ color: var(--sim-muted);
763
+ }
764
+
765
+ .sim-branch-label {
766
+ max-width: 22rem;
767
+ padding: 2px 8px;
768
+ border-radius: 5px;
769
+ background: var(--sim-surface-2);
770
+ border: 1px solid var(--sim-border);
771
+ color: var(--sim-text-2);
772
+ overflow: hidden;
773
+ text-overflow: ellipsis;
774
+ white-space: nowrap;
775
+ }
776
+
777
+ /* The path: one stop per round, with the choice that led there and its verdict */
778
+
779
+ .sim-timeline {
780
+ display: flex;
781
+ align-items: center;
782
+ gap: 10px;
783
+ padding: 0 10px 0 12px;
784
+ height: 38px;
785
+ border-top: 1px solid var(--sim-border);
786
+ }
787
+
788
+ .sim-timeline-label {
789
+ font-size: 11px;
790
+ font-weight: 600;
791
+ letter-spacing: 0.06em;
792
+ text-transform: uppercase;
793
+ color: var(--sim-muted);
794
+ flex-shrink: 0;
795
+ }
796
+
797
+ .sim-track {
798
+ position: relative;
799
+ display: flex;
800
+ align-items: center;
801
+ gap: 3px;
802
+ min-width: 0;
803
+ flex: 1;
804
+ overflow-x: auto;
805
+ scrollbar-width: none;
806
+ padding: 4px 2px;
807
+ mask-image: linear-gradient(to right, transparent 0, black 6px, black calc(100% - 16px), transparent);
808
+ }
809
+
810
+ .sim-track::-webkit-scrollbar {
811
+ display: none;
812
+ }
813
+
814
+ .sim-app button.sim-step {
815
+ position: relative;
816
+ flex-shrink: 0;
817
+ display: inline-flex;
818
+ align-items: center;
819
+ justify-content: center;
820
+ min-width: 24px;
821
+ height: 22px;
822
+ padding: 0 5px;
823
+ border-radius: 5px;
824
+ font-family: var(--sim-mono);
825
+ font-size: 11.5px;
826
+ color: var(--sim-text-2);
827
+ background: var(--sim-surface-2);
828
+ border: 1px solid var(--sim-border);
829
+ transition: background-color 0.1s, border-color 0.1s;
830
+ }
831
+
832
+ .sim-app button.sim-step::after {
833
+ content: '';
834
+ position: absolute;
835
+ left: 4px;
836
+ right: 4px;
837
+ bottom: -4px;
838
+ height: 2px;
839
+ border-radius: 2px;
840
+ background: transparent;
841
+ }
842
+
843
+ .sim-app button.sim-step[data-verdict='success']::after { background: var(--sim-success); }
844
+ .sim-app button.sim-step[data-verdict='failure']::after { background: var(--sim-failure); }
845
+
846
+ .sim-app button.sim-step:hover {
847
+ border-color: var(--sim-faint);
848
+ }
849
+
850
+ .sim-app button.sim-step.sim-current {
851
+ background: var(--sim-accent);
852
+ border-color: var(--sim-accent);
853
+ color: var(--sim-accent-text);
854
+ font-weight: 600;
855
+ }
856
+
857
+ .sim-app button.sim-step.sim-future {
858
+ opacity: 0.45;
859
+ border-style: dashed;
860
+ }
861
+
862
+ .sim-track-sep {
863
+ flex-shrink: 0;
864
+ width: 6px;
865
+ height: 1px;
866
+ background: var(--sim-border-strong);
867
+ }
868
+
869
+ .sim-timeline .sim-step-label {
870
+ flex-shrink: 1;
871
+ min-width: 0;
872
+ max-width: 40%;
873
+ overflow: hidden;
874
+ text-overflow: ellipsis;
875
+ white-space: nowrap;
876
+ }
877
+
878
+ /* The shell: the activity bar, then the transport above the workbench */
879
+
880
+ .sim-shell {
881
+ flex: 1;
882
+ min-height: 0;
883
+ display: flex;
884
+ }
885
+
886
+ .sim-activity {
887
+ flex: none;
888
+ display: flex;
889
+ flex-direction: column;
890
+ align-items: center;
891
+ gap: 4px;
892
+ width: 52px;
893
+ padding: var(--sim-gap) 0;
894
+ }
895
+
896
+ .sim-app button.sim-activity-btn {
897
+ position: relative;
898
+ display: flex;
899
+ align-items: center;
900
+ justify-content: center;
901
+ width: 38px;
902
+ height: 38px;
903
+ border-radius: 9px;
904
+ color: var(--sim-muted);
905
+ transition: color 0.12s, background-color 0.12s;
906
+ }
907
+
908
+ .sim-app button.sim-activity-btn:hover {
909
+ color: var(--sim-text);
910
+ background: var(--sim-surface-3);
911
+ }
912
+
913
+ .sim-app button.sim-activity-btn.sim-active {
914
+ color: var(--sim-accent);
915
+ background: var(--sim-accent-soft);
916
+ }
917
+
918
+ .sim-app button.sim-activity-btn.sim-active::before {
919
+ content: '';
920
+ position: absolute;
921
+ left: -7px;
922
+ top: 9px;
923
+ bottom: 9px;
924
+ width: 3px;
925
+ border-radius: 0 3px 3px 0;
926
+ background: var(--sim-accent);
927
+ }
928
+
929
+ .sim-activity-sep {
930
+ width: 22px;
931
+ height: 1px;
932
+ margin: 4px 0;
933
+ background: var(--sim-border-strong);
934
+ }
935
+
936
+ .sim-main {
937
+ flex: 1;
938
+ min-width: 0;
939
+ min-height: 0;
940
+ display: flex;
941
+ flex-direction: column;
942
+ }
943
+
944
+ .sim-workbench {
945
+ position: relative;
946
+ flex: 1;
947
+ min-height: 0;
948
+ display: flex;
949
+ padding: var(--sim-gap) var(--sim-gap) var(--sim-gap) 0;
950
+ }
951
+
952
+ .sim-sidebar {
953
+ /* The width is a flex basis: a narrow window shrinks the side bars before the configuration. */
954
+ flex: 0 1 auto;
955
+ min-width: 200px;
956
+ min-height: 0;
957
+ display: flex;
958
+ flex-direction: column;
959
+ gap: var(--sim-gap);
960
+ }
961
+
962
+ .sim-center {
963
+ flex: 1;
964
+ min-width: 300px;
965
+ min-height: 0;
966
+ display: flex;
967
+ flex-direction: column;
968
+ }
969
+
970
+ .sim-center > .sim-panel {
971
+ flex: 1 1 0;
972
+ min-height: 200px;
973
+ }
974
+
975
+ /* Docks: the side bars stack their panels, the dock below the configuration lines them up. */
976
+
977
+ .sim-dock-bottom {
978
+ display: flex;
979
+ gap: var(--sim-gap);
980
+ min-height: 0;
981
+ /* Panels side by side keep a usable width: a narrow center scrolls them rather than overflowing. */
982
+ overflow-x: auto;
983
+ }
984
+
985
+ .sim-slot {
986
+ display: flex;
987
+ min-width: 0;
988
+ min-height: 0;
989
+ container-type: inline-size;
990
+ }
991
+
992
+ .sim-slot > * {
993
+ flex: 1;
994
+ min-width: 0;
995
+ }
996
+
997
+ .sim-sidebar > .sim-slot {
998
+ min-height: 110px;
999
+ }
1000
+
1001
+ .sim-dock-bottom > .sim-slot {
1002
+ min-width: 220px;
1003
+ }
1004
+
1005
+ .sim-slot-dragged {
1006
+ opacity: 0.45;
1007
+ }
1008
+
1009
+ .sim-inspector-panel .sim-panel-body {
1010
+ padding: 8px 10px 12px;
1011
+ }
1012
+
1013
+ .sim-graph-panel .config-graph {
1014
+ flex: 1;
1015
+ }
1016
+
1017
+ .sim-panel-head-draggable,
1018
+ .sim-app .algorithm-header-draggable {
1019
+ cursor: grab;
1020
+ }
1021
+
1022
+ /* Dragging a panel: the docks it can go to, and the panel's name under the pointer */
1023
+
1024
+ .sim-dropzones {
1025
+ position: absolute;
1026
+ inset: 0;
1027
+ z-index: 40;
1028
+ pointer-events: none;
1029
+ }
1030
+
1031
+ .sim-dropzone {
1032
+ position: absolute;
1033
+ display: flex;
1034
+ flex-direction: column;
1035
+ align-items: center;
1036
+ justify-content: center;
1037
+ gap: 6px;
1038
+ border: 2px dashed color-mix(in srgb, var(--sim-accent) 45%, transparent);
1039
+ border-radius: 12px;
1040
+ background: color-mix(in srgb, var(--sim-bg) 55%, transparent);
1041
+ backdrop-filter: blur(2px);
1042
+ color: var(--sim-accent);
1043
+ font-size: 13px;
1044
+ font-weight: 600;
1045
+ transition: background-color 0.12s, border-color 0.12s;
1046
+ }
1047
+
1048
+ .sim-dropzone span {
1049
+ padding: 3px 10px;
1050
+ border-radius: 999px;
1051
+ background: var(--sim-surface);
1052
+ box-shadow: var(--sim-shadow-md);
1053
+ }
1054
+
1055
+ .sim-dropzone-active {
1056
+ border-style: solid;
1057
+ border-color: var(--sim-accent);
1058
+ background: color-mix(in srgb, var(--sim-accent) 18%, color-mix(in srgb, var(--sim-bg) 60%, transparent));
1059
+ }
1060
+
1061
+ .sim-dropzone-active span {
1062
+ background: var(--sim-accent);
1063
+ color: var(--sim-accent-text);
1064
+ }
1065
+
1066
+ .sim-drag-ghost {
1067
+ position: fixed;
1068
+ z-index: 60;
1069
+ transform: translate(14px, 10px);
1070
+ display: inline-flex;
1071
+ align-items: center;
1072
+ gap: 6px;
1073
+ padding: 5px 10px;
1074
+ border-radius: 8px;
1075
+ background: var(--sim-text);
1076
+ color: var(--sim-surface);
1077
+ font-size: 12.5px;
1078
+ font-weight: 600;
1079
+ box-shadow: var(--sim-shadow-lg);
1080
+ pointer-events: none;
1081
+ }
1082
+
1083
+ .sim-dragging-panel,
1084
+ .sim-dragging-panel * {
1085
+ cursor: grabbing !important;
1086
+ user-select: none !important;
1087
+ }
1088
+
1089
+ /* Menus */
1090
+
1091
+ .sim-menu {
1092
+ position: absolute;
1093
+ top: calc(100% + 4px);
1094
+ right: 0;
1095
+ z-index: 45;
1096
+ min-width: 230px;
1097
+ padding: 4px;
1098
+ background: var(--sim-surface);
1099
+ border: 1px solid var(--sim-border);
1100
+ border-radius: 9px;
1101
+ box-shadow: var(--sim-shadow-lg);
1102
+ cursor: default;
1103
+ }
1104
+
1105
+ .sim-menu-label {
1106
+ padding: 6px 8px 4px;
1107
+ font-size: 10.5px;
1108
+ font-weight: 600;
1109
+ letter-spacing: 0.06em;
1110
+ text-transform: uppercase;
1111
+ color: var(--sim-muted);
1112
+ }
1113
+
1114
+ .sim-app button.sim-menu-item {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ gap: 9px;
1118
+ width: 100%;
1119
+ height: 30px;
1120
+ padding: 0 8px;
1121
+ border-radius: 6px;
1122
+ font-size: 13px;
1123
+ color: var(--sim-text);
1124
+ white-space: nowrap;
1125
+ }
1126
+
1127
+ .sim-app button.sim-menu-item:hover {
1128
+ background: var(--sim-surface-3);
1129
+ }
1130
+
1131
+ .sim-app button.sim-menu-item .sim-svg {
1132
+ color: var(--sim-muted);
1133
+ }
1134
+
1135
+ .sim-app button.sim-menu-item.sim-menu-current,
1136
+ .sim-app button.sim-menu-item.sim-menu-current .sim-svg {
1137
+ color: var(--sim-accent);
1138
+ }
1139
+
1140
+ .sim-menu-check {
1141
+ margin-left: auto;
1142
+ }
1143
+
1144
+ /* Splitters: a gap between panels that shows a handle on hover */
1145
+
1146
+ .sim-splitter {
1147
+ position: relative;
1148
+ flex: none;
1149
+ touch-action: none;
1150
+ }
1151
+
1152
+ .sim-splitter-vertical {
1153
+ width: var(--sim-gap);
1154
+ cursor: col-resize;
1155
+ }
1156
+
1157
+ .sim-splitter-horizontal {
1158
+ height: var(--sim-gap);
1159
+ cursor: row-resize;
1160
+ z-index: 1;
1161
+ }
1162
+
1163
+ /* Inside a dock, a splitter takes the place of the gap between its panels. */
1164
+ .sim-dock > .sim-splitter-horizontal {
1165
+ margin: calc(var(--sim-gap) * -1) 0;
1166
+ }
1167
+
1168
+ .sim-dock-bottom > .sim-splitter-vertical {
1169
+ margin: 0 calc(var(--sim-gap) * -1);
1170
+ }
1171
+
1172
+ .sim-splitter::after {
1173
+ content: '';
1174
+ position: absolute;
1175
+ border-radius: 4px;
1176
+ background: var(--sim-accent);
1177
+ opacity: 0;
1178
+ transition: opacity 0.15s;
1179
+ }
1180
+
1181
+ .sim-splitter-vertical::after {
1182
+ top: 0;
1183
+ bottom: 0;
1184
+ left: calc(50% - 1.5px);
1185
+ width: 3px;
1186
+ }
1187
+
1188
+ .sim-splitter-horizontal::after {
1189
+ left: 0;
1190
+ right: 0;
1191
+ top: calc(50% - 1.5px);
1192
+ height: 3px;
1193
+ }
1194
+
1195
+ .sim-splitter:hover::after,
1196
+ .sim-splitter.sim-dragging::after {
1197
+ opacity: 0.8;
1198
+ }
1199
+
1200
+ .sim-resizing,
1201
+ .sim-resizing * {
1202
+ cursor: col-resize !important;
1203
+ user-select: none !important;
1204
+ }
1205
+
1206
+ .sim-resizing-rows,
1207
+ .sim-resizing-rows * {
1208
+ cursor: row-resize !important;
1209
+ user-select: none !important;
1210
+ }
1211
+
1212
+ /* The stage: the configuration's drawing on a dotted surface */
1213
+
1214
+ .sim-stage {
1215
+ position: relative;
1216
+ flex: 1;
1217
+ min-height: 0;
1218
+ background-color: var(--sim-stage);
1219
+ background-image: radial-gradient(var(--sim-stage-dot) 1px, transparent 1.2px);
1220
+ background-size: 18px 18px;
1221
+ background-position: 9px 9px;
1222
+ overflow: hidden;
1223
+ }
1224
+
1225
+ .sim-canvas {
1226
+ position: absolute;
1227
+ inset: 0;
1228
+ display: block;
1229
+ cursor: default;
1230
+ }
1231
+
1232
+ .sim-canvas.sim-over-agent {
1233
+ cursor: pointer;
1234
+ }
1235
+
1236
+ .sim-stage-overlay {
1237
+ position: absolute;
1238
+ left: 10px;
1239
+ bottom: 10px;
1240
+ display: flex;
1241
+ gap: 6px;
1242
+ pointer-events: none;
1243
+ }
1244
+
1245
+ .sim-stage-badge {
1246
+ display: inline-flex;
1247
+ align-items: center;
1248
+ gap: 6px;
1249
+ height: 22px;
1250
+ padding: 0 8px;
1251
+ border-radius: 6px;
1252
+ font-size: 11.5px;
1253
+ color: var(--sim-muted);
1254
+ background: color-mix(in srgb, var(--sim-surface) 85%, transparent);
1255
+ border: 1px solid var(--sim-border);
1256
+ backdrop-filter: blur(4px);
1257
+ }
1258
+
1259
+ .sim-stage-tip {
1260
+ position: absolute;
1261
+ z-index: 2;
1262
+ transform: translate(-50%, calc(-100% - 14px));
1263
+ padding: 5px 8px;
1264
+ border-radius: 6px;
1265
+ background: var(--sim-text);
1266
+ color: var(--sim-surface);
1267
+ font-size: 12px;
1268
+ white-space: nowrap;
1269
+ pointer-events: none;
1270
+ box-shadow: var(--sim-shadow-md);
1271
+ }
1272
+
1273
+ .sim-stage-tip strong {
1274
+ font-weight: 600;
1275
+ }
1276
+
1277
+ .sim-stage-tip span {
1278
+ opacity: 0.75;
1279
+ }
1280
+
1281
+ .sim-stage-empty {
1282
+ position: absolute;
1283
+ inset: 0;
1284
+ display: flex;
1285
+ flex-direction: column;
1286
+ align-items: center;
1287
+ justify-content: center;
1288
+ gap: 8px;
1289
+ color: var(--sim-muted);
1290
+ font-size: 13px;
1291
+ text-align: center;
1292
+ padding: 1rem;
1293
+ }
1294
+
1295
+ /* Settings form */
1296
+
1297
+ .sim-form {
1298
+ display: grid;
1299
+ grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
1300
+ gap: 12px 14px;
1301
+ }
1302
+
1303
+ .sim-form .sim-field-wide {
1304
+ grid-column: 1 / -1;
1305
+ }
1306
+
1307
+ .sim-field label {
1308
+ display: flex;
1309
+ flex-direction: column;
1310
+ gap: 5px;
1311
+ }
1312
+
1313
+ .sim-field-label {
1314
+ display: flex;
1315
+ align-items: baseline;
1316
+ gap: 6px;
1317
+ font-size: 12px;
1318
+ font-weight: 500;
1319
+ color: var(--sim-text-2);
1320
+ }
1321
+
1322
+ .sim-field-hint {
1323
+ font-weight: 400;
1324
+ color: var(--sim-faint);
1325
+ overflow: hidden;
1326
+ text-overflow: ellipsis;
1327
+ white-space: nowrap;
1328
+ }
1329
+
1330
+ .sim-field-check label {
1331
+ flex-direction: row;
1332
+ align-items: center;
1333
+ gap: 8px;
1334
+ height: 30px;
1335
+ margin-top: 18px;
1336
+ font-size: 13px;
1337
+ }
1338
+
1339
+ .sim-code-editor {
1340
+ display: grid;
1341
+ grid-template-columns: 3.2em minmax(0, 1fr);
1342
+ border: 1px solid var(--sim-border-strong);
1343
+ border-radius: var(--sim-radius-sm);
1344
+ overflow: hidden;
1345
+ background: var(--sim-surface);
1346
+ font-family: var(--sim-mono);
1347
+ font-size: 12.5px;
1348
+ line-height: 1.55;
1349
+ }
1350
+
1351
+ .sim-code-editor:focus-within {
1352
+ border-color: var(--sim-accent);
1353
+ box-shadow: 0 0 0 3px var(--sim-focus);
1354
+ }
1355
+
1356
+ .sim-code-gutter {
1357
+ padding: 8px 6px;
1358
+ text-align: right;
1359
+ color: var(--sim-faint);
1360
+ background: var(--sim-surface-2);
1361
+ border-right: 1px solid var(--sim-border);
1362
+ overflow: hidden;
1363
+ user-select: none;
1364
+ }
1365
+
1366
+ .sim-app .sim-code-editor textarea {
1367
+ border: none;
1368
+ border-radius: 0;
1369
+ box-shadow: none;
1370
+ padding: 8px 10px;
1371
+ font-family: inherit;
1372
+ font-size: inherit;
1373
+ line-height: inherit;
1374
+ white-space: pre;
1375
+ tab-size: 2;
1376
+ background: transparent;
1377
+ }
1378
+
1379
+ .sim-feedback {
1380
+ display: flex;
1381
+ gap: 10px;
1382
+ margin-top: 14px;
1383
+ padding: 10px 12px;
1384
+ border-radius: var(--sim-radius-sm);
1385
+ font-size: 13px;
1386
+ line-height: 1.45;
1387
+ border: 1px solid;
1388
+ }
1389
+
1390
+ .sim-feedback > .sim-svg {
1391
+ margin-top: 1px;
1392
+ }
1393
+
1394
+ .sim-feedback > div {
1395
+ display: flex;
1396
+ flex-direction: column;
1397
+ gap: 2px;
1398
+ min-width: 0;
1399
+ }
1400
+
1401
+ .sim-settings-error {
1402
+ background: var(--sim-failure-soft);
1403
+ border-color: color-mix(in srgb, var(--sim-failure) 40%, transparent);
1404
+ color: var(--sim-text);
1405
+ }
1406
+
1407
+ .sim-settings-error > .sim-svg { color: var(--sim-failure); }
1408
+
1409
+ .sim-settings-error mark {
1410
+ background: none;
1411
+ color: inherit;
1412
+ font-family: var(--sim-mono);
1413
+ font-size: 12px;
1414
+ white-space: pre-wrap;
1415
+ overflow-wrap: anywhere;
1416
+ }
1417
+
1418
+ .sim-settings-warning {
1419
+ background: var(--sim-progress-soft);
1420
+ border-color: color-mix(in srgb, var(--sim-progress) 40%, transparent);
1421
+ }
1422
+
1423
+ .sim-settings-warning > .sim-svg { color: var(--sim-progress); }
1424
+
1425
+ .sim-feedback .sim-muted {
1426
+ font-size: 12px;
1427
+ }
1428
+
1429
+ /* Presets and saved settings */
1430
+
1431
+ .sim-library h4 {
1432
+ margin: 0 0 6px;
1433
+ font-size: 11px;
1434
+ font-weight: 600;
1435
+ text-transform: uppercase;
1436
+ letter-spacing: 0.06em;
1437
+ color: var(--sim-muted);
1438
+ }
1439
+
1440
+ .sim-library h4:not(:first-child) {
1441
+ margin-top: 16px;
1442
+ }
1443
+
1444
+ .sim-entries {
1445
+ list-style: none;
1446
+ margin: 0;
1447
+ padding: 0;
1448
+ display: flex;
1449
+ flex-direction: column;
1450
+ gap: 2px;
1451
+ }
1452
+
1453
+ .sim-entries li.sim-entry {
1454
+ list-style: none;
1455
+ display: flex;
1456
+ align-items: center;
1457
+ gap: 10px;
1458
+ padding: 7px 8px 7px 10px;
1459
+ margin: 0;
1460
+ border-radius: 7px;
1461
+ border: 1px solid transparent;
1462
+ transition: background-color 0.1s;
1463
+ }
1464
+
1465
+ .sim-entries li.sim-entry:hover {
1466
+ background: var(--sim-surface-2);
1467
+ }
1468
+
1469
+ .sim-entries li.sim-entry-current {
1470
+ background: var(--sim-accent-soft);
1471
+ border-color: color-mix(in srgb, var(--sim-accent) 30%, transparent);
1472
+ }
1473
+
1474
+ .sim-entry-text {
1475
+ display: flex;
1476
+ flex-direction: column;
1477
+ gap: 1px;
1478
+ min-width: 0;
522
1479
  flex: 1;
523
1480
  }
524
1481
 
525
1482
  .sim-entry-text .sim-muted {
526
1483
  font-family: var(--sim-mono);
527
- font-size: 0.75rem;
1484
+ font-size: 11.5px;
528
1485
  overflow: hidden;
529
1486
  text-overflow: ellipsis;
530
1487
  white-space: nowrap;
531
1488
  }
532
1489
 
533
1490
  .sim-entry-name {
1491
+ display: flex;
1492
+ align-items: center;
1493
+ gap: 6px;
1494
+ font-weight: 500;
1495
+ font-size: 13px;
1496
+ }
1497
+
1498
+ .sim-entry-badge {
1499
+ font-size: 10.5px;
534
1500
  font-weight: 600;
535
- font-size: 0.9rem;
1501
+ letter-spacing: 0.04em;
1502
+ text-transform: uppercase;
1503
+ color: var(--sim-accent);
536
1504
  }
537
1505
 
538
1506
  .sim-entry-actions {
539
1507
  display: flex;
540
- gap: 0.3rem;
1508
+ align-items: center;
1509
+ gap: 2px;
541
1510
  flex-shrink: 0;
542
1511
  }
543
1512
 
544
- .sim-entry-actions button {
545
- font-size: 0.78rem !important;
546
- --pico-form-element-spacing-vertical: 0.15rem;
547
- --pico-form-element-spacing-horizontal: 0.5rem;
1513
+ .sim-entry-actions .sim-ghost.sim-icon {
1514
+ opacity: 0.6;
1515
+ }
1516
+
1517
+ .sim-entry:hover .sim-entry-actions .sim-ghost.sim-icon {
1518
+ opacity: 1;
1519
+ }
1520
+
1521
+ .sim-library-empty {
1522
+ padding: 10px;
1523
+ border: 1px dashed var(--sim-border-strong);
1524
+ border-radius: 7px;
1525
+ font-size: 12.5px;
1526
+ color: var(--sim-muted);
548
1527
  }
549
1528
 
550
1529
  .sim-save {
551
1530
  display: flex;
552
- gap: 0.5rem;
553
- margin: 0.9rem 0 0;
1531
+ gap: 8px;
1532
+ margin: 14px 0 0;
554
1533
  }
555
1534
 
556
1535
  .sim-save input {
557
1536
  flex: 1;
558
1537
  }
559
1538
 
560
- .sim-notice mark {
561
- background: none;
562
- color: inherit;
563
- padding: 0;
1539
+ /* Notices */
1540
+
1541
+ .sim-banner {
1542
+ flex: none;
1543
+ display: flex;
1544
+ align-items: flex-start;
1545
+ gap: 10px;
1546
+ margin: var(--sim-gap) var(--sim-gap) 0;
1547
+ padding: 10px 12px;
1548
+ border-radius: var(--sim-radius);
1549
+ border: 1px solid color-mix(in srgb, var(--sim-accent) 35%, transparent);
1550
+ background: var(--sim-accent-soft);
1551
+ font-size: 13px;
564
1552
  }
565
1553
 
566
- .sim-choices button {
567
- font-size: 0.8rem !important;
1554
+ .sim-banner > .sim-svg {
1555
+ margin-top: 1px;
1556
+ color: var(--sim-accent);
568
1557
  }
569
1558
 
570
- .sim-left .state-inspector {
571
- width: 100%;
1559
+ .sim-banner.sim-error {
1560
+ border-color: color-mix(in srgb, var(--sim-failure) 40%, transparent);
1561
+ background: var(--sim-failure-soft);
572
1562
  }
573
1563
 
574
- .sim-choices button {
575
- max-width: 20rem;
576
- overflow: hidden;
577
- text-overflow: ellipsis;
578
- white-space: nowrap;
1564
+ .sim-banner.sim-error > .sim-svg {
1565
+ color: var(--sim-failure);
579
1566
  }
580
1567
 
581
- .sim-branch {
582
- font-weight: 600;
583
- font-size: 0.9rem;
1568
+ .sim-banner-body {
1569
+ flex: 1;
1570
+ min-width: 0;
1571
+ }
1572
+
1573
+ .sim-banner pre {
1574
+ margin-top: 4px;
1575
+ font-family: var(--sim-mono);
1576
+ font-size: 12px;
1577
+ white-space: pre-wrap;
1578
+ overflow-wrap: anywhere;
1579
+ color: var(--sim-text-2);
1580
+ }
1581
+
1582
+ .sim-toast {
1583
+ position: fixed;
1584
+ bottom: calc(var(--sim-statusbar-h) + 16px);
1585
+ left: 50%;
1586
+ transform: translateX(-50%);
1587
+ display: flex;
1588
+ align-items: center;
1589
+ gap: 8px;
1590
+ background: var(--sim-text);
1591
+ color: var(--sim-surface);
1592
+ padding: 8px 14px;
1593
+ border-radius: 8px;
1594
+ font-size: 13px;
1595
+ font-weight: 500;
1596
+ z-index: 100;
1597
+ box-shadow: var(--sim-shadow-lg);
1598
+ animation: sim-toast-in 0.18s ease-out;
1599
+ }
1600
+
1601
+ .sim-toast .sim-svg {
1602
+ color: var(--sim-success);
1603
+ }
1604
+
1605
+ @keyframes sim-toast-in {
1606
+ from { opacity: 0; transform: translate(-50%, 8px); }
1607
+ to { opacity: 1; transform: translate(-50%, 0); }
1608
+ }
1609
+
1610
+ /* Keyboard shortcuts */
1611
+
1612
+ .sim-shortcuts {
1613
+ position: absolute;
1614
+ top: calc(100% + 6px);
1615
+ right: 0;
1616
+ z-index: 40;
1617
+ width: 280px;
1618
+ padding: 10px 12px;
1619
+ background: var(--sim-surface);
1620
+ border: 1px solid var(--sim-border);
1621
+ border-radius: var(--sim-radius);
1622
+ box-shadow: var(--sim-shadow-lg);
1623
+ font-size: 13px;
1624
+ }
1625
+
1626
+ .sim-shortcuts h4 {
1627
+ font-size: 11px;
1628
+ text-transform: uppercase;
1629
+ letter-spacing: 0.06em;
1630
+ color: var(--sim-muted);
1631
+ margin-bottom: 8px;
1632
+ }
1633
+
1634
+ .sim-shortcuts dl {
1635
+ display: grid;
1636
+ grid-template-columns: auto 1fr;
1637
+ gap: 7px 12px;
1638
+ align-items: center;
1639
+ }
1640
+
1641
+ .sim-shortcuts dt {
1642
+ display: flex;
1643
+ gap: 3px;
1644
+ }
1645
+
1646
+ .sim-shortcuts dd {
1647
+ color: var(--sim-text-2);
1648
+ }
1649
+
1650
+ .sim-popover-anchor {
1651
+ position: relative;
1652
+ }
1653
+
1654
+ /* Status bar */
1655
+
1656
+ .sim-statusbar {
1657
+ flex: none;
1658
+ display: flex;
1659
+ align-items: center;
1660
+ gap: 16px;
1661
+ height: var(--sim-statusbar-h);
1662
+ padding: 0 12px;
1663
+ background: var(--sim-surface);
1664
+ border-top: 1px solid var(--sim-border);
1665
+ font-size: 11.5px;
1666
+ color: var(--sim-muted);
584
1667
  white-space: nowrap;
585
- font-variant-numeric: tabular-nums;
586
1668
  }
587
1669
 
588
- .sim-branch-label {
589
- max-width: 18rem;
1670
+ .sim-status-item {
1671
+ display: inline-flex;
1672
+ align-items: center;
1673
+ gap: 6px;
1674
+ min-width: 0;
1675
+ }
1676
+
1677
+ .sim-status-item .sim-svg {
1678
+ width: 13px;
1679
+ height: 13px;
1680
+ }
1681
+
1682
+ .sim-status-dot {
1683
+ width: 7px;
1684
+ height: 7px;
1685
+ border-radius: 50%;
1686
+ background: var(--sim-success);
1687
+ box-shadow: 0 0 0 3px var(--sim-success-soft);
1688
+ }
1689
+
1690
+ .sim-status-dot.sim-stale {
1691
+ background: var(--sim-failure);
1692
+ box-shadow: 0 0 0 3px var(--sim-failure-soft);
1693
+ }
1694
+
1695
+ .sim-status-mono {
1696
+ font-family: var(--sim-mono);
1697
+ font-size: 11px;
1698
+ }
1699
+
1700
+ .sim-app button.sim-status-model {
1701
+ display: inline-flex;
1702
+ align-items: center;
1703
+ gap: 6px;
1704
+ min-width: 0;
1705
+ flex: 1;
1706
+ height: 20px;
1707
+ padding: 0 6px;
1708
+ border-radius: 4px;
1709
+ overflow: hidden;
1710
+ color: var(--sim-muted);
1711
+ font-family: var(--sim-mono);
1712
+ font-size: 11px;
1713
+ }
1714
+
1715
+ .sim-app button.sim-status-model:hover {
1716
+ background: var(--sim-surface-3);
1717
+ color: var(--sim-text);
1718
+ }
1719
+
1720
+ .sim-status-model span {
590
1721
  overflow: hidden;
591
1722
  text-overflow: ellipsis;
592
- white-space: nowrap;
1723
+ }
1724
+
1725
+ .sim-status-keys {
1726
+ display: inline-flex;
1727
+ align-items: center;
1728
+ gap: 4px;
1729
+ }
1730
+
1731
+ .sim-status-keys kbd {
1732
+ font-size: 10px;
1733
+ }
1734
+
1735
+ @media (max-width: 760px) {
1736
+ .sim-topbar { gap: 8px; padding: 0 10px; }
1737
+ .sim-brand-name, .sim-brand-sep, .sim-brand h1, .sim-tab-label, .sim-share-label { display: none; }
1738
+ .sim-topbar .sim-spacer { display: none; }
1739
+ .sim-project { flex: 1; min-width: 0; }
1740
+ .sim-app .sim-project select { min-width: 0; max-width: none; width: 100%; }
1741
+ .sim-app button.sim-tab { padding: 0 9px; }
1742
+ .sim-topbar-actions { gap: 2px; }
1743
+ .sim-status-keys, .sim-status-hide-sm { display: none; }
1744
+ .sim-transport-row { gap: 8px; }
1745
+ .sim-transport-row .sim-divider { display: none; }
1746
+ .sim-group { flex-wrap: wrap; }
1747
+ .sim-branch-label { max-width: 10rem; }
1748
+ .algorithm-header { flex-wrap: wrap; }
1749
+ .algorithm-agents { justify-content: flex-start; }
1750
+ .sim-panel-sub { display: none; }
1751
+ }
1752
+
1753
+ /* The model view replaces the shell, and scrolls */
1754
+
1755
+ .sim-model-page {
1756
+ flex: 1;
1757
+ min-height: 0;
1758
+ overflow: auto;
1759
+ padding: var(--sim-gap);
1760
+ }
1761
+
1762
+ /* Narrow windows: the page scrolls, the configuration first, then the panels shown */
1763
+
1764
+ @media (max-width: 900px) {
1765
+ .sim-app { height: auto; min-height: 100vh; overflow: visible; }
1766
+ .sim-shell { flex-direction: column; }
1767
+ .sim-activity { flex-direction: row; width: auto; padding: var(--sim-gap) var(--sim-gap) 0; justify-content: flex-start; }
1768
+ .sim-activity-sep { width: 1px; height: 22px; margin: 0 4px; }
1769
+ .sim-activity .sim-spacer { display: none; }
1770
+ .sim-app button.sim-activity-btn.sim-active::before { display: none; }
1771
+ .sim-transport-bar { padding: var(--sim-gap) var(--sim-gap) 0; }
1772
+ .sim-workbench { flex-direction: column; gap: var(--sim-gap); padding: var(--sim-gap); }
1773
+ .sim-workbench > .sim-splitter { display: none; }
1774
+ .sim-sidebar { flex-basis: auto !important; min-width: 0; }
1775
+ .sim-center { min-width: 0; }
1776
+ .sim-center { order: -1; flex: none; }
1777
+ .sim-center > .sim-stage-panel { flex: none; height: 380px; }
1778
+ .sim-center > .sim-graph-panel { flex: none; height: 80vh; }
1779
+ .sim-center > .sim-splitter, .sim-dock > .sim-splitter { display: none; }
1780
+ .sim-dock-bottom { flex: none !important; flex-direction: column; margin-top: var(--sim-gap); }
1781
+ .sim-slot { flex: none !important; max-height: 75vh; }
1782
+ .sim-model-page { overflow: visible; }
593
1783
  }