@almadar/std 16.241.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 (109) hide show
  1. package/behaviors/behaviors-registry.json +4650 -535
  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-book-reader.lolo +25 -1
  11. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +9 -0
  12. package/behaviors/lolo/ui/core/atoms/std-doc-page.lolo +153 -0
  13. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +124 -92
  14. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +114 -55
  15. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +40 -14
  16. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +363 -123
  17. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +93 -48
  18. package/behaviors/lolo/ui/learning/atoms/std-learn-diagram.lolo +60 -28
  19. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +193 -96
  20. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +75 -32
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +142 -86
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +266 -98
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +103 -65
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-live-sim.lolo +223 -109
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +232 -64
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-param-explorer.lolo +69 -29
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +363 -123
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +73 -41
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-sample-accumulator.lolo +96 -38
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-sandbox.lolo +65 -45
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +243 -117
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +76 -28
  33. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +228 -109
  34. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +95 -44
  35. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +199 -125
  36. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +92 -48
  37. package/behaviors/lolo/ui/learning/atoms/std-learn-trace-player.lolo +239 -78
  38. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +147 -38
  39. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +123 -58
  40. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +22 -0
  41. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +26 -0
  42. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +26 -0
  43. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +27 -1
  44. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +27 -1
  45. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +29 -9
  46. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +26 -0
  47. package/behaviors/lolo-behavior-contracts.json +1 -1
  48. package/behaviors/registry/agent/atoms/std-agent-memory.orb +372 -2
  49. package/behaviors/registry/agent/atoms/std-agent-session.orb +4752 -348
  50. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +54 -42
  51. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +356 -122
  52. package/behaviors/registry/factory-signatures.json +1 -1
  53. package/behaviors/registry/infra/atoms/std-page-open.orb +435 -0
  54. package/behaviors/registry/infra/atoms/std-page-search.orb +867 -0
  55. package/behaviors/registry/infra/atoms/std-page-treat.orb +494 -0
  56. package/behaviors/registry/infra/atoms/std-page-watch.orb +554 -0
  57. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +119 -0
  58. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +61 -0
  59. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +594 -0
  60. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +903 -369
  61. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1002 -232
  62. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +253 -74
  63. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3624 -921
  64. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +685 -144
  65. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +404 -52
  66. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1787 -210
  67. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +699 -71
  68. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1102 -578
  69. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +2760 -872
  70. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +689 -152
  71. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1431 -633
  72. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +2485 -512
  73. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +501 -197
  74. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +3642 -928
  75. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +705 -125
  76. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +624 -114
  77. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +405 -153
  78. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1911 -611
  79. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +436 -128
  80. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +2482 -485
  81. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +896 -192
  82. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +2001 -759
  83. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +734 -228
  84. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +2501 -764
  85. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1591 -173
  86. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +883 -122
  87. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +176 -0
  88. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +211 -0
  89. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +211 -0
  90. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +212 -1
  91. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +212 -1
  92. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +203 -9
  93. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +211 -0
  94. package/behaviors/signatures.lolo +325 -655
  95. package/dist/behaviors/exports-reader.js +16092 -9747
  96. package/dist/behaviors/functions/index.d.ts +1052 -136
  97. package/dist/behaviors/functions/index.js +16063 -9745
  98. package/dist/behaviors/index.d.ts +1 -1
  99. package/dist/behaviors/index.js +16093 -9748
  100. package/dist/behaviors/query.js +16092 -9747
  101. package/dist/behaviors-embeddings.hash.json +3 -3
  102. package/dist/behaviors-embeddings.json +45 -25
  103. package/dist/behaviors-registry.json +4650 -535
  104. package/dist/index.d.ts +1 -1
  105. package/dist/index.js +16093 -9748
  106. package/dist/knob-embeddings.hash.json +3 -3
  107. package/dist/knob-embeddings.json +607 -263
  108. package/dist/registry/factory-signatures.json +1 -1
  109. package/package.json +3 -3
@@ -316,7 +316,7 @@
316
316
  "type": "number"
317
317
  },
318
318
  "learnerColor": {
319
- "default": "#3b82f6",
319
+ "default": "series-2",
320
320
  "label": "Learner Color",
321
321
  "tier": "presentation",
322
322
  "type": "string"
@@ -417,6 +417,13 @@
417
417
  "tier": "domain",
418
418
  "type": "boolean"
419
419
  },
420
+ "summary": {
421
+ "default": "",
422
+ "description": "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line.",
423
+ "label": "Concept",
424
+ "tier": "presentation",
425
+ "type": "string"
426
+ },
420
427
  "targetA": {
421
428
  "default": 2.5,
422
429
  "description": "Hidden first parameter of the target curve the learner must recover.",
@@ -432,7 +439,7 @@
432
439
  "type": "number"
433
440
  },
