jev-devtools 0.4.0 → 0.5.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 (37) hide show
  1. package/README.md +20 -13
  2. package/lib/flow/compare.d.ts +61 -0
  3. package/lib/flow/compare.js +336 -0
  4. package/lib/flow/index.d.ts +6 -1
  5. package/lib/flow/index.js +78 -16
  6. package/lib/flow/replay.d.ts +5 -0
  7. package/lib/flow/replay.js +55 -0
  8. package/lib/flow/runtime.d.ts +4 -0
  9. package/lib/flow/runtime.js +74 -0
  10. package/lib/flow/step-context.d.ts +7 -0
  11. package/lib/flow/step-context.js +3 -0
  12. package/lib/server/flows.d.ts +2 -2
  13. package/lib/server/flows.js +4 -6
  14. package/lib/server/index.js +16 -4
  15. package/lib/server/recorder.js +42 -6
  16. package/lib/src/ConnectedInspector.d.ts +1 -1
  17. package/lib/src/ConnectedInspector.js +14 -3
  18. package/lib/src/CopyFixture.d.ts +22 -0
  19. package/lib/src/CopyFixture.js +67 -0
  20. package/lib/src/FlowOverview.js +4 -2
  21. package/lib/src/JevDevtools.js +1 -1
  22. package/lib/src/JevDrawer.js +2 -4
  23. package/lib/src/display-redaction.d.ts +9 -0
  24. package/lib/src/display-redaction.js +116 -0
  25. package/lib/src/flow-fixture.d.ts +19 -0
  26. package/lib/src/flow-fixture.js +40 -0
  27. package/lib/src/flow-stream.js +9 -0
  28. package/lib/src/index.d.ts +5 -0
  29. package/lib/src/index.js +1 -0
  30. package/lib/src/inspector-styles.js +1 -1
  31. package/lib/src/inspector.css +207 -267
  32. package/package.json +2 -2
  33. package/skills/setup-jev-devtools/SKILL.md +8 -5
  34. package/skills/setup-jev-devtools/references/flows.md +15 -2
  35. package/skills/setup-jev-devtools/references/nextjs.md +1 -1
  36. package/skills/setup-jev-devtools/references/react-node.md +1 -2
  37. package/skills/setup-jev-devtools/references/verify.md +2 -4
