@almadar/std 16.239.0 → 16.242.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/behaviors/behaviors-registry.json +4814 -553
  2. package/behaviors/lolo/agent/atoms/std-agent-memory.lolo +38 -1
  3. package/behaviors/lolo/agent/atoms/std-agent-session.lolo +1074 -47
  4. package/behaviors/lolo/agent/atoms/std-agent-tool-loop.lolo +8 -7
  5. package/behaviors/lolo/agent/organisms/std-agent-assistant.lolo +56 -37
  6. package/behaviors/lolo/infra/atoms/std-page-open.lolo +59 -0
  7. package/behaviors/lolo/infra/atoms/std-page-search.lolo +134 -0
  8. package/behaviors/lolo/infra/atoms/std-page-treat.lolo +59 -0
  9. package/behaviors/lolo/infra/atoms/std-page-watch.lolo +86 -0
  10. package/behaviors/lolo/ui/core/atoms/std-board.lolo +53 -6
  11. package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +25 -1
  12. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +9 -0
  13. package/behaviors/lolo/ui/core/atoms/std-doc-page.lolo +153 -0
  14. package/behaviors/lolo/ui/core/atoms/std-site-header.lolo +15 -3
  15. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +2 -2
  16. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +7 -7
  17. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +1 -1
  18. package/behaviors/lolo/ui/core/molecules/ui-header.lolo +5 -0
  19. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +124 -92
  20. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +114 -55
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +40 -14
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +363 -123
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +93 -48
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-diagram.lolo +60 -28
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +193 -96
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +75 -32
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +142 -86
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +266 -98
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +103 -65
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-live-sim.lolo +223 -109
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +232 -64
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-param-explorer.lolo +69 -29
  33. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +363 -123
  34. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +73 -41
  35. package/behaviors/lolo/ui/learning/atoms/std-learn-sample-accumulator.lolo +96 -38
  36. package/behaviors/lolo/ui/learning/atoms/std-learn-sandbox.lolo +65 -45
  37. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +243 -117
  38. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +76 -28
  39. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +228 -109
  40. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +95 -44
  41. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +199 -125
  42. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +92 -48
  43. package/behaviors/lolo/ui/learning/atoms/std-learn-trace-player.lolo +239 -78
  44. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +147 -38
  45. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +123 -58
  46. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +22 -0
  47. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +26 -0
  48. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +26 -0
  49. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +27 -1
  50. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +27 -1
  51. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +29 -9
  52. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +26 -0
  53. package/behaviors/lolo-behavior-contracts.json +1 -1
  54. package/behaviors/registry/agent/atoms/std-agent-memory.orb +372 -2
  55. package/behaviors/registry/agent/atoms/std-agent-session.orb +4752 -348
  56. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +54 -42
  57. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +356 -122
  58. package/behaviors/registry/factory-signatures.json +1 -1
  59. package/behaviors/registry/infra/atoms/std-page-open.orb +435 -0
  60. package/behaviors/registry/infra/atoms/std-page-search.orb +867 -0
  61. package/behaviors/registry/infra/atoms/std-page-treat.orb +494 -0
  62. package/behaviors/registry/infra/atoms/std-page-watch.orb +554 -0
  63. package/behaviors/registry/ui/core/atoms/std-board.orb +110 -14
  64. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +119 -0
  65. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +61 -0
  66. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +594 -0
  67. package/behaviors/registry/ui/core/atoms/std-site-header.orb +40 -2
  68. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +2 -0
  69. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +24 -0
  70. package/behaviors/registry/ui/core/atoms/std-version-history.orb +8 -1
  71. package/behaviors/registry/ui/core/molecules/ui-header.orb +7 -0
  72. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +903 -369
  73. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1002 -232
  74. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +253 -74
  75. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3624 -921
  76. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +685 -144
  77. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +404 -52
  78. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1787 -210
  79. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +699 -71
  80. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1102 -578
  81. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +2760 -872
  82. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +689 -152
  83. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1431 -633
  84. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +2485 -512
  85. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +501 -197
  86. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +3642 -928
  87. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +705 -125
  88. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +624 -114
  89. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +405 -153
  90. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1911 -611
  91. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +436 -128
  92. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +2482 -485
  93. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +896 -192
  94. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +2001 -759
  95. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +734 -228
  96. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +2501 -764
  97. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1591 -173
  98. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +883 -122
  99. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +176 -0
  100. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +211 -0
  101. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +211 -0
  102. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +212 -1
  103. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +212 -1
  104. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +203 -9
  105. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +211 -0
  106. package/behaviors/signatures.lolo +325 -655
  107. package/canonical-operators.json +35 -1
  108. package/dist/behaviors/exports-reader.js +41980 -35508
  109. package/dist/behaviors/functions/index.d.ts +1063 -140
  110. package/dist/behaviors/functions/index.js +41951 -35506
  111. package/dist/behaviors/index.d.ts +1 -1
  112. package/dist/behaviors/index.js +41981 -35509
  113. package/dist/behaviors/query.js +41980 -35508
  114. package/dist/behaviors-embeddings.hash.json +3 -3
  115. package/dist/behaviors-embeddings.json +47 -27
  116. package/dist/behaviors-registry.json +4814 -553
  117. package/dist/index.d.ts +4 -4
  118. package/dist/index.js +42019 -35509
  119. package/dist/knob-embeddings.hash.json +3 -3
  120. package/dist/knob-embeddings.json +623 -263
  121. package/dist/modules/anim.d.ts +1 -1
  122. package/dist/modules/array.d.ts +1 -1
  123. package/dist/modules/async.d.ts +1 -1
  124. package/dist/modules/behavior.d.ts +1 -1
  125. package/dist/modules/browser.d.ts +1 -1
  126. package/dist/modules/composition.d.ts +1 -1
  127. package/dist/modules/contract.d.ts +1 -1
  128. package/dist/modules/core.d.ts +1 -1
  129. package/dist/modules/core.js +2 -0
  130. package/dist/modules/data.d.ts +1 -1
  131. package/dist/modules/ease.d.ts +1 -1
  132. package/dist/modules/format.d.ts +1 -1
  133. package/dist/modules/geo.d.ts +1 -1
  134. package/dist/modules/graph.d.ts +1 -1
  135. package/dist/modules/grid.d.ts +1 -1
  136. package/dist/modules/i18n.d.ts +17 -0
  137. package/dist/modules/i18n.js +22 -0
  138. package/dist/modules/index.d.ts +2 -1
  139. package/dist/modules/index.js +24 -1
  140. package/dist/modules/integration.d.ts +1 -1
  141. package/dist/modules/json.d.ts +1 -1
  142. package/dist/modules/llm.d.ts +1 -1
  143. package/dist/modules/math.d.ts +1 -1
  144. package/dist/modules/memory.d.ts +1 -1
  145. package/dist/modules/nn.d.ts +1 -1
  146. package/dist/modules/noise.d.ts +1 -1
  147. package/dist/modules/object.d.ts +1 -1
  148. package/dist/modules/os.d.ts +1 -1
  149. package/dist/modules/path.d.ts +1 -1
  150. package/dist/modules/prob.d.ts +1 -1
  151. package/dist/modules/session.d.ts +1 -1
  152. package/dist/modules/str.d.ts +1 -1
  153. package/dist/modules/tensor.d.ts +1 -1
  154. package/dist/modules/time.d.ts +1 -1
  155. package/dist/modules/trace.d.ts +1 -1
  156. package/dist/modules/train.d.ts +1 -1
  157. package/dist/modules/validate.d.ts +1 -1
  158. package/dist/modules/vector.d.ts +1 -1
  159. package/dist/modules/workspace.d.ts +1 -1
  160. package/dist/registry/factory-signatures.json +1 -1
  161. package/dist/registry.d.ts +10 -3
  162. package/dist/registry.js +31 -1
  163. package/dist/{types-DLx38UFZ.d.ts → types-Cdb321uM.d.ts} +9 -3
  164. package/i18n/ar.json +1 -0
  165. package/i18n/en.json +1 -0
  166. package/i18n/sl.json +1 -0
  167. package/package.json +3 -3
@@ -91,6 +91,24 @@
91
91
  "parent": "trt_01M075815GAMP7HHTXCBE7VS66",
92
92
  "renames": []
93
93
  },
94
+ "evt_01M41M1H3N21H25P8DJY3D9KWW": {
95
+ "bakedName": "TOGGLE_RUN",
96
+ "curName": "TOGGLE_RUN",
97
+ "id": "evt_01M41M1H3N21H25P8DJY3D9KWW",
98
+ "kind": "event",
99
+ "owner": "workspace",
100
+ "parent": "trt_01M075815GAMP7HHTXCBE7VS66",
101
+ "renames": []
102
+ },
103
+ "evt_01M41M1H3NV148ESM3DRXKKF8X": {
104
+ "bakedName": "SPEED_SET",
105
+ "curName": "SPEED_SET",
106
+ "id": "evt_01M41M1H3NV148ESM3DRXKKF8X",
107
+ "kind": "event",
108
+ "owner": "workspace",
109
+ "parent": "trt_01M075815GAMP7HHTXCBE7VS66",
110
+ "renames": []
111
+ },
94
112
  "orb_01M075815G44PKNH4ZV052M4GM": {
95
113
  "bakedName": "MeasureOrbital",
96
114
  "curName": "MeasureOrbital",
@@ -152,6 +170,11 @@
152
170
  "name": "running",
153
171
  "type": "boolean"
154
172
  },