434
441
  "targetColor": {
435
- "default": "#94a3b8",
442
+ "default": "guide",
436
443
  "label": "Target Color",
437
444
  "tier": "presentation",
438
445
  "type": "string"
@@ -1307,74 +1314,135 @@
1307
1314
  {
1308
1315
  "children": [
1309
1316
  {
1310
- "content": "@entity.title",
1311
- "type": "typography",
1312
- "variant": "h4"
1313
- },
1314
- {
1315
- "content": "@config.goalText",
1316
- "type": "typography",
1317
- "variant": "body"
1318
- },
1319
- {
1317
+ "align": "start",
1320
1318
  "children": [
1321
1319
  {
1322
- "content": [
1323
- "str/concat",
1324
- "@entity.paramALabel",
1325
- ": ",
1320
+ "children": [
1321
+ {
1322
+ "content": "@entity.title",
1323
+ "type": "typography",
1324
+ "variant": "h4"
1325
+ },
1326
1326
  [
1327
- "math/round",
1328
- "@entity.paramA",
1329
- 2.0
1327
+ "if",
1328
+ [
1329
+ "==",
1330
+ "@config.summary",
1331
+ ""
1332
+ ],
1333
+ null,
1334
+ {
1335
+ "color": "muted",
1336
+ "content": "@config.summary",
1337
+ "type": "typography",
1338
+ "variant": "body2"
1339
+ }
1330
1340
  ]
1331
1341
  ],
1332
- "type": "typography",
1333
- "variant": "caption"
1342
+ "direction": "vertical",
1343
+ "gap": "xs",
1344
+ "type": "stack"
1334
1345
  },
1335
1346
  {
1336
- "action": "SET_PARAM_A",
1337
- "max": "@config.paramAMax",
1338
- "min": "@config.paramAMin",
1339
- "showTooltip": true,
1340
- "step": "@config.paramAStep",
1341
- "type": "range-slider",
1342
- "value": "@entity.paramA"
1347
+ "label": [
1348
+ "if",
1349
+ "@entity.solved",
1350
+ "Solved",
1351
+ [
1352
+ "if",
1353
+ [
1354
+ ">",
1355
+ "@entity.attempts",
1356
+ 0.0
1357
+ ],
1358
+ "Try again",
1359
+ "Tuning"
1360
+ ]
1361
+ ],
1362
+ "type": "badge",
1363
+ "variant": [
1364
+ "if",
1365
+ "@entity.solved",
1366
+ "success",
1367
+ [
1368
+ "if",
1369
+ [
1370
+ ">",
1371
+ "@entity.attempts",
1372
+ 0.0
1373
+ ],
1374
+ "warning",
1375
+ "neutral"
1376
+ ]
1377
+ ]
1343
1378
  }
1344
1379
  ],
1345
- "direction": "vertical",
1346
- "gap": "xs",
1380
+ "direction": "horizontal",
1381
+ "gap": "md",
1382
+ "justify": "between",
1347
1383
  "type": "stack"
1348
1384
  },
1349
1385
  {
1386
+ "align": "center",
1350
1387
  "children": [
1351
1388
  {
1389
+ "action": "CHECK",
1390
+ "disabled": [
1391
+ "if",
1392
+ "@entity.solved",
1393
+ true,
1394
+ false
1395
+ ],
1396
+ "icon": "check",
1397
+ "label": "@config.checkLabel",
1398
+ "type": "button",
1399
+ "variant": "primary"
1400
+ },
1401
+ {
1402
+ "action": "RESET",
1403
+ "icon": "rotate-ccw",
1404
+ "label": "Reset",
1405
+ "type": "button",
1406
+ "variant": "ghost"
1407
+ },
1408
+ {
1409
+ "color": "muted",
1352
1410
  "content": [
1353
- "str/concat",
1354
- "@entity.paramBLabel",
1355
- ": ",
1411
+ "if",
1412
+ "@config.showLiveDistance",
1356
1413
  [
1357
- "math/round",
1358
- "@entity.paramB",
1359
- 2.0
1414
+ "str/concat",
1415
+ "Distance from target: ",
1416
+ [
1417
+ "math/round",
1418
+ "@entity.distance",
1419
+ 3.0
1420
+ ],
1421
+ " · attempts: ",
1422
+ [
1423
+ "str/concat",
1424
+ "",
1425
+ "@entity.attempts"
1426
+ ]
1427
+ ],
1428
+ [
1429
+ "str/concat",
1430
+ "Attempts: ",
1431
+ [
1432
+ "str/concat",
1433
+ "",
1434
+ "@entity.attempts"
1435
+ ]
1360
1436
  ]
1361
1437
  ],
1362
1438
  "type": "typography",
1363
1439
  "variant": "caption"
1364
- },
1365
- {
1366
- "action": "SET_PARAM_B",
1367
- "max": "@config.paramBMax",
1368
- "min": "@config.paramBMin",
1369
- "showTooltip": true,
1370
- "step": "@config.paramBStep",
1371
- "type": "range-slider",
1372
- "value": "@entity.paramB"
1373
1440
  }
1374
1441
  ],
1375
- "direction": "vertical",
1376
- "gap": "xs",
1377
- "type": "stack"
1442
+ "direction": "horizontal",
1443
+ "gap": "sm",
1444
+ "type": "stack",
1445
+ "wrap": true
1378
1446
  },
1379
1447
  {
1380
1448
  "animate": false,
@@ -1382,6 +1450,10 @@
1382
1450
  "gridStep": "@config.gridStep",
1383
1451
  "height": "@config.height",
1384
1452
  "interactive": false,
1453
+ "keyMap": {
1454
+ "KeyR": "RESET",
1455
+ "Space": "CHECK"
1456
+ },
1385
1457
  "points": [],
1386
1458
  "shapes": [],
1387
1459
  "showAxes": "@config.showAxes",
@@ -1395,68 +1467,83 @@
1395
1467
  "yMax": "@entity.yMax",
1396
1468
  "yMin": "@entity.yMin"
1397
1469
  },
1398
- {
1399
- "content": [
1400
- "if",
1401
- "@config.showLiveDistance",
1402
- [
1403
- "str/concat",
1404
- "Distance from target: ",
1405
- [
1406
- "math/round",
1407
- "@entity.distance",
1408
- 3.0
1409
- ],
1410
- " · attempts: ",
1411
- [
1412
- "str/concat",
1413
- "",
1414
- "@entity.attempts"
1415
- ]
1416
- ],
1417
- [
1418
- "str/concat",
1419
- "Attempts: ",
1420
- [
1421
- "str/concat",
1422
- "",
1423
- "@entity.attempts"
1424
- ]
1425
- ]
1426
- ],
1427
- "type": "typography",
1428
- "variant": "body"
1429
- },
1430
1470
  {
1431
1471
  "children": [
1432
1472
  {
1433
- "action": "CHECK",
1434
- "disabled": [
1435
- "if",
1436
- "@entity.solved",
1437
- true,
1438
- false
1473
+ "children": [
1474
+ {
1475
+ "content": [
1476
+ "str/concat",
1477
+ "@entity.paramALabel",
1478
+ ": ",
1479
+ [
1480
+ "math/round",
1481
+ "@entity.paramA",
1482
+ 2.0
1483
+ ]
1484
+ ],
1485
+ "type": "typography",
1486
+ "variant": "caption"
1487
+ },
1488
+ {
1489
+ "action": "SET_PARAM_A",
1490
+ "max": "@config.paramAMax",
1491
+ "min": "@config.paramAMin",
1492
+ "showTooltip": true,
1493
+ "step": "@config.paramAStep",
1494
+ "type": "range-slider",
1495
+ "value": "@entity.paramA"
1496
+ }
1439
1497
  ],
1440
- "label": "@config.checkLabel",
1441
- "type": "button",
1442
- "variant": "primary"
1498
+ "direction": "vertical",
1499
+ "gap": "xs",
1500
+ "type": "stack"
1443
1501
  },
1444
1502
  {
1445
- "action": "RESET",
1446
- "label": "Reset",
1447
- "type": "button",
1448
- "variant": "ghost"
1503
+ "children": [
1504
+ {
1505
+ "content": [
1506
+ "str/concat",
1507
+ "@entity.paramBLabel",
1508
+ ": ",
1509
+ [
1510
+ "math/round",
1511
+ "@entity.paramB",
1512
+ 2.0
1513
+ ]
1514
+ ],
1515
+ "type": "typography",
1516
+ "variant": "caption"
1517
+ },
1518
+ {
1519
+ "action": "SET_PARAM_B",
1520
+ "max": "@config.paramBMax",
1521
+ "min": "@config.paramBMin",
1522
+ "showTooltip": true,
1523
+ "step": "@config.paramBStep",
1524
+ "type": "range-slider",
1525
+ "value": "@entity.paramB"
1526
+ }
1527
+ ],
1528
+ "direction": "vertical",
1529
+ "gap": "xs",
1530
+ "type": "stack"
1449
1531
  }
1450
1532
  ],
1451
- "direction": "horizontal",
1533
+ "direction": "vertical",
1452
1534
  "gap": "sm",
1453
1535
  "type": "stack"
1454
1536
  },
1455
1537
  {
1456
- "children": "@entity.resultRow",
1457
- "direction": "horizontal",
1458
- "gap": "xs",
1459
- "type": "stack"
1538
+ "content": "@config.goalText",
1539
+ "type": "typography",
1540
+ "variant": "body"
1541
+ },
1542
+ {
1543
+ "color": "muted",
1544
+ "content": "@entity.feedback",
1545
+ "type": "typography",
1546
+ "variant": "caption"
1460
1547
  }
1461
1548
  ],
1462
1549
  "direction": "vertical",
@@ -1479,6 +1566,43 @@
1479
1566
  ],
1480
1567
  "to": "idle"
1481
1568
  },
1569
+ {
1570
+ "effects": [
1571
+ [
1572
+ "set",
1573
+ "@entity.active",
1574
+ false
1575
+ ],
1576
+ [
1577
+ "render-ui",
1578
+ "main",
1579
+ null
1580
+ ]
1581
+ ],
1582
+ "event": "MODE_SELECTED",
1583
+ "eventId": "evt_01M07580W5HD3M1WG88XEPW7CQ",
1584
+ "from": "idle",
1585
+ "guard": [
1586
+ "and",
1587
+ [
1588
+ "not",
1589
+ [
1590
+ "==",
1591
+ "@config.matchMode",
1592
+ ""
1593
+ ]
1594
+ ],
1595
+ [
1596
+ "not",
1597
+ [
1598
+ "==",
1599
+ "@payload.mode",
1600
+ "@config.matchMode"
1601
+ ]
1602
+ ]
1603
+ ],
1604
+ "to": "idle"
1605
+ },
1482
1606
  {
1483
1607
  "effects": [
1484
1608
  [
@@ -1976,74 +2100,135 @@
1976
2100
  {
1977
2101
  "children": [
1978
2102
  {
1979
- "content": "@entity.title",
1980
- "type": "typography",
1981
- "variant": "h4"
1982
- },
1983
- {
1984
- "content": "@config.goalText",
1985
- "type": "typography",
1986
- "variant": "body"
1987
- },
1988
- {
2103
+ "align": "start",
1989
2104
  "children": [
1990
2105
  {
1991
- "content": [
1992
- "str/concat",
1993
- "@entity.paramALabel",
1994
- ": ",
2106
+ "children": [
2107
+ {
2108
+ "content": "@entity.title",
2109
+ "type": "typography",
2110
+ "variant": "h4"
2111
+ },
1995
2112
  [
1996
- "math/round",
1997
- "@entity.paramA",
1998
- 2.0
2113
+ "if",
2114
+ [
2115
+ "==",
2116
+ "@config.summary",
2117
+ ""
2118
+ ],
2119
+ null,
2120
+ {
2121
+ "color": "muted",
2122
+ "content": "@config.summary",
2123
+ "type": "typography",
2124
+ "variant": "body2"
2125
+ }
1999
2126
  ]
2000
2127
  ],
2001
- "type": "typography",
2002
- "variant": "caption"
2128
+ "direction": "vertical",
2129
+ "gap": "xs",
2130
+ "type": "stack"
2003
2131
  },
2004
2132
  {
2005
- "action": "SET_PARAM_A",
2006
- "max": "@config.paramAMax",
2007
- "min": "@config.paramAMin",
2008
- "showTooltip": true,
2009
- "step": "@config.paramAStep",
2010
- "type": "range-slider",
2011
- "value": "@entity.paramA"
2133
+ "label": [
2134
+ "if",
2135
+ "@entity.solved",
2136
+ "Solved",
2137
+ [
2138
+ "if",
2139
+ [
2140
+ ">",
2141
+ "@entity.attempts",
2142
+ 0.0
2143
+ ],
2144
+ "Try again",
2145
+ "Tuning"
2146
+ ]
2147
+ ],
2148
+ "type": "badge",
2149
+ "variant": [
2150
+ "if",
2151
+ "@entity.solved",
2152
+ "success",
2153
+ [
2154
+ "if",
2155
+ [
2156
+ ">",
2157
+ "@entity.attempts",
2158
+ 0.0
2159
+ ],
2160
+ "warning",
2161
+ "neutral"
2162
+ ]
2163
+ ]
2012
2164
  }
2013
2165
  ],
2014
- "direction": "vertical",
2015
- "gap": "xs",
2166
+ "direction": "horizontal",
2167
+ "gap": "md",
2168
+ "justify": "between",
2016
2169
  "type": "stack"
2017
2170
  },
2018
2171
  {
2172
+ "align": "center",
2019
2173
  "children": [
2020
2174
  {
2175
+ "action": "CHECK",
2176
+ "disabled": [
2177
+ "if",
2178
+ "@entity.solved",
2179
+ true,
2180
+ false
2181
+ ],
2182
+ "icon": "check",
2183
+ "label": "@config.checkLabel",
2184
+ "type": "button",
2185
+ "variant": "primary"
2186
+ },
2187
+ {
2188
+ "action": "RESET",
2189
+ "icon": "rotate-ccw",
2190
+ "label": "Reset",
2191
+ "type": "button",
2192
+ "variant": "ghost"
2193
+ },
2194
+ {
2195
+ "color": "muted",
2021
2196
  "content": [
2022
- "str/concat",
2023
- "@entity.paramBLabel",
2024
- ": ",
2197
+ "if",
2198
+ "@config.showLiveDistance",
2199
+ [
2200
+ "str/concat",
2201
+ "Distance from target: ",
2202
+ [
2203
+ "math/round",
2204
+ "@entity.distance",
2205
+ 3.0
2206
+ ],
2207
+ " · attempts: ",
2208
+ [
2209
+ "str/concat",
2210
+ "",
2211
+ "@entity.attempts"
2212
+ ]
2213
+ ],
2025
2214
  [
2026
- "math/round",
2027
- "@entity.paramB",
2028
- 2.0
2215
+ "str/concat",
2216
+ "Attempts: ",
2217
+ [
2218
+ "str/concat",
2219
+ "",
2220
+ "@entity.attempts"
2221
+ ]
2029
2222
  ]
2030
2223
  ],
2031
2224
  "type": "typography",
2032
2225
  "variant": "caption"
2033
- },
2034
- {
2035
- "action": "SET_PARAM_B",
2036
- "max": "@config.paramBMax",
2037
- "min": "@config.paramBMin",
2038
- "showTooltip": true,
2039
- "step": "@config.paramBStep",
2040
- "type": "range-slider",
2041
- "value": "@entity.paramB"
2042
2226
  }
2043
2227
  ],
2044
- "direction": "vertical",
2045
- "gap": "xs",
2046
- "type": "stack"
2228
+ "direction": "horizontal",
2229
+ "gap": "sm",
2230
+ "type": "stack",
2231
+ "wrap": true
2047
2232
  },
2048
2233
  {
2049
2234
  "animate": false,
@@ -2051,6 +2236,10 @@
2051
2236
  "gridStep": "@config.gridStep",
2052
2237
  "height": "@config.height",
2053
2238
  "interactive": false,
2239
+ "keyMap": {
2240
+ "KeyR": "RESET",
2241
+ "Space": "CHECK"
2242
+ },
2054
2243
  "points": [],
2055
2244
  "shapes": [],
2056
2245
  "showAxes": "@config.showAxes",
@@ -2064,68 +2253,83 @@
2064
2253
  "yMax": "@entity.yMax",
2065
2254
  "yMin": "@entity.yMin"
2066
2255
  },
2067
- {
2068
- "content": [
2069
- "if",
2070
- "@config.showLiveDistance",
2071
- [
2072
- "str/concat",
2073
- "Distance from target: ",
2074
- [
2075
- "math/round",
2076
- "@entity.distance",
2077
- 3.0
2078
- ],
2079
- " · attempts: ",
2080
- [
2081
- "str/concat",
2082
- "",
2083
- "@entity.attempts"
2084
- ]
2085
- ],
2086
- [
2087
- "str/concat",
2088
- "Attempts: ",
2089
- [
2090
- "str/concat",
2091
- "",
2092
- "@entity.attempts"
2093
- ]
2094
- ]
2095
- ],
2096
- "type": "typography",
2097
- "variant": "body"
2098
- },
2099
2256
  {
2100
2257
  "children": [
2101
2258
  {
2102
- "action": "CHECK",
2103
- "disabled": [
2104
- "if",
2105
- "@entity.solved",
2106
- true,
2107
- false
2259
+ "children": [
2260
+ {
2261
+ "content": [
2262
+ "str/concat",
2263
+ "@entity.paramALabel",
2264
+ ": ",
2265
+ [
2266
+ "math/round",
2267
+ "@entity.paramA",
2268
+ 2.0
2269
+ ]
2270
+ ],
2271
+ "type": "typography",
2272
+ "variant": "caption"
2273
+ },
2274
+ {
2275
+ "action": "SET_PARAM_A",
2276
+ "max": "@config.paramAMax",
2277
+ "min": "@config.paramAMin",
2278
+ "showTooltip": true,
2279
+ "step": "@config.paramAStep",
2280
+ "type": "range-slider",
2281
+ "value": "@entity.paramA"
2282
+ }
2108
2283
  ],
2109
- "label": "@config.checkLabel",
2110
- "type": "button",
2111
- "variant": "primary"
2284
+ "direction": "vertical",
2285
+ "gap": "xs",
2286
+ "type": "stack"
2112
2287
  },
2113
2288
  {
2114
- "action": "RESET",
2115
- "label": "Reset",
2116
- "type": "button",
2117
- "variant": "ghost"
2289
+ "children": [
2290
+ {
2291
+ "content": [
2292
+ "str/concat",
2293
+ "@entity.paramBLabel",
2294
+ ": ",
2295
+ [
2296
+ "math/round",
2297
+ "@entity.paramB",
2298
+ 2.0
2299
+ ]
2300
+ ],
2301
+ "type": "typography",
2302
+ "variant": "caption"
2303
+ },
2304
+ {
2305
+ "action": "SET_PARAM_B",
2306
+ "max": "@config.paramBMax",
2307
+ "min": "@config.paramBMin",
2308
+ "showTooltip": true,
2309
+ "step": "@config.paramBStep",
2310
+ "type": "range-slider",
2311
+ "value": "@entity.paramB"
2312
+ }
2313
+ ],
2314
+ "direction": "vertical",
2315
+ "gap": "xs",
2316
+ "type": "stack"
2118
2317
  }
2119
2318
  ],
2120
- "direction": "horizontal",
2319
+ "direction": "vertical",
2121
2320
  "gap": "sm",
2122
2321
  "type": "stack"
2123
2322
  },
2124
2323
  {
2125
- "children": "@entity.resultRow",
2126
- "direction": "horizontal",
2127
- "gap": "xs",
2128
- "type": "stack"
2324
+ "content": "@config.goalText",
2325
+ "type": "typography",
2326
+ "variant": "body"
2327
+ },
2328
+ {
2329
+ "color": "muted",
2330
+ "content": "@entity.feedback",
2331
+ "type": "typography",
2332
+ "variant": "caption"
2129
2333
  }
2130
2334
  ],
2131
2335
  "direction": "vertical",
@@ -2501,74 +2705,135 @@
2501
2705
  {
2502
2706
  "children": [
2503
2707
  {
2504
- "content": "@entity.title",
2505
- "type": "typography",
2506
- "variant": "h4"
2507
- },
2508
- {
2509
- "content": "@config.goalText",
2510
- "type": "typography",
2511
- "variant": "body"
2512
- },
2513
- {
2708
+ "align": "start",
2514
2709
  "children": [
2515
2710
  {
2516
- "content": [
2517
- "str/concat",
2518
- "@entity.paramALabel",
2519
- ": ",
2711
+ "children": [
2712
+ {
2713
+ "content": "@entity.title",
2714
+ "type": "typography",
2715
+ "variant": "h4"
2716
+ },
2520
2717
  [
2521
- "math/round",
2522
- "@entity.paramA",
2523
- 2.0
2718
+ "if",
2719
+ [
2720
+ "==",
2721
+ "@config.summary",
2722
+ ""
2723
+ ],
2724
+ null,
2725
+ {
2726
+ "color": "muted",
2727
+ "content": "@config.summary",
2728
+ "type": "typography",
2729
+ "variant": "body2"
2730
+ }
2524
2731
  ]
2525
2732
  ],
2526
- "type": "typography",
2527
- "variant": "caption"
2733
+ "direction": "vertical",
2734
+ "gap": "xs",
2735
+ "type": "stack"
2528
2736
  },
2529
2737
  {
2530
- "action": "SET_PARAM_A",
2531
- "max": "@config.paramAMax",
2532
- "min": "@config.paramAMin",
2533
- "showTooltip": true,
2534
- "step": "@config.paramAStep",
2535
- "type": "range-slider",
2536
- "value": "@entity.paramA"
2738
+ "label": [
2739
+ "if",
2740
+ "@entity.solved",
2741
+ "Solved",
2742
+ [
2743
+ "if",
2744
+ [
2745
+ ">",
2746
+ "@entity.attempts",
2747
+ 0.0
2748
+ ],
2749
+ "Try again",
2750
+ "Tuning"
2751
+ ]
2752
+ ],
2753
+ "type": "badge",
2754
+ "variant": [
2755
+ "if",
2756
+ "@entity.solved",
2757
+ "success",
2758
+ [
2759
+ "if",
2760
+ [
2761
+ ">",
2762
+ "@entity.attempts",
2763
+ 0.0
2764
+ ],
2765
+ "warning",
2766
+ "neutral"
2767
+ ]
2768
+ ]
2537
2769
  }
2538
2770
  ],
2539
- "direction": "vertical",
2540
- "gap": "xs",
2771
+ "direction": "horizontal",
2772
+ "gap": "md",
2773
+ "justify": "between",
2541
2774
  "type": "stack"
2542
2775
  },
2543
2776
  {
2777
+ "align": "center",
2544
2778
  "children": [
2545
2779
  {
2780
+ "action": "CHECK",
2781
+ "disabled": [
2782
+ "if",
2783
+ "@entity.solved",
2784
+ true,
2785
+ false
2786
+ ],
2787
+ "icon": "check",
2788
+ "label": "@config.checkLabel",
2789
+ "type": "button",
2790
+ "variant": "primary"
2791
+ },
2792
+ {
2793
+ "action": "RESET",
2794
+ "icon": "rotate-ccw",
2795
+ "label": "Reset",
2796
+ "type": "button",
2797
+ "variant": "ghost"
2798
+ },
2799
+ {
2800
+ "color": "muted",
2546
2801
  "content": [
2547
- "str/concat",
2548
- "@entity.paramBLabel",
2549
- ": ",
2802
+ "if",
2803
+ "@config.showLiveDistance",
2550
2804
  [
2551
- "math/round",
2552
- "@entity.paramB",
2553
- 2.0
2805
+ "str/concat",
2806
+ "Distance from target: ",
2807
+ [
2808
+ "math/round",
2809
+ "@entity.distance",
2810
+ 3.0
2811
+ ],
2812
+ " · attempts: ",
2813
+ [
2814
+ "str/concat",
2815
+ "",
2816
+ "@entity.attempts"
2817
+ ]
2818
+ ],
2819
+ [
2820
+ "str/concat",
2821
+ "Attempts: ",
2822
+ [
2823
+ "str/concat",
2824
+ "",
2825
+ "@entity.attempts"
2826
+ ]
2554
2827
  ]
2555
2828
  ],
2556
2829
  "type": "typography",
2557
2830
  "variant": "caption"
2558
- },
2559
- {
2560
- "action": "SET_PARAM_B",
2561
- "max": "@config.paramBMax",
2562
- "min": "@config.paramBMin",
2563
- "showTooltip": true,
2564
- "step": "@config.paramBStep",
2565
- "type": "range-slider",
2566
- "value": "@entity.paramB"
2567
2831
  }
2568
2832
  ],
2569
- "direction": "vertical",
2570
- "gap": "xs",
2571
- "type": "stack"
2833
+ "direction": "horizontal",
2834
+ "gap": "sm",
2835
+ "type": "stack",
2836
+ "wrap": true
2572
2837
  },
2573
2838
  {
2574
2839
  "animate": false,
@@ -2576,6 +2841,10 @@
2576
2841
  "gridStep": "@config.gridStep",
2577
2842
  "height": "@config.height",
2578
2843
  "interactive": false,
2844
+ "keyMap": {
2845
+ "KeyR": "RESET",
2846
+ "Space": "CHECK"
2847
+ },
2579
2848
  "points": [],
2580
2849
  "shapes": [],
2581
2850
  "showAxes": "@config.showAxes",
@@ -2589,68 +2858,83 @@
2589
2858
  "yMax": "@entity.yMax",
2590
2859
  "yMin": "@entity.yMin"
2591
2860
  },
2592
- {
2593
- "content": [
2594
- "if",
2595
- "@config.showLiveDistance",
2596
- [
2597
- "str/concat",
2598
- "Distance from target: ",
2599
- [
2600
- "math/round",
2601
- "@entity.distance",
2602
- 3.0
2603
- ],
2604
- " · attempts: ",
2605
- [
2606
- "str/concat",
2607
- "",
2608
- "@entity.attempts"
2609
- ]
2610
- ],
2611
- [
2612
- "str/concat",
2613
- "Attempts: ",
2614
- [
2615
- "str/concat",
2616
- "",
2617
- "@entity.attempts"
2618
- ]
2619
- ]
2620
- ],
2621
- "type": "typography",
2622
- "variant": "body"
2623
- },
2624
2861
  {
2625
2862
  "children": [
2626
2863
  {
2627
- "action": "CHECK",
2628
- "disabled": [
2629
- "if",
2630
- "@entity.solved",
2631
- true,
2632
- false
2864
+ "children": [
2865
+ {
2866
+ "content": [
2867
+ "str/concat",
2868
+ "@entity.paramALabel",
2869
+ ": ",
2870
+ [
2871
+ "math/round",
2872
+ "@entity.paramA",
2873
+ 2.0
2874
+ ]
2875
+ ],
2876
+ "type": "typography",
2877
+ "variant": "caption"
2878
+ },
2879
+ {
2880
+ "action": "SET_PARAM_A",
2881
+ "max": "@config.paramAMax",
2882
+ "min": "@config.paramAMin",
2883
+ "showTooltip": true,
2884
+ "step": "@config.paramAStep",
2885
+ "type": "range-slider",
2886
+ "value": "@entity.paramA"
2887
+ }
2633
2888
  ],
2634
- "label": "@config.checkLabel",
2635
- "type": "button",
2636
- "variant": "primary"
2889
+ "direction": "vertical",
2890
+ "gap": "xs",
2891
+ "type": "stack"
2637
2892
  },
2638
2893
  {
2639
- "action": "RESET",
2640
- "label": "Reset",
2641
- "type": "button",
2642
- "variant": "ghost"
2894
+ "children": [
2895
+ {
2896
+ "content": [
2897
+ "str/concat",
2898
+ "@entity.paramBLabel",
2899
+ ": ",
2900
+ [
2901
+ "math/round",
2902
+ "@entity.paramB",
2903
+ 2.0
2904
+ ]
2905
+ ],
2906
+ "type": "typography",
2907
+ "variant": "caption"
2908
+ },
2909
+ {
2910
+ "action": "SET_PARAM_B",
2911
+ "max": "@config.paramBMax",
2912
+ "min": "@config.paramBMin",
2913
+ "showTooltip": true,
2914
+ "step": "@config.paramBStep",
2915
+ "type": "range-slider",
2916
+ "value": "@entity.paramB"
2917
+ }
2918
+ ],
2919
+ "direction": "vertical",
2920
+ "gap": "xs",
2921
+ "type": "stack"
2643
2922
  }
2644
2923
  ],
2645
- "direction": "horizontal",
2924
+ "direction": "vertical",
2646
2925
  "gap": "sm",
2647
2926
  "type": "stack"
2648
2927
  },
2649
2928
  {
2650
- "children": "@entity.resultRow",
2651
- "direction": "horizontal",
2652
- "gap": "xs",
2653
- "type": "stack"
2929
+ "content": "@config.goalText",
2930
+ "type": "typography",
2931
+ "variant": "body"
2932
+ },
2933
+ {
2934
+ "color": "muted",
2935
+ "content": "@entity.feedback",
2936
+ "type": "typography",
2937
+ "variant": "caption"
2654
2938
  }
2655
2939
  ],
2656
2940
  "direction": "vertical",
@@ -3043,74 +3327,135 @@
3043
3327
  {
3044
3328
  "children": [
3045
3329
  {
3046
- "content": "@entity.title",
3047
- "type": "typography",
3048
- "variant": "h4"
3049
- },
3050
- {
3051
- "content": "@config.goalText",
3052
- "type": "typography",
3053
- "variant": "body"
3054
- },
3055
- {
3330
+ "align": "start",
3056
3331
  "children": [
3057
3332
  {
3058
- "content": [
3059
- "str/concat",
3060
- "@entity.paramALabel",
3061
- ": ",
3333
+ "children": [
3334
+ {
3335
+ "content": "@entity.title",
3336
+ "type": "typography",
3337
+ "variant": "h4"
3338
+ },
3062
3339
  [
3063
- "math/round",
3064
- "@entity.paramA",
3065
- 2.0
3340
+ "if",
3341
+ [
3342
+ "==",
3343
+ "@config.summary",
3344
+ ""
3345
+ ],
3346
+ null,
3347
+ {
3348
+ "color": "muted",
3349
+ "content": "@config.summary",
3350
+ "type": "typography",
3351
+ "variant": "body2"
3352
+ }
3066
3353
  ]
3067
3354
  ],
3068
- "type": "typography",
3069
- "variant": "caption"
3355
+ "direction": "vertical",
3356
+ "gap": "xs",
3357
+ "type": "stack"
3070
3358
  },
3071
3359
  {
3072
- "action": "SET_PARAM_A",
3073
- "max": "@config.paramAMax",
3074
- "min": "@config.paramAMin",
3075
- "showTooltip": true,
3076
- "step": "@config.paramAStep",
3077
- "type": "range-slider",
3078
- "value": "@entity.paramA"
3360
+ "label": [
3361
+ "if",
3362
+ "@entity.solved",
3363
+ "Solved",
3364
+ [
3365
+ "if",
3366
+ [
3367
+ ">",
3368
+ "@entity.attempts",
3369
+ 0.0
3370
+ ],
3371
+ "Try again",
3372
+ "Tuning"
3373
+ ]
3374
+ ],
3375
+ "type": "badge",
3376
+ "variant": [
3377
+ "if",
3378
+ "@entity.solved",
3379
+ "success",
3380
+ [
3381
+ "if",
3382
+ [
3383
+ ">",
3384
+ "@entity.attempts",
3385
+ 0.0
3386
+ ],
3387
+ "warning",
3388
+ "neutral"
3389
+ ]
3390
+ ]
3079
3391
  }
3080
3392
  ],
3081
- "direction": "vertical",
3082
- "gap": "xs",
3393
+ "direction": "horizontal",
3394
+ "gap": "md",
3395
+ "justify": "between",
3083
3396
  "type": "stack"
3084
3397
  },
3085
3398
  {
3399
+ "align": "center",
3086
3400
  "children": [
3087
3401
  {
3402
+ "action": "CHECK",
3403
+ "disabled": [
3404
+ "if",
3405
+ "@entity.solved",
3406
+ true,
3407
+ false
3408
+ ],
3409
+ "icon": "check",
3410
+ "label": "@config.checkLabel",
3411
+ "type": "button",
3412
+ "variant": "primary"
3413
+ },
3414
+ {
3415
+ "action": "RESET",
3416
+ "icon": "rotate-ccw",
3417
+ "label": "Reset",
3418
+ "type": "button",
3419
+ "variant": "ghost"
3420
+ },
3421
+ {
3422
+ "color": "muted",
3088
3423
  "content": [
3089
- "str/concat",
3090
- "@entity.paramBLabel",
3091
- ": ",
3424
+ "if",
3425
+ "@config.showLiveDistance",
3092
3426
  [
3093
- "math/round",
3094
- "@entity.paramB",
3095
- 2.0
3427
+ "str/concat",
3428
+ "Distance from target: ",
3429
+ [
3430
+ "math/round",
3431
+ "@entity.distance",
3432
+ 3.0
3433
+ ],
3434
+ " · attempts: ",
3435
+ [
3436
+ "str/concat",
3437
+ "",
3438
+ "@entity.attempts"
3439
+ ]
3440
+ ],
3441
+ [
3442
+ "str/concat",
3443
+ "Attempts: ",
3444
+ [
3445
+ "str/concat",
3446
+ "",
3447
+ "@entity.attempts"
3448
+ ]
3096
3449
  ]
3097
3450
  ],
3098
3451
  "type": "typography",
3099
3452
  "variant": "caption"
3100
- },
3101
- {
3102
- "action": "SET_PARAM_B",
3103
- "max": "@config.paramBMax",
3104
- "min": "@config.paramBMin",
3105
- "showTooltip": true,
3106
- "step": "@config.paramBStep",
3107
- "type": "range-slider",
3108
- "value": "@entity.paramB"
3109
3453
  }
3110
3454
  ],
3111
- "direction": "vertical",
3112
- "gap": "xs",
3113
- "type": "stack"
3455
+ "direction": "horizontal",
3456
+ "gap": "sm",
3457
+ "type": "stack",
3458
+ "wrap": true
3114
3459
  },
3115
3460
  {
3116
3461
  "animate": false,
@@ -3118,6 +3463,10 @@
3118
3463
  "gridStep": "@config.gridStep",
3119
3464
  "height": "@config.height",
3120
3465
  "interactive": false,
3466
+ "keyMap": {
3467
+ "KeyR": "RESET",
3468
+ "Space": "CHECK"
3469
+ },
3121
3470
  "points": [],
3122
3471
  "shapes": [],
3123
3472
  "showAxes": "@config.showAxes",
@@ -3131,68 +3480,83 @@
3131
3480
  "yMax": "@entity.yMax",
3132
3481
  "yMin": "@entity.yMin"
3133
3482
  },
3134
- {
3135
- "content": [
3136
- "if",
3137
- "@config.showLiveDistance",
3138
- [
3139
- "str/concat",
3140
- "Distance from target: ",
3141
- [
3142
- "math/round",
3143
- "@entity.distance",
3144
- 3.0
3145
- ],
3146
- " · attempts: ",
3147
- [
3148
- "str/concat",
3149
- "",
3150
- "@entity.attempts"
3151
- ]
3152
- ],
3153
- [
3154
- "str/concat",
3155
- "Attempts: ",
3156
- [
3157
- "str/concat",
3158
- "",
3159
- "@entity.attempts"
3160
- ]
3161
- ]
3162
- ],
3163
- "type": "typography",
3164
- "variant": "body"
3165
- },
3166
3483
  {
3167
3484
  "children": [
3168
3485
  {
3169
- "action": "CHECK",
3170
- "disabled": [
3171
- "if",
3172
- "@entity.solved",
3173
- true,
3174
- false
3486
+ "children": [
3487
+ {
3488
+ "content": [
3489
+ "str/concat",
3490
+ "@entity.paramALabel",
3491
+ ": ",
3492
+ [
3493
+ "math/round",
3494
+ "@entity.paramA",
3495
+ 2.0
3496
+ ]
3497
+ ],
3498
+ "type": "typography",
3499
+ "variant": "caption"
3500
+ },
3501
+ {
3502
+ "action": "SET_PARAM_A",
3503
+ "max": "@config.paramAMax",
3504
+ "min": "@config.paramAMin",
3505
+ "showTooltip": true,
3506
+ "step": "@config.paramAStep",
3507
+ "type": "range-slider",
3508
+ "value": "@entity.paramA"
3509
+ }
3175
3510
  ],
3176
- "label": "@config.checkLabel",
3177
- "type": "button",
3178
- "variant": "primary"
3511
+ "direction": "vertical",
3512
+ "gap": "xs",
3513
+ "type": "stack"
3179
3514
  },
3180
3515
  {
3181
- "action": "RESET",
3182
- "label": "Reset",
3183
- "type": "button",
3184
- "variant": "ghost"
3516
+ "children": [
3517
+ {
3518
+ "content": [
3519
+ "str/concat",
3520
+ "@entity.paramBLabel",
3521
+ ": ",
3522
+ [
3523
+ "math/round",
3524
+ "@entity.paramB",
3525
+ 2.0
3526
+ ]
3527
+ ],
3528
+ "type": "typography",
3529
+ "variant": "caption"
3530
+ },
3531
+ {
3532
+ "action": "SET_PARAM_B",
3533
+ "max": "@config.paramBMax",
3534
+ "min": "@config.paramBMin",
3535
+ "showTooltip": true,
3536
+ "step": "@config.paramBStep",
3537
+ "type": "range-slider",
3538
+ "value": "@entity.paramB"
3539
+ }
3540
+ ],
3541
+ "direction": "vertical",
3542
+ "gap": "xs",
3543
+ "type": "stack"
3185
3544
  }
3186
3545
  ],
3187
- "direction": "horizontal",
3546
+ "direction": "vertical",
3188
3547
  "gap": "sm",
3189
3548
  "type": "stack"
3190
3549
  },
3191
3550
  {
3192
- "children": "@entity.resultRow",
3193
- "direction": "horizontal",
3194
- "gap": "xs",
3195
- "type": "stack"
3551
+ "content": "@config.goalText",
3552
+ "type": "typography",
3553
+ "variant": "body"
3554
+ },
3555
+ {
3556
+ "color": "muted",
3557
+ "content": "@entity.feedback",
3558
+ "type": "typography",
3559
+ "variant": "caption"
3196
3560
  }
3197
3561
  ],
3198
3562
  "direction": "vertical",
@@ -3335,74 +3699,135 @@
3335
3699
  {
3336
3700
  "children": [
3337
3701
  {
3338
- "content": "@entity.title",
3339
- "type": "typography",
3340
- "variant": "h4"
3341
- },
3342
- {
3343
- "content": "@config.goalText",
3344
- "type": "typography",
3345
- "variant": "body"
3346
- },
3347
- {
3702
+ "align": "start",
3348
3703
  "children": [
3349
3704
  {
3350
- "content": [
3351
- "str/concat",
3352
- "@entity.paramALabel",
3353
- ": ",
3705
+ "children": [
3706
+ {
3707
+ "content": "@entity.title",
3708
+ "type": "typography",
3709
+ "variant": "h4"
3710
+ },
3354
3711
  [
3355
- "math/round",
3356
- "@entity.paramA",
3357
- 2.0
3712
+ "if",
3713
+ [
3714
+ "==",
3715
+ "@config.summary",
3716
+ ""
3717
+ ],
3718
+ null,
3719
+ {
3720
+ "color": "muted",
3721
+ "content": "@config.summary",
3722
+ "type": "typography",
3723
+ "variant": "body2"
3724
+ }
3358
3725
  ]
3359
3726
  ],
3360
- "type": "typography",
3361
- "variant": "caption"
3727
+ "direction": "vertical",
3728
+ "gap": "xs",
3729
+ "type": "stack"
3362
3730
  },
3363
3731
  {
3364
- "action": "SET_PARAM_A",
3365
- "max": "@config.paramAMax",
3366
- "min": "@config.paramAMin",
3367
- "showTooltip": true,
3368
- "step": "@config.paramAStep",
3369
- "type": "range-slider",
3370
- "value": "@entity.paramA"
3732
+ "label": [
3733
+ "if",
3734
+ "@entity.solved",
3735
+ "Solved",
3736
+ [
3737
+ "if",
3738
+ [
3739
+ ">",
3740
+ "@entity.attempts",
3741
+ 0.0
3742
+ ],
3743
+ "Try again",
3744
+ "Tuning"
3745
+ ]
3746
+ ],
3747
+ "type": "badge",
3748
+ "variant": [
3749
+ "if",
3750
+ "@entity.solved",
3751
+ "success",
3752
+ [
3753
+ "if",
3754
+ [
3755
+ ">",
3756
+ "@entity.attempts",
3757
+ 0.0
3758
+ ],
3759
+ "warning",
3760
+ "neutral"
3761
+ ]
3762
+ ]
3371
3763
  }
3372
3764
  ],
3373
- "direction": "vertical",
3374
- "gap": "xs",
3765
+ "direction": "horizontal",
3766
+ "gap": "md",
3767
+ "justify": "between",
3375
3768
  "type": "stack"
3376
3769
  },
3377
3770
  {
3771
+ "align": "center",
3378
3772
  "children": [
3379
3773
  {
3774
+ "action": "CHECK",
3775
+ "disabled": [
3776
+ "if",
3777
+ "@entity.solved",
3778
+ true,
3779
+ false
3780
+ ],
3781
+ "icon": "check",
3782
+ "label": "@config.checkLabel",
3783
+ "type": "button",
3784
+ "variant": "primary"
3785
+ },
3786
+ {
3787
+ "action": "RESET",
3788
+ "icon": "rotate-ccw",
3789
+ "label": "Reset",
3790
+ "type": "button",
3791
+ "variant": "ghost"
3792
+ },
3793
+ {
3794
+ "color": "muted",
3380
3795
  "content": [
3381
- "str/concat",
3382
- "@entity.paramBLabel",
3383
- ": ",
3796
+ "if",
3797
+ "@config.showLiveDistance",
3384
3798
  [
3385
- "math/round",
3386
- "@entity.paramB",
3387
- 2.0
3799
+ "str/concat",
3800
+ "Distance from target: ",
3801
+ [
3802
+ "math/round",
3803
+ "@entity.distance",
3804
+ 3.0
3805
+ ],
3806
+ " · attempts: ",
3807
+ [
3808
+ "str/concat",
3809
+ "",
3810
+ "@entity.attempts"
3811
+ ]
3812
+ ],
3813
+ [
3814
+ "str/concat",
3815
+ "Attempts: ",
3816
+ [
3817
+ "str/concat",
3818
+ "",
3819
+ "@entity.attempts"
3820
+ ]
3388
3821
  ]
3389
3822
  ],
3390
3823
  "type": "typography",
3391
3824
  "variant": "caption"
3392
- },
3393
- {
3394
- "action": "SET_PARAM_B",
3395
- "max": "@config.paramBMax",
3396
- "min": "@config.paramBMin",
3397
- "showTooltip": true,
3398
- "step": "@config.paramBStep",
3399
- "type": "range-slider",
3400
- "value": "@entity.paramB"
3401
3825
  }
3402
3826
  ],
3403
- "direction": "vertical",
3404
- "gap": "xs",
3405
- "type": "stack"
3827
+ "direction": "horizontal",
3828
+ "gap": "sm",
3829
+ "type": "stack",
3830
+ "wrap": true
3406
3831
  },
3407
3832
  {
3408
3833
  "animate": false,
@@ -3410,6 +3835,10 @@
3410
3835
  "gridStep": "@config.gridStep",
3411
3836
  "height": "@config.height",
3412
3837
  "interactive": false,
3838
+ "keyMap": {
3839
+ "KeyR": "RESET",
3840
+ "Space": "CHECK"
3841
+ },
3413
3842
  "points": [],
3414
3843
  "shapes": [],
3415
3844
  "showAxes": "@config.showAxes",
@@ -3423,68 +3852,83 @@
3423
3852
  "yMax": "@entity.yMax",
3424
3853
  "yMin": "@entity.yMin"
3425
3854
  },
3426
- {
3427
- "content": [
3428
- "if",
3429
- "@config.showLiveDistance",
3430
- [
3431
- "str/concat",
3432
- "Distance from target: ",
3433
- [
3434
- "math/round",
3435
- "@entity.distance",
3436
- 3.0
3437
- ],
3438
- " · attempts: ",
3439
- [
3440
- "str/concat",
3441
- "",
3442
- "@entity.attempts"
3443
- ]
3444
- ],
3445
- [
3446
- "str/concat",
3447
- "Attempts: ",
3448
- [
3449
- "str/concat",
3450
- "",
3451
- "@entity.attempts"
3452
- ]
3453
- ]
3454
- ],
3455
- "type": "typography",
3456
- "variant": "body"
3457
- },
3458
3855
  {
3459
3856
  "children": [
3460
3857
  {
3461
- "action": "CHECK",
3462
- "disabled": [
3463
- "if",
3464
- "@entity.solved",
3465
- true,
3466
- false
3858
+ "children": [
3859
+ {
3860
+ "content": [
3861
+ "str/concat",
3862
+ "@entity.paramALabel",
3863
+ ": ",
3864
+ [
3865
+ "math/round",
3866
+ "@entity.paramA",
3867
+ 2.0
3868
+ ]
3869
+ ],
3870
+ "type": "typography",
3871
+ "variant": "caption"
3872
+ },
3873
+ {
3874
+ "action": "SET_PARAM_A",
3875
+ "max": "@config.paramAMax",
3876
+ "min": "@config.paramAMin",
3877
+ "showTooltip": true,
3878
+ "step": "@config.paramAStep",
3879
+ "type": "range-slider",
3880
+ "value": "@entity.paramA"
3881
+ }
3467
3882
  ],
3468
- "label": "@config.checkLabel",
3469
- "type": "button",
3470
- "variant": "primary"
3883
+ "direction": "vertical",
3884
+ "gap": "xs",
3885
+ "type": "stack"
3471
3886
  },
3472
3887
  {
3473
- "action": "RESET",
3474
- "label": "Reset",
3475
- "type": "button",
3476
- "variant": "ghost"
3888
+ "children": [
3889
+ {
3890
+ "content": [
3891
+ "str/concat",
3892
+ "@entity.paramBLabel",
3893
+ ": ",
3894
+ [
3895
+ "math/round",
3896
+ "@entity.paramB",
3897
+ 2.0
3898
+ ]
3899
+ ],
3900
+ "type": "typography",
3901
+ "variant": "caption"
3902
+ },
3903
+ {
3904
+ "action": "SET_PARAM_B",
3905
+ "max": "@config.paramBMax",
3906
+ "min": "@config.paramBMin",
3907
+ "showTooltip": true,
3908
+ "step": "@config.paramBStep",
3909
+ "type": "range-slider",
3910
+ "value": "@entity.paramB"
3911
+ }
3912
+ ],
3913
+ "direction": "vertical",
3914
+ "gap": "xs",
3915
+ "type": "stack"
3477
3916
  }
3478
3917
  ],
3479
- "direction": "horizontal",
3918
+ "direction": "vertical",
3480
3919
  "gap": "sm",
3481
3920
  "type": "stack"
3482
3921
  },
3483
3922
  {
3484
- "children": "@entity.resultRow",
3485
- "direction": "horizontal",
3486
- "gap": "xs",
3487
- "type": "stack"
3923
+ "content": "@config.goalText",
3924
+ "type": "typography",
3925
+ "variant": "body"
3926
+ },
3927
+ {
3928
+ "color": "muted",
3929
+ "content": "@entity.feedback",
3930
+ "type": "typography",
3931
+ "variant": "caption"
3488
3932
  }
3489
3933
  ],
3490
3934
  "direction": "vertical",
@@ -3905,74 +4349,135 @@
3905
4349
  {
3906
4350
  "children": [
3907
4351
  {
3908
- "content": "@entity.title",
3909
- "type": "typography",
3910
- "variant": "h4"
3911
- },
3912
- {
3913
- "content": "@config.goalText",
3914
- "type": "typography",
3915
- "variant": "body"
3916
- },
3917
- {
4352
+ "align": "start",
3918
4353
  "children": [
3919
4354
  {
3920
- "content": [
3921
- "str/concat",
3922
- "@entity.paramALabel",
3923
- ": ",
4355
+ "children": [
4356
+ {
4357
+ "content": "@entity.title",
4358
+ "type": "typography",
4359
+ "variant": "h4"
4360
+ },
3924
4361
  [
3925
- "math/round",
3926
- "@entity.paramA",
3927
- 2.0
4362
+ "if",
4363
+ [
4364
+ "==",
4365
+ "@config.summary",
4366
+ ""
4367
+ ],
4368
+ null,
4369
+ {
4370
+ "color": "muted",
4371
+ "content": "@config.summary",
4372
+ "type": "typography",
4373
+ "variant": "body2"
4374
+ }
3928
4375
  ]
3929
4376
  ],
3930
- "type": "typography",
3931
- "variant": "caption"
4377
+ "direction": "vertical",
4378
+ "gap": "xs",
4379
+ "type": "stack"
3932
4380
  },
3933
4381
  {
3934
- "action": "SET_PARAM_A",
3935
- "max": "@config.paramAMax",
3936
- "min": "@config.paramAMin",
3937
- "showTooltip": true,
3938
- "step": "@config.paramAStep",
3939
- "type": "range-slider",
3940
- "value": "@entity.paramA"
4382
+ "label": [
4383
+ "if",
4384
+ "@entity.solved",
4385
+ "Solved",
4386
+ [
4387
+ "if",
4388
+ [
4389
+ ">",
4390
+ "@entity.attempts",
4391
+ 0.0
4392
+ ],
4393
+ "Try again",
4394
+ "Tuning"
4395
+ ]
4396
+ ],
4397
+ "type": "badge",
4398
+ "variant": [
4399
+ "if",
4400
+ "@entity.solved",
4401
+ "success",
4402
+ [
4403
+ "if",
4404
+ [
4405
+ ">",
4406
+ "@entity.attempts",
4407
+ 0.0
4408
+ ],
4409
+ "warning",
4410
+ "neutral"
4411
+ ]
4412
+ ]
3941
4413
  }
3942
4414
  ],
3943
- "direction": "vertical",
3944
- "gap": "xs",
4415
+ "direction": "horizontal",
4416
+ "gap": "md",
4417
+ "justify": "between",
3945
4418
  "type": "stack"
3946
4419
  },
3947
4420
  {
4421
+ "align": "center",
3948
4422
  "children": [
3949
4423
  {
4424
+ "action": "CHECK",
4425
+ "disabled": [
4426
+ "if",
4427
+ "@entity.solved",
4428
+ true,
4429
+ false
4430
+ ],
4431
+ "icon": "check",
4432
+ "label": "@config.checkLabel",
4433
+ "type": "button",
4434
+ "variant": "primary"
4435
+ },
4436
+ {
4437
+ "action": "RESET",
4438
+ "icon": "rotate-ccw",
4439
+ "label": "Reset",
4440
+ "type": "button",
4441
+ "variant": "ghost"
4442
+ },
4443
+ {
4444
+ "color": "muted",
3950
4445
  "content": [
3951
- "str/concat",
3952
- "@entity.paramBLabel",
3953
- ": ",
4446
+ "if",
4447
+ "@config.showLiveDistance",
4448
+ [
4449
+ "str/concat",
4450
+ "Distance from target: ",
4451
+ [
4452
+ "math/round",
4453
+ "@entity.distance",
4454
+ 3.0
4455
+ ],
4456
+ " · attempts: ",
4457
+ [
4458
+ "str/concat",
4459
+ "",
4460
+ "@entity.attempts"
4461
+ ]
4462
+ ],
3954
4463
  [
3955
- "math/round",
3956
- "@entity.paramB",
3957
- 2.0
4464
+ "str/concat",
4465
+ "Attempts: ",
4466
+ [
4467
+ "str/concat",
4468
+ "",
4469
+ "@entity.attempts"
4470
+ ]
3958
4471
  ]
3959
4472
  ],
3960
4473
  "type": "typography",
3961
4474
  "variant": "caption"
3962
- },
3963
- {
3964
- "action": "SET_PARAM_B",
3965
- "max": "@config.paramBMax",
3966
- "min": "@config.paramBMin",
3967
- "showTooltip": true,
3968
- "step": "@config.paramBStep",
3969
- "type": "range-slider",
3970
- "value": "@entity.paramB"
3971
4475
  }
3972
4476
  ],
3973
- "direction": "vertical",
3974
- "gap": "xs",
3975
- "type": "stack"
4477
+ "direction": "horizontal",
4478
+ "gap": "sm",
4479
+ "type": "stack",
4480
+ "wrap": true
3976
4481
  },
3977
4482
  {
3978
4483
  "animate": false,
@@ -3980,6 +4485,10 @@
3980
4485
  "gridStep": "@config.gridStep",
3981
4486
  "height": "@config.height",
3982
4487
  "interactive": false,
4488
+ "keyMap": {
4489
+ "KeyR": "RESET",
4490
+ "Space": "CHECK"
4491
+ },
3983
4492
  "points": [],
3984
4493
  "shapes": [],
3985
4494
  "showAxes": "@config.showAxes",
@@ -3993,68 +4502,83 @@
3993
4502
  "yMax": "@entity.yMax",
3994
4503
  "yMin": "@entity.yMin"
3995
4504
  },
3996
- {
3997
- "content": [
3998
- "if",
3999
- "@config.showLiveDistance",
4000
- [
4001
- "str/concat",
4002
- "Distance from target: ",
4003
- [
4004
- "math/round",
4005
- "@entity.distance",
4006
- 3.0
4007
- ],
4008
- " · attempts: ",
4009
- [
4010
- "str/concat",
4011
- "",
4012
- "@entity.attempts"
4013
- ]
4014
- ],
4015
- [
4016
- "str/concat",
4017
- "Attempts: ",
4018
- [
4019
- "str/concat",
4020
- "",
4021
- "@entity.attempts"
4022
- ]
4023
- ]
4024
- ],
4025
- "type": "typography",
4026
- "variant": "body"
4027
- },
4028
4505
  {
4029
4506
  "children": [
4030
4507
  {
4031
- "action": "CHECK",
4032
- "disabled": [
4033
- "if",
4034
- "@entity.solved",
4035
- true,
4036
- false
4508
+ "children": [
4509
+ {
4510
+ "content": [
4511
+ "str/concat",
4512
+ "@entity.paramALabel",
4513
+ ": ",
4514
+ [
4515
+ "math/round",
4516
+ "@entity.paramA",
4517
+ 2.0
4518
+ ]
4519
+ ],
4520
+ "type": "typography",
4521
+ "variant": "caption"
4522
+ },
4523
+ {
4524
+ "action": "SET_PARAM_A",
4525
+ "max": "@config.paramAMax",
4526
+ "min": "@config.paramAMin",
4527
+ "showTooltip": true,
4528
+ "step": "@config.paramAStep",
4529
+ "type": "range-slider",
4530
+ "value": "@entity.paramA"
4531
+ }
4037
4532
  ],
4038
- "label": "@config.checkLabel",
4039
- "type": "button",
4040
- "variant": "primary"
4533
+ "direction": "vertical",
4534
+ "gap": "xs",
4535
+ "type": "stack"
4041
4536
  },
4042
4537
  {
4043
- "action": "RESET",
4044
- "label": "Reset",
4045
- "type": "button",
4046
- "variant": "ghost"
4538
+ "children": [
4539
+ {
4540
+ "content": [
4541
+ "str/concat",
4542
+ "@entity.paramBLabel",
4543
+ ": ",
4544
+ [
4545
+ "math/round",
4546
+ "@entity.paramB",
4547
+ 2.0
4548
+ ]
4549
+ ],
4550
+ "type": "typography",
4551
+ "variant": "caption"
4552
+ },
4553
+ {
4554
+ "action": "SET_PARAM_B",
4555
+ "max": "@config.paramBMax",
4556
+ "min": "@config.paramBMin",
4557
+ "showTooltip": true,
4558
+ "step": "@config.paramBStep",
4559
+ "type": "range-slider",
4560
+ "value": "@entity.paramB"
4561
+ }
4562
+ ],
4563
+ "direction": "vertical",
4564
+ "gap": "xs",
4565
+ "type": "stack"
4047
4566
  }
4048
4567
  ],
4049
- "direction": "horizontal",
4568
+ "direction": "vertical",
4050
4569
  "gap": "sm",
4051
4570
  "type": "stack"
4052
4571
  },
4053
4572
  {
4054
- "children": "@entity.resultRow",
4055
- "direction": "horizontal",
4056
- "gap": "xs",
4057
- "type": "stack"
4573
+ "content": "@config.goalText",
4574
+ "type": "typography",
4575
+ "variant": "body"
4576
+ },
4577
+ {
4578
+ "color": "muted",
4579
+ "content": "@entity.feedback",
4580
+ "type": "typography",
4581
+ "variant": "caption"
4058
4582
  }
4059
4583
  ],
4060
4584
  "direction": "vertical",