@@ -1,5 +1,31 @@
1
+ /* Important declarations in the inner shadow context beat page-authored host
2
+ styles, including important ones. Keep the reset here instead of expanding
3
+ the all shorthand into hundreds of inline properties on the host element.
4
+ These qualified host selectors are inert in the public document stylesheet. */
5
+ :host(jev-devtools-root) {
6
+ all: initial !important;
7
+ direction: ltr !important;
8
+ unicode-bidi: isolate !important;
9
+ position: fixed !important;
10
+ inset: 0 !important;
11
+ pointer-events: none !important;
12
+ z-index: 2147483000 !important;
13
+ }
14
+
15
+ :host(jev-devtools-root)::before,
16
+ :host(jev-devtools-root)::after {
17
+ content: none !important;
18
+ display: none !important;
19
+ }
20
+
1
21
  .jev-devtools {
2
22
  all: initial;
23
+ /* all does not reset custom properties. Establish our own inherited defaults;
24
+ cameras and probability cards can still set local values below this root. */
25
+ --diagram-grid-opacity: 1;
26
+ --diagram-grid-weight: 1;
27
+ --lab-noul-probability: 1;
28
+ --flow-item-offset: 0px;
3
29
  display: block;
4
30
  direction: ltr;
5
31
  unicode-bidi: isolate;
@@ -256,47 +282,6 @@
256
282
  background-image: radial-gradient(#342337 0.6px, transparent 0.6px);
257
283
  background-size: 16px 16px;
258
284
  }
259
- .jev-devtools .request-flow {
260
- display: flex;
261
- align-items: center;
262
- gap: 40px;
263
- padding: 14px 0 20px;
264
- }
265
- .jev-devtools .state-node {
266
- position: relative;
267
- flex: 0 0 160px;
268
- border: 1px solid #e551ba;
269
- padding: 20px 15px;
270
- background: #1f1320;
271
- border-radius: 6px;
272
- }
273
- .jev-devtools .state-node h3 {
274
- margin-top: 12px;
275
- }
276
- .jev-devtools .state-node p {
277
- color: #b69db3;
278
- line-height: 1.5;
279
- }
280
- .jev-devtools .state-node code {
281
- font-size: 10px;
282
- }
283
- .jev-devtools .state-node:after {
284
- content: "";
285
- position: absolute;
286
- left: 100%;
287
- top: 50%;
288
- width: 20px;
289
- border-top: 1px solid #7f416d;
290
- }
291
- .jev-devtools .question-branches {
292
- border-left: 1px solid #7f416d;
293
- padding-left: 20px;
294
- display: grid;
295
- grid-template-columns: repeat(3, minmax(160px, 1fr));
296
- gap: 12px;
297
- flex: 1;
298
- position: relative;
299
- }
300
285
  .jev-devtools .question-node {
301
286
  position: relative;
302
287
  border: 1px solid #75516c;
@@ -305,6 +290,9 @@
305
290
  background: #110d14;
306
291
  min-width: 0;
307
292
  }
293
+ /* Retain the legacy question connectors and standalone suppression together.
294
+ Remove only after resolving the narrow-screen visual differences in
295
+ https://github.com/diegoag64/jev-devtools/issues/57. */
308
296
  .jev-devtools .question-node:before {
309
297
  content: "";
310
298
  position: absolute;
@@ -335,11 +323,6 @@
335
323
  border-radius: 3px;
336
324
  padding: 3px 5px;
337
325
  }
338
- .jev-devtools .instructions {
339
- font-size: 11px;
340
- color: #b8a6bc;
341
- line-height: 1.5;
342
- }
343
326
  .jev-devtools .answer-value {
344
327
  display: block;
345
328
  font-size: 20px;
@@ -475,44 +458,10 @@
475
458
  border-bottom: 1px solid #302634;
476
459
  padding: 14px;
477
460
  }
478
- .jev-devtools .flow-dot {
479
- display: none;
480
- }
481
- .jev-devtools .pending .flow-dot {
482
- display: block;
483
- position: absolute;
484
- right: -23px;
485
- top: calc(50% - 3px);
486
- width: 6px;
487
- height: 6px;
488
- background: #e551ba;
489
- border-radius: 50%;
490
- animation: jev-inspector-pulse 1s infinite;
491
- }
492
- @keyframes jev-inspector-pulse {
493
- 50% {
494
- opacity: 0.2;
495
- transform: scale(0.7);
496
- }
497
- }
498
- @media (prefers-reduced-motion: reduce) {
499
- .jev-devtools .pending .flow-dot {
500
- animation: none;
501
- }
502
- }
503
461
  @media (max-width: 1100px) {
504
- .jev-devtools .question-branches {
505
- grid-template-columns: 1fr;
506
- }
507
462
  .jev-devtools .question-branches .question-node:not(:first-child):before {
508
463
  display: block;
509
464
  }
510
- .jev-devtools .request-flow {
511
- align-items: flex-start;
512
- }
513
- .jev-devtools .state-node {
514
- margin-top: 45px;
515
- }
516
465
  .jev-devtools .metrics {
517
466
  gap: 12px;
518
467
  }
@@ -546,9 +495,6 @@
546
495
  min-width: 240px;
547
496
  padding: 8px 12px;
548
497
  }
549
- .jev-devtools .request-detail {
550
- min-height: 0;
551
- }
552
498
  .jev-devtools .detail-header {
553
499
  padding: 12px;
554
500
  }
@@ -563,19 +509,6 @@
563
509
  .jev-devtools .metrics {
564
510
  display: none;
565
511
  }
566
- .jev-devtools .state-node {
567
- flex-basis: 115px;
568
- padding: 12px;
569
- }
570
- .jev-devtools .request-flow {
571
- gap: 25px;
572
- }
573
- .jev-devtools .state-node:after {
574
- width: 12px;
575
- }
576
- .jev-devtools .question-branches {
577
- padding-left: 12px;
578
- }
579
512
  .jev-devtools .question-node:before {
580
513
  width: 13px;
581
514
  }
@@ -583,46 +516,6 @@
583
516
  padding: 12px;
584
517
  }
585
518
  }
586
-
587
- .jev-devtools .request-flow {
588
- flex-direction: column;
589
- align-items: stretch;
590
- gap: 24px;
591
- }
592
- .jev-devtools .state-node {
593
- flex: auto;
594
- width: fit-content;
595
- align-self: center;
596
- padding: 12px 24px;
597
- text-align: center;
598
- margin: 0;
599
- }
600
- .jev-devtools .state-node h3 {
601
- display: inline-block;
602
- margin: 0 12px;
603
- }
604
- .jev-devtools .state-node p {
605
- display: inline-block;
606
- margin: 0 12px 0 0;
607
- font-size: 11px;
608
- }
609
- .jev-devtools .state-node .eyebrow {
610
- display: none;
611
- }
612
- .jev-devtools .state-node:after {
613
- left: 50%;
614
- top: 100%;
615
- width: 0;
616
- height: 24px;
617
- border-top: 0;
618
- border-left: 1px solid #7f416d;
619
- }
620
- .jev-devtools .question-branches {
621
- border-left: 0;
622
- border-top: 1px solid #7f416d;
623
- padding: 20px 0 0;
624
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
625
- }
626
519
  .jev-devtools .question-node:before,
627
520
  .jev-devtools .question-branches .question-node:not(:first-child):before {
628
521
  display: block;
@@ -637,18 +530,7 @@
637
530
  .jev-devtools .standalone:before {
638
531
  display: none;
639
532
  }
640
- .jev-devtools .flow-caption {
641
- margin-top: 0;
642
- }
643
- .jev-devtools .pending .flow-dot {
644
- right: auto;
645
- left: calc(50% - 3px);
646
- top: calc(100% + 10px);
647
- }
648
533
  @media (max-width: 900px) {
649
- .jev-devtools .question-branches {
650
- grid-template-columns: 1fr;
651
- }
652
534
  .jev-devtools .question-node:before,
653
535
  .jev-devtools .question-branches .question-node:not(:first-child):before {
654
536
  height: 12px;
@@ -658,16 +540,6 @@
658
540
  height: 20px;
659
541
  top: -21px;
660
542
  }
661
- .jev-devtools .state-node {
662
- padding: 10px;
663
- }
664
- .jev-devtools .state-node p {
665
- display: block;
666
- margin: 6px 0;
667
- }
668
- .jev-devtools .state-node h3 {
669
- font-size: 12px;
670
- }
671
543
  }
672
544
 
673
545
  .jev-devtools.jev-drawer {
@@ -730,10 +602,6 @@
730
602
  gap: 9px;
731
603
  font-weight: 600;
732
604
  }
733
- .jev-devtools .jev-mark {
734
- color: #e551ba;
735
- font-size: 21px;
736
- }
737
605
  .jev-devtools .jev-drawer-header > div {
738
606
  display: flex;
739
607
  align-items: center;
@@ -1150,7 +1018,6 @@
1150
1018
  overflow: auto;
1151
1019
  overscroll-behavior: contain;
1152
1020
  min-height: 0;
1153
- flex: 1;
1154
1021
  }
1155
1022
  .jev-devtools .lab-choice-browser table {
1156
1023
  width: 100%;
@@ -1271,29 +1138,30 @@
1271
1138
  }
1272
1139
  }
1273
1140
 