173
+ {
174
+ "default": 1.0,
175
+ "name": "speed",
176
+ "type": "number"
177
+ },
155
178
  {
156
179
  "items": {
157
180
  "properties": {
@@ -302,7 +325,7 @@
302
325
  "type": "string"
303
326
  },
304
327
  "probeColor": {
305
- "default": "#dc2626",
328
+ "default": "highlight",
306
329
  "label": "Probe Color",
307
330
  "tier": "presentation",
308
331
  "type": "string"
@@ -321,7 +344,7 @@
321
344
  "type": "number"
322
345
  },
323
346
  "signalColor": {
324
- "default": "#94a3b8",
347
+ "default": "ink",
325
348
  "label": "Signal Color",
326
349
  "tier": "presentation",
327
350
  "type": "string"
@@ -334,6 +357,13 @@
334
357
  "tier": "domain",
335
358
  "type": "string"
336
359
  },
360
+ "summary": {
361
+ "default": "",
362
+ "description": "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line.",
363
+ "label": "Concept",
364
+ "tier": "presentation",
365
+ "type": "string"
366
+ },
337
367
  "taskText": {
338
368
  "default": "Run the signal, then press Probe to record measurements. Watch the running mean settle.",
339
369
  "description": "One-sentence statement of the measuring task.",
@@ -343,7 +373,7 @@
343
373
  },
344
374
  "title": {
345
375
  "default": "Measurement Lab",
346
- "description": "Title shown above the experiment.",
376
+ "description": "The instrument's name, the header's one hero.",
347
377
  "label": "Title",
348
378
  "tier": "presentation",
349
379
  "type": "string"
@@ -418,6 +448,10 @@
418
448
  "kind": "set",
419
449
  "resource": "@entity.sampleCount"
420
450
  },
451
+ {
452
+ "kind": "set",
453
+ "resource": "@entity.speed"
454
+ },
421
455
  {
422
456
  "kind": "set",
423
457
  "resource": "@entity.t"
@@ -524,6 +558,7 @@
524
558
  "points",
525
559
  "running",
526
560
  "sampleCount",
561
+ "speed",
527
562
  "t",
528
563
  "title",
529
564
  "traceCurves",
@@ -561,6 +596,26 @@
561
596
  ],
562
597
  "tier": "domain"
563
598
  },
599
+ {
600
+ "description": "Learner pressed the Play/Pause toggle — starts or freezes the signal clock.",
601
+ "id": "evt_01M41M1H3N21H25P8DJY3D9KWW",
602
+ "key": "TOGGLE_RUN",
603
+ "name": "Toggle Run",
604
+ "tier": "domain"
605
+ },
606
+ {
607
+ "description": "The learner picked a playback speed; the signal clock advances that many times faster.",
608
+ "id": "evt_01M41M1H3NV148ESM3DRXKKF8X",
609
+ "key": "SPEED_SET",
610
+ "name": "Speed Set",
611
+ "payloadSchema": [
612
+ {
613
+ "name": "speed",
614
+ "type": "number"
615
+ }
616
+ ],
617
+ "tier": "presentation"
618
+ },
564
619
  {
565
620
  "description": "Learner started (or resumed) the signal's evolution; the trace draws live until Pause or the configured duration.",
566
621
  "id": "evt_01M075815MDMMK99BHXWM8HBNS",
@@ -718,79 +773,269 @@
718
773
  {
719
774
  "children": [
720
775
  {
721
- "content": "@entity.title",
722
- "type": "typography",
723
- "variant": "h4"
724
- },
725
- {
726
- "content": "@config.taskText",
727
- "type": "typography",
728
- "variant": "body"
729
- },
730
- {
776
+ "align": "start",
731
777
  "children": [
732
778
  {
733
- "action": "RUN",
734
- "disabled": [
735
- "if",
779
+ "children": [
780
+ {
781
+ "content": "@entity.title",
782
+ "type": "typography",
783
+ "variant": "h4"
784
+ },
736
785
  [
737
- "and",
786
+ "if",
738
787
  [
739
788
  "==",
740
- "@entity.running",
741
- false
789
+ "@config.summary",
790
+ ""
742
791
  ],
743
- [
744
- "<",
745
- "@entity.t",
746
- "@config.duration"
747
- ]
748
- ],
749
- false,
750
- true
792
+ null,
793
+ {
794
+ "color": "muted",
795
+ "content": "@config.summary",
796
+ "type": "typography",
797
+ "variant": "body2"
798
+ }
799
+ ]
751
800
  ],
752
- "label": "Run",
753
- "type": "button",
754
- "variant": "primary"
801
+ "direction": "vertical",
802
+ "gap": "xs",
803
+ "type": "stack"
755
804
  },
756
805
  {
757
- "action": "PAUSE",
758
- "disabled": [
806
+ "label": [
759
807
  "if",
760
- "@entity.running",
761
- false,
762
- true
808
+ [
809
+ ">=",
810
+ "@entity.t",
811
+ "@config.duration"
812
+ ],
813
+ "Done",
814
+ [
815
+ "if",
816
+ "@entity.running",
817
+ "Measuring…",
818
+ "Paused"
819
+ ]
763
820
  ],
764
- "label": "Pause",
765
- "type": "button",
766
- "variant": "secondary"
767
- },
768
- {
769
- "action": "PROBE",
770
- "disabled": [
821
+ "type": "badge",
822
+ "variant": [
771
823
  "if",
772
824
  [
773
- ">",
825
+ ">=",
826
+ "@entity.t",
827
+ "@config.duration"
828
+ ],
829
+ "success",
830
+ [
831
+ "if",
832
+ "@entity.running",
833
+ "primary",
834
+ "neutral"
835
+ ]
836
+ ]
837
+ }
838
+ ],
839
+ "direction": "horizontal",
840
+ "gap": "md",
841
+ "justify": "between",
842
+ "type": "stack"
843
+ },
844
+ {
845
+ "align": "center",
846
+ "children": [
847
+ [
848
+ "if",
849
+ "@entity.running",
850
+ {
851
+ "action": "TOGGLE_RUN",
852
+ "aria-pressed": "true",
853
+ "icon": "pause",
854
+ "label": "Pause",
855
+ "type": "button",
856
+ "variant": "primary"
857
+ },
858
+ {
859
+ "action": "TOGGLE_RUN",
860
+ "aria-pressed": "false",
861
+ "disabled": [
862
+ ">=",
774
863
  "@entity.t",
775
- 0.0
864
+ "@config.duration"
776
865
  ],
777
- false,
778
- true
866
+ "icon": "play",
867
+ "label": "Play",
868
+ "type": "button",
869
+ "variant": "primary"
870
+ }
871
+ ],
872
+ {
873
+ "action": "PROBE",
874
+ "disabled": [
875
+ "<=",
876
+ "@entity.t",
877
+ 0.0
779
878
  ],
879
+ "icon": "plus",
780
880
  "label": "@config.probeLabel",
781
881
  "type": "button",
782
- "variant": "primary"
882
+ "variant": "secondary"
783
883
  },
784
884
  {
785
885
  "action": "RESET",
886
+ "icon": "rotate-ccw",
786
887
  "label": "Reset",
787
888
  "type": "button",
788
889
  "variant": "ghost"
890
+ },
891
+ {
892
+ "align": "center",
893
+ "aria-label": "Speed",
894
+ "children": [
895
+ {
896
+ "action": "SPEED_SET",
897
+ "actionPayload": {
898
+ "speed": 0.5
899
+ },
900
+ "aria-pressed": [
901
+ "if",
902
+ [
903
+ "==",
904
+ "@entity.speed",
905
+ 0.5
906
+ ],
907
+ "true",
908
+ "false"
909
+ ],
910
+ "label": "0.5×",
911
+ "size": "sm",
912
+ "type": "button",
913
+ "variant": [
914
+ "if",
915
+ [
916
+ "==",
917
+ "@entity.speed",
918
+ 0.5
919
+ ],
920
+ "secondary",
921
+ "ghost"
922
+ ]
923
+ },
924
+ {
925
+ "action": "SPEED_SET",
926
+ "actionPayload": {
927
+ "speed": 1.0
928
+ },
929
+ "aria-pressed": [
930
+ "if",
931
+ [
932
+ "==",
933
+ "@entity.speed",
934
+ 1.0
935
+ ],
936
+ "true",
937
+ "false"
938
+ ],
939
+ "label": "1×",
940
+ "size": "sm",
941
+ "type": "button",
942
+ "variant": [
943
+ "if",
944
+ [
945
+ "==",
946
+ "@entity.speed",
947
+ 1.0
948
+ ],
949
+ "secondary",
950
+ "ghost"
951
+ ]
952
+ },
953
+ {
954
+ "action": "SPEED_SET",
955
+ "actionPayload": {
956
+ "speed": 2.0
957
+ },
958
+ "aria-pressed": [
959
+ "if",
960
+ [
961
+ "==",
962
+ "@entity.speed",
963
+ 2.0
964
+ ],
965
+ "true",
966
+ "false"
967
+ ],
968
+ "label": "2×",
969
+ "size": "sm",
970
+ "type": "button",
971
+ "variant": [
972
+ "if",
973
+ [
974
+ "==",
975
+ "@entity.speed",
976
+ 2.0
977
+ ],
978
+ "secondary",
979
+ "ghost"
980
+ ]
981
+ },
982
+ {
983
+ "action": "SPEED_SET",
984
+ "actionPayload": {
985
+ "speed": 4.0
986
+ },
987
+ "aria-pressed": [
988
+ "if",
989
+ [
990
+ "==",
991
+ "@entity.speed",
992
+ 4.0
993
+ ],
994
+ "true",
995
+ "false"
996
+ ],
997
+ "label": "4×",
998
+ "size": "sm",
999
+ "type": "button",
1000
+ "variant": [
1001
+ "if",
1002
+ [
1003
+ "==",
1004
+ "@entity.speed",
1005
+ 4.0
1006
+ ],
1007
+ "secondary",
1008
+ "ghost"
1009
+ ]
1010
+ }
1011
+ ],
1012
+ "direction": "horizontal",
1013
+ "gap": "xs",
1014
+ "role": "group",
1015
+ "type": "stack"
1016
+ },
1017
+ {
1018
+ "color": "muted",
1019
+ "content": [
1020
+ "str/concat",
1021
+ "t = ",
1022
+ [
1023
+ "math/round",
1024
+ "@entity.t",
1025
+ 1.0
1026
+ ],
1027
+ " of ",
1028
+ "@config.duration",
1029
+ " s"
1030
+ ],
1031
+ "type": "typography",
1032
+ "variant": "caption"
789
1033
  }
790
1034
  ],
791
1035
  "direction": "horizontal",
792
1036
  "gap": "sm",
793
- "type": "stack"
1037
+ "type": "stack",
1038
+ "wrap": true
794
1039
  },
795
1040
  {
796
1041
  "animate": false,
@@ -798,6 +1043,11 @@
798
1043
  "gridStep": "@config.gridStep",
799
1044
  "height": "@config.height",
800
1045
  "interactive": false,
1046
+ "keyMap": {
1047
+ "Enter": "PROBE",
1048
+ "KeyR": "RESET",
1049
+ "Space": "TOGGLE_RUN"
1050
+ },
801
1051
  "points": "@entity.points",
802
1052
  "shapes": [],
803
1053
  "showAxes": true,
@@ -812,46 +1062,39 @@
812
1062
  "yMin": "@config.valueMin"
813
1063
  },
814
1064
  {
815
- "content": [
816
- "str/concat",
817
- "t = ",
818
- [
819
- "math/round",
820
- "@entity.t",
821
- 1.0
822
- ],
823
- "s · ",
824
- "@config.valueLabel",
825
- " = ",
826
- [
827
- "math/round",
828
- "@entity.value",
829
- 3.0
830
- ]
831
- ],
832
- "type": "typography",
833
- "variant": "body"
834
- },
835
- {
836
- "content": [
837
- "str/concat",
838
- "Samples recorded: ",
839
- [
840
- "str/concat",
841
- "",
842
- "@entity.sampleCount"
843
- ],
844
- " · mean ",
845
- "@config.valueLabel",
846
- ": ",
847
- [
848
- "math/round",
849
- "@entity.meanValue",
850
- 3.0
851
- ]
1065
+ "children": [
1066
+ {
1067
+ "content": "@config.taskText",
1068
+ "type": "typography",
1069
+ "variant": "body"
1070
+ },
1071
+ {
1072
+ "color": "muted",
1073
+ "content": [
1074
+ "str/concat",
1075
+ "@config.valueLabel",
1076
+ " = ",
1077
+ [
1078
+ "math/round",
1079
+ "@entity.value",
1080
+ 3.0
1081
+ ],
1082
+ " · ",
1083
+ "@entity.sampleCount",
1084
+ " recorded · mean ",
1085
+ [
1086
+ "math/round",
1087
+ "@entity.meanValue",
1088
+ 3.0
1089
+ ]
1090
+ ],
1091
+ "type": "typography",
1092
+ "variant": "caption"
1093
+ }
852
1094
  ],
853
- "type": "typography",
854
- "variant": "caption"
1095
+ "direction": "vertical",
1096
+ "gap": "xs",
1097
+ "type": "stack"
855
1098
  }
856
1099
  ],
857
1100
  "direction": "vertical",
@@ -874,6 +1117,48 @@
874
1117
  ],
875
1118
  "to": "idle"
876
1119
  },
1120
+ {
1121
+ "effects": [
1122
+ [
1123
+ "set",
1124
+ "@entity.active",
1125
+ false
1126
+ ],
1127
+ [
1128
+ "set",
1129
+ "@entity.running",
1130
+ false
1131
+ ],
1132
+ [
1133
+ "render-ui",
1134
+ "main",
1135
+ null
1136
+ ]
1137
+ ],
1138
+ "event": "MODE_SELECTED",
1139
+ "eventId": "evt_01M075815MA03A5SSAB91E1VSJ",
1140
+ "from": "idle",
1141
+ "guard": [
1142
+ "and",
1143
+ [
1144
+ "not",
1145
+ [
1146
+ "==",
1147
+ "@config.matchMode",
1148
+ ""
1149
+ ]
1150
+ ],
1151
+ [
1152
+ "not",
1153
+ [
1154
+ "==",
1155
+ "@payload.mode",
1156
+ "@config.matchMode"
1157
+ ]
1158
+ ]
1159
+ ],
1160
+ "to": "idle"
1161
+ },
877
1162
  {
878
1163
  "effects": [
879
1164
  [
@@ -943,79 +1228,269 @@
943
1228
  {
944
1229
  "children": [
945
1230
  {
946
- "content": "@entity.title",
947
- "type": "typography",
948
- "variant": "h4"
949
- },
950
- {
951
- "content": "@config.taskText",
952
- "type": "typography",
953
- "variant": "body"
954
- },
955
- {
1231
+ "align": "start",
956
1232
  "children": [
957
1233
  {
958
- "action": "RUN",
959
- "disabled": [
960
- "if",
1234
+ "children": [
1235
+ {
1236
+ "content": "@entity.title",
1237
+ "type": "typography",
1238
+ "variant": "h4"
1239
+ },
961
1240
  [
962
- "and",
1241
+ "if",
963
1242
  [
964
1243
  "==",
965
- "@entity.running",
966
- false
1244
+ "@config.summary",
1245
+ ""
967
1246
  ],
968
- [
969
- "<",
970
- "@entity.t",
971
- "@config.duration"
972
- ]
973
- ],
974
- false,
975
- true
1247
+ null,
1248
+ {
1249
+ "color": "muted",
1250
+ "content": "@config.summary",
1251
+ "type": "typography",
1252
+ "variant": "body2"
1253
+ }
1254
+ ]
976
1255
  ],
977
- "label": "Run",
978
- "type": "button",
979
- "variant": "primary"
1256
+ "direction": "vertical",
1257
+ "gap": "xs",
1258
+ "type": "stack"
980
1259
  },
981
1260
  {
982
- "action": "PAUSE",
983
- "disabled": [
1261
+ "label": [
984
1262
  "if",
985
- "@entity.running",
986
- false,
987
- true
1263
+ [
1264
+ ">=",
1265
+ "@entity.t",
1266
+ "@config.duration"
1267
+ ],
1268
+ "Done",
1269
+ [
1270
+ "if",
1271
+ "@entity.running",
1272
+ "Measuring…",
1273
+ "Paused"
1274
+ ]
988
1275
  ],
989
- "label": "Pause",
990
- "type": "button",
991
- "variant": "secondary"
992
- },
993
- {
994
- "action": "PROBE",
995
- "disabled": [
1276
+ "type": "badge",
1277
+ "variant": [
996
1278
  "if",
997
1279
  [
998
- ">",
1280
+ ">=",
999
1281
  "@entity.t",
1000
- 0.0
1282
+ "@config.duration"
1001
1283
  ],
1002
- false,
1003
- true
1284
+ "success",
1285
+ [
1286
+ "if",
1287
+ "@entity.running",
1288
+ "primary",
1289
+ "neutral"
1290
+ ]
1291
+ ]
1292
+ }
1293
+ ],
1294
+ "direction": "horizontal",
1295
+ "gap": "md",
1296
+ "justify": "between",
1297
+ "type": "stack"
1298
+ },
1299
+ {
1300
+ "align": "center",
1301
+ "children": [
1302
+ [
1303
+ "if",
1304
+ "@entity.running",
1305
+ {
1306
+ "action": "TOGGLE_RUN",
1307
+ "aria-pressed": "true",
1308
+ "icon": "pause",
1309
+ "label": "Pause",
1310
+ "type": "button",
1311
+ "variant": "primary"
1312
+ },
1313
+ {
1314
+ "action": "TOGGLE_RUN",
1315
+ "aria-pressed": "false",
1316
+ "disabled": [
1317
+ ">=",
1318
+ "@entity.t",
1319
+ "@config.duration"
1320
+ ],
1321
+ "icon": "play",
1322
+ "label": "Play",
1323
+ "type": "button",
1324
+ "variant": "primary"
1325
+ }
1326
+ ],
1327
+ {
1328
+ "action": "PROBE",
1329
+ "disabled": [
1330
+ "<=",
1331
+ "@entity.t",
1332
+ 0.0
1004
1333
  ],
1334
+ "icon": "plus",
1005
1335
  "label": "@config.probeLabel",
1006
1336
  "type": "button",
1007
- "variant": "primary"
1337
+ "variant": "secondary"
1008
1338
  },
1009
1339
  {
1010
1340
  "action": "RESET",
1341
+ "icon": "rotate-ccw",
1011
1342
  "label": "Reset",
1012
1343
  "type": "button",
1013
1344
  "variant": "ghost"
1345
+ },
1346
+ {
1347
+ "align": "center",
1348
+ "aria-label": "Speed",
1349
+ "children": [
1350
+ {
1351
+ "action": "SPEED_SET",
1352
+ "actionPayload": {
1353
+ "speed": 0.5
1354
+ },
1355
+ "aria-pressed": [
1356
+ "if",
1357
+ [
1358
+ "==",
1359
+ "@entity.speed",
1360
+ 0.5
1361
+ ],
1362
+ "true",
1363
+ "false"
1364
+ ],
1365
+ "label": "0.5×",
1366
+ "size": "sm",
1367
+ "type": "button",
1368
+ "variant": [
1369
+ "if",
1370
+ [
1371
+ "==",
1372
+ "@entity.speed",
1373
+ 0.5
1374
+ ],
1375
+ "secondary",
1376
+ "ghost"
1377
+ ]
1378
+ },
1379
+ {
1380
+ "action": "SPEED_SET",
1381
+ "actionPayload": {
1382
+ "speed": 1.0
1383
+ },
1384
+ "aria-pressed": [
1385
+ "if",
1386
+ [
1387
+ "==",
1388
+ "@entity.speed",
1389
+ 1.0
1390
+ ],
1391
+ "true",
1392
+ "false"
1393
+ ],
1394
+ "label": "1×",
1395
+ "size": "sm",
1396
+ "type": "button",
1397
+ "variant": [
1398
+ "if",
1399
+ [
1400
+ "==",
1401
+ "@entity.speed",
1402
+ 1.0
1403
+ ],
1404
+ "secondary",
1405
+ "ghost"
1406
+ ]
1407
+ },
1408
+ {
1409
+ "action": "SPEED_SET",
1410
+ "actionPayload": {
1411
+ "speed": 2.0
1412
+ },
1413
+ "aria-pressed": [
1414
+ "if",
1415
+ [
1416
+ "==",
1417
+ "@entity.speed",
1418
+ 2.0
1419
+ ],
1420
+ "true",
1421
+ "false"
1422
+ ],
1423
+ "label": "2×",
1424
+ "size": "sm",
1425
+ "type": "button",
1426
+ "variant": [
1427
+ "if",
1428
+ [
1429
+ "==",
1430
+ "@entity.speed",
1431
+ 2.0
1432
+ ],
1433
+ "secondary",
1434
+ "ghost"
1435
+ ]
1436
+ },
1437
+ {
1438
+ "action": "SPEED_SET",
1439
+ "actionPayload": {
1440
+ "speed": 4.0
1441
+ },
1442
+ "aria-pressed": [
1443
+ "if",
1444
+ [
1445
+ "==",
1446
+ "@entity.speed",
1447
+ 4.0
1448
+ ],
1449
+ "true",
1450
+ "false"
1451
+ ],
1452
+ "label": "4×",
1453
+ "size": "sm",
1454
+ "type": "button",
1455
+ "variant": [
1456
+ "if",
1457
+ [
1458
+ "==",
1459
+ "@entity.speed",
1460
+ 4.0
1461
+ ],
1462
+ "secondary",
1463
+ "ghost"
1464
+ ]
1465
+ }
1466
+ ],
1467
+ "direction": "horizontal",
1468
+ "gap": "xs",
1469
+ "role": "group",
1470
+ "type": "stack"
1471
+ },
1472
+ {
1473
+ "color": "muted",
1474
+ "content": [
1475
+ "str/concat",
1476
+ "t = ",
1477
+ [
1478
+ "math/round",
1479
+ "@entity.t",
1480
+ 1.0
1481
+ ],
1482
+ " of ",
1483
+ "@config.duration",
1484
+ " s"
1485
+ ],
1486
+ "type": "typography",
1487
+ "variant": "caption"
1014
1488
  }
1015
1489
  ],
1016
1490
  "direction": "horizontal",
1017
1491
  "gap": "sm",
1018
- "type": "stack"
1492
+ "type": "stack",
1493
+ "wrap": true
1019
1494
  },
1020
1495
  {
1021
1496
  "animate": false,
@@ -1023,6 +1498,11 @@
1023
1498
  "gridStep": "@config.gridStep",
1024
1499
  "height": "@config.height",
1025
1500
  "interactive": false,
1501
+ "keyMap": {
1502
+ "Enter": "PROBE",
1503
+ "KeyR": "RESET",
1504
+ "Space": "TOGGLE_RUN"
1505
+ },
1026
1506
  "points": "@entity.points",
1027
1507
  "shapes": [],
1028
1508
  "showAxes": true,
@@ -1037,46 +1517,39 @@
1037
1517
  "yMin": "@config.valueMin"
1038
1518
  },
1039
1519
  {
1040
- "content": [
1041
- "str/concat",
1042
- "t = ",
1043
- [
1044
- "math/round",
1045
- "@entity.t",
1046
- 1.0
1047
- ],
1048
- "s · ",
1049
- "@config.valueLabel",
1050
- " = ",
1051
- [
1052
- "math/round",
1053
- "@entity.value",
1054
- 3.0
1055
- ]
1056
- ],
1057
- "type": "typography",
1058
- "variant": "body"
1059
- },
1060
- {
1061
- "content": [
1062
- "str/concat",
1063
- "Samples recorded: ",
1064
- [
1065
- "str/concat",
1066
- "",
1067
- "@entity.sampleCount"
1068
- ],
1069
- " · mean ",
1070
- "@config.valueLabel",
1071
- ": ",
1072
- [
1073
- "math/round",
1074
- "@entity.meanValue",
1075
- 3.0
1076
- ]
1520
+ "children": [
1521
+ {
1522
+ "content": "@config.taskText",
1523
+ "type": "typography",
1524
+ "variant": "body"
1525
+ },
1526
+ {
1527
+ "color": "muted",
1528
+ "content": [
1529
+ "str/concat",
1530
+ "@config.valueLabel",
1531
+ " = ",
1532
+ [
1533
+ "math/round",
1534
+ "@entity.value",
1535
+ 3.0
1536
+ ],
1537
+ " · ",
1538
+ "@entity.sampleCount",
1539
+ " recorded · mean ",
1540
+ [
1541
+ "math/round",
1542
+ "@entity.meanValue",
1543
+ 3.0
1544
+ ]
1545
+ ],
1546
+ "type": "typography",
1547
+ "variant": "caption"
1548
+ }
1077
1549
  ],
1078
- "type": "typography",
1079
- "variant": "caption"
1550
+ "direction": "vertical",
1551
+ "gap": "xs",
1552
+ "type": "stack"
1080
1553
  }
1081
1554
  ],
1082
1555
  "direction": "vertical",
@@ -1104,7 +1577,10 @@
1104
1577
  [
1105
1578
  "set",
1106
1579
  "@entity.running",
1107
- true
1580
+ [
1581
+ "not",
1582
+ "@entity.running"
1583
+ ]
1108
1584
  ],
1109
1585
  [
1110
1586
  "render-ui",
@@ -1114,79 +1590,1010 @@
1114
1590
  {
1115
1591
  "children": [
1116
1592
  {
1117
- "content": "@entity.title",
1118
- "type": "typography",
1119
- "variant": "h4"
1120
- },
1121
- {
1122
- "content": "@config.taskText",
1123
- "type": "typography",
1124
- "variant": "body"
1125
- },
1126
- {
1593
+ "align": "start",
1127
1594
  "children": [
1128
1595
  {
1129
- "action": "RUN",
1130
- "disabled": [
1131
- "if",
1596
+ "children": [
1597
+ {
1598
+ "content": "@entity.title",
1599
+ "type": "typography",
1600
+ "variant": "h4"
1601
+ },
1132
1602
  [
1133
- "and",
1603
+ "if",
1134
1604
  [
1135
1605
  "==",
1136
- "@entity.running",
1137
- false
1606
+ "@config.summary",
1607
+ ""
1138
1608
  ],
1139
- [
1140
- "<",
1141
- "@entity.t",
1142
- "@config.duration"
1143
- ]
1144
- ],
1145
- false,
1146
- true
1609
+ null,
1610
+ {
1611
+ "color": "muted",
1612
+ "content": "@config.summary",
1613
+ "type": "typography",
1614
+ "variant": "body2"
1615
+ }
1616
+ ]
1147
1617
  ],
1148
- "label": "Run",
1149
- "type": "button",
1150
- "variant": "primary"
1618
+ "direction": "vertical",
1619
+ "gap": "xs",
1620
+ "type": "stack"
1151
1621
  },
1152
1622
  {
1153
- "action": "PAUSE",
1154
- "disabled": [
1623
+ "label": [
1155
1624
  "if",
1156
- "@entity.running",
1157
- false,
1158
- true
1625
+ [
1626
+ ">=",
1627
+ "@entity.t",
1628
+ "@config.duration"
1629
+ ],
1630
+ "Done",
1631
+ [
1632
+ "if",
1633
+ "@entity.running",
1634
+ "Measuring…",
1635
+ "Paused"
1636
+ ]
1159
1637
  ],
1160
- "label": "Pause",
1161
- "type": "button",
1162
- "variant": "secondary"
1163
- },
1164
- {
1165
- "action": "PROBE",
1166
- "disabled": [
1638
+ "type": "badge",
1639
+ "variant": [
1167
1640
  "if",
1168
1641
  [
1169
- ">",
1642
+ ">=",
1643
+ "@entity.t",
1644
+ "@config.duration"
1645
+ ],
1646
+ "success",
1647
+ [
1648
+ "if",
1649
+ "@entity.running",
1650
+ "primary",
1651
+ "neutral"
1652
+ ]
1653
+ ]
1654
+ }
1655
+ ],
1656
+ "direction": "horizontal",
1657
+ "gap": "md",
1658
+ "justify": "between",
1659
+ "type": "stack"
1660
+ },
1661
+ {
1662
+ "align": "center",
1663
+ "children": [
1664
+ [
1665
+ "if",
1666
+ "@entity.running",
1667
+ {
1668
+ "action": "TOGGLE_RUN",
1669
+ "aria-pressed": "true",
1670
+ "icon": "pause",
1671
+ "label": "Pause",
1672
+ "type": "button",
1673
+ "variant": "primary"
1674
+ },
1675
+ {
1676
+ "action": "TOGGLE_RUN",
1677
+ "aria-pressed": "false",
1678
+ "disabled": [
1679
+ ">=",
1170
1680
  "@entity.t",
1171
- 0.0
1681
+ "@config.duration"
1172
1682
  ],
1173
- false,
1174
- true
1683
+ "icon": "play",
1684
+ "label": "Play",
1685
+ "type": "button",
1686
+ "variant": "primary"
1687
+ }
1688
+ ],
1689
+ {
1690
+ "action": "PROBE",
1691
+ "disabled": [
1692
+ "<=",
1693
+ "@entity.t",
1694
+ 0.0
1175
1695
  ],
1696
+ "icon": "plus",
1176
1697
  "label": "@config.probeLabel",
1177
1698
  "type": "button",
1178
- "variant": "primary"
1699
+ "variant": "secondary"
1179
1700
  },
1180
1701
  {
1181
1702
  "action": "RESET",
1703
+ "icon": "rotate-ccw",
1182
1704
  "label": "Reset",
1183
1705
  "type": "button",
1184
1706
  "variant": "ghost"
1185
- }
1186
- ],
1187
- "direction": "horizontal",
1707
+ },
1708
+ {
1709
+ "align": "center",
1710
+ "aria-label": "Speed",
1711
+ "children": [
1712
+ {
1713
+ "action": "SPEED_SET",
1714
+ "actionPayload": {
1715
+ "speed": 0.5
1716
+ },
1717
+ "aria-pressed": [
1718
+ "if",
1719
+ [
1720
+ "==",
1721
+ "@entity.speed",
1722
+ 0.5
1723
+ ],
1724
+ "true",
1725
+ "false"
1726
+ ],
1727
+ "label": "0.5×",
1728
+ "size": "sm",
1729
+ "type": "button",
1730
+ "variant": [
1731
+ "if",
1732
+ [
1733
+ "==",
1734
+ "@entity.speed",
1735
+ 0.5
1736
+ ],
1737
+ "secondary",
1738
+ "ghost"
1739
+ ]
1740
+ },
1741
+ {
1742
+ "action": "SPEED_SET",
1743
+ "actionPayload": {
1744
+ "speed": 1.0
1745
+ },
1746
+ "aria-pressed": [
1747
+ "if",
1748
+ [
1749
+ "==",
1750
+ "@entity.speed",
1751
+ 1.0
1752
+ ],
1753
+ "true",
1754
+ "false"
1755
+ ],
1756
+ "label": "1×",
1757
+ "size": "sm",
1758
+ "type": "button",
1759
+ "variant": [
1760
+ "if",
1761
+ [
1762
+ "==",
1763
+ "@entity.speed",
1764
+ 1.0
1765
+ ],
1766
+ "secondary",
1767
+ "ghost"
1768
+ ]
1769
+ },
1770
+ {
1771
+ "action": "SPEED_SET",
1772
+ "actionPayload": {
1773
+ "speed": 2.0
1774
+ },
1775
+ "aria-pressed": [
1776
+ "if",
1777
+ [
1778
+ "==",
1779
+ "@entity.speed",
1780
+ 2.0
1781
+ ],
1782
+ "true",
1783
+ "false"
1784
+ ],
1785
+ "label": "2×",
1786
+ "size": "sm",
1787
+ "type": "button",
1788
+ "variant": [
1789
+ "if",
1790
+ [
1791
+ "==",
1792
+ "@entity.speed",
1793
+ 2.0
1794
+ ],
1795
+ "secondary",
1796
+ "ghost"
1797
+ ]
1798
+ },
1799
+ {
1800
+ "action": "SPEED_SET",
1801
+ "actionPayload": {
1802
+ "speed": 4.0
1803
+ },
1804
+ "aria-pressed": [
1805
+ "if",
1806
+ [
1807
+ "==",
1808
+ "@entity.speed",
1809
+ 4.0
1810
+ ],
1811
+ "true",
1812
+ "false"
1813
+ ],
1814
+ "label": "4×",
1815
+ "size": "sm",
1816
+ "type": "button",
1817
+ "variant": [
1818
+ "if",
1819
+ [
1820
+ "==",
1821
+ "@entity.speed",
1822
+ 4.0
1823
+ ],
1824
+ "secondary",
1825
+ "ghost"
1826
+ ]
1827
+ }
1828
+ ],
1829
+ "direction": "horizontal",
1830
+ "gap": "xs",
1831
+ "role": "group",
1832
+ "type": "stack"
1833
+ },
1834
+ {
1835
+ "color": "muted",
1836
+ "content": [
1837
+ "str/concat",
1838
+ "t = ",
1839
+ [
1840
+ "math/round",
1841
+ "@entity.t",
1842
+ 1.0
1843
+ ],
1844
+ " of ",
1845
+ "@config.duration",
1846
+ " s"
1847
+ ],
1848
+ "type": "typography",
1849
+ "variant": "caption"
1850
+ }
1851
+ ],
1852
+ "direction": "horizontal",
1853
+ "gap": "sm",
1854
+ "type": "stack",
1855
+ "wrap": true
1856
+ },
1857
+ {
1858
+ "animate": false,
1859
+ "curves": "@entity.traceCurves",
1860
+ "gridStep": "@config.gridStep",
1861
+ "height": "@config.height",
1862
+ "interactive": false,
1863
+ "keyMap": {
1864
+ "Enter": "PROBE",
1865
+ "KeyR": "RESET",
1866
+ "Space": "TOGGLE_RUN"
1867
+ },
1868
+ "points": "@entity.points",
1869
+ "shapes": [],
1870
+ "showAxes": true,
1871
+ "showGrid": true,
1872
+ "title": "",
1873
+ "type": "math-canvas",
1874
+ "vectors": [],
1875
+ "width": "@config.width",
1876
+ "xMax": "@config.duration",
1877
+ "xMin": 0.0,
1878
+ "yMax": "@config.valueMax",
1879
+ "yMin": "@config.valueMin"
1880
+ },
1881
+ {
1882
+ "children": [
1883
+ {
1884
+ "content": "@config.taskText",
1885
+ "type": "typography",
1886
+ "variant": "body"
1887
+ },
1888
+ {
1889
+ "color": "muted",
1890
+ "content": [
1891
+ "str/concat",
1892
+ "@config.valueLabel",
1893
+ " = ",
1894
+ [
1895
+ "math/round",
1896
+ "@entity.value",
1897
+ 3.0
1898
+ ],
1899
+ " · ",
1900
+ "@entity.sampleCount",
1901
+ " recorded · mean ",
1902
+ [
1903
+ "math/round",
1904
+ "@entity.meanValue",
1905
+ 3.0
1906
+ ]
1907
+ ],
1908
+ "type": "typography",
1909
+ "variant": "caption"
1910
+ }
1911
+ ],
1912
+ "direction": "vertical",
1913
+ "gap": "xs",
1914
+ "type": "stack"
1915
+ }
1916
+ ],
1917
+ "direction": "vertical",
1918
+ "gap": "md",
1919
+ "type": "stack"
1920
+ }
1921
+ ],
1922
+ "padding": "md",
1923
+ "type": "box"
1924
+ }
1925
+ ],
1926
+ [
1927
+ "emit",
1928
+ "RUN_TOGGLED",
1929
+ {
1930
+ "running": "@entity.running"
1931
+ }
1932
+ ]
1933
+ ],
1934
+ "event": "TOGGLE_RUN",
1935
+ "eventId": "evt_01M41M1H3N21H25P8DJY3D9KWW",
1936
+ "from": "idle",
1937
+ "guard": [
1938
+ "and",
1939
+ [
1940
+ "==",
1941
+ "@entity.active",
1942
+ true
1943
+ ],
1944
+ [
1945
+ "or",
1946
+ [
1947
+ "==",
1948
+ "@entity.running",
1949
+ true
1950
+ ],
1951
+ [
1952
+ "<",
1953
+ "@entity.t",
1954
+ "@config.duration"
1955
+ ]
1956
+ ]
1957
+ ],
1958
+ "to": "idle"
1959
+ },
1960
+ {
1961
+ "effects": [
1962
+ [
1963
+ "set",
1964
+ "@entity.speed",
1965
+ "@payload.speed"
1966
+ ],
1967
+ [
1968
+ "render-ui",
1969
+ "main",
1970
+ {
1971
+ "children": [
1972
+ {
1973
+ "children": [
1974
+ {
1975
+ "align": "start",
1976
+ "children": [
1977
+ {
1978
+ "children": [
1979
+ {
1980
+ "content": "@entity.title",
1981
+ "type": "typography",
1982
+ "variant": "h4"
1983
+ },
1984
+ [
1985
+ "if",
1986
+ [
1987
+ "==",
1988
+ "@config.summary",
1989
+ ""
1990
+ ],
1991
+ null,
1992
+ {
1993
+ "color": "muted",
1994
+ "content": "@config.summary",
1995
+ "type": "typography",
1996
+ "variant": "body2"
1997
+ }
1998
+ ]
1999
+ ],
2000
+ "direction": "vertical",
2001
+ "gap": "xs",
2002
+ "type": "stack"
2003
+ },
2004
+ {
2005
+ "label": [
2006
+ "if",
2007
+ [
2008
+ ">=",
2009
+ "@entity.t",
2010
+ "@config.duration"
2011
+ ],
2012
+ "Done",
2013
+ [
2014
+ "if",
2015
+ "@entity.running",
2016
+ "Measuring…",
2017
+ "Paused"
2018
+ ]
2019
+ ],
2020
+ "type": "badge",
2021
+ "variant": [
2022
+ "if",
2023
+ [
2024
+ ">=",
2025
+ "@entity.t",
2026
+ "@config.duration"
2027
+ ],
2028
+ "success",
2029
+ [
2030
+ "if",
2031
+ "@entity.running",
2032
+ "primary",
2033
+ "neutral"
2034
+ ]
2035
+ ]
2036
+ }
2037
+ ],
2038
+ "direction": "horizontal",
2039
+ "gap": "md",
2040
+ "justify": "between",
2041
+ "type": "stack"
2042
+ },
2043
+ {
2044
+ "align": "center",
2045
+ "children": [
2046
+ [
2047
+ "if",
2048
+ "@entity.running",
2049
+ {
2050
+ "action": "TOGGLE_RUN",
2051
+ "aria-pressed": "true",
2052
+ "icon": "pause",
2053
+ "label": "Pause",
2054
+ "type": "button",
2055
+ "variant": "primary"
2056
+ },
2057
+ {
2058
+ "action": "TOGGLE_RUN",
2059
+ "aria-pressed": "false",
2060
+ "disabled": [
2061
+ ">=",
2062
+ "@entity.t",
2063
+ "@config.duration"
2064
+ ],
2065
+ "icon": "play",
2066
+ "label": "Play",
2067
+ "type": "button",
2068
+ "variant": "primary"
2069
+ }
2070
+ ],
2071
+ {
2072
+ "action": "PROBE",
2073
+ "disabled": [
2074
+ "<=",
2075
+ "@entity.t",
2076
+ 0.0
2077
+ ],
2078
+ "icon": "plus",
2079
+ "label": "@config.probeLabel",
2080
+ "type": "button",
2081
+ "variant": "secondary"
2082
+ },
2083
+ {
2084
+ "action": "RESET",
2085
+ "icon": "rotate-ccw",
2086
+ "label": "Reset",
2087
+ "type": "button",
2088
+ "variant": "ghost"
2089
+ },
2090
+ {
2091
+ "align": "center",
2092
+ "aria-label": "Speed",
2093
+ "children": [
2094
+ {
2095
+ "action": "SPEED_SET",
2096
+ "actionPayload": {
2097
+ "speed": 0.5
2098
+ },
2099
+ "aria-pressed": [
2100
+ "if",
2101
+ [
2102
+ "==",
2103
+ "@entity.speed",
2104
+ 0.5
2105
+ ],
2106
+ "true",
2107
+ "false"
2108
+ ],
2109
+ "label": "0.5×",
2110
+ "size": "sm",
2111
+ "type": "button",
2112
+ "variant": [
2113
+ "if",
2114
+ [
2115
+ "==",
2116
+ "@entity.speed",
2117
+ 0.5
2118
+ ],
2119
+ "secondary",
2120
+ "ghost"
2121
+ ]
2122
+ },
2123
+ {
2124
+ "action": "SPEED_SET",
2125
+ "actionPayload": {
2126
+ "speed": 1.0
2127
+ },
2128
+ "aria-pressed": [
2129
+ "if",
2130
+ [
2131
+ "==",
2132
+ "@entity.speed",
2133
+ 1.0
2134
+ ],
2135
+ "true",
2136
+ "false"
2137
+ ],
2138
+ "label": "1×",
2139
+ "size": "sm",
2140
+ "type": "button",
2141
+ "variant": [
2142
+ "if",
2143
+ [
2144
+ "==",
2145
+ "@entity.speed",
2146
+ 1.0
2147
+ ],
2148
+ "secondary",
2149
+ "ghost"
2150
+ ]
2151
+ },
2152
+ {
2153
+ "action": "SPEED_SET",
2154
+ "actionPayload": {
2155
+ "speed": 2.0
2156
+ },
2157
+ "aria-pressed": [
2158
+ "if",
2159
+ [
2160
+ "==",
2161
+ "@entity.speed",
2162
+ 2.0
2163
+ ],
2164
+ "true",
2165
+ "false"
2166
+ ],
2167
+ "label": "2×",
2168
+ "size": "sm",
2169
+ "type": "button",
2170
+ "variant": [
2171
+ "if",
2172
+ [
2173
+ "==",
2174
+ "@entity.speed",
2175
+ 2.0
2176
+ ],
2177
+ "secondary",
2178
+ "ghost"
2179
+ ]
2180
+ },
2181
+ {
2182
+ "action": "SPEED_SET",
2183
+ "actionPayload": {
2184
+ "speed": 4.0
2185
+ },
2186
+ "aria-pressed": [
2187
+ "if",
2188
+ [
2189
+ "==",
2190
+ "@entity.speed",
2191
+ 4.0
2192
+ ],
2193
+ "true",
2194
+ "false"
2195
+ ],
2196
+ "label": "4×",
2197
+ "size": "sm",
2198
+ "type": "button",
2199
+ "variant": [
2200
+ "if",
2201
+ [
2202
+ "==",
2203
+ "@entity.speed",
2204
+ 4.0
2205
+ ],
2206
+ "secondary",
2207
+ "ghost"
2208
+ ]
2209
+ }
2210
+ ],
2211
+ "direction": "horizontal",
2212
+ "gap": "xs",
2213
+ "role": "group",
2214
+ "type": "stack"
2215
+ },
2216
+ {
2217
+ "color": "muted",
2218
+ "content": [
2219
+ "str/concat",
2220
+ "t = ",
2221
+ [
2222
+ "math/round",
2223
+ "@entity.t",
2224
+ 1.0
2225
+ ],
2226
+ " of ",
2227
+ "@config.duration",
2228
+ " s"
2229
+ ],
2230
+ "type": "typography",
2231
+ "variant": "caption"
2232
+ }
2233
+ ],
2234
+ "direction": "horizontal",
2235
+ "gap": "sm",
2236
+ "type": "stack",
2237
+ "wrap": true
2238
+ },
2239
+ {
2240
+ "animate": false,
2241
+ "curves": "@entity.traceCurves",
2242
+ "gridStep": "@config.gridStep",
2243
+ "height": "@config.height",
2244
+ "interactive": false,
2245
+ "keyMap": {
2246
+ "Enter": "PROBE",
2247
+ "KeyR": "RESET",
2248
+ "Space": "TOGGLE_RUN"
2249
+ },
2250
+ "points": "@entity.points",
2251
+ "shapes": [],
2252
+ "showAxes": true,
2253
+ "showGrid": true,
2254
+ "title": "",
2255
+ "type": "math-canvas",
2256
+ "vectors": [],
2257
+ "width": "@config.width",
2258
+ "xMax": "@config.duration",
2259
+ "xMin": 0.0,
2260
+ "yMax": "@config.valueMax",
2261
+ "yMin": "@config.valueMin"
2262
+ },
2263
+ {
2264
+ "children": [
2265
+ {
2266
+ "content": "@config.taskText",
2267
+ "type": "typography",
2268
+ "variant": "body"
2269
+ },
2270
+ {
2271
+ "color": "muted",
2272
+ "content": [
2273
+ "str/concat",
2274
+ "@config.valueLabel",
2275
+ " = ",
2276
+ [
2277
+ "math/round",
2278
+ "@entity.value",
2279
+ 3.0
2280
+ ],
2281
+ " · ",
2282
+ "@entity.sampleCount",
2283
+ " recorded · mean ",
2284
+ [
2285
+ "math/round",
2286
+ "@entity.meanValue",
2287
+ 3.0
2288
+ ]
2289
+ ],
2290
+ "type": "typography",
2291
+ "variant": "caption"
2292
+ }
2293
+ ],
2294
+ "direction": "vertical",
2295
+ "gap": "xs",
2296
+ "type": "stack"
2297
+ }
2298
+ ],
2299
+ "direction": "vertical",
2300
+ "gap": "md",
2301
+ "type": "stack"
2302
+ }
2303
+ ],
2304
+ "padding": "md",
2305
+ "type": "box"
2306
+ }
2307
+ ]
2308
+ ],
2309
+ "event": "SPEED_SET",
2310
+ "eventId": "evt_01M41M1H3NV148ESM3DRXKKF8X",
2311
+ "from": "idle",
2312
+ "guard": [
2313
+ "==",
2314
+ "@entity.active",
2315
+ true
2316
+ ],
2317
+ "to": "idle"
2318
+ },
2319
+ {
2320
+ "effects": [
2321
+ [
2322
+ "set",
2323
+ "@entity.running",
2324
+ true
2325
+ ],
2326
+ [
2327
+ "render-ui",
2328
+ "main",
2329
+ {
2330
+ "children": [
2331
+ {
2332
+ "children": [
2333
+ {
2334
+ "align": "start",
2335
+ "children": [
2336
+ {
2337
+ "children": [
2338
+ {
2339
+ "content": "@entity.title",
2340
+ "type": "typography",
2341
+ "variant": "h4"
2342
+ },
2343
+ [
2344
+ "if",
2345
+ [
2346
+ "==",
2347
+ "@config.summary",
2348
+ ""
2349
+ ],
2350
+ null,
2351
+ {
2352
+ "color": "muted",
2353
+ "content": "@config.summary",
2354
+ "type": "typography",
2355
+ "variant": "body2"
2356
+ }
2357
+ ]
2358
+ ],
2359
+ "direction": "vertical",
2360
+ "gap": "xs",
2361
+ "type": "stack"
2362
+ },
2363
+ {
2364
+ "label": [
2365
+ "if",
2366
+ [
2367
+ ">=",
2368
+ "@entity.t",
2369
+ "@config.duration"
2370
+ ],
2371
+ "Done",
2372
+ [
2373
+ "if",
2374
+ "@entity.running",
2375
+ "Measuring…",
2376
+ "Paused"
2377
+ ]
2378
+ ],
2379
+ "type": "badge",
2380
+ "variant": [
2381
+ "if",
2382
+ [
2383
+ ">=",
2384
+ "@entity.t",
2385
+ "@config.duration"
2386
+ ],
2387
+ "success",
2388
+ [
2389
+ "if",
2390
+ "@entity.running",
2391
+ "primary",
2392
+ "neutral"
2393
+ ]
2394
+ ]
2395
+ }
2396
+ ],
2397
+ "direction": "horizontal",
2398
+ "gap": "md",
2399
+ "justify": "between",
2400
+ "type": "stack"
2401
+ },
2402
+ {
2403
+ "align": "center",
2404
+ "children": [
2405
+ [
2406
+ "if",
2407
+ "@entity.running",
2408
+ {
2409
+ "action": "TOGGLE_RUN",
2410
+ "aria-pressed": "true",
2411
+ "icon": "pause",
2412
+ "label": "Pause",
2413
+ "type": "button",
2414
+ "variant": "primary"
2415
+ },
2416
+ {
2417
+ "action": "TOGGLE_RUN",
2418
+ "aria-pressed": "false",
2419
+ "disabled": [
2420
+ ">=",
2421
+ "@entity.t",
2422
+ "@config.duration"
2423
+ ],
2424
+ "icon": "play",
2425
+ "label": "Play",
2426
+ "type": "button",
2427
+ "variant": "primary"
2428
+ }
2429
+ ],
2430
+ {
2431
+ "action": "PROBE",
2432
+ "disabled": [
2433
+ "<=",
2434
+ "@entity.t",
2435
+ 0.0
2436
+ ],
2437
+ "icon": "plus",
2438
+ "label": "@config.probeLabel",
2439
+ "type": "button",
2440
+ "variant": "secondary"
2441
+ },
2442
+ {
2443
+ "action": "RESET",
2444
+ "icon": "rotate-ccw",
2445
+ "label": "Reset",
2446
+ "type": "button",
2447
+ "variant": "ghost"
2448
+ },
2449
+ {
2450
+ "align": "center",
2451
+ "aria-label": "Speed",
2452
+ "children": [
2453
+ {
2454
+ "action": "SPEED_SET",
2455
+ "actionPayload": {
2456
+ "speed": 0.5
2457
+ },
2458
+ "aria-pressed": [
2459
+ "if",
2460
+ [
2461
+ "==",
2462
+ "@entity.speed",
2463
+ 0.5
2464
+ ],
2465
+ "true",
2466
+ "false"
2467
+ ],
2468
+ "label": "0.5×",
2469
+ "size": "sm",
2470
+ "type": "button",
2471
+ "variant": [
2472
+ "if",
2473
+ [
2474
+ "==",
2475
+ "@entity.speed",
2476
+ 0.5
2477
+ ],
2478
+ "secondary",
2479
+ "ghost"
2480
+ ]
2481
+ },
2482
+ {
2483
+ "action": "SPEED_SET",
2484
+ "actionPayload": {
2485
+ "speed": 1.0
2486
+ },
2487
+ "aria-pressed": [
2488
+ "if",
2489
+ [
2490
+ "==",
2491
+ "@entity.speed",
2492
+ 1.0
2493
+ ],
2494
+ "true",
2495
+ "false"
2496
+ ],
2497
+ "label": "1×",
2498
+ "size": "sm",
2499
+ "type": "button",
2500
+ "variant": [
2501
+ "if",
2502
+ [
2503
+ "==",
2504
+ "@entity.speed",
2505
+ 1.0
2506
+ ],
2507
+ "secondary",
2508
+ "ghost"
2509
+ ]
2510
+ },
2511
+ {
2512
+ "action": "SPEED_SET",
2513
+ "actionPayload": {
2514
+ "speed": 2.0
2515
+ },
2516
+ "aria-pressed": [
2517
+ "if",
2518
+ [
2519
+ "==",
2520
+ "@entity.speed",
2521
+ 2.0
2522
+ ],
2523
+ "true",
2524
+ "false"
2525
+ ],
2526
+ "label": "2×",
2527
+ "size": "sm",
2528
+ "type": "button",
2529
+ "variant": [
2530
+ "if",
2531
+ [
2532
+ "==",
2533
+ "@entity.speed",
2534
+ 2.0
2535
+ ],
2536
+ "secondary",
2537
+ "ghost"
2538
+ ]
2539
+ },
2540
+ {
2541
+ "action": "SPEED_SET",
2542
+ "actionPayload": {
2543
+ "speed": 4.0
2544
+ },
2545
+ "aria-pressed": [
2546
+ "if",
2547
+ [
2548
+ "==",
2549
+ "@entity.speed",
2550
+ 4.0
2551
+ ],
2552
+ "true",
2553
+ "false"
2554
+ ],
2555
+ "label": "4×",
2556
+ "size": "sm",
2557
+ "type": "button",
2558
+ "variant": [
2559
+ "if",
2560
+ [
2561
+ "==",
2562
+ "@entity.speed",
2563
+ 4.0
2564
+ ],
2565
+ "secondary",
2566
+ "ghost"
2567
+ ]
2568
+ }
2569
+ ],
2570
+ "direction": "horizontal",
2571
+ "gap": "xs",
2572
+ "role": "group",
2573
+ "type": "stack"
2574
+ },
2575
+ {
2576
+ "color": "muted",
2577
+ "content": [
2578
+ "str/concat",
2579
+ "t = ",
2580
+ [
2581
+ "math/round",
2582
+ "@entity.t",
2583
+ 1.0
2584
+ ],
2585
+ " of ",
2586
+ "@config.duration",
2587
+ " s"
2588
+ ],
2589
+ "type": "typography",
2590
+ "variant": "caption"
2591
+ }
2592
+ ],
2593
+ "direction": "horizontal",
1188
2594
  "gap": "sm",
1189
- "type": "stack"
2595
+ "type": "stack",
2596
+ "wrap": true
1190
2597
  },
1191
2598
  {
1192
2599
  "animate": false,
@@ -1194,6 +2601,11 @@
1194
2601
  "gridStep": "@config.gridStep",
1195
2602
  "height": "@config.height",
1196
2603
  "interactive": false,
2604
+ "keyMap": {
2605
+ "Enter": "PROBE",
2606
+ "KeyR": "RESET",
2607
+ "Space": "TOGGLE_RUN"
2608
+ },
1197
2609
  "points": "@entity.points",
1198
2610
  "shapes": [],
1199
2611
  "showAxes": true,
@@ -1208,46 +2620,39 @@
1208
2620
  "yMin": "@config.valueMin"
1209
2621
  },
1210
2622
  {
1211
- "content": [
1212
- "str/concat",
1213
- "t = ",
1214
- [
1215
- "math/round",
1216
- "@entity.t",
1217
- 1.0
1218
- ],
1219
- "s · ",
1220
- "@config.valueLabel",
1221
- " = ",
1222
- [
1223
- "math/round",
1224
- "@entity.value",
1225
- 3.0
1226
- ]
1227
- ],
1228
- "type": "typography",
1229
- "variant": "body"
1230
- },
1231
- {
1232
- "content": [
1233
- "str/concat",
1234
- "Samples recorded: ",
1235
- [
1236
- "str/concat",
1237
- "",
1238
- "@entity.sampleCount"
1239
- ],
1240
- " · mean ",
1241
- "@config.valueLabel",
1242
- ": ",
1243
- [
1244
- "math/round",
1245
- "@entity.meanValue",
1246
- 3.0
1247
- ]
2623
+ "children": [
2624
+ {
2625
+ "content": "@config.taskText",
2626
+ "type": "typography",
2627
+ "variant": "body"
2628
+ },
2629
+ {
2630
+ "color": "muted",
2631
+ "content": [
2632
+ "str/concat",
2633
+ "@config.valueLabel",
2634
+ " = ",
2635
+ [
2636
+ "math/round",
2637
+ "@entity.value",
2638
+ 3.0
2639
+ ],
2640
+ " · ",
2641
+ "@entity.sampleCount",
2642
+ " recorded · mean ",
2643
+ [
2644
+ "math/round",
2645
+ "@entity.meanValue",
2646
+ 3.0
2647
+ ]
2648
+ ],
2649
+ "type": "typography",
2650
+ "variant": "caption"
2651
+ }
1248
2652
  ],
1249
- "type": "typography",
1250
- "variant": "caption"
2653
+ "direction": "vertical",
2654
+ "gap": "xs",
2655
+ "type": "stack"
1251
2656
  }
1252
2657
  ],
1253
2658
  "direction": "vertical",
@@ -1308,79 +2713,269 @@
1308
2713
  {
1309
2714
  "children": [
1310
2715
  {
1311
- "content": "@entity.title",
1312
- "type": "typography",
1313
- "variant": "h4"
1314
- },
1315
- {
1316
- "content": "@config.taskText",
1317
- "type": "typography",
1318
- "variant": "body"
1319
- },
1320
- {
2716
+ "align": "start",
1321
2717
  "children": [
1322
2718
  {
1323
- "action": "RUN",
1324
- "disabled": [
1325
- "if",
2719
+ "children": [
2720
+ {
2721
+ "content": "@entity.title",
2722
+ "type": "typography",
2723
+ "variant": "h4"
2724
+ },
1326
2725
  [
1327
- "and",
2726
+ "if",
1328
2727
  [
1329
2728
  "==",
1330
- "@entity.running",
1331
- false
2729
+ "@config.summary",
2730
+ ""
1332
2731
  ],
1333
- [
1334
- "<",
1335
- "@entity.t",
1336
- "@config.duration"
1337
- ]
1338
- ],
1339
- false,
1340
- true
2732
+ null,
2733
+ {
2734
+ "color": "muted",
2735
+ "content": "@config.summary",
2736
+ "type": "typography",
2737
+ "variant": "body2"
2738
+ }
2739
+ ]
1341
2740
  ],
1342
- "label": "Run",
1343
- "type": "button",
1344
- "variant": "primary"
2741
+ "direction": "vertical",
2742
+ "gap": "xs",
2743
+ "type": "stack"
1345
2744
  },
1346
2745
  {
1347
- "action": "PAUSE",
1348
- "disabled": [
2746
+ "label": [
1349
2747
  "if",
1350
- "@entity.running",
1351
- false,
1352
- true
2748
+ [
2749
+ ">=",
2750
+ "@entity.t",
2751
+ "@config.duration"
2752
+ ],
2753
+ "Done",
2754
+ [
2755
+ "if",
2756
+ "@entity.running",
2757
+ "Measuring…",
2758
+ "Paused"
2759
+ ]
1353
2760
  ],
1354
- "label": "Pause",
1355
- "type": "button",
1356
- "variant": "secondary"
1357
- },
1358
- {
1359
- "action": "PROBE",
1360
- "disabled": [
2761
+ "type": "badge",
2762
+ "variant": [
1361
2763
  "if",
1362
2764
  [
1363
- ">",
2765
+ ">=",
2766
+ "@entity.t",
2767
+ "@config.duration"
2768
+ ],
2769
+ "success",
2770
+ [
2771
+ "if",
2772
+ "@entity.running",
2773
+ "primary",
2774
+ "neutral"
2775
+ ]
2776
+ ]
2777
+ }
2778
+ ],
2779
+ "direction": "horizontal",
2780
+ "gap": "md",
2781
+ "justify": "between",
2782
+ "type": "stack"
2783
+ },
2784
+ {
2785
+ "align": "center",
2786
+ "children": [
2787
+ [
2788
+ "if",
2789
+ "@entity.running",
2790
+ {
2791
+ "action": "TOGGLE_RUN",
2792
+ "aria-pressed": "true",
2793
+ "icon": "pause",
2794
+ "label": "Pause",
2795
+ "type": "button",
2796
+ "variant": "primary"
2797
+ },
2798
+ {
2799
+ "action": "TOGGLE_RUN",
2800
+ "aria-pressed": "false",
2801
+ "disabled": [
2802
+ ">=",
1364
2803
  "@entity.t",
1365
- 0.0
2804
+ "@config.duration"
1366
2805
  ],
1367
- false,
1368
- true
2806
+ "icon": "play",
2807
+ "label": "Play",
2808
+ "type": "button",
2809
+ "variant": "primary"
2810
+ }
2811
+ ],
2812
+ {
2813
+ "action": "PROBE",
2814
+ "disabled": [
2815
+ "<=",
2816
+ "@entity.t",
2817
+ 0.0
1369
2818
  ],
2819
+ "icon": "plus",
1370
2820
  "label": "@config.probeLabel",
1371
2821
  "type": "button",
1372
- "variant": "primary"
2822
+ "variant": "secondary"
1373
2823
  },
1374
2824
  {
1375
2825
  "action": "RESET",
2826
+ "icon": "rotate-ccw",
1376
2827
  "label": "Reset",
1377
2828
  "type": "button",
1378
2829
  "variant": "ghost"
2830
+ },
2831
+ {
2832
+ "align": "center",
2833
+ "aria-label": "Speed",
2834
+ "children": [
2835
+ {
2836
+ "action": "SPEED_SET",
2837
+ "actionPayload": {
2838
+ "speed": 0.5
2839
+ },
2840
+ "aria-pressed": [
2841
+ "if",
2842
+ [
2843
+ "==",
2844
+ "@entity.speed",
2845
+ 0.5
2846
+ ],
2847
+ "true",
2848
+ "false"
2849
+ ],
2850
+ "label": "0.5×",
2851
+ "size": "sm",
2852
+ "type": "button",
2853
+ "variant": [
2854
+ "if",
2855
+ [
2856
+ "==",
2857
+ "@entity.speed",
2858
+ 0.5
2859
+ ],
2860
+ "secondary",
2861
+ "ghost"
2862
+ ]
2863
+ },
2864
+ {
2865
+ "action": "SPEED_SET",
2866
+ "actionPayload": {
2867
+ "speed": 1.0
2868
+ },
2869
+ "aria-pressed": [
2870
+ "if",
2871
+ [
2872
+ "==",
2873
+ "@entity.speed",
2874
+ 1.0
2875
+ ],
2876
+ "true",
2877
+ "false"
2878
+ ],
2879
+ "label": "1×",
2880
+ "size": "sm",
2881
+ "type": "button",
2882
+ "variant": [
2883
+ "if",
2884
+ [
2885
+ "==",
2886
+ "@entity.speed",
2887
+ 1.0
2888
+ ],
2889
+ "secondary",
2890
+ "ghost"
2891
+ ]
2892
+ },
2893
+ {
2894
+ "action": "SPEED_SET",
2895
+ "actionPayload": {
2896
+ "speed": 2.0
2897
+ },
2898
+ "aria-pressed": [
2899
+ "if",
2900
+ [
2901
+ "==",
2902
+ "@entity.speed",
2903
+ 2.0
2904
+ ],
2905
+ "true",
2906
+ "false"
2907
+ ],
2908
+ "label": "2×",
2909
+ "size": "sm",
2910
+ "type": "button",
2911
+ "variant": [
2912
+ "if",
2913
+ [
2914
+ "==",
2915
+ "@entity.speed",
2916
+ 2.0
2917
+ ],
2918
+ "secondary",
2919
+ "ghost"
2920
+ ]
2921
+ },
2922
+ {
2923
+ "action": "SPEED_SET",
2924
+ "actionPayload": {
2925
+ "speed": 4.0
2926
+ },
2927
+ "aria-pressed": [
2928
+ "if",
2929
+ [
2930
+ "==",
2931
+ "@entity.speed",
2932
+ 4.0
2933
+ ],
2934
+ "true",
2935
+ "false"
2936
+ ],
2937
+ "label": "4×",
2938
+ "size": "sm",
2939
+ "type": "button",
2940
+ "variant": [
2941
+ "if",
2942
+ [
2943
+ "==",
2944
+ "@entity.speed",
2945
+ 4.0
2946
+ ],
2947
+ "secondary",
2948
+ "ghost"
2949
+ ]
2950
+ }
2951
+ ],
2952
+ "direction": "horizontal",
2953
+ "gap": "xs",
2954
+ "role": "group",
2955
+ "type": "stack"
2956
+ },
2957
+ {
2958
+ "color": "muted",
2959
+ "content": [
2960
+ "str/concat",
2961
+ "t = ",
2962
+ [
2963
+ "math/round",
2964
+ "@entity.t",
2965
+ 1.0
2966
+ ],
2967
+ " of ",
2968
+ "@config.duration",
2969
+ " s"
2970
+ ],
2971
+ "type": "typography",
2972
+ "variant": "caption"
1379
2973
  }
1380
2974
  ],
1381
2975
  "direction": "horizontal",
1382
2976
  "gap": "sm",
1383
- "type": "stack"
2977
+ "type": "stack",
2978
+ "wrap": true
1384
2979
  },
1385
2980
  {
1386
2981
  "animate": false,
@@ -1388,6 +2983,11 @@
1388
2983
  "gridStep": "@config.gridStep",
1389
2984
  "height": "@config.height",
1390
2985
  "interactive": false,
2986
+ "keyMap": {
2987
+ "Enter": "PROBE",
2988
+ "KeyR": "RESET",
2989
+ "Space": "TOGGLE_RUN"
2990
+ },
1391
2991
  "points": "@entity.points",
1392
2992
  "shapes": [],
1393
2993
  "showAxes": true,
@@ -1402,46 +3002,39 @@
1402
3002
  "yMin": "@config.valueMin"
1403
3003
  },
1404
3004
  {
1405
- "content": [
1406
- "str/concat",
1407
- "t = ",
1408
- [
1409
- "math/round",
1410
- "@entity.t",
1411
- 1.0
1412
- ],
1413
- "s · ",
1414
- "@config.valueLabel",
1415
- " = ",
1416
- [
1417
- "math/round",
1418
- "@entity.value",
1419
- 3.0
1420
- ]
1421
- ],
1422
- "type": "typography",
1423
- "variant": "body"
1424
- },
1425
- {
1426
- "content": [
1427
- "str/concat",
1428
- "Samples recorded: ",
1429
- [
1430
- "str/concat",
1431
- "",
1432
- "@entity.sampleCount"
1433
- ],
1434
- " · mean ",
1435
- "@config.valueLabel",
1436
- ": ",
1437
- [
1438
- "math/round",
1439
- "@entity.meanValue",
1440
- 3.0
1441
- ]
3005
+ "children": [
3006
+ {
3007
+ "content": "@config.taskText",
3008
+ "type": "typography",
3009
+ "variant": "body"
3010
+ },
3011
+ {
3012
+ "color": "muted",
3013
+ "content": [
3014
+ "str/concat",
3015
+ "@config.valueLabel",
3016
+ " = ",
3017
+ [
3018
+ "math/round",
3019
+ "@entity.value",
3020
+ 3.0
3021
+ ],
3022
+ " · ",
3023
+ "@entity.sampleCount",
3024
+ " recorded · mean ",
3025
+ [
3026
+ "math/round",
3027
+ "@entity.meanValue",
3028
+ 3.0
3029
+ ]
3030
+ ],
3031
+ "type": "typography",
3032
+ "variant": "caption"
3033
+ }
1442
3034
  ],
1443
- "type": "typography",
1444
- "variant": "caption"
3035
+ "direction": "vertical",
3036
+ "gap": "xs",
3037
+ "type": "stack"
1445
3038
  }
1446
3039
  ],
1447
3040
  "direction": "vertical",
@@ -1530,79 +3123,269 @@
1530
3123
  {
1531
3124
  "children": [
1532
3125
  {
1533
- "content": "@entity.title",
1534
- "type": "typography",
1535
- "variant": "h4"
1536
- },
1537
- {
1538
- "content": "@config.taskText",
1539
- "type": "typography",
1540
- "variant": "body"
1541
- },
1542
- {
3126
+ "align": "start",
1543
3127
  "children": [
1544
3128
  {
1545
- "action": "RUN",
1546
- "disabled": [
1547
- "if",
3129
+ "children": [
3130
+ {
3131
+ "content": "@entity.title",
3132
+ "type": "typography",
3133
+ "variant": "h4"
3134
+ },
1548
3135
  [
1549
- "and",
3136
+ "if",
1550
3137
  [
1551
3138
  "==",
1552
- "@entity.running",
1553
- false
3139
+ "@config.summary",
3140
+ ""
1554
3141
  ],
1555
- [
1556
- "<",
1557
- "@entity.t",
1558
- "@config.duration"
1559
- ]
1560
- ],
1561
- false,
1562
- true
3142
+ null,
3143
+ {
3144
+ "color": "muted",
3145
+ "content": "@config.summary",
3146
+ "type": "typography",
3147
+ "variant": "body2"
3148
+ }
3149
+ ]
1563
3150
  ],
1564
- "label": "Run",
1565
- "type": "button",
1566
- "variant": "primary"
3151
+ "direction": "vertical",
3152
+ "gap": "xs",
3153
+ "type": "stack"
1567
3154
  },
1568
3155
  {
1569
- "action": "PAUSE",
1570
- "disabled": [
3156
+ "label": [
1571
3157
  "if",
1572
- "@entity.running",
1573
- false,
1574
- true
3158
+ [
3159
+ ">=",
3160
+ "@entity.t",
3161
+ "@config.duration"
3162
+ ],
3163
+ "Done",
3164
+ [
3165
+ "if",
3166
+ "@entity.running",
3167
+ "Measuring…",
3168
+ "Paused"
3169
+ ]
1575
3170
  ],
1576
- "label": "Pause",
1577
- "type": "button",
1578
- "variant": "secondary"
1579
- },
1580
- {
1581
- "action": "PROBE",
1582
- "disabled": [
3171
+ "type": "badge",
3172
+ "variant": [
1583
3173
  "if",
1584
3174
  [
1585
- ">",
3175
+ ">=",
3176
+ "@entity.t",
3177
+ "@config.duration"
3178
+ ],
3179
+ "success",
3180
+ [
3181
+ "if",
3182
+ "@entity.running",
3183
+ "primary",
3184
+ "neutral"
3185
+ ]
3186
+ ]
3187
+ }
3188
+ ],
3189
+ "direction": "horizontal",
3190
+ "gap": "md",
3191
+ "justify": "between",
3192
+ "type": "stack"
3193
+ },
3194
+ {
3195
+ "align": "center",
3196
+ "children": [
3197
+ [
3198
+ "if",
3199
+ "@entity.running",
3200
+ {
3201
+ "action": "TOGGLE_RUN",
3202
+ "aria-pressed": "true",
3203
+ "icon": "pause",
3204
+ "label": "Pause",
3205
+ "type": "button",
3206
+ "variant": "primary"
3207
+ },
3208
+ {
3209
+ "action": "TOGGLE_RUN",
3210
+ "aria-pressed": "false",
3211
+ "disabled": [
3212
+ ">=",
1586
3213
  "@entity.t",
1587
- 0.0
3214
+ "@config.duration"
1588
3215
  ],
1589
- false,
1590
- true
3216
+ "icon": "play",
3217
+ "label": "Play",
3218
+ "type": "button",
3219
+ "variant": "primary"
3220
+ }
3221
+ ],
3222
+ {
3223
+ "action": "PROBE",
3224
+ "disabled": [
3225
+ "<=",
3226
+ "@entity.t",
3227
+ 0.0
1591
3228
  ],
3229
+ "icon": "plus",
1592
3230
  "label": "@config.probeLabel",
1593
3231
  "type": "button",
1594
- "variant": "primary"
3232
+ "variant": "secondary"
1595
3233
  },
1596
3234
  {
1597
3235
  "action": "RESET",
3236
+ "icon": "rotate-ccw",
1598
3237
  "label": "Reset",
1599
3238
  "type": "button",
1600
3239
  "variant": "ghost"
3240
+ },
3241
+ {
3242
+ "align": "center",
3243
+ "aria-label": "Speed",
3244
+ "children": [
3245
+ {
3246
+ "action": "SPEED_SET",
3247
+ "actionPayload": {
3248
+ "speed": 0.5
3249
+ },
3250
+ "aria-pressed": [
3251
+ "if",
3252
+ [
3253
+ "==",
3254
+ "@entity.speed",
3255
+ 0.5
3256
+ ],
3257
+ "true",
3258
+ "false"
3259
+ ],
3260
+ "label": "0.5×",
3261
+ "size": "sm",
3262
+ "type": "button",
3263
+ "variant": [
3264
+ "if",
3265
+ [
3266
+ "==",
3267
+ "@entity.speed",
3268
+ 0.5
3269
+ ],
3270
+ "secondary",
3271
+ "ghost"
3272
+ ]
3273
+ },
3274
+ {
3275
+ "action": "SPEED_SET",
3276
+ "actionPayload": {
3277
+ "speed": 1.0
3278
+ },
3279
+ "aria-pressed": [
3280
+ "if",
3281
+ [
3282
+ "==",
3283
+ "@entity.speed",
3284
+ 1.0
3285
+ ],
3286
+ "true",
3287
+ "false"
3288
+ ],
3289
+ "label": "1×",
3290
+ "size": "sm",
3291
+ "type": "button",
3292
+ "variant": [
3293
+ "if",
3294
+ [
3295
+ "==",
3296
+ "@entity.speed",
3297
+ 1.0
3298
+ ],
3299
+ "secondary",
3300
+ "ghost"
3301
+ ]
3302
+ },
3303
+ {
3304
+ "action": "SPEED_SET",
3305
+ "actionPayload": {
3306
+ "speed": 2.0
3307
+ },
3308
+ "aria-pressed": [
3309
+ "if",
3310
+ [
3311
+ "==",
3312
+ "@entity.speed",
3313
+ 2.0
3314
+ ],
3315
+ "true",
3316
+ "false"
3317
+ ],
3318
+ "label": "2×",
3319
+ "size": "sm",
3320
+ "type": "button",
3321
+ "variant": [
3322
+ "if",
3323
+ [
3324
+ "==",
3325
+ "@entity.speed",
3326
+ 2.0
3327
+ ],
3328
+ "secondary",
3329
+ "ghost"
3330
+ ]
3331
+ },
3332
+ {
3333
+ "action": "SPEED_SET",
3334
+ "actionPayload": {
3335
+ "speed": 4.0
3336
+ },
3337
+ "aria-pressed": [
3338
+ "if",
3339
+ [
3340
+ "==",
3341
+ "@entity.speed",
3342
+ 4.0
3343
+ ],
3344
+ "true",
3345
+ "false"
3346
+ ],
3347
+ "label": "4×",
3348
+ "size": "sm",
3349
+ "type": "button",
3350
+ "variant": [
3351
+ "if",
3352
+ [
3353
+ "==",
3354
+ "@entity.speed",
3355
+ 4.0
3356
+ ],
3357
+ "secondary",
3358
+ "ghost"
3359
+ ]
3360
+ }
3361
+ ],
3362
+ "direction": "horizontal",
3363
+ "gap": "xs",
3364
+ "role": "group",
3365
+ "type": "stack"
3366
+ },
3367
+ {
3368
+ "color": "muted",
3369
+ "content": [
3370
+ "str/concat",
3371
+ "t = ",
3372
+ [
3373
+ "math/round",
3374
+ "@entity.t",
3375
+ 1.0
3376
+ ],
3377
+ " of ",
3378
+ "@config.duration",
3379
+ " s"
3380
+ ],
3381
+ "type": "typography",
3382
+ "variant": "caption"
1601
3383
  }
1602
3384
  ],
1603
3385
  "direction": "horizontal",
1604
3386
  "gap": "sm",
1605
- "type": "stack"
3387
+ "type": "stack",
3388
+ "wrap": true
1606
3389
  },
1607
3390
  {
1608
3391
  "animate": false,
@@ -1610,6 +3393,11 @@
1610
3393
  "gridStep": "@config.gridStep",
1611
3394
  "height": "@config.height",
1612
3395
  "interactive": false,
3396
+ "keyMap": {
3397
+ "Enter": "PROBE",
3398
+ "KeyR": "RESET",
3399
+ "Space": "TOGGLE_RUN"
3400
+ },
1613
3401
  "points": "@entity.points",
1614
3402
  "shapes": [],
1615
3403
  "showAxes": true,
@@ -1624,46 +3412,39 @@
1624
3412
  "yMin": "@config.valueMin"
1625
3413
  },
1626
3414
  {
1627
- "content": [
1628
- "str/concat",
1629
- "t = ",
1630
- [
1631
- "math/round",
1632
- "@entity.t",
1633
- 1.0
1634
- ],
1635
- "s · ",
1636
- "@config.valueLabel",
1637
- " = ",
1638
- [
1639
- "math/round",
1640
- "@entity.value",
1641
- 3.0
1642
- ]
1643
- ],
1644
- "type": "typography",
1645
- "variant": "body"
1646
- },
1647
- {
1648
- "content": [
1649
- "str/concat",
1650
- "Samples recorded: ",
1651
- [
1652
- "str/concat",
1653
- "",
1654
- "@entity.sampleCount"
1655
- ],
1656
- " · mean ",
1657
- "@config.valueLabel",
1658
- ": ",
1659
- [
1660
- "math/round",
1661
- "@entity.meanValue",
1662
- 3.0
1663
- ]
3415
+ "children": [
3416
+ {
3417
+ "content": "@config.taskText",
3418
+ "type": "typography",
3419
+ "variant": "body"
3420
+ },
3421
+ {
3422
+ "color": "muted",
3423
+ "content": [
3424
+ "str/concat",
3425
+ "@config.valueLabel",
3426
+ " = ",
3427
+ [
3428
+ "math/round",
3429
+ "@entity.value",
3430
+ 3.0
3431
+ ],
3432
+ " · ",
3433
+ "@entity.sampleCount",
3434
+ " recorded · mean ",
3435
+ [
3436
+ "math/round",
3437
+ "@entity.meanValue",
3438
+ 3.0
3439
+ ]
3440
+ ],
3441
+ "type": "typography",
3442
+ "variant": "caption"
3443
+ }
1664
3444
  ],
1665
- "type": "typography",
1666
- "variant": "caption"
3445
+ "direction": "vertical",
3446
+ "gap": "xs",
3447
+ "type": "stack"
1667
3448
  }
1668
3449
  ],
1669
3450
  "direction": "vertical",
@@ -1763,79 +3544,269 @@
1763
3544
  {
1764
3545
  "children": [
1765
3546
  {
1766
- "content": "@entity.title",
1767
- "type": "typography",
1768
- "variant": "h4"
1769
- },
1770
- {
1771
- "content": "@config.taskText",
1772
- "type": "typography",
1773
- "variant": "body"
1774
- },
1775
- {
3547
+ "align": "start",
1776
3548
  "children": [
1777
3549
  {
1778
- "action": "RUN",
1779
- "disabled": [
1780
- "if",
3550
+ "children": [
3551
+ {
3552
+ "content": "@entity.title",
3553
+ "type": "typography",
3554
+ "variant": "h4"
3555
+ },
1781
3556
  [
1782
- "and",
3557
+ "if",
1783
3558
  [
1784
3559
  "==",
1785
- "@entity.running",
1786
- false
3560
+ "@config.summary",
3561
+ ""
1787
3562
  ],
1788
- [
1789
- "<",
1790
- "@entity.t",
1791
- "@config.duration"
1792
- ]
1793
- ],
1794
- false,
1795
- true
3563
+ null,
3564
+ {
3565
+ "color": "muted",
3566
+ "content": "@config.summary",
3567
+ "type": "typography",
3568
+ "variant": "body2"
3569
+ }
3570
+ ]
1796
3571
  ],
1797
- "label": "Run",
1798
- "type": "button",
1799
- "variant": "primary"
3572
+ "direction": "vertical",
3573
+ "gap": "xs",
3574
+ "type": "stack"
1800
3575
  },
1801
3576
  {
1802
- "action": "PAUSE",
1803
- "disabled": [
3577
+ "label": [
1804
3578
  "if",
1805
- "@entity.running",
1806
- false,
1807
- true
3579
+ [
3580
+ ">=",
3581
+ "@entity.t",
3582
+ "@config.duration"
3583
+ ],
3584
+ "Done",
3585
+ [
3586
+ "if",
3587
+ "@entity.running",
3588
+ "Measuring…",
3589
+ "Paused"
3590
+ ]
1808
3591
  ],
1809
- "label": "Pause",
1810
- "type": "button",
1811
- "variant": "secondary"
1812
- },
1813
- {
1814
- "action": "PROBE",
1815
- "disabled": [
3592
+ "type": "badge",
3593
+ "variant": [
1816
3594
  "if",
1817
3595
  [
1818
- ">",
3596
+ ">=",
3597
+ "@entity.t",
3598
+ "@config.duration"
3599
+ ],
3600
+ "success",
3601
+ [
3602
+ "if",
3603
+ "@entity.running",
3604
+ "primary",
3605
+ "neutral"
3606
+ ]
3607
+ ]
3608
+ }
3609
+ ],
3610
+ "direction": "horizontal",
3611
+ "gap": "md",
3612
+ "justify": "between",
3613
+ "type": "stack"
3614
+ },
3615
+ {
3616
+ "align": "center",
3617
+ "children": [
3618
+ [
3619
+ "if",
3620
+ "@entity.running",
3621
+ {
3622
+ "action": "TOGGLE_RUN",
3623
+ "aria-pressed": "true",
3624
+ "icon": "pause",
3625
+ "label": "Pause",
3626
+ "type": "button",
3627
+ "variant": "primary"
3628
+ },
3629
+ {
3630
+ "action": "TOGGLE_RUN",
3631
+ "aria-pressed": "false",
3632
+ "disabled": [
3633
+ ">=",
1819
3634
  "@entity.t",
1820
- 0.0
3635
+ "@config.duration"
1821
3636
  ],
1822
- false,
1823
- true
3637
+ "icon": "play",
3638
+ "label": "Play",
3639
+ "type": "button",
3640
+ "variant": "primary"
3641
+ }
3642
+ ],
3643
+ {
3644
+ "action": "PROBE",
3645
+ "disabled": [
3646
+ "<=",
3647
+ "@entity.t",
3648
+ 0.0
1824
3649
  ],
3650
+ "icon": "plus",
1825
3651
  "label": "@config.probeLabel",
1826
3652
  "type": "button",
1827
- "variant": "primary"
3653
+ "variant": "secondary"
1828
3654
  },
1829
3655
  {
1830
3656
  "action": "RESET",
3657
+ "icon": "rotate-ccw",
1831
3658
  "label": "Reset",
1832
3659
  "type": "button",
1833
3660
  "variant": "ghost"
3661
+ },
3662
+ {
3663
+ "align": "center",
3664
+ "aria-label": "Speed",
3665
+ "children": [
3666
+ {
3667
+ "action": "SPEED_SET",
3668
+ "actionPayload": {
3669
+ "speed": 0.5
3670
+ },
3671
+ "aria-pressed": [
3672
+ "if",
3673
+ [
3674
+ "==",
3675
+ "@entity.speed",
3676
+ 0.5
3677
+ ],
3678
+ "true",
3679
+ "false"
3680
+ ],
3681
+ "label": "0.5×",
3682
+ "size": "sm",
3683
+ "type": "button",
3684
+ "variant": [
3685
+ "if",
3686
+ [
3687
+ "==",
3688
+ "@entity.speed",
3689
+ 0.5
3690
+ ],
3691
+ "secondary",
3692
+ "ghost"
3693
+ ]
3694
+ },
3695
+ {
3696
+ "action": "SPEED_SET",
3697
+ "actionPayload": {
3698
+ "speed": 1.0
3699
+ },
3700
+ "aria-pressed": [
3701
+ "if",
3702
+ [
3703
+ "==",
3704
+ "@entity.speed",
3705
+ 1.0
3706
+ ],
3707
+ "true",
3708
+ "false"
3709
+ ],
3710
+ "label": "1×",
3711
+ "size": "sm",
3712
+ "type": "button",
3713
+ "variant": [
3714
+ "if",
3715
+ [
3716
+ "==",
3717
+ "@entity.speed",
3718
+ 1.0
3719
+ ],
3720
+ "secondary",
3721
+ "ghost"
3722
+ ]
3723
+ },
3724
+ {
3725
+ "action": "SPEED_SET",
3726
+ "actionPayload": {
3727
+ "speed": 2.0
3728
+ },
3729
+ "aria-pressed": [
3730
+ "if",
3731
+ [
3732
+ "==",
3733
+ "@entity.speed",
3734
+ 2.0
3735
+ ],
3736
+ "true",
3737
+ "false"
3738
+ ],
3739
+ "label": "2×",
3740
+ "size": "sm",
3741
+ "type": "button",
3742
+ "variant": [
3743
+ "if",
3744
+ [
3745
+ "==",
3746
+ "@entity.speed",
3747
+ 2.0
3748
+ ],
3749
+ "secondary",
3750
+ "ghost"
3751
+ ]
3752
+ },
3753
+ {
3754
+ "action": "SPEED_SET",
3755
+ "actionPayload": {
3756
+ "speed": 4.0
3757
+ },
3758
+ "aria-pressed": [
3759
+ "if",
3760
+ [
3761
+ "==",
3762
+ "@entity.speed",
3763
+ 4.0
3764
+ ],
3765
+ "true",
3766
+ "false"
3767
+ ],
3768
+ "label": "4×",
3769
+ "size": "sm",
3770
+ "type": "button",
3771
+ "variant": [
3772
+ "if",
3773
+ [
3774
+ "==",
3775
+ "@entity.speed",
3776
+ 4.0
3777
+ ],
3778
+ "secondary",
3779
+ "ghost"
3780
+ ]
3781
+ }
3782
+ ],
3783
+ "direction": "horizontal",
3784
+ "gap": "xs",
3785
+ "role": "group",
3786
+ "type": "stack"
3787
+ },
3788
+ {
3789
+ "color": "muted",
3790
+ "content": [
3791
+ "str/concat",
3792
+ "t = ",
3793
+ [
3794
+ "math/round",
3795
+ "@entity.t",
3796
+ 1.0
3797
+ ],
3798
+ " of ",
3799
+ "@config.duration",
3800
+ " s"
3801
+ ],
3802
+ "type": "typography",
3803
+ "variant": "caption"
1834
3804
  }
1835
3805
  ],
1836
3806
  "direction": "horizontal",
1837
3807
  "gap": "sm",
1838
- "type": "stack"
3808
+ "type": "stack",
3809
+ "wrap": true
1839
3810
  },
1840
3811
  {
1841
3812
  "animate": false,
@@ -1843,6 +3814,11 @@
1843
3814
  "gridStep": "@config.gridStep",
1844
3815
  "height": "@config.height",
1845
3816
  "interactive": false,
3817
+ "keyMap": {
3818
+ "Enter": "PROBE",
3819
+ "KeyR": "RESET",
3820
+ "Space": "TOGGLE_RUN"
3821
+ },
1846
3822
  "points": "@entity.points",
1847
3823
  "shapes": [],
1848
3824
  "showAxes": true,
@@ -1857,46 +3833,39 @@
1857
3833
  "yMin": "@config.valueMin"
1858
3834
  },
1859
3835
  {
1860
- "content": [
1861
- "str/concat",
1862
- "t = ",
1863
- [
1864
- "math/round",
1865
- "@entity.t",
1866
- 1.0
1867
- ],
1868
- "s · ",
1869
- "@config.valueLabel",
1870
- " = ",
1871
- [
1872
- "math/round",
1873
- "@entity.value",
1874
- 3.0
1875
- ]
1876
- ],
1877
- "type": "typography",
1878
- "variant": "body"
1879
- },
1880
- {
1881
- "content": [
1882
- "str/concat",
1883
- "Samples recorded: ",
1884
- [
1885
- "str/concat",
1886
- "",
1887
- "@entity.sampleCount"
1888
- ],
1889
- " · mean ",
1890
- "@config.valueLabel",
1891
- ": ",
1892
- [
1893
- "math/round",
1894
- "@entity.meanValue",
1895
- 3.0
1896
- ]
3836
+ "children": [
3837
+ {
3838
+ "content": "@config.taskText",
3839
+ "type": "typography",
3840
+ "variant": "body"
3841
+ },
3842
+ {
3843
+ "color": "muted",
3844
+ "content": [
3845
+ "str/concat",
3846
+ "@config.valueLabel",
3847
+ " = ",
3848
+ [
3849
+ "math/round",
3850
+ "@entity.value",
3851
+ 3.0
3852
+ ],
3853
+ " · ",
3854
+ "@entity.sampleCount",
3855
+ " recorded · mean ",
3856
+ [
3857
+ "math/round",
3858
+ "@entity.meanValue",
3859
+ 3.0
3860
+ ]
3861
+ ],
3862
+ "type": "typography",
3863
+ "variant": "caption"
3864
+ }
1897
3865
  ],
1898
- "type": "typography",
1899
- "variant": "caption"
3866
+ "direction": "vertical",
3867
+ "gap": "xs",
3868
+ "type": "stack"
1900
3869
  }
1901
3870
  ],
1902
3871
  "direction": "vertical",
@@ -1940,7 +3909,11 @@
1940
3909
  [
1941
3910
  "+",
1942
3911
  "@entity.t",
1943
- 0.1
3912
+ [
3913
+ "*",
3914
+ 0.1,
3915
+ "@entity.speed"
3916
+ ]
1944
3917
  ]
1945
3918
  ]
1946
3919
  ],