@typeonce/effect-machine-devtools 0.23.0 → 0.25.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 (80) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +14 -8
  3. package/dist/DevServer.d.ts +2 -1
  4. package/dist/DevServer.d.ts.map +1 -1
  5. package/dist/DevServer.js.map +1 -1
  6. package/dist/DevToolsProtocol.d.ts +167 -17
  7. package/dist/DevToolsProtocol.d.ts.map +1 -1
  8. package/dist/DevToolsProtocol.js +1 -1
  9. package/dist/MachineDocument.d.ts +98 -2
  10. package/dist/MachineDocument.d.ts.map +1 -1
  11. package/dist/MachineDocument.js +35 -1
  12. package/dist/MachineDocument.js.map +1 -1
  13. package/dist/MachineRegistry.d.ts +56 -6
  14. package/dist/MachineRegistry.d.ts.map +1 -1
  15. package/dist/MachineWalkthrough.d.ts +171 -0
  16. package/dist/MachineWalkthrough.d.ts.map +1 -0
  17. package/dist/MachineWalkthrough.js +98 -0
  18. package/dist/MachineWalkthrough.js.map +1 -0
  19. package/dist/client/assets/index-BTOAhezX.js +37 -0
  20. package/dist/client/assets/index-Cg7xzSkz.css +1 -0
  21. package/dist/client/index.html +4 -4
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/internal/devServer.d.ts +2 -1
  27. package/dist/internal/devServer.d.ts.map +1 -1
  28. package/dist/internal/devServer.js +4 -3
  29. package/dist/internal/devServer.js.map +1 -1
  30. package/dist/internal/evaluationWorker.d.ts.map +1 -1
  31. package/dist/internal/evaluationWorker.js +28 -9
  32. package/dist/internal/evaluationWorker.js.map +1 -1
  33. package/dist/internal/machineDocument.d.ts.map +1 -1
  34. package/dist/internal/machineDocument.js +65 -2
  35. package/dist/internal/machineDocument.js.map +1 -1
  36. package/dist/internal/machineWalkthrough.d.ts +26 -0
  37. package/dist/internal/machineWalkthrough.d.ts.map +1 -0
  38. package/dist/internal/machineWalkthrough.js +256 -0
  39. package/dist/internal/machineWalkthrough.js.map +1 -0
  40. package/dist/internal/projectInspector.d.ts.map +1 -1
  41. package/dist/internal/projectInspector.js +15 -9
  42. package/dist/internal/projectInspector.js.map +1 -1
  43. package/index.html +2 -2
  44. package/package.json +4 -3
  45. package/src/DevServer.ts +6 -2
  46. package/src/DevToolsProtocol.ts +1 -1
  47. package/src/MachineDocument.ts +56 -1
  48. package/src/MachineWalkthrough.ts +199 -0
  49. package/src/index.ts +2 -2
  50. package/src/internal/browser/chart-layout.ts +433 -0
  51. package/src/internal/browser/chart-model.ts +234 -0
  52. package/src/internal/browser/chart-renderer.ts +661 -0
  53. package/src/internal/browser/example-machine.ts +15 -6
  54. package/src/internal/browser/input-form.ts +252 -0
  55. package/src/internal/browser/invoke-outcomes-example.ts +231 -0
  56. package/src/internal/browser/parallel-completion-example.ts +199 -0
  57. package/src/internal/browser/planner-example.ts +145 -0
  58. package/src/internal/browser/protocol-events-example.ts +200 -0
  59. package/src/internal/browser/styles.css +959 -185
  60. package/src/internal/browser/transition-semantics-example.ts +236 -0
  61. package/src/internal/browser/visualizer-app.ts +818 -389
  62. package/src/internal/browser/visualizer-model.ts +104 -0
  63. package/src/internal/browser/visualizer.ts +1 -1
  64. package/src/internal/devServer.ts +9 -4
  65. package/src/internal/evaluationWorker.ts +28 -10
  66. package/src/internal/machineDocument.ts +77 -2
  67. package/src/internal/machineWalkthrough.ts +355 -0
  68. package/src/internal/projectInspector.ts +29 -14
  69. package/dist/MachineSimulator.d.ts +0 -169
  70. package/dist/MachineSimulator.d.ts.map +0 -1
  71. package/dist/MachineSimulator.js +0 -98
  72. package/dist/MachineSimulator.js.map +0 -1
  73. package/dist/client/assets/index-BGOhE3Ng.css +0 -1
  74. package/dist/client/assets/index-DiqGhsGR.js +0 -14
  75. package/dist/internal/machineSimulator.d.ts +0 -5
  76. package/dist/internal/machineSimulator.d.ts.map +0 -1
  77. package/dist/internal/machineSimulator.js +0 -156
  78. package/dist/internal/machineSimulator.js.map +0 -1
  79. package/src/MachineSimulator.ts +0 -154
  80. package/src/internal/machineSimulator.ts +0 -199
@@ -23,7 +23,7 @@ html,
23
23
  body,
24
24
  #app {
25
25
  min-width: 320px;
26
- min-height: 100%;
26
+ height: 100%;
27
27
  margin: 0;
28
28
  }
29
29
 
@@ -32,27 +32,40 @@ body {
32
32
  }
33
33
 
34
34
  .devtools-shell {
35
- display: grid;
36
- min-height: 100vh;
37
- grid-template-columns: 220px minmax(0, 1fr);
35
+ display: flex;
36
+ width: 100vw;
37
+ height: 100vh;
38
+ flex-direction: column;
39
+ overflow: hidden;
38
40
  }
39
41
 
40
42
  .machine-index {
43
+ display: flex;
44
+ width: 100%;
41
45
  min-width: 0;
42
- height: 100vh;
43
- padding: 8px 0;
44
- border-right: 1px solid var(--line);
46
+ min-height: 48px;
47
+ flex: 0 0 auto;
48
+ padding: 0;
49
+ border-bottom: 1px solid var(--line);
45
50
  background: #0d0f12;
46
- overflow: auto;
51
+ overflow-x: auto;
52
+ overflow-y: hidden;
53
+ scrollbar-width: thin;
47
54
  }