1274
- /* Connected requests share one camera and one opt-in full request detail. */
1275
- .whole-flow {
1141
+ /* Connected requests share one camera and one opt-in full request detail.
1142
+ :where scopes these selectors without changing their existing specificity. */
1143
+ :where(.jev-devtools) .whole-flow {
1276
1144
  min-width: 0;
1277
1145
  overflow: hidden;
1278
1146
  }
1279
- .whole-flow > .detail-header,
1280
- .whole-flow > .lab-flow-toolbar {
1147
+ :where(.jev-devtools) .whole-flow > .detail-header,
1148
+ :where(.jev-devtools) .whole-flow > .lab-flow-toolbar {
1281
1149
  flex-shrink: 0;
1282
1150
  }
1283
- .flow-workspace {
1151
+ :where(.jev-devtools) .flow-workspace {
1284
1152
  display: flex;
1285
1153
  flex-direction: column;
1286
1154
  flex: 1;
1287
1155
  min-height: 0;
1288
1156
  overflow: hidden;
1289
1157
  }
1290
- .flow-details-panel {
1158
+ :where(.jev-devtools) .flow-details-panel {
1291
1159
  flex: none;
1292
1160
  min-width: 0;
1293
1161
  background: #130f17;
1294
1162
  border-top: 1px solid #342a38;
1295
1163
  }
1296
- .flow-details-bar {
1164
+ :where(.jev-devtools) .flow-details-bar {
1297
1165
  display: flex;
1298
1166
  align-items: center;
1299
1167
  gap: 12px;
@@ -1305,19 +1173,19 @@
1305
1173
  padding: 4px 8px;
1306
1174
  font-size: 11px;
1307
1175
  }
1308
- .flow-details-bar > span {
1176
+ :where(.jev-devtools) .flow-details-bar > span {
1309
1177
  color: #b5a6bc;
1310
1178
  font-size: 11px;
1311
1179
  overflow: hidden;
1312
1180
  white-space: nowrap;
1313
1181
  text-overflow: ellipsis;
1314
1182
  }
1315
- .flow-details-body {
1183
+ :where(.jev-devtools) .flow-details-body {
1316
1184
  overflow: auto;
1317
1185
  overscroll-behavior: contain;
1318
1186
  scrollbar-gutter: stable;
1319
1187
  }
1320
- .flow-details-resize {
1188
+ :where(.jev-devtools) .flow-details-resize {
1321
1189
  display: flex;
1322
1190
  align-items: center;
1323
1191
  justify-content: center;
@@ -1326,19 +1194,19 @@
1326
1194
  touch-action: none;
1327
1195
  user-select: none;
1328
1196
  }
1329
- .flow-details-resize span {
1197
+ :where(.jev-devtools) .flow-details-resize span {
1330
1198
  width: 40px;
1331
1199
  height: 2px;
1332
1200
  border-radius: 2px;
1333
1201
  background: #6c5874;
1334
1202
  }
1335
- .flow-details-resize:hover,
1336
- .flow-details-resize:focus-visible {
1203
+ :where(.jev-devtools) .flow-details-resize:hover,
1204
+ :where(.jev-devtools) .flow-details-resize:focus-visible {
1337
1205
  background: #392239;
1338
1206
  outline: 1px solid #e551ba;
1339
1207
  outline-offset: -1px;
1340
1208
  }
1341
- .flow-overview-viewport {
1209
+ :where(.jev-devtools) .flow-overview-viewport {
1342
1210
  position: relative;
1343
1211
  min-height: 0;
1344
1212
  flex: 1 1 0;
@@ -1352,23 +1220,22 @@
1352
1220
  );
1353
1221
  background-size: 20px 20px;
1354
1222
  }
1355
- .flow-overview-viewport[data-panning] {
1223
+ :where(.jev-devtools) .flow-overview-viewport[data-panning] {
1356
1224
  cursor: grabbing;
1357
1225
  }
1358
- .flow-overview-canvas {
1226
+ :where(.jev-devtools) .flow-overview-canvas {
1359
1227
  position: absolute;
1360
1228
  transform-origin: 0 0;
1361
1229
  }
1362
- .flow-connections {
1230
+ :where(.jev-devtools) .flow-connections {
1363
1231
  position: absolute;
1364
1232
  inset: 0;
1365
1233
  overflow: visible;
1366
1234
  color: #c0b8c4;
1367
1235
  pointer-events: none;
1368
1236
  }
1369
- .flow-step {
1237
+ :where(.jev-devtools) .flow-step {
1370
1238
  position: absolute;
1371
- width: 220px;
1372
1239
  min-height: 172px;
1373
1240
  overflow-wrap: anywhere;
1374
1241
  display: flex;
@@ -1381,15 +1248,15 @@
1381
1248
  background: #151017;
1382
1249
  color: inherit;
1383
1250
  }
1384
- .flow-step strong {
1251
+ :where(.jev-devtools) .flow-step strong {
1385
1252
  white-space: normal;
1386
1253
  width: 100%;
1387
1254
  }
1388
- .flow-step-description {
1255
+ :where(.jev-devtools) .flow-step-description {
1389
1256
  overflow-wrap: anywhere;
1390
1257
  font-size: 12px;
1391
1258
  }
1392
- .flow-step.flow-request {
1259
+ :where(.jev-devtools) .flow-step.flow-request {
1393
1260
  display: block;
1394
1261
  padding: 0;
1395
1262
  background: #0d0a0f;
@@ -1397,7 +1264,7 @@
1397
1264
  content-visibility: auto;
1398
1265
  contain-intrinsic-size: auto 640px;
1399
1266
  }
1400
- .flow-request-heading {
1267
+ :where(.jev-devtools) .flow-request-heading {
1401
1268
  width: 100%;
1402
1269
  min-height: 64px;
1403
1270
  gap: 20px;
@@ -1412,7 +1279,7 @@
1412
1279
  background: transparent;
1413
1280
  color: inherit;
1414
1281
  }
1415
- .flow-request-heading .eyebrow {
1282
+ :where(.jev-devtools) .flow-request-heading .eyebrow {
1416
1283
  display: block;
1417
1284
  margin-bottom: 4px;
1418
1285
  }
@@ -1433,64 +1300,64 @@
1433
1300
  .jev-devtools .lab-flow-embedded .lab-choice-browser {
1434
1301
  height: 520px;
1435
1302
  }
1436
- .flow-step.selected {
1303
+ :where(.jev-devtools) .flow-step.selected {
1437
1304
  outline: 2px solid #e551ba;
1438
1305
  outline-offset: 3px;
1439
1306
  }
1440
- .flow-step[data-status="completed"] {
1307
+ :where(.jev-devtools) .flow-step[data-status="completed"] {
1441
1308
  border-color: #e551ba;
1442
1309
  }
1443
- .flow-step[data-status="running"] {
1310
+ :where(.jev-devtools) .flow-step[data-status="running"] {
1444
1311
  border-color: #e551ba;
1445
1312
  background: #2b1728;
1446
1313
  }
1447
- .flow-step[data-status="untaken"],
1448
- .flow-step[data-status="blocked"] {
1314
+ :where(.jev-devtools) .flow-step[data-status="untaken"],
1315
+ :where(.jev-devtools) .flow-step[data-status="blocked"] {
1449
1316
  color: #948797;
1450
1317
  border-color: #403746;
1451
1318
  background: #151017;
1452
1319
  }
1453
- .flow-step[data-status="error"] {
1320
+ :where(.jev-devtools) .flow-step[data-status="error"] {
1454
1321
  border-color: #f17c78;
1455
1322
  }
1456
- .flow-step[data-status="cancelled"] {
1323
+ :where(.jev-devtools) .flow-step[data-status="cancelled"] {
1457
1324
  border-style: dashed;
1458
1325
  }
1459
- .flow-selection {
1326
+ :where(.jev-devtools) .flow-selection {
1460
1327
  padding: 12px 20px;
1461
1328
  border-top: 1px solid #342a38;
1462
1329
  }
1463
- .flow-selection p {
1330
+ :where(.jev-devtools) .flow-selection p {
1464
1331
  margin: 6px 0;
1465
1332
  overflow-wrap: anywhere;
1466
1333
  }
1467
- .flow-request-detail {
1334
+ :where(.jev-devtools) .flow-request-detail {
1468
1335
  min-height: 450px;
1469
1336
  border-top: 1px solid #534357;
1470
1337
  }
1471
- .flow-request-detail > .request-detail {
1338
+ :where(.jev-devtools) .flow-request-detail > .request-detail {
1472
1339
  min-height: 450px;
1473
1340
  }
1474
1341
 
1475
- .flow-card-heading,
1476
- .flow-card-footer,
1477
- .flow-join-summary,
1478
- .flow-lane {
1342
+ :where(.jev-devtools) .flow-card-heading,
1343
+ :where(.jev-devtools) .flow-card-footer,
1344
+ :where(.jev-devtools) .flow-join-summary,
1345
+ :where(.jev-devtools) .flow-lane {
1479
1346
  display: flex;
1480
1347
  align-items: center;
1481
1348
  justify-content: space-between;
1482
1349
  gap: 8px;
1483
1350
  width: 100%;
1484
1351
  }
1485
- .flow-card-heading {
1352
+ :where(.jev-devtools) .flow-card-heading {
1486
1353
  justify-content: flex-start;
1487
1354
  }
1488
- .flow-task .flow-kind-icon {
1355
+ :where(.jev-devtools) .flow-task .flow-kind-icon {
1489
1356
  border: 1px solid currentColor;
1490
1357
  border-radius: 6px;
1491
1358
  padding: 4px;
1492
1359
  }
1493
- .flow-task-preview {
1360
+ :where(.jev-devtools) .flow-task-preview {
1494
1361
  display: grid;
1495
1362
  gap: 8px;
1496
1363
  min-width: 0;
@@ -1502,39 +1369,39 @@
1502
1369
  border-radius: 4px;
1503
1370
  background: #100c13;
1504
1371
  }
1505
- .flow-task-preview small {
1506
- color: var(--muted);
1372
+ :where(.jev-devtools) .flow-task-preview small {
1373
+ color: #a89bac;
1507
1374
  font-size: 11px;
1508
1375
  }
1509
- .flow-task-details {
1376
+ :where(.jev-devtools) .flow-task-details {
1510
1377
  display: grid;
1511
1378
  gap: 12px;
1512
1379
  }
1513
- .flow-task-details details {
1380
+ :where(.jev-devtools) .flow-task-details details {
1514
1381
  min-width: 0;
1515
1382
  }
1516
- .flow-task-details summary {
1383
+ :where(.jev-devtools) .flow-task-details summary {
1517
1384
  cursor: pointer;
1518
1385
  margin-bottom: 8px;
1519
1386
  }
1520
- .flow-task-details .diagram-content {
1387
+ :where(.jev-devtools) .flow-task-details .diagram-content {
1521
1388
  max-height: 320px;
1522
1389
  overflow: auto;
1523
1390
  }
1524
- .flow-kind-icon {
1391
+ :where(.jev-devtools) .flow-kind-icon {
1525
1392
  width: 26px;
1526
1393
  height: 26px;
1527
1394
  color: #e551ba;
1528
1395
  flex-shrink: 0;
1529
1396
  }
1530
- .flow-kind-icon svg {
1397
+ :where(.jev-devtools) .flow-kind-icon svg {
1531
1398
  width: 100%;
1532
1399
  height: 100%;
1533
1400
  }
1534
- .flow-card-heading .eyebrow {
1401
+ :where(.jev-devtools) .flow-card-heading .eyebrow {
1535
1402
  font-size: 10px;
1536
1403
  }
1537
- .flow-status {
1404
+ :where(.jev-devtools) .flow-status {
1538
1405
  margin-left: auto;
1539
1406
  font-size: 10px;
1540
1407
  border-radius: 20px;
@@ -1542,81 +1409,81 @@
1542
1409
  background: #342031;
1543
1410
  color: #f0b7e0;
1544
1411
  }
1545
- .flow-step[data-status="untaken"] .flow-status {
1412
+ :where(.jev-devtools) .flow-step[data-status="untaken"] .flow-status {
1546
1413
  background: #241e28;
1547
1414
  color: #948797;
1548
1415
  }
1549
- .flow-step[data-status="untaken"] .flow-kind-icon {
1416
+ :where(.jev-devtools) .flow-step[data-status="untaken"] .flow-kind-icon {
1550
1417
  color: #948797;
1551
1418
  }
1552
- .flow-card-body > strong {
1419
+ :where(.jev-devtools) .flow-card-body > strong {
1553
1420
  white-space: normal;
1554
1421
  font-size: 18px;
1555
1422
  line-height: 1.25;
1556
1423
  overflow-wrap: anywhere;
1557
1424
  }
1558
- .flow-step-description {
1425
+ :where(.jev-devtools) .flow-step-description {
1559
1426
  line-height: 1.5;
1560
1427
  color: #b9aebf;
1561
1428
  white-space: pre-wrap;
1562
1429
  }
1563
- .flow-card-footer {
1430
+ :where(.jev-devtools) .flow-card-footer {
1564
1431
  margin-top: auto;
1565
1432
  padding-top: 10px;
1566
1433
  border-top: 1px solid #342a38;
1567
1434
  font-size: 10px;
1568
1435
  color: #a092a7;
1569
1436
  }
1570
- .flow-card-footer code {
1437
+ :where(.jev-devtools) .flow-card-footer code {
1571
1438
  max-width: 45%;
1572
1439
  white-space: normal;
1573
1440
  overflow-wrap: anywhere;
1574
1441
  }
1575
- .flow-card-footer small {
1442
+ :where(.jev-devtools) .flow-card-footer small {
1576
1443
  text-align: right;
1577
1444
  }
1578
- .flow-join-summary {
1445
+ :where(.jev-devtools) .flow-join-summary {
1579
1446
  margin-top: 4px;
1580
1447
  font-size: 11px;
1581
1448
  color: #c9b9cd;
1582
1449
  }
1583
- .flow-join-summary > span {
1450
+ :where(.jev-devtools) .flow-join-summary > span {
1584
1451
  color: #ef9ed9;
1585
1452
  font-variant-numeric: tabular-nums;
1586
1453
  }
1587
- .flow-lanes {
1454
+ :where(.jev-devtools) .flow-lanes {
1588
1455
  display: flex;
1589
1456
  flex-direction: column;
1590
1457
  gap: 4px;
1591
1458
  width: 100%;
1592
1459
  }
1593
- .flow-lane {
1460
+ :where(.jev-devtools) .flow-lane {
1594
1461
  border-radius: 5px;
1595
1462
  background: #211923;
1596
1463
  padding: 6px 8px;
1597
1464
  font-size: 11px;
1598
1465
  min-height: 28px;
1599
1466
  }
1600
- .flow-lane > span {
1467
+ :where(.jev-devtools) .flow-lane > span {
1601
1468
  min-width: 0;
1602
1469
  overflow-wrap: anywhere;
1603
1470
  }
1604
- .flow-lane > span > span {
1471
+ :where(.jev-devtools) .flow-lane > span > span {
1605
1472
  color: #ef9ed9;
1606
1473
  margin-right: 4px;
1607
1474
  }
1608
- .flow-lane small {
1475
+ :where(.jev-devtools) .flow-lane small {
1609
1476
  color: #b9aebf;
1610
1477
  }
1611
- .flow-lane-details {
1478
+ :where(.jev-devtools) .flow-lane-details {
1612
1479
  padding-left: 18px;
1613
1480
  font-size: 12px;
1614
1481
  }
1615
- .flow-request-heading > span:first-child {
1482
+ :where(.jev-devtools) .flow-request-heading > span:first-child {
1616
1483
  min-width: 0;
1617
1484
  max-width: 80%;
1618
1485
  }
1619
- .flow-request-description {
1486
+ :where(.jev-devtools) .flow-request-description {
1620
1487
  display: block;
1621
1488
  white-space: pre-wrap;
1622
1489
  font-size: 12px;
@@ -1776,7 +1643,7 @@
1776
1643
  opacity: calc(0.65 + 0.35 * var(--lab-noul-probability, 1));
1777
1644
  }
1778
1645
 
1779
- .flow-condition-rule {
1646
+ :where(.jev-devtools) .flow-condition-rule {
1780
1647
  display: block;
1781
1648
  padding: 10px 12px;
1782
1649
  border: 1px solid #49324b;
@@ -1784,13 +1651,13 @@
1784
1651
  background: #211723;
1785
1652
  width: 100%;
1786
1653
  }
1787
- .flow-condition-label {
1654
+ :where(.jev-devtools) .flow-condition-label {
1788
1655
  display: block;
1789
1656
  font-size: 10px;
1790
1657
  color: #ba9dbe;
1791
1658
  margin-bottom: 5px;
1792
1659
  }
1793
- .flow-condition-rule code {
1660
+ :where(.jev-devtools) .flow-condition-rule code {
1794
1661
  display: block;
1795
1662
  white-space: pre-wrap;
1796
1663
  overflow-wrap: anywhere;
@@ -1800,13 +1667,13 @@
1800
1667
  color: #f2d7eb;
1801
1668
  }
1802
1669
 
1803
- .flow-condition-incoming {
1670
+ :where(.jev-devtools) .flow-condition-incoming {
1804
1671
  display: block;
1805
1672
  padding-bottom: 10px;
1806
1673
  margin-bottom: 10px;
1807
1674
  border-bottom: 1px solid #49324b;
1808
1675
  }
1809
- .flow-condition-input {
1676
+ :where(.jev-devtools) .flow-condition-input {
1810
1677
  display: flex;
1811
1678
  justify-content: space-between;
1812
1679
  align-items: baseline;
@@ -1814,11 +1681,11 @@
1814
1681
  font-size: 12px;
1815
1682
  padding: 3px 0;
1816
1683
  }
1817
- .flow-condition-input > span {
1684
+ :where(.jev-devtools) .flow-condition-input > span {
1818
1685
  min-width: 0;
1819
1686
  overflow-wrap: anywhere;
1820
1687
  }
1821
- .flow-condition-input > b {
1688
+ :where(.jev-devtools) .flow-condition-input > b {
1822
1689
  font-size: 17px;
1823
1690
  font-weight: 600;
1824
1691
  color: #f2d7eb;
@@ -1826,24 +1693,24 @@
1826
1693
  white-space: normal;
1827
1694
  max-width: 65%;
1828
1695
  }
1829
- .flow-input-details {
1696
+ :where(.jev-devtools) .flow-input-details {
1830
1697
  font-size: 12px;
1831
1698
  }
1832
- .flow-input-details > div {
1699
+ :where(.jev-devtools) .flow-input-details > div {
1833
1700
  display: flex;
1834
1701
  gap: 16px;
1835
1702
  margin: 6px 0;
1836
1703
  }
1837
- .flow-input-details code {
1704
+ :where(.jev-devtools) .flow-input-details code {
1838
1705
  color: #a092a7;
1839
1706
  margin-left: 8px;
1840
1707
  }
1841
- .flow-input-details dd {
1708
+ :where(.jev-devtools) .flow-input-details dd {
1842
1709
  margin: 0;
1843
1710
  overflow-wrap: anywhere;
1844
1711
  }
1845
1712
 
1846
- .flow-overview-stack {
1713
+ :where(.jev-devtools) .flow-overview-stack {
1847
1714
  display: flex;
1848
1715
  flex-direction: column;
1849
1716
  flex: 1;
@@ -1851,13 +1718,13 @@
1851
1718
  min-width: 0;
1852
1719
  overflow: hidden;
1853
1720
  }
1854
- .flow-map-progress {
1721
+ :where(.jev-devtools) .flow-map-progress {
1855
1722
  display: grid;
1856
1723
  gap: 10px;
1857
1724
  font-size: 14px;
1858
1725
  line-height: 1.5;
1859
1726
  }
1860
- .flow-map-progress small {
1727
+ :where(.jev-devtools) .flow-map-progress small {
1861
1728
  color: #b5a6bc;
1862
1729
  }
1863
1730
 
@@ -1878,7 +1745,7 @@
1878
1745
  .jev-devtools .flow-card-body:hover {
1879
1746
  background: transparent;
1880
1747
  }
1881
- .flow-collection-controls {
1748
+ :where(.jev-devtools) .flow-collection-controls {
1882
1749
  display: flex;
1883
1750
  align-items: end;
1884
1751
  gap: 10px;
@@ -1886,7 +1753,7 @@
1886
1753
  margin-top: 4px;
1887
1754
  padding-top: 12px;
1888
1755
  }
1889
- .flow-collection-controls label {
1756
+ :where(.jev-devtools) .flow-collection-controls label {
1890
1757
  display: grid;
1891
1758
  gap: 6px;
1892
1759
  flex: 1;
@@ -1902,17 +1769,17 @@
1902
1769
  flex: none;
1903
1770
  color: #efb1df;
1904
1771
  }
1905
- .flow-collection-expansion {
1772
+ :where(.jev-devtools) .flow-collection-expansion {
1906
1773
  position: absolute;
1907
1774
  width: max-content;
1908
1775
  }
1909
- .flow-item-frame {
1776
+ :where(.jev-devtools) .flow-item-frame {
1910
1777
  border: 1px solid #64415d;
1911
1778
  border-radius: 12px;
1912
1779
  background: #100c13;
1913
1780
  overflow: hidden;
1914
1781
  }
1915
- .flow-collection-heading {
1782
+ :where(.jev-devtools) .flow-collection-heading {
1916
1783
  display: flex;
1917
1784
  align-items: center;
1918
1785
  justify-content: space-between;
@@ -1921,43 +1788,43 @@
1921
1788
  border-bottom: 1px solid #49324b;
1922
1789
  background: #1c1220;
1923
1790
  }
1924
- .flow-collection-heading h3 {
1791
+ :where(.jev-devtools) .flow-collection-heading h3 {
1925
1792
  margin: 5px 0;
1926
1793
  font-size: 16px;
1927
1794
  }
1928
- .flow-collection-heading small {
1795
+ :where(.jev-devtools) .flow-collection-heading small {
1929
1796
  color: #b9aebf;
1930
1797
  }
1931
- .flow-collection-link text {
1798
+ :where(.jev-devtools) .flow-collection-link text {
1932
1799
  fill: #ce9abd;
1933
1800
  font-size: 12px;
1934
1801
  }
1935
- .flow-item-placeholder {
1802
+ :where(.jev-devtools) .flow-item-placeholder {
1936
1803
  width: 600px;
1937
1804
  padding: 24px;
1938
1805
  line-height: 1.6;
1939
1806
  }
1940
- .flow-inline-overview,
1941
- .flow-inline-overview > .whole-flow,
1942
- .flow-inline-overview > .whole-flow > .flow-workspace {
1807
+ :where(.jev-devtools) .flow-inline-overview,
1808
+ :where(.jev-devtools) .flow-inline-overview > .whole-flow,
1809
+ :where(.jev-devtools) .flow-inline-overview > .whole-flow > .flow-workspace {
1943
1810
  display: block;
1944
1811
  flex: none;
1945
1812
  }
1946
- .flow-inline-surface {
1813
+ :where(.jev-devtools) .flow-inline-surface {
1947
1814
  position: relative;
1948
1815
  }
1949
1816
 
1950
- .flow-item-content {
1817
+ :where(.jev-devtools) .flow-item-content {
1951
1818
  min-width: 0;
1952
- animation: flow-item-enter 240ms cubic-bezier(0.22, 1, 0.36, 1) both;
1819
+ animation: jev-flow-item-enter 240ms cubic-bezier(0.22, 1, 0.36, 1) both;
1953
1820
  }
1954
- .flow-item-forward {
1821
+ :where(.jev-devtools) .flow-item-forward {
1955
1822
  --flow-item-offset: 28px;
1956
1823
  }
1957
- .flow-item-backward {
1824
+ :where(.jev-devtools) .flow-item-backward {
1958
1825
  --flow-item-offset: -28px;
1959
1826
  }
1960
- @keyframes flow-item-enter {
1827
+ @keyframes jev-flow-item-enter {
1961
1828
  from {
1962
1829
  opacity: 0;
1963
1830
  transform: translateX(var(--flow-item-offset));
@@ -1968,7 +1835,7 @@
1968
1835
  }
1969
1836
  }
1970
1837
  @media (prefers-reduced-motion: reduce) {
1971
- .flow-item-content {
1838
+ :where(.jev-devtools) .flow-item-content {
1972
1839
  animation: none;
1973
1840
  }
1974
1841
  }
@@ -1991,14 +1858,87 @@
1991
1858
  background: #382035;
1992
1859
  border-color: #e551ba;
1993
1860
  }
1994
- .flow-item-arrow svg {
1861
+ :where(.jev-devtools) .flow-item-arrow svg {
1995
1862
  width: 28px;
1996
1863
  height: 28px;
1997
1864
  }
1998
1865
 
1999
- .flow-item-previous {
1866
+ :where(.jev-devtools) .flow-item-previous {
2000
1867
  left: -76px;
2001
1868
  }
2002
- .flow-item-next {
1869
+ :where(.jev-devtools) .flow-item-next {
2003
1870
  right: -76px;
2004
1871
  }
1872
+ .jev-devtools .flow-run-summary {
1873
+ text-align: right;
1874
+ }
1875
+ .jev-devtools .flow-fixture-button {
1876
+ display: block;
1877
+ margin: 6px 0 0 auto;
1878
+ /* Keep the header still when the shorter confirmation replaces the label. */
1879
+ min-width: 96px;
1880
+ font-size: 11px;
1881
+ transition: background-color 160ms ease, border-color 160ms ease;
1882
+ }
1883
+ .jev-devtools .flow-fixture-button[data-copied] {
1884
+ border-color: #e551ba;
1885
+ background: #382035;
1886
+ animation: jev-fixture-copied 200ms ease-out;
1887
+ }
1888
+ @keyframes jev-fixture-copied {
1889
+ from {
1890
+ transform: scale(0.96);
1891
+ }
1892
+ to {
1893
+ transform: scale(1);
1894
+ }
1895
+ }
1896
+ @media (prefers-reduced-motion: reduce) {
1897
+ .jev-devtools .flow-fixture-button {
1898
+ transition: none;
1899
+ }
1900
+ .jev-devtools .flow-fixture-button[data-copied] {
1901
+ animation: none;
1902
+ }
1903
+ }
1904
+ .jev-devtools .flow-fixture {
1905
+ display: flex;
1906
+ flex-direction: column;
1907
+ align-items: flex-end;
1908
+ flex-shrink: 0;
1909
+ gap: 4px;
1910
+ padding: 0 24px;
1911
+ text-align: right;
1912
+ }
1913
+ .jev-devtools .flow-fixture p {
1914
+ margin: 0;
1915
+ max-width: 360px;
1916
+ font-size: 11px;
1917
+ }
1918
+ .jev-devtools .flow-fixture details {
1919
+ max-width: 360px;
1920
+ font-size: 11px;
1921
+ }
1922
+ .jev-devtools .flow-fixture details ul {
1923
+ max-height: 120px;
1924
+ margin: 4px 0 0;
1925
+ padding: 0;
1926
+ overflow: auto;
1927
+ list-style: none;
1928
+ font-family: "JetBrains Mono", monospace;
1929
+ overflow-wrap: anywhere;
1930
+ }
1931
+ .jev-devtools .flow-fixture details ul:focus-visible {
1932
+ outline: 2px solid #e551ba;
1933
+ outline-offset: 2px;
1934
+ }
1935
+ .jev-devtools .flow-fixture textarea {
1936
+ width: 360px;
1937
+ max-width: 100%;
1938
+ height: 120px;
1939
+ padding: 8px;
1940
+ font:
1941
+ 11px "JetBrains Mono",
1942
+ monospace;
1943
+ text-align: left;
1944
+ }