48
55
 
49
56
  .machine-row {
50
- display: grid;
51
- width: 100%;
52
- grid-template-columns: 8px minmax(0, 1fr);
53
- gap: 3px 8px;
54
- padding: 10px 12px;
57
+ position: relative;
58
+ display: flex;
59
+ width: auto;
60
+ max-width: 280px;
61
+ min-width: 148px;
62
+ min-height: 48px;
63
+ flex: 0 0 auto;
64
+ align-items: center;
65
+ gap: 8px;
66
+ padding: 0 16px;
55
67
  border: 0;
68
+ border-right: 1px solid var(--line-soft);
56
69
  color: #c9cdd2;
57
70
  background: transparent;
58
71
  text-align: left;
@@ -69,14 +82,23 @@ body {
69
82
 
70
83
  .machine-row.is-selected {
71
84
  color: #fff;
72
- background: rgb(75 125 255 / 18%);
85
+ background: rgb(75 125 255 / 12%);
86
+ }
87
+
88
+ .machine-row.is-selected::after {
89
+ position: absolute;
90
+ right: 0;
91
+ bottom: 0;
92
+ left: 0;
93
+ height: 2px;
94
+ background: var(--accent);
95
+ content: "";
73
96
  }
74
97
 
75
98
  .machine-row-status {
76
99
  width: 6px;
77
100
  height: 6px;
78
- align-self: center;
79
- grid-row: 1;
101
+ flex: 0 0 auto;
80
102
  border-radius: 50%;
81
103
  background: #646b75;
82
104
  }
@@ -102,24 +124,24 @@ body {
102
124
  }
103
125
 
104
126
  .machine-row-label {
105
- grid-column: 2;
106
127
  font: 600 12px/1.3 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
107
128
  }
108
129
 
109
130
  .machine-row-file {
110
- grid-column: 2;
111
- color: #727983;
112
- font: 10px/1.3 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
131
+ display: none;
113
132
  }
114
133
 
115
134
  .machine-index-empty {
116
- padding: 12px;
135
+ padding: 16px;
117
136
  color: #646b75;
118
137
  font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
119
138
  }
120
139
 
121
140
  .machine-view {
122
141
  min-width: 0;
142
+ min-height: 0;
143
+ flex: 1;
144
+ overflow: hidden;
123
145
  }
124
146
 
125
147
  .registry-empty,
@@ -148,21 +170,22 @@ button {
148
170
 
149
171
  .app-shell,
150
172
  .workspace {
151
- min-height: 100vh;
173
+ width: 100%;
174
+ height: 100%;
175
+ min-height: 0;
152
176
  }
153
177
 
154
178
  .workspace {
155
- display: grid;
156
- height: 100vh;
157
- grid-template-columns: minmax(420px, 1fr) minmax(380px, 46%);
179
+ position: relative;
158
180
  }
159
181
 
160
- .tree-panel {
182
+ .chart-panel {
183
+ position: relative;
161
184
  display: flex;
185
+ width: 100%;
162
186
  min-width: 0;
163
- height: 100vh;
187
+ height: 100%;
164
188
  flex-direction: column;
165
- border-right: 1px solid var(--line);
166
189
  overflow: hidden;
167
190
  }
168
191
 
@@ -207,6 +230,7 @@ button {
207
230
  }
208
231
 
209
232
  .toolbar-actions,
233
+ .zoom-controls,
210
234
  .runtime-summary {
211
235
  display: flex;
212
236
  align-items: center;
@@ -216,6 +240,35 @@ button {
216
240
  gap: 2px;
217
241
  }
218
242
 
243
+ .zoom-controls {
244
+ position: absolute;
245
+ z-index: 5;
246
+ bottom: 14px;
247
+ left: 14px;
248
+ flex: 0 0 auto;
249
+ gap: 1px;
250
+ padding: 2px;
251
+ border: 1px solid var(--line-soft);
252
+ border-radius: 4px;
253
+ background: rgb(13 15 18 / 94%);
254
+ box-shadow: 0 8px 28px rgb(0 0 0 / 32%);
255
+ }
256
+
257
+ .chart-panel.has-walkthrough .zoom-controls {
258
+ bottom: 88px;
259
+ }
260
+
261
+ .zoom-button {
262
+ min-width: 28px;
263
+ padding-inline: 7px;
264
+ }
265
+
266
+ .zoom-value {
267
+ min-width: 46px;
268
+ color: #aeb4bd;
269
+ font: 10px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
270
+ }
271
+
219
272
  .runtime-summary {
220
273
  gap: 7px;
221
274
  color: #7f8690;
@@ -255,170 +308,483 @@ button {
255
308
  cursor: default;
256
309
  }
257
310
 
258
- .topology-tree {
311
+ .topology-chart {
312
+ display: flex;
259
313
  flex: 1;
260
314
  min-height: 0;
261
- padding: 23px 18px 34px;
262
- overflow: auto;
315
+ flex-direction: column;
263
316
  font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
264
317
  }
265
318
 
266
- .machine-id {
267
- margin: 0 8px 16px;
268
- color: #fff;
269
- font-weight: 700;
319
+ .topology-empty {
320
+ display: grid;
321
+ max-width: 420px;
322
+ gap: 7px;
323
+ margin: 26px 8px;
324
+ color: #7f8690;
325
+ font: 12px/1.6 Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
270
326
  }
271
327
 
272
- .enabled-events {
273
- display: flex;
274
- min-height: 32px;
275
- flex-wrap: wrap;
276
- align-items: center;
277
- gap: 6px;
278
- margin: 0 8px 14px;
279
- padding-bottom: 13px;
280
- border-bottom: 1px solid var(--line-soft);
328
+ .topology-empty strong {
329
+ color: #d4d7dc;
330
+ font: 600 13px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
281
331
  }
282
332
 
283
- .enabled-events-label,
284
- .enabled-events-empty {
285
- color: #6f7680;
286
- font-size: 10px;
333
+ .chart-host,
334
+ .chart-viewport {
335
+ width: 100%;
336
+ height: 100%;
287
337
  }
288
338
 
289
- .enabled-events-label {
290
- margin-right: 3px;
291
- text-transform: uppercase;
339
+ .chart-host {
340
+ flex: 1;
341
+ min-height: 0;
342
+ position: relative;
292
343
  }
293
344
 
294
- .simulation-feedback {
295
- margin: -5px 8px 14px;
296
- color: #7f99c4;
297
- font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
345
+ .chart-viewport {
346
+ overflow: auto;
347
+ overscroll-behavior: contain;
348
+ cursor: grab;
349
+ touch-action: pan-x pan-y;
298
350
  }
299
351
 
300
- .simulation-feedback[data-status="indeterminate"] {
301
- color: #d9ae7e;
352
+ .chart-viewport.is-panning,
353
+ .chart-viewport.is-panning .chart-state,
354
+ .chart-viewport.is-panning .chart-edge-hit,
355
+ .chart-viewport.is-panning .chart-edge-label {
356
+ cursor: grabbing;
357
+ user-select: none;
302
358
  }
303
359
 
304
- .simulation-feedback[data-status="blocked"] {
305
- color: #d58d89;
360
+ .chart-stage {
361
+ position: relative;
362
+ min-width: 100%;
363
+ min-height: 100%;
306
364
  }
307
365
 
308
- .enabled-events[hidden],
309
- .simulation-feedback[hidden] {
310
- display: none;
366
+ .chart-canvas {
367
+ position: absolute;
368
+ top: 0;
369
+ left: 0;
370
+ transform-origin: top left;
311
371
  }
312
372
 
313
- .event-button {
314
- padding: 4px 7px;
315
- border: 0;
316
- border-radius: 3px;
317
- color: #aeb5bf;
318
- background: #1b1f25;
319
- font: 11px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
320
- cursor: pointer;
373
+ .chart-regions,
374
+ .chart-edges,
375
+ .chart-nodes,
376
+ .chart-labels {
377
+ position: absolute;
378
+ inset: 0;
321
379
  }
322
380
 
323
- .event-button:hover,
324
- .event-button:focus-visible,
325
- .event-button.is-selected {
326
- color: #d9e6ff;
327
- background: rgb(75 125 255 / 22%);
328
- outline: none;
381
+ .chart-regions {
382
+ z-index: 0;
383
+ pointer-events: none;
329
384
  }
330
385
 
331
- .topology-node {
332
- background: transparent;
386
+ .chart-edges {
387
+ z-index: 1;
388
+ overflow: visible;
389
+ pointer-events: none;
333
390
  }
334
391
 
335
- .topology-empty {
336
- display: grid;
337
- max-width: 420px;
338
- gap: 7px;
339
- margin: 26px 8px;
340
- color: #7f8690;
341
- font: 12px/1.6 Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
392
+ .chart-nodes {
393
+ z-index: 2;
394
+ pointer-events: none;
342
395
  }
343
396
 
344
- .topology-empty strong {
345
- color: #d4d7dc;
346
- font: 600 13px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
397
+ .chart-labels {
398
+ z-index: 3;
399
+ pointer-events: none;
347
400
  }
348
401
 
349
- .topology-node.is-selected {
350
- background: var(--accent-bg);
402
+ .chart-compound {
403
+ position: absolute;
404
+ border: 1px solid #272c33;
405
+ border-radius: 5px;
406
+ background: rgb(18 21 25 / 72%);
351
407
  }
352
408
 
353
- .state-row {
354
- display: grid;
355
- width: 100%;
356
- min-height: 38px;
357
- grid-template-columns: 14px 10px minmax(90px, auto) 1fr;
358
- align-items: center;
359
- gap: 8px;
360
- padding: 6px 8px 6px calc(8px + var(--depth) * 22px);
361
- border: 0;
362
- color: #d7d9dc;
363
- background: transparent;
409
+ .chart-compound-parallel {
410
+ border-color: #303845;
411
+ background: rgb(20 24 30 / 74%);
412
+ }
413
+
414
+ .chart-state {
415
+ position: absolute;
416
+ display: block;
417
+ padding: 16px;
418
+ border: 1px solid #30363f;
419
+ border-radius: 4px;
420
+ color: #d9dce1;
421
+ background: #14181d;
422
+ box-shadow: 0 4px 14px rgb(0 0 0 / 18%);
423
+ overflow: hidden;
364
424
  text-align: left;
365
425
  cursor: pointer;
426
+ pointer-events: auto;
366
427
  user-select: none;
367
428
  }
368
429
 
369
- .state-row:hover,
370
- .state-row:focus-visible {
371
- color: #fff;
372
- background: #1b1e23;
373
- outline: none;
430
+ .chart-state-compound,
431
+ .chart-state-parallel {
432
+ border-color: #353c47;
433
+ background: #171b21;
374
434
  }
375
435
 
376
- .state-row[aria-selected="true"] {
377
- color: #fff;
436
+ .chart-state-final {
437
+ border-color: #445066;
378
438
  }
379
439
 
380
- .topology-node.is-selected > .state-row {
381
- color: #fff;
440
+ .chart-state-history,
441
+ .chart-state-choice {
442
+ background: #18171d;
382
443
  }
383
444
 
384
- .topology-node.is-related-target > .state-row {
385
- background: rgb(75 125 255 / 9%);
445
+ .chart-state:not(:disabled):hover,
446
+ .chart-state:focus-visible {
447
+ border-color: #596475;
448
+ color: #fff;
449
+ outline: none;
386
450
  }
387
451
 
388
- .topology-node.is-related-source > .state-row {
389
- background: rgb(172 104 224 / 8%);
452
+ .chart-state-heading,
453
+ .chart-state-identity,
454
+ .chart-field-row,
455
+ .chart-activity-row {
456
+ display: flex;
457
+ min-width: 0;
458
+ align-items: center;
390
459
  }
391
460
 
392
- .topology-node.is-related-update > .state-row {
393
- background: rgb(240 163 91 / 8%);
461
+ .chart-state-heading {
462
+ justify-content: space-between;
463
+ gap: 12px;
394
464
  }
395
465
 
396
- .state-disclosure {
397
- color: #737a84;
398
- font-size: 11px;
466
+ .chart-state-identity {
467
+ gap: 8px;
399
468
  }
400
469
 
401
- .state-status {
470
+ .chart-state-status {
402
471
  width: 7px;
403
472
  height: 7px;
473
+ flex: 0 0 auto;
404
474
  border: 1px solid #686f78;
405
475
  border-radius: 50%;
406
476
  }
407
477
 
408
- .state-status.is-active {
478
+ .chart-state-status.is-active {
409
479
  border-color: var(--accent);
410
480
  background: var(--accent);
411
481
  box-shadow: 0 0 0 3px rgb(117 167 255 / 10%);
412
482
  }
413
483
 
414
- .state-label {
484
+ .chart-state-status.is-initial {
485
+ border-color: #d9a441;
486
+ background: #d9a441;
487
+ box-shadow: 0 0 0 3px rgb(217 164 65 / 12%);
488
+ }
489
+
490
+ .chart-state-status.is-active.is-initial {
491
+ box-shadow: 0 0 0 2px #14181d, 0 0 0 4px var(--accent);
492
+ }
493
+
494
+ .chart-state-name,
495
+ .chart-field-name,
496
+ .chart-activity-name {
415
497
  min-width: 0;
416
498
  overflow: hidden;
417
499
  text-overflow: ellipsis;
418
500
  white-space: nowrap;
419
501
  }
420
502
 
421
- .state-markers,
503
+ .chart-state-name {
504
+ font-size: 12px;
505
+ }
506
+
507
+ .chart-section-label,
508
+ .chart-field-type,
509
+ .chart-activity-kind,
510
+ .chart-more {
511
+ color: #7e8792;
512
+ font-size: 9px;
513
+ line-height: 1.3;
514
+ }
515
+
516
+ .chart-section-label,
517
+ .chart-activity-kind {
518
+ text-transform: uppercase;
519
+ }
520
+
521
+ .chart-state-section {
522
+ width: min(300px, 100%);
523
+ margin-top: 11px;
524
+ padding-top: 8px;
525
+ border-top: 1px solid #242a31;
526
+ }
527
+
528
+ .chart-section-label {
529
+ margin-bottom: 4px;
530
+ letter-spacing: 0.06em;
531
+ }
532
+
533
+ .chart-field-row,
534
+ .chart-activity-row {
535
+ display: grid;
536
+ min-height: 22px;
537
+ grid-template-columns: minmax(0, 1fr) auto;
538
+ gap: 10px;
539
+ }
540
+
541
+ .chart-activity-row {
542
+ grid-template-columns: auto minmax(0, 1fr);
543
+ }
544
+
545
+ .chart-field-name,
546
+ .chart-activity-name {
547
+ color: #c4c9d0;
548
+ font-size: 10px;
549
+ }
550
+
551
+ .chart-field-type,
552
+ .chart-activity-kind {
553
+ flex: 0 1 auto;
554
+ overflow: hidden;
555
+ text-overflow: ellipsis;
556
+ white-space: nowrap;
557
+ }
558
+
559
+ .chart-activity-kind {
560
+ min-width: max-content;
561
+ color: #77a990;
562
+ overflow: visible;
563
+ text-overflow: clip;
564
+ }
565
+
566
+ .chart-more {
567
+ min-height: 18px;
568
+ padding-top: 3px;
569
+ }
570
+
571
+ .chart-initial {
572
+ position: absolute;
573
+ border-radius: 50%;
574
+ background: #9ba3ae;
575
+ box-shadow: 0 0 0 3px rgb(155 163 174 / 8%);
576
+ pointer-events: none;
577
+ }
578
+
579
+ .chart-runtime-target {
580
+ position: absolute;
581
+ display: grid;
582
+ place-items: center;
583
+ border: 1px dashed #555d68;
584
+ border-radius: 3px;
585
+ color: #858d98;
586
+ background: #111419;
587
+ font: 9px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
588
+ letter-spacing: 0.04em;
589
+ text-transform: uppercase;
590
+ pointer-events: none;
591
+ user-select: none;
592
+ }
593
+
594
+ .chart-edge-line,
595
+ .chart-edge-hit {
596
+ fill: none;
597
+ }
598
+
599
+ .chart-edge-line {
600
+ stroke: #626b77;
601
+ stroke-width: 1.4;
602
+ vector-effect: non-scaling-stroke;
603
+ }
604
+
605
+ .chart-edge-initial .chart-edge-line {
606
+ stroke: #89929e;
607
+ }
608
+
609
+ .chart-edge-hit {
610
+ stroke: transparent;
611
+ stroke-width: 14;
612
+ cursor: pointer;
613
+ pointer-events: stroke;
614
+ }
615
+
616
+ #chart-arrow path {
617
+ fill: context-stroke;
618
+ }
619
+
620
+ .chart-edge-label {
621
+ position: absolute;
622
+ padding: 4px 7px;
623
+ border: 1px solid #2c333c;
624
+ border-radius: 3px;
625
+ color: #c0c7d0;
626
+ background: #101318;
627
+ font: 10px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
628
+ overflow: hidden;
629
+ text-overflow: ellipsis;
630
+ white-space: nowrap;
631
+ cursor: pointer;
632
+ pointer-events: auto;
633
+ user-select: none;
634
+ }
635
+
636
+ .chart-edge-label:not(:disabled):hover,
637
+ .chart-edge-label:focus-visible,
638
+ .chart-edge-group.is-hovered + .chart-edge-label {
639
+ border-color: #53657e;
640
+ color: #fff;
641
+ outline: none;
642
+ }
643
+
644
+ .chart-edge-label-always,
645
+ .chart-edge-label-choice,
646
+ .chart-edge-label-done {
647
+ color: #d4b4e9;
648
+ }
649
+
650
+ .chart-edge-group.is-hovered .chart-edge-line {
651
+ stroke: #7c9ed2;
652
+ stroke-width: 1.8;
653
+ }
654
+
655
+ .chart-edge-group.is-walkthrough-unavailable .chart-edge-line {
656
+ stroke: #6e675b;
657
+ stroke-dasharray: 5 5;
658
+ }
659
+
660
+ .chart-edge-group.chart-transition-runtime .chart-edge-line {
661
+ stroke-dasharray: 5 5;
662
+ }
663
+
664
+ .chart-edge-group.is-incoming .chart-edge-line {
665
+ stroke: #ed6a70;
666
+ stroke-width: 2;
667
+ }
668
+
669
+ .chart-edge-group.is-outgoing .chart-edge-line {
670
+ stroke: #6eb6dc;
671
+ stroke-width: 2;
672
+ }
673
+
674
+ .chart-edge-group.is-selected .chart-edge-line {
675
+ stroke: #8ab5ff;
676
+ stroke-width: 2.5;
677
+ }
678
+
679
+ .chart-edge-group.is-walkthrough-available .chart-edge-line {
680
+ stroke: #d5aa57;
681
+ stroke-width: 2;
682
+ }
683
+
684
+ .chart-edge-label.is-hovered {
685
+ border-color: #526783;
686
+ color: #dbe8ff;
687
+ }
688
+
689
+ .chart-edge-label.is-walkthrough-unavailable {
690
+ border-color: #4e4a43;
691
+ color: #8d8679;
692
+ background: #151412;
693
+ }
694
+
695
+ .chart-edge-label.is-incoming {
696
+ border-color: #a9484e;
697
+ color: #ffd0d2;
698
+ background: #251416;
699
+ }
700
+
701
+ .chart-edge-label.is-outgoing {
702
+ border-color: #47758d;
703
+ color: #c5e8f7;
704
+ background: #111c22;
705
+ }
706
+
707
+ .chart-edge-label.is-selected {
708
+ border-color: #719ce0;
709
+ color: #fff;
710
+ background: #18253a;
711
+ }
712
+
713
+ .chart-edge-label.is-walkthrough-available {
714
+ border-color: #8d713c;
715
+ color: #f0d39a;
716
+ background: #211b12;
717
+ }
718
+
719
+ .chart-state.is-selected,
720
+ .chart-compound.is-selected {
721
+ border-color: #5f88ca;
722
+ background: rgb(44 75 122 / 42%);
723
+ }
724
+
725
+ .chart-state.is-related-to,
726
+ .chart-compound.is-related-to,
727
+ .chart-state.is-hover-target,
728
+ .chart-compound.is-hover-target {
729
+ border-color: #4f829a;
730
+ background: rgb(48 112 140 / 24%);
731
+ }
732
+
733
+ .chart-state.is-related-from,
734
+ .chart-compound.is-related-from,
735
+ .chart-state.is-hover-source,
736
+ .chart-compound.is-hover-source {
737
+ border-color: #a94b52;
738
+ background: rgb(151 48 57 / 26%);
739
+ }
740
+
741
+ .chart-state.is-related-from.is-related-to,
742
+ .chart-compound.is-related-from.is-related-to {
743
+ border-color: #6e708f;
744
+ background: linear-gradient(135deg, rgb(151 48 57 / 28%) 0 50%, rgb(48 112 140 / 26%) 50% 100%);
745
+ }
746
+
747
+ .chart-viewport.is-simulating .chart-state:disabled,
748
+ .chart-viewport.is-simulating .chart-edge-label:disabled,
749
+ .chart-viewport.is-simulating .chart-edge-hit {
750
+ cursor: default;
751
+ }
752
+
753
+ .chart-viewport.is-simulating .chart-edge-label:disabled,
754
+ .chart-viewport.is-simulating .chart-edge-hit {
755
+ pointer-events: none;
756
+ }
757
+
758
+ .chart-viewport.is-simulating .chart-edge-label.is-walkthrough-available,
759
+ .chart-viewport.is-simulating .chart-edge-label.is-walkthrough-unavailable,
760
+ .chart-viewport.is-simulating .chart-edge-group.is-walkthrough-available .chart-edge-hit,
761
+ .chart-viewport.is-simulating .chart-edge-group.is-walkthrough-unavailable .chart-edge-hit {
762
+ cursor: pointer;
763
+ }
764
+
765
+ .chart-viewport.is-simulating .chart-edge-group.is-walkthrough-available .chart-edge-hit,
766
+ .chart-viewport.is-simulating .chart-edge-group.is-walkthrough-unavailable .chart-edge-hit {
767
+ pointer-events: stroke;
768
+ }
769
+
770
+ .chart-loading,
771
+ .chart-layout-error {
772
+ display: grid;
773
+ max-width: 440px;
774
+ gap: 7px;
775
+ margin: 28px;
776
+ color: #7f8690;
777
+ font: 11px/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
778
+ }
779
+
780
+ .chart-layout-error {
781
+ color: #d58d89;
782
+ }
783
+
784
+ .chart-layout-error strong {
785
+ color: #efb0ac;
786
+ }
787
+
422
788
  .inspector-eyebrow,
423
789
  .card-title,
424
790
  .card-flags,
@@ -428,10 +794,6 @@ button {
428
794
  gap: 6px;
429
795
  }
430
796
 
431
- .state-markers {
432
- justify-self: end;
433
- }
434
-
435
797
  .badge {
436
798
  display: inline-flex;
437
799
  align-items: center;
@@ -450,11 +812,6 @@ button {
450
812
  background: rgb(75 125 255 / 22%);
451
813
  }
452
814
 
453
- .badge-initial {
454
- color: #e9c89f;
455
- background: rgb(240 163 91 / 13%);
456
- }
457
-
458
815
  .badge-trigger {
459
816
  color: #b9d2ff;
460
817
  background: rgb(75 125 255 / 16%);
@@ -476,12 +833,52 @@ button {
476
833
  }
477
834
 
478
835
  .inspector {
836
+ position: absolute;
837
+ z-index: 10;
838
+ top: 14px;
839
+ right: 14px;
840
+ bottom: 14px;
841
+ width: min(460px, calc(100% - 28px));
479
842
  min-width: 0;
480
- height: 100vh;
481
- padding: 28px;
482
- overflow: auto;
483
- background: var(--surface);
484
- }
843
+ padding: 0;
844
+ border: 1px solid #333943;
845
+ border-radius: 6px;
846
+ overflow: hidden;
847
+ background: rgb(15 17 20 / 97%);
848
+ box-shadow: 0 18px 60px rgb(0 0 0 / 48%);
849
+ }
850
+
851
+ .inspector[hidden] {
852
+ display: none;
853
+ }
854
+
855
+ .inspector-close {
856
+ position: absolute;
857
+ z-index: 1;
858
+ top: 11px;
859
+ right: 12px;
860
+ padding: 6px 9px;
861
+ border: 0;
862
+ border-radius: 3px;
863
+ color: #8e949e;
864
+ background: transparent;
865
+ font-size: 11px;
866
+ cursor: pointer;
867
+ }
868
+
869
+ .inspector-content {
870
+ width: 100%;
871
+ height: 100%;
872
+ padding: 48px 24px 24px;
873
+ overflow: auto;
874
+ }
875
+
876
+ .inspector-close:hover,
877
+ .inspector-close:focus-visible {
878
+ color: #fff;
879
+ background: #20242a;
880
+ outline: none;
881
+ }
485
882
 
486
883
  .failure-shell {
487
884
  display: grid;
@@ -543,9 +940,29 @@ button {
543
940
  overflow-wrap: anywhere;
544
941
  }
545
942
 
943
+ .inspector-title-row,
944
+ .inspector-state-title {
945
+ display: flex;
946
+ min-width: 0;
947
+ align-items: center;
948
+ }
949
+
950
+ .inspector-title-row {
951
+ justify-content: space-between;
952
+ gap: 16px;
953
+ }
954
+
955
+ .inspector-state-title {
956
+ gap: 9px;
957
+ }
958
+
959
+ .inspector-title-row h2 {
960
+ min-width: 0;
961
+ margin: 0;
962
+ }
963
+
546
964
  .inspector-empty p,
547
- .section-empty,
548
- .empty-inline {
965
+ .section-empty {
549
966
  color: var(--muted);
550
967
  font-size: 12px;
551
968
  line-height: 1.6;
@@ -607,7 +1024,7 @@ button {
607
1024
 
608
1025
  .metadata {
609
1026
  display: grid;
610
- grid-template-columns: minmax(74px, auto) minmax(0, 1fr);
1027
+ grid-template-columns: minmax(74px, max-content) minmax(0, 1fr);
611
1028
  gap: 8px 16px;
612
1029
  margin: 20px 0 0;
613
1030
  font-size: 11px;
@@ -663,15 +1080,6 @@ button {
663
1080
  padding: 10px 12px;
664
1081
  }
665
1082
 
666
- .transition-source {
667
- display: flex;
668
- align-items: baseline;
669
- gap: 12px;
670
- padding: 0 12px 10px;
671
- color: #727983;
672
- font-size: 11px;
673
- }
674
-
675
1083
  .card-title {
676
1084
  min-width: 0;
677
1085
  }
@@ -709,6 +1117,7 @@ button {
709
1117
  }
710
1118
 
711
1119
  .branch-row .metadata,
1120
+ .transition-card .card-metadata,
712
1121
  .activity-card .metadata,
713
1122
  .incoming-card .metadata {
714
1123
  margin-top: 10px;
@@ -722,9 +1131,13 @@ button {
722
1131
  padding: 0 12px;
723
1132
  }
724
1133
 
1134
+ .transition-card .card-metadata {
1135
+ padding: 0 12px 10px;
1136
+ }
1137
+
725
1138
  .branch-updates {
726
1139
  display: grid;
727
- grid-template-columns: minmax(74px, auto) minmax(0, 1fr);
1140
+ grid-template-columns: minmax(74px, max-content) minmax(0, 1fr);
728
1141
  gap: 8px 16px;
729
1142
  margin-top: 9px;
730
1143
  font-size: 11px;
@@ -746,41 +1159,397 @@ button {
746
1159
  padding: 0 12px;
747
1160
  }
748
1161
 
749
- @media (max-width: 900px) {
750
- .devtools-shell {
751
- grid-template-columns: 1fr;
752
- }
1162
+ .walkthrough-dock {
1163
+ display: grid;
1164
+ min-height: 0;
1165
+ max-height: 76px;
1166
+ flex: 0 0 auto;
1167
+ grid-template-rows: auto auto;
1168
+ gap: 6px;
1169
+ padding: 8px 14px 10px;
1170
+ border-top: 1px solid var(--line);
1171
+ background: rgb(13 15 18 / 98%);
1172
+ box-shadow: 0 -12px 32px rgb(0 0 0 / 20%);
1173
+ font: 10px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1174
+ }
753
1175
 
754
- .machine-index {
755
- display: flex;
756
- height: auto;
757
- min-height: 54px;
758
- padding: 0;
759
- border-right: 0;
760
- border-bottom: 1px solid var(--line);
761
- overflow-x: auto;
762
- }
1176
+ .walkthrough-dock[hidden] {
1177
+ display: none;
1178
+ }
763
1179
 
764
- .machine-row {
765
- width: min(220px, 70vw);
766
- flex: 0 0 auto;
767
- }
1180
+ .walkthrough-heading,
1181
+ .walkthrough-identity,
1182
+ .walkthrough-timeline {
1183
+ display: flex;
1184
+ min-width: 0;
1185
+ align-items: center;
1186
+ }
768
1187
 
769
- .workspace {
770
- height: auto;
771
- grid-template-columns: 1fr;
772
- }
1188
+ .walkthrough-heading {
1189
+ justify-content: space-between;
1190
+ gap: 12px;
1191
+ color: #d4d7dc;
1192
+ }
1193
+
1194
+ .walkthrough-identity {
1195
+ gap: 10px;
1196
+ }
1197
+
1198
+ .walkthrough-status,
1199
+ .walkthrough-hint {
1200
+ color: #777f8a;
1201
+ }
1202
+
1203
+ .walkthrough-hint {
1204
+ font-size: 9px;
1205
+ }
1206
+
1207
+ .walkthrough-timeline {
1208
+ gap: 5px;
1209
+ overflow-x: auto;
1210
+ scrollbar-width: thin;
1211
+ }
1212
+
1213
+ .walkthrough-step {
1214
+ flex: 0 0 auto;
1215
+ border: 1px solid var(--line-soft);
1216
+ border-radius: 3px;
1217
+ color: #aeb4bd;
1218
+ background: #14171b;
1219
+ cursor: pointer;
1220
+ }
1221
+
1222
+ .walkthrough-step {
1223
+ padding: 5px 8px;
1224
+ white-space: nowrap;
1225
+ }
1226
+
1227
+ .walkthrough-step:hover,
1228
+ .walkthrough-step:focus-visible {
1229
+ border-color: #53657e;
1230
+ color: #fff;
1231
+ outline: none;
1232
+ }
1233
+
1234
+ .walkthrough-step.is-current {
1235
+ border-color: #5f88ca;
1236
+ color: #d8e6ff;
1237
+ background: rgb(44 75 122 / 38%);
1238
+ }
1239
+
1240
+ .transition-picker {
1241
+ position: fixed;
1242
+ z-index: 20;
1243
+ display: grid;
1244
+ width: min(380px, calc(100vw - 20px));
1245
+ max-height: min(420px, calc(100vh - 68px));
1246
+ grid-template-rows: auto minmax(0, 1fr);
1247
+ border: 1px solid #4e4535;
1248
+ border-radius: 5px;
1249
+ background: rgb(15 17 20 / 98%);
1250
+ box-shadow: 0 18px 60px rgb(0 0 0 / 52%);
1251
+ overflow: hidden;
1252
+ }
1253
+
1254
+ .transition-picker[hidden] {
1255
+ display: none;
1256
+ }
1257
+
1258
+ .transition-picker-header,
1259
+ .transition-picker-choice-main {
1260
+ display: flex;
1261
+ min-width: 0;
1262
+ align-items: center;
1263
+ }
1264
+
1265
+ .transition-picker-header {
1266
+ min-height: 38px;
1267
+ justify-content: space-between;
1268
+ gap: 10px;
1269
+ padding: 8px 10px 8px 12px;
1270
+ border-bottom: 1px solid var(--line-soft);
1271
+ }
1272
+
1273
+ .transition-picker-header strong {
1274
+ color: #d8dadd;
1275
+ font: 600 11px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1276
+ overflow: hidden;
1277
+ text-overflow: ellipsis;
1278
+ white-space: nowrap;
1279
+ }
1280
+
1281
+ .transition-picker-close {
1282
+ padding: 4px 6px;
1283
+ border: 0;
1284
+ border-radius: 3px;
1285
+ color: #7f8690;
1286
+ background: transparent;
1287
+ font-size: 10px;
1288
+ cursor: pointer;
1289
+ }
1290
+
1291
+ .transition-picker-close:hover,
1292
+ .transition-picker-close:focus-visible {
1293
+ color: #fff;
1294
+ background: #20242a;
1295
+ outline: none;
1296
+ }
1297
+
1298
+ .transition-picker-content {
1299
+ display: grid;
1300
+ gap: 5px;
1301
+ padding: 7px;
1302
+ overflow: auto;
1303
+ }
1304
+
1305
+ .transition-picker-choice {
1306
+ display: grid;
1307
+ min-width: 0;
1308
+ gap: 4px;
1309
+ padding: 8px 9px;
1310
+ border: 1px solid var(--line-soft);
1311
+ border-radius: 3px;
1312
+ color: #aeb4bd;
1313
+ background: #14171b;
1314
+ font: 10px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1315
+ text-align: left;
1316
+ cursor: pointer;
1317
+ }
1318
+
1319
+ .transition-picker-choice:hover,
1320
+ .transition-picker-choice:focus-visible {
1321
+ border-color: #8d713c;
1322
+ background: #1d1912;
1323
+ outline: none;
1324
+ }
1325
+
1326
+ .transition-picker-choice-main {
1327
+ gap: 7px;
1328
+ }
1329
+
1330
+ .transition-picker-choice-main strong,
1331
+ .transition-picker-choice-title,
1332
+ .transition-picker-choice-route,
1333
+ .transition-picker-choice-contract,
1334
+ .transition-picker-choice-decision,
1335
+ .transition-picker-choice-unavailable {
1336
+ min-width: 0;
1337
+ overflow: hidden;
1338
+ text-overflow: ellipsis;
1339
+ white-space: nowrap;
1340
+ }
1341
+
1342
+ .transition-picker-choice-main strong {
1343
+ color: #efd18f;
1344
+ }
1345
+
1346
+ .transition-picker-choice-title {
1347
+ color: #d9b8ef;
1348
+ }
1349
+
1350
+ .transition-picker-choice-route {
1351
+ color: #777f8a;
1352
+ }
1353
+
1354
+ .transition-picker-choice-contract {
1355
+ color: #9ebce9;
1356
+ }
1357
+
1358
+ .transition-picker-choice-decision {
1359
+ color: #b69ac9;
1360
+ }
1361
+
1362
+ .transition-picker-choice-unavailable {
1363
+ color: #a38c6f;
1364
+ }
1365
+
1366
+ .transition-picker-choice.is-unavailable {
1367
+ opacity: 0.68;
1368
+ cursor: default;
1369
+ }
1370
+
1371
+ .input-contract-fields,
1372
+ .input-contract-field,
1373
+ .input-contract-children,
1374
+ .input-contract-alternatives {
1375
+ display: grid;
1376
+ gap: 9px;
1377
+ }
1378
+
1379
+ .input-contract-fields {
1380
+ padding: 11px 12px;
1381
+ border: 1px solid var(--line-soft);
1382
+ background: var(--surface-raised);
1383
+ }
1384
+
1385
+ .input-contract-field + .input-contract-field {
1386
+ padding-top: 9px;
1387
+ border-top: 1px solid var(--line-soft);
1388
+ }
1389
+
1390
+ .input-contract-children,
1391
+ .input-contract-alternatives {
1392
+ margin-top: 2px;
1393
+ padding: 9px 0 0 12px;
1394
+ border-top: 1px solid var(--line-soft);
1395
+ border-left: 1px solid var(--line-soft);
1396
+ }
1397
+
1398
+ .input-contract .section-empty {
1399
+ margin: 0;
1400
+ }
1401
+
1402
+ .input-field-heading {
1403
+ display: flex;
1404
+ align-items: center;
1405
+ justify-content: space-between;
1406
+ gap: 12px;
1407
+ }
1408
+
1409
+ .input-field-identity,
1410
+ .input-constraints {
1411
+ display: flex;
1412
+ min-width: 0;
1413
+ flex-wrap: wrap;
1414
+ align-items: center;
1415
+ gap: 6px;
1416
+ }
1417
+
1418
+ .input-label,
1419
+ .input-required,
1420
+ .input-optional {
1421
+ font-size: 11px;
1422
+ }
1423
+
1424
+ .input-label {
1425
+ color: #cfd3d9;
1426
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1427
+ }
1428
+
1429
+ .input-field-type,
1430
+ .input-constraints span {
1431
+ color: #8294ad;
1432
+ font: 10px/1.3 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1433
+ }
1434
+
1435
+ .input-field-type {
1436
+ padding: 2px 5px;
1437
+ border-radius: 3px;
1438
+ background: rgb(75 125 255 / 12%);
1439
+ }
1440
+
1441
+ .input-constraints {
1442
+ margin-top: -1px;
1443
+ }
1444
+
1445
+ .input-constraints span + span::before {
1446
+ margin-right: 6px;
1447
+ color: #4f5762;
1448
+ content: "·";
1449
+ }
1450
+
1451
+ .input-required {
1452
+ color: #737b86;
1453
+ }
1454
+
1455
+ .input-optional {
1456
+ display: inline-flex;
1457
+ align-items: center;
1458
+ gap: 6px;
1459
+ color: #9199a4;
1460
+ }
1461
+
1462
+ .input-description,
1463
+ .input-unsupported {
1464
+ margin: 0;
1465
+ font-size: 11px;
1466
+ line-height: 1.55;
1467
+ }
1468
+
1469
+ .input-description {
1470
+ color: #737b86;
1471
+ }
1472
+
1473
+ .input-unsupported {
1474
+ color: #d7a5a2;
1475
+ }
1476
+
1477
+ .trace-topology {
1478
+ display: grid;
1479
+ gap: 10px;
1480
+ }
1481
+
1482
+ .trace-topology .section-heading {
1483
+ margin-bottom: 1px;
1484
+ }
1485
+
1486
+ .trace-path-group,
1487
+ .trace-values,
1488
+ .trace-transitions {
1489
+ display: grid;
1490
+ gap: 7px;
1491
+ }
1492
+
1493
+ .trace-path-group {
1494
+ grid-template-columns: 78px minmax(0, 1fr);
1495
+ align-items: start;
1496
+ }
1497
+
1498
+ .trace-paths {
1499
+ display: flex;
1500
+ min-width: 0;
1501
+ flex-wrap: wrap;
1502
+ gap: 4px 10px;
1503
+ }
1504
+
1505
+ .trace-label {
1506
+ color: #747c87;
1507
+ font-size: 10px;
1508
+ line-height: 1.5;
1509
+ text-transform: uppercase;
1510
+ }
1511
+
1512
+ .trace-card {
1513
+ padding-bottom: 12px;
1514
+ }
1515
+
1516
+ .trace-card > .trace-path-group,
1517
+ .trace-card > .trace-values,
1518
+ .trace-card > .trace-transitions {
1519
+ margin: 0 12px 10px;
1520
+ }
1521
+
1522
+ .trace-transition {
1523
+ display: flex;
1524
+ min-width: 0;
1525
+ flex-wrap: wrap;
1526
+ align-items: center;
1527
+ gap: 6px;
1528
+ }
773
1529
 
774
- .tree-panel {
775
- height: 58vh;
776
- min-height: 58vh;
777
- border-right: 0;
778
- border-bottom: 1px solid var(--line);
1530
+ .trace-transition + .trace-path-group {
1531
+ margin: 0 0 4px;
1532
+ }
1533
+
1534
+ .trace-results {
1535
+ padding-bottom: 24px;
1536
+ }
1537
+
1538
+ .trace-results > .trace-values {
1539
+ margin-top: 12px;
1540
+ }
1541
+
1542
+ @media (max-width: 900px) {
1543
+ .machine-row {
1544
+ max-width: 220px;
1545
+ min-width: 132px;
779
1546
  }
780
1547
 
781
1548
  .inspector {
782
- height: auto;
783
- min-height: 42vh;
1549
+ top: 8px;
1550
+ right: 8px;
1551
+ bottom: 8px;
1552
+ width: min(440px, calc(100% - 16px));
784
1553
  }
785
1554
  }
786
1555
 
@@ -799,19 +1568,24 @@ button {
799
1568
  padding-top: 8px;
800
1569
  }
801
1570
 
802
- .topology-tree,
803
- .inspector {
804
- padding-inline: 14px;
1571
+ .inspector-content {
1572
+ padding: 48px 14px 18px;
1573
+ }
1574
+
1575
+ .zoom-controls {
1576
+ bottom: 8px;
1577
+ left: 8px;
805
1578
  }
806
1579
 
807
- .state-markers .badge-count {
808
- display: none;
1580
+ .chart-panel.has-walkthrough .zoom-controls {
1581
+ bottom: 88px;
809
1582
  }
810
1583
  }
811
1584
 
812
1585
  @media (prefers-reduced-motion: no-preference) {
813
- .state-row,
1586
+ .chart-state,
1587
+ .chart-edge-label,
814
1588
  .toolbar-button {
815
- transition: color 120ms ease, background-color 120ms ease;
1589
+ transition: color 120ms ease, background-color 120ms ease, border-color 120ms ease;
816
1590
  }
817
1591
  }