@almadar/std 16.173.0 → 16.175.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 (220) hide show
  1. package/behaviors/lolo/infra/atoms/std-cross-reference.lolo +2 -4
  2. package/behaviors/lolo/ui/core/atoms/std-board.lolo +5 -9
  3. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +8 -1
  4. package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +2 -2
  5. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +3 -7
  6. package/behaviors/lolo/ui/core/atoms/std-form-advanced.lolo +1 -1
  7. package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +1 -1
  8. package/behaviors/lolo/ui/core/atoms/std-list.lolo +3 -3
  9. package/behaviors/lolo/ui/core/atoms/std-modal.lolo +2 -2
  10. package/behaviors/lolo/ui/core/atoms/std-multi-party-flow.lolo +2 -4
  11. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +5 -13
  12. package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +3 -7
  13. package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +1 -1
  14. package/behaviors/lolo/ui/core/atoms/std-signature-capture.lolo +2 -2
  15. package/behaviors/lolo/ui/core/atoms/std-step-flow.lolo +2 -4
  16. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +1 -1
  17. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +2 -2
  18. package/behaviors/lolo/ui/core/atoms/std-vote.lolo +2 -2
  19. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +3 -7
  20. package/behaviors/lolo/ui/core/atoms/ui-atlas-image.lolo +1 -1
  21. package/behaviors/lolo/ui/core/atoms/ui-atlas-panel.lolo +1 -1
  22. package/behaviors/lolo/ui/core/atoms/ui-center.lolo +1 -1
  23. package/behaviors/lolo/ui/core/atoms/ui-hstack.lolo +1 -1
  24. package/behaviors/lolo/ui/core/atoms/ui-icon.lolo +1 -1
  25. package/behaviors/lolo/ui/core/atoms/ui-stack.lolo +1 -1
  26. package/behaviors/lolo/ui/core/atoms/ui-typography.lolo +1 -1
  27. package/behaviors/lolo/ui/core/atoms/ui-vstack.lolo +1 -1
  28. package/behaviors/lolo/ui/core/molecules/ui-content-renderer.lolo +1 -1
  29. package/behaviors/lolo/ui/core/molecules/ui-form-layout.lolo +1 -1
  30. package/behaviors/lolo/ui/core/molecules/ui-grid.lolo +1 -1
  31. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +4 -9
  32. package/behaviors/lolo/ui/core/organisms/ui-chat-bar.lolo +1 -1
  33. package/behaviors/lolo/ui/core/organisms/ui-dashboard-grid.lolo +1 -1
  34. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +1 -1
  35. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +1 -1
  36. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +1 -1
  37. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +1 -1
  38. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +9 -3
  39. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +9 -3
  40. package/behaviors/lolo/ui/core/organisms/ui-master-detail.lolo +1 -1
  41. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +1 -1
  42. package/behaviors/lolo/ui/core/organisms/ui-segment-renderer.lolo +7 -1
  43. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +1 -1
  44. package/behaviors/lolo/ui/core/organisms/ui-subagent-trace-panel.lolo +1 -1
  45. package/behaviors/lolo/ui/game/atoms/ui-action-tile.lolo +1 -1
  46. package/behaviors/lolo/ui/game/atoms/ui-draw-shape-layer.lolo +41 -9
  47. package/behaviors/lolo/ui/game/atoms/ui-draw-shape.lolo +40 -8
  48. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite-layer.lolo +13 -3
  49. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite.lolo +12 -2
  50. package/behaviors/lolo/ui/game/atoms/ui-draw-text-layer.lolo +3 -3
  51. package/behaviors/lolo/ui/game/atoms/ui-draw-text.lolo +2 -2
  52. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +32 -2
  53. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +133 -23
  54. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +397 -0
  55. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +537 -0
  56. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +428 -0
  57. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +520 -0
  58. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +419 -0
  59. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +591 -0
  60. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +425 -0
  61. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +398 -0
  62. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +325 -0
  63. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +494 -0
  64. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +408 -0
  65. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +805 -0
  66. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +307 -0
  67. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +318 -0
  68. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +336 -0
  69. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +409 -0
  70. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +186 -0
  71. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +522 -0
  72. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +192 -0
  73. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +111 -2
  74. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +193 -5
  75. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +173 -5
  76. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +48 -1
  77. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +141 -1
  78. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +242 -5
  79. package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +1 -1
  80. package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +1 -1
  81. package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +1 -1
  82. package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +1 -1
  83. package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +1 -1
  84. package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +1 -1
  85. package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +1 -1
  86. package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +1 -1
  87. package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +1 -1
  88. package/behaviors/registry/agent/atoms/std-agent-session.orb +22 -1
  89. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +38 -2
  90. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +38 -2
  91. package/behaviors/registry/agent/organisms/std-agent-rabit.orb +23 -1
  92. package/behaviors/registry/infra/atoms/std-approval-gate.orb +8 -16
  93. package/behaviors/registry/infra/atoms/std-cache-aside.orb +31 -62
  94. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +16 -32
  95. package/behaviors/registry/infra/atoms/std-cross-reference.orb +32 -4
  96. package/behaviors/registry/infra/atoms/std-data-erasure.orb +8 -16
  97. package/behaviors/registry/infra/atoms/std-mod-queue.orb +8 -16
  98. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +14 -28
  99. package/behaviors/registry/infra/atoms/std-row-access-control.orb +30 -2
  100. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -2
  101. package/behaviors/registry/ui/core/atoms/std-board.orb +19 -5
  102. package/behaviors/registry/ui/core/atoms/std-browse.orb +29 -7
  103. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -2
  104. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +3 -5
  105. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +3 -6
  106. package/behaviors/registry/ui/core/atoms/std-event-log.orb +17 -3
  107. package/behaviors/registry/ui/core/atoms/std-export.orb +2 -4
  108. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
  109. package/behaviors/registry/ui/core/atoms/std-gallery.orb +9 -18
  110. package/behaviors/registry/ui/core/atoms/std-graphs.orb +15 -1
  111. package/behaviors/registry/ui/core/atoms/std-import.orb +2 -4
  112. package/behaviors/registry/ui/core/atoms/std-list.orb +4 -6
  113. package/behaviors/registry/ui/core/atoms/std-modal.orb +2 -2
  114. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +16 -2
  115. package/behaviors/registry/ui/core/atoms/std-pagination.orb +15 -1
  116. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +19 -5
  117. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +17 -3
  118. package/behaviors/registry/ui/core/atoms/std-rich-editor.orb +15 -1
  119. package/behaviors/registry/ui/core/atoms/std-scatter.orb +15 -1
  120. package/behaviors/registry/ui/core/atoms/std-signature-capture.orb +2 -2
  121. package/behaviors/registry/ui/core/atoms/std-stats.orb +15 -1
  122. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +16 -2
  123. package/behaviors/registry/ui/core/atoms/std-thread.orb +2 -2
  124. package/behaviors/registry/ui/core/atoms/std-vote.orb +2 -2
  125. package/behaviors/registry/ui/core/atoms/std-wizard.orb +17 -3
  126. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +4 -1
  127. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +4 -1
  128. package/behaviors/registry/ui/core/atoms/ui-center.orb +4 -1
  129. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +4 -1
  130. package/behaviors/registry/ui/core/atoms/ui-icon.orb +4 -1
  131. package/behaviors/registry/ui/core/atoms/ui-stack.orb +4 -1
  132. package/behaviors/registry/ui/core/atoms/ui-typography.orb +4 -1
  133. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +4 -1
  134. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +3 -3
  135. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +4 -1
  136. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +4 -1
  137. package/behaviors/registry/ui/core/molecules/ui-grid.orb +4 -1
  138. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +4 -39
  139. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +2 -2
  140. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
  141. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +4 -1
  142. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +5 -2
  143. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +5 -2
  144. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +4 -1
  145. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +4 -1
  146. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +4 -1
  147. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +34 -2
  148. package/behaviors/registry/ui/core/organisms/ui-form.orb +34 -2
  149. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +4 -1
  150. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +4 -1
  151. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +24 -2
  152. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +4 -1
  153. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +4 -1
  154. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  155. package/behaviors/registry/ui/core/organisms/ui-ui-slot-renderer.orb +1 -1
  156. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +35 -1
  157. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +4 -1
  158. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +183 -13
  159. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +104 -9
  160. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +56 -2
  161. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +36 -4
  162. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +21 -2
  163. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +19 -4
  164. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +173 -2
  165. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1288 -197
  166. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +2814 -0
  167. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3183 -0
  168. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +2512 -0
  169. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +3678 -0
  170. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +2394 -0
  171. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +3951 -0
  172. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +3458 -0
  173. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +2646 -0
  174. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1979 -0
  175. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +2994 -0
  176. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +2682 -0
  177. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +6539 -0
  178. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1842 -0
  179. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1648 -0
  180. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +2307 -0
  181. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +3118 -0
  182. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +986 -0
  183. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +3333 -0
  184. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +716 -0
  185. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +679 -5
  186. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +962 -18
  187. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +919 -30
  188. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +372 -1
  189. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +936 -16
  190. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1328 -43
  191. package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +1 -2
  192. package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +1 -2
  193. package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +1 -2
  194. package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +1 -2
  195. package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +1 -2
  196. package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +1 -2
  197. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +4 -1
  198. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +4 -1
  199. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +4 -1
  200. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +4 -1
  201. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +4 -1
  202. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +4 -1
  203. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +4 -1
  204. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +4 -1
  205. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +4 -1
  206. package/dist/behaviors/exports-reader.js +3704 -2189
  207. package/dist/behaviors/functions/index.d.ts +2638 -254
  208. package/dist/behaviors/functions/index.js +3648 -2190
  209. package/dist/behaviors/index.d.ts +1 -1
  210. package/dist/behaviors/index.js +3705 -2190
  211. package/dist/behaviors/query.js +3704 -2189
  212. package/dist/behaviors-embeddings.hash.json +3 -3
  213. package/dist/behaviors-embeddings.json +289 -213
  214. package/dist/behaviors-registry.json +7900 -587
  215. package/dist/index.d.ts +1 -1
  216. package/dist/index.js +3705 -2190
  217. package/dist/knob-embeddings.hash.json +3 -3
  218. package/dist/knob-embeddings.json +1 -1
  219. package/dist/registry/factory-signatures.json +1 -1
  220. package/package.json +2 -2
@@ -64,6 +64,15 @@
64
64
  "parent": "trt_01KZEFWYXP5EK4MMGJG1PAGTNG",
65
65
  "renames": []
66
66
  },
67
+ "evt_01M0C5Q7CX6XJDQZ9YRAZJGB0K": {
68
+ "bakedName": "TOGGLE_RUN",
69
+ "curName": "TOGGLE_RUN",
70
+ "id": "evt_01M0C5Q7CX6XJDQZ9YRAZJGB0K",
71
+ "kind": "event",
72
+ "owner": "workspace",
73
+ "parent": "trt_01KZEFWYXP5EK4MMGJG1PAGTNG",
74
+ "renames": []
75
+ },
67
76
  "orb_01KZEFWYXPQ981SKZVC2A5E2Q9": {
68
77
  "bakedName": "LearnClassifyOrbital",
69
78
  "curName": "LearnClassifyOrbital",
@@ -159,6 +168,21 @@
159
168
  "name": "roundComplete",
160
169
  "type": "boolean"
161
170
  },
171
+ {
172
+ "default": false,
173
+ "name": "running",
174
+ "type": "boolean"
175
+ },
176
+ {
177
+ "default": 0.0,
178
+ "name": "elapsedMs",
179
+ "type": "number"
180
+ },
181
+ {
182
+ "default": 0.0,
183
+ "name": "score",
184
+ "type": "number"
185
+ },
162
186
  {
163
187
  "items": {
164
188
  "properties": {
@@ -359,7 +383,7 @@
359
383
  },
360
384
  {
361
385
  "items": {
362
- "type": "object"
386
+ "type": "node"
363
387
  },
364
388
  "name": "roundView",
365
389
  "type": "array"
@@ -395,6 +419,13 @@
395
419
  "tier": "presentation",
396
420
  "type": "string"
397
421
  },
422
+ "advanceMs": {
423
+ "default": 900.0,
424
+ "description": "Milliseconds between automatic advances while running — the 32ms base tick accumulates elapsed time and fires ADVANCE each time this interval elapses.",
425
+ "label": "Auto-Advance Interval (ms)",
426
+ "tier": "domain",
427
+ "type": "number"
428
+ },
398
429
  "animate": {
399
430
  "default": false,
400
431
  "description": "Enable continuous redraw loop.",
@@ -402,6 +433,13 @@
402
433
  "tier": "presentation",
403
434
  "type": "boolean"
404
435
  },
436
+ "autoRun": {
437
+ "default": false,
438
+ "description": "When true the advance clock starts on load and the drill flips to the next item every advanceMs milliseconds; toggle live with the Auto/Pause button.",
439
+ "label": "Auto Run",
440
+ "tier": "domain",
441
+ "type": "boolean"
442
+ },
405
443
  "backgroundColor": {
406
444
  "default": "#f8fafc",
407
445
  "label": "Background Color",
@@ -508,6 +546,26 @@
508
546
  "required": false,
509
547
  "type": "string"
510
548
  },
549
+ "options": {
550
+ "items": {
551
+ "properties": {
552
+ "category": {
553
+ "name": "category",
554
+ "required": true,
555
+ "type": "string"
556
+ },
557
+ "label": {
558
+ "name": "label",
559
+ "required": true,
560
+ "type": "string"
561
+ }
562
+ },
563
+ "type": "object"
564
+ },
565
+ "name": "options",
566
+ "required": false,
567
+ "type": "array"
568
+ },
511
569
  "text": {
512
570
  "name": "text",
513
571
  "required": true,
@@ -521,6 +579,13 @@
521
579
  "tier": "domain",
522
580
  "type": "[LearnClassifyItem]"
523
581
  },
582
+ "loopRound": {
583
+ "default": false,
584
+ "description": "When true the item cursor wraps past the last item forever (a looping drill) instead of ending the round at the summary screen.",
585
+ "label": "Loop Round",
586
+ "tier": "domain",
587
+ "type": "boolean"
588
+ },
524
589
  "matchMode": {
525
590
  "default": "",
526
591
  "description": "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT.",
@@ -528,6 +593,34 @@
528
593
  "tier": "presentation",
529
594
  "type": "string"
530
595
  },
596
+ "orderStride": {
597
+ "default": 1.0,
598
+ "description": "Items advance by this stride through the roster — 1 is sequential; a stride coprime with the roster length (e.g. 3) interleaves the corpus so adjacent items differ.",
599
+ "label": "Order Stride",
600
+ "tier": "domain",
601
+ "type": "number"
602
+ },
603
+ "passScore": {
604
+ "default": 0.0,
605
+ "description": "Target score shown next to the running score as \"pass at N\"; 0 hides the target.",
606
+ "label": "Pass Score",
607
+ "tier": "domain",
608
+ "type": "number"
609
+ },
610
+ "penaltyPerMiss": {
611
+ "default": 0.0,
612
+ "description": "Rubric points subtracted for each incorrect pick (score never drops below 0).",
613
+ "label": "Penalty Per Miss",
614
+ "tier": "domain",
615
+ "type": "number"
616
+ },
617
+ "pointsPerCorrect": {
618
+ "default": 1.0,
619
+ "description": "Rubric points added to the score for each correct pick; at the default 1 with no penalty, the plain correct/attempted counts render instead of the rubric score.",
620
+ "label": "Points Per Correct",
621
+ "tier": "domain",
622
+ "type": "number"
623
+ },
531
624
  "retryLabel": {
532
625
  "default": "Retry Round",
533
626
  "description": "Label text for the button that restarts the round from the end-of-round summary.",
@@ -535,6 +628,20 @@
535
628
  "tier": "presentation",
536
629
  "type": "string"
537
630
  },
631
+ "scoreCap": {
632
+ "default": 0.0,
633
+ "description": "Upper bound on the rubric score; 0 means uncapped.",
634
+ "label": "Score Cap",
635
+ "tier": "domain",
636
+ "type": "number"
637
+ },
638
+ "showHint": {
639
+ "default": true,
640
+ "description": "Show each item's hint line beneath the prompt before the learner picks; hide for a harder drill.",
641
+ "label": "Show Hint",
642
+ "tier": "domain",
643
+ "type": "boolean"
644
+ },
538
645
  "title": {
539
646
  "default": "Classify",
540
647
  "description": "Title shown above the instrument.",
@@ -594,6 +701,7 @@
594
701
  "categoryStats",
595
702
  "correctCategory",
596
703
  "correctCount",
704
+ "elapsedMs",
597
705
  "feedback",
598
706
  "itemExplanation",
599
707
  "itemHint",
@@ -601,6 +709,8 @@
601
709
  "itemText",
602
710
  "roundComplete",
603
711
  "roundView",
712
+ "running",
713
+ "score",
604
714
  "selectedCategory",
605
715
  "title",
606
716
  "totalItems",
@@ -664,6 +774,13 @@
664
774
  "name": "Retry",
665
775
  "tier": "domain"
666
776
  },
777
+ {
778
+ "description": "Learner toggled auto-advance: while running, the advance clock steps to the next item every advanceMs milliseconds.",
779
+ "id": "evt_01M0C5Q7CX6XJDQZ9YRAZJGB0K",
780
+ "key": "TOGGLE_RUN",
781
+ "name": "Toggle Run",
782
+ "tier": "domain"
783
+ },
667
784
  {
668
785
  "description": "The classification state after each learner action — a composed listener (readout, grader) can subscribe; a harmless no-op when the atom runs standalone.",
669
786
  "id": "evt_01KZEFWYXQ79QRSM4HE1YVSQBD",
@@ -753,6 +870,21 @@
753
870
  "@entity.roundComplete",
754
871
  false
755
872
  ],
873
+ [
874
+ "set",
875
+ "@entity.running",
876
+ "@config.autoRun"
877
+ ],
878
+ [
879
+ "set",
880
+ "@entity.elapsedMs",
881
+ 0.0
882
+ ],
883
+ [
884
+ "set",
885
+ "@entity.score",
886
+ 0.0
887
+ ],
756
888
  [
757
889
  "set",
758
890
  "@entity.totalItems",
@@ -1275,9 +1407,13 @@
1275
1407
  [
1276
1408
  "if",
1277
1409
  [
1278
- "!=",
1279
- "@entity.itemHint",
1280
- ""
1410
+ "and",
1411
+ "@config.showHint",
1412
+ [
1413
+ "!=",
1414
+ "@entity.itemHint",
1415
+ ""
1416
+ ]
1281
1417
  ],
1282
1418
  [
1283
1419
  {
@@ -1307,45 +1443,113 @@
1307
1443
  },
1308
1444
  {
1309
1445
  "children": [
1310
- "array/map",
1446
+ "let",
1311
1447
  [
1312
- "array/reverse",
1313
- "@config.categories"
1448
+ [
1449
+ "itemOptions",
1450
+ [
1451
+ "object/get",
1452
+ [
1453
+ "array/nth",
1454
+ "@config.items",
1455
+ "@entity.itemIndex"
1456
+ ],
1457
+ "options",
1458
+ []
1459
+ ]
1460
+ ]
1314
1461
  ],
1315
1462
  [
1316
- "fn",
1317
- "c",
1318
- {
1319
- "action": "PICK",
1320
- "actionPayload": {
1321
- "category": [
1322
- "object/get",
1323
- "@c",
1324
- "value"
1325
- ]
1326
- },
1327
- "label": [
1328
- "object/get",
1329
- "@c",
1330
- "label"
1463
+ "if",
1464
+ [
1465
+ ">",
1466
+ [
1467
+ "array/len",
1468
+ "@itemOptions"
1331
1469
  ],
1332
- "size": "sm",
1333
- "type": "button",
1334
- "variant": [
1335
- "if",
1336
- [
1337
- "==",
1338
- "@entity.selectedCategory",
1339
- [
1470
+ 0.0
1471
+ ],
1472
+ [
1473
+ "array/map",
1474
+ "@itemOptions",
1475
+ [
1476
+ "fn",
1477
+ "o",
1478
+ {
1479
+ "action": "PICK",
1480
+ "actionPayload": {
1481
+ "category": [
1482
+ "object/get",
1483
+ "@o",
1484
+ "category"
1485
+ ]
1486
+ },
1487
+ "label": [
1488
+ "object/get",
1489
+ "@o",
1490
+ "label"
1491
+ ],
1492
+ "size": "sm",
1493
+ "type": "button",
1494
+ "variant": [
1495
+ "if",
1496
+ [
1497
+ "==",
1498
+ "@entity.selectedCategory",
1499
+ [
1500
+ "object/get",
1501
+ "@o",
1502
+ "category"
1503
+ ]
1504
+ ],
1505
+ "primary",
1506
+ "secondary"
1507
+ ]
1508
+ }
1509
+ ]
1510
+ ],
1511
+ [
1512
+ "array/map",
1513
+ [
1514
+ "array/reverse",
1515
+ "@config.categories"
1516
+ ],
1517
+ [
1518
+ "fn",
1519
+ "c",
1520
+ {
1521
+ "action": "PICK",
1522
+ "actionPayload": {
1523
+ "category": [
1524
+ "object/get",
1525
+ "@c",
1526
+ "value"
1527
+ ]
1528
+ },
1529
+ "label": [
1340
1530
  "object/get",
1341
1531
  "@c",
1342
- "value"
1532
+ "label"
1533
+ ],
1534
+ "size": "sm",
1535
+ "type": "button",
1536
+ "variant": [
1537
+ "if",
1538
+ [
1539
+ "==",
1540
+ "@entity.selectedCategory",
1541
+ [
1542
+ "object/get",
1543
+ "@c",
1544
+ "value"
1545
+ ]
1546
+ ],
1547
+ "primary",
1548
+ "secondary"
1343
1549
  ]
1344
- ],
1345
- "primary",
1346
- "secondary"
1550
+ }
1347
1551
  ]
1348
- }
1552
+ ]
1349
1553
  ]
1350
1554
  ],
1351
1555
  "direction": "horizontal",
@@ -1418,6 +1622,17 @@
1418
1622
  "label": "@config.advanceLabel",
1419
1623
  "type": "button",
1420
1624
  "variant": "primary"
1625
+ },
1626
+ {
1627
+ "action": "TOGGLE_RUN",
1628
+ "label": [
1629
+ "if",
1630
+ "@entity.running",
1631
+ "Pause",
1632
+ "Auto"
1633
+ ],
1634
+ "type": "button",
1635
+ "variant": "ghost"
1421
1636
  }
1422
1637
  ],
1423
1638
  "direction": "horizontal",
@@ -1425,10 +1640,70 @@
1425
1640
  "type": "stack"
1426
1641
  },
1427
1642
  {
1428
- "label": "Score",
1429
- "max": "@entity.attemptedCount",
1643
+ "label": [
1644
+ "if",
1645
+ [
1646
+ ">",
1647
+ "@config.passScore",
1648
+ 0.0
1649
+ ],
1650
+ [
1651
+ "str/concat",
1652
+ "Score — pass at ",
1653
+ "@config.passScore"
1654
+ ],
1655
+ "Score"
1656
+ ],
1657
+ "max": [
1658
+ "if",
1659
+ [
1660
+ "or",
1661
+ [
1662
+ "!=",
1663
+ "@config.pointsPerCorrect",
1664
+ 1.0
1665
+ ],
1666
+ [
1667
+ ">",
1668
+ "@config.penaltyPerMiss",
1669
+ 0.0
1670
+ ]
1671
+ ],
1672
+ [
1673
+ "if",
1674
+ [
1675
+ ">",
1676
+ "@config.scoreCap",
1677
+ 0.0
1678
+ ],
1679
+ "@config.scoreCap",
1680
+ [
1681
+ "*",
1682
+ "@entity.totalItems",
1683
+ "@config.pointsPerCorrect"
1684
+ ]
1685
+ ],
1686
+ "@entity.attemptedCount"
1687
+ ],
1430
1688
  "type": "stat-display",
1431
- "value": "@entity.correctCount"
1689
+ "value": [
1690
+ "if",
1691
+ [
1692
+ "or",
1693
+ [
1694
+ "!=",
1695
+ "@config.pointsPerCorrect",
1696
+ 1.0
1697
+ ],
1698
+ [
1699
+ ">",
1700
+ "@config.penaltyPerMiss",
1701
+ 0.0
1702
+ ]
1703
+ ],
1704
+ "@entity.score",
1705
+ "@entity.correctCount"
1706
+ ]
1432
1707
  }
1433
1708
  ]
1434
1709
  ]
@@ -1567,6 +1842,21 @@
1567
1842
  "@entity.roundComplete",
1568
1843
  false
1569
1844
  ],
1845
+ [
1846
+ "set",
1847
+ "@entity.running",
1848
+ "@config.autoRun"
1849
+ ],
1850
+ [
1851
+ "set",
1852
+ "@entity.elapsedMs",
1853
+ 0.0
1854
+ ],
1855
+ [
1856
+ "set",
1857
+ "@entity.score",
1858
+ 0.0
1859
+ ],
1570
1860
  [
1571
1861
  "set",
1572
1862
  "@entity.totalItems",
@@ -2089,9 +2379,13 @@
2089
2379
  [
2090
2380
  "if",
2091
2381
  [
2092
- "!=",
2093
- "@entity.itemHint",
2094
- ""
2382
+ "and",
2383
+ "@config.showHint",
2384
+ [
2385
+ "!=",
2386
+ "@entity.itemHint",
2387
+ ""
2388
+ ]
2095
2389
  ],
2096
2390
  [
2097
2391
  {
@@ -2121,45 +2415,113 @@
2121
2415
  },
2122
2416
  {
2123
2417
  "children": [
2124
- "array/map",
2418
+ "let",
2125
2419
  [
2126
- "array/reverse",
2127
- "@config.categories"
2420
+ [
2421
+ "itemOptions",
2422
+ [
2423
+ "object/get",
2424
+ [
2425
+ "array/nth",
2426
+ "@config.items",
2427
+ "@entity.itemIndex"
2428
+ ],
2429
+ "options",
2430
+ []
2431
+ ]
2432
+ ]
2128
2433
  ],
2129
2434
  [
2130
- "fn",
2131
- "c",
2132
- {
2133
- "action": "PICK",
2134
- "actionPayload": {
2135
- "category": [
2136
- "object/get",
2137
- "@c",
2138
- "value"
2139
- ]
2140
- },
2141
- "label": [
2142
- "object/get",
2143
- "@c",
2144
- "label"
2435
+ "if",
2436
+ [
2437
+ ">",
2438
+ [
2439
+ "array/len",
2440
+ "@itemOptions"
2145
2441
  ],
2146
- "size": "sm",
2147
- "type": "button",
2148
- "variant": [
2149
- "if",
2150
- [
2151
- "==",
2152
- "@entity.selectedCategory",
2153
- [
2442
+ 0.0
2443
+ ],
2444
+ [
2445
+ "array/map",
2446
+ "@itemOptions",
2447
+ [
2448
+ "fn",
2449
+ "o",
2450
+ {
2451
+ "action": "PICK",
2452
+ "actionPayload": {
2453
+ "category": [
2454
+ "object/get",
2455
+ "@o",
2456
+ "category"
2457
+ ]
2458
+ },
2459
+ "label": [
2460
+ "object/get",
2461
+ "@o",
2462
+ "label"
2463
+ ],
2464
+ "size": "sm",
2465
+ "type": "button",
2466
+ "variant": [
2467
+ "if",
2468
+ [
2469
+ "==",
2470
+ "@entity.selectedCategory",
2471
+ [
2472
+ "object/get",
2473
+ "@o",
2474
+ "category"
2475
+ ]
2476
+ ],
2477
+ "primary",
2478
+ "secondary"
2479
+ ]
2480
+ }
2481
+ ]
2482
+ ],
2483
+ [
2484
+ "array/map",
2485
+ [
2486
+ "array/reverse",
2487
+ "@config.categories"
2488
+ ],
2489
+ [
2490
+ "fn",
2491
+ "c",
2492
+ {
2493
+ "action": "PICK",
2494
+ "actionPayload": {
2495
+ "category": [
2496
+ "object/get",
2497
+ "@c",
2498
+ "value"
2499
+ ]
2500
+ },
2501
+ "label": [
2154
2502
  "object/get",
2155
2503
  "@c",
2156
- "value"
2504
+ "label"
2505
+ ],
2506
+ "size": "sm",
2507
+ "type": "button",
2508
+ "variant": [
2509
+ "if",
2510
+ [
2511
+ "==",
2512
+ "@entity.selectedCategory",
2513
+ [
2514
+ "object/get",
2515
+ "@c",
2516
+ "value"
2517
+ ]
2518
+ ],
2519
+ "primary",
2520
+ "secondary"
2157
2521
  ]
2158
- ],
2159
- "primary",
2160
- "secondary"
2522
+ }
2161
2523
  ]
2162
- }
2524
+ ]
2163
2525
  ]
2164
2526
  ],
2165
2527
  "direction": "horizontal",
@@ -2232,6 +2594,17 @@
2232
2594
  "label": "@config.advanceLabel",
2233
2595
  "type": "button",
2234
2596
  "variant": "primary"
2597
+ },
2598
+ {
2599
+ "action": "TOGGLE_RUN",
2600
+ "label": [
2601
+ "if",
2602
+ "@entity.running",
2603
+ "Pause",
2604
+ "Auto"
2605
+ ],
2606
+ "type": "button",
2607
+ "variant": "ghost"
2235
2608
  }
2236
2609
  ],
2237
2610
  "direction": "horizontal",
@@ -2239,12 +2612,72 @@
2239
2612
  "type": "stack"
2240
2613
  },
2241
2614
  {
2242
- "label": "Score",
2243
- "max": "@entity.attemptedCount",
2615
+ "label": [
2616
+ "if",
2617
+ [
2618
+ ">",
2619
+ "@config.passScore",
2620
+ 0.0
2621
+ ],
2622
+ [
2623
+ "str/concat",
2624
+ "Score — pass at ",
2625
+ "@config.passScore"
2626
+ ],
2627
+ "Score"
2628
+ ],
2629
+ "max": [
2630
+ "if",
2631
+ [
2632
+ "or",
2633
+ [
2634
+ "!=",
2635
+ "@config.pointsPerCorrect",
2636
+ 1.0
2637
+ ],
2638
+ [
2639
+ ">",
2640
+ "@config.penaltyPerMiss",
2641
+ 0.0
2642
+ ]
2643
+ ],
2644
+ [
2645
+ "if",
2646
+ [
2647
+ ">",
2648
+ "@config.scoreCap",
2649
+ 0.0
2650
+ ],
2651
+ "@config.scoreCap",
2652
+ [
2653
+ "*",
2654
+ "@entity.totalItems",
2655
+ "@config.pointsPerCorrect"
2656
+ ]
2657
+ ],
2658
+ "@entity.attemptedCount"
2659
+ ],
2244
2660
  "type": "stat-display",
2245
- "value": "@entity.correctCount"
2246
- }
2247
- ]
2661
+ "value": [
2662
+ "if",
2663
+ [
2664
+ "or",
2665
+ [
2666
+ "!=",
2667
+ "@config.pointsPerCorrect",
2668
+ 1.0
2669
+ ],
2670
+ [
2671
+ ">",
2672
+ "@config.penaltyPerMiss",
2673
+ 0.0
2674
+ ]
2675
+ ],
2676
+ "@entity.score",
2677
+ "@entity.correctCount"
2678
+ ]
2679
+ }
2680
+ ]
2248
2681
  ]
2249
2682
  ],
2250
2683
  [
@@ -2437,6 +2870,50 @@
2437
2870
  "@entity.correctCount"
2438
2871
  ]
2439
2872
  ],
2873
+ [
2874
+ "set",
2875
+ "@entity.score",
2876
+ [
2877
+ "let",
2878
+ [
2879
+ [
2880
+ "raw",
2881
+ [
2882
+ "if",
2883
+ "@isCorrect",
2884
+ [
2885
+ "+",
2886
+ "@entity.score",
2887
+ "@config.pointsPerCorrect"
2888
+ ],
2889
+ [
2890
+ "-",
2891
+ "@entity.score",
2892
+ "@config.penaltyPerMiss"
2893
+ ]
2894
+ ]
2895
+ ]
2896
+ ],
2897
+ [
2898
+ "math/max",
2899
+ 0.0,
2900
+ [
2901
+ "if",
2902
+ [
2903
+ ">",
2904
+ "@config.scoreCap",
2905
+ 0.0
2906
+ ],
2907
+ [
2908
+ "math/min",
2909
+ "@raw",
2910
+ "@config.scoreCap"
2911
+ ],
2912
+ "@raw"
2913
+ ]
2914
+ ]
2915
+ ]
2916
+ ],
2440
2917
  [
2441
2918
  "set",
2442
2919
  "@entity.verdict",
@@ -2950,9 +3427,13 @@
2950
3427
  [
2951
3428
  "if",
2952
3429
  [
2953
- "!=",
2954
- "@entity.itemHint",
2955
- ""
3430
+ "and",
3431
+ "@config.showHint",
3432
+ [
3433
+ "!=",
3434
+ "@entity.itemHint",
3435
+ ""
3436
+ ]
2956
3437
  ],
2957
3438
  [
2958
3439
  {
@@ -2982,45 +3463,113 @@
2982
3463
  },
2983
3464
  {
2984
3465
  "children": [
2985
- "array/map",
3466
+ "let",
2986
3467
  [
2987
- "array/reverse",
2988
- "@config.categories"
3468
+ [
3469
+ "itemOptions",
3470
+ [
3471
+ "object/get",
3472
+ [
3473
+ "array/nth",
3474
+ "@config.items",
3475
+ "@entity.itemIndex"
3476
+ ],
3477
+ "options",
3478
+ []
3479
+ ]
3480
+ ]
2989
3481
  ],
2990
3482
  [
2991
- "fn",
2992
- "c",
2993
- {
2994
- "action": "PICK",
2995
- "actionPayload": {
2996
- "category": [
2997
- "object/get",
2998
- "@c",
2999
- "value"
3000
- ]
3001
- },
3002
- "label": [
3003
- "object/get",
3004
- "@c",
3005
- "label"
3483
+ "if",
3484
+ [
3485
+ ">",
3486
+ [
3487
+ "array/len",
3488
+ "@itemOptions"
3006
3489
  ],
3007
- "size": "sm",
3008
- "type": "button",
3009
- "variant": [
3010
- "if",
3011
- [
3012
- "==",
3013
- "@entity.selectedCategory",
3014
- [
3490
+ 0.0
3491
+ ],
3492
+ [
3493
+ "array/map",
3494
+ "@itemOptions",
3495
+ [
3496
+ "fn",
3497
+ "o",
3498
+ {
3499
+ "action": "PICK",
3500
+ "actionPayload": {
3501
+ "category": [
3502
+ "object/get",
3503
+ "@o",
3504
+ "category"
3505
+ ]
3506
+ },
3507
+ "label": [
3508
+ "object/get",
3509
+ "@o",
3510
+ "label"
3511
+ ],
3512
+ "size": "sm",
3513
+ "type": "button",
3514
+ "variant": [
3515
+ "if",
3516
+ [
3517
+ "==",
3518
+ "@entity.selectedCategory",
3519
+ [
3520
+ "object/get",
3521
+ "@o",
3522
+ "category"
3523
+ ]
3524
+ ],
3525
+ "primary",
3526
+ "secondary"
3527
+ ]
3528
+ }
3529
+ ]
3530
+ ],
3531
+ [
3532
+ "array/map",
3533
+ [
3534
+ "array/reverse",
3535
+ "@config.categories"
3536
+ ],
3537
+ [
3538
+ "fn",
3539
+ "c",
3540
+ {
3541
+ "action": "PICK",
3542
+ "actionPayload": {
3543
+ "category": [
3544
+ "object/get",
3545
+ "@c",
3546
+ "value"
3547
+ ]
3548
+ },
3549
+ "label": [
3015
3550
  "object/get",
3016
3551
  "@c",
3017
- "value"
3552
+ "label"
3553
+ ],
3554
+ "size": "sm",
3555
+ "type": "button",
3556
+ "variant": [
3557
+ "if",
3558
+ [
3559
+ "==",
3560
+ "@entity.selectedCategory",
3561
+ [
3562
+ "object/get",
3563
+ "@c",
3564
+ "value"
3565
+ ]
3566
+ ],
3567
+ "primary",
3568
+ "secondary"
3018
3569
  ]
3019
- ],
3020
- "primary",
3021
- "secondary"
3570
+ }
3022
3571
  ]
3023
- }
3572
+ ]
3024
3573
  ]
3025
3574
  ],
3026
3575
  "direction": "horizontal",
@@ -3093,6 +3642,17 @@
3093
3642
  "label": "@config.advanceLabel",
3094
3643
  "type": "button",
3095
3644
  "variant": "primary"
3645
+ },
3646
+ {
3647
+ "action": "TOGGLE_RUN",
3648
+ "label": [
3649
+ "if",
3650
+ "@entity.running",
3651
+ "Pause",
3652
+ "Auto"
3653
+ ],
3654
+ "type": "button",
3655
+ "variant": "ghost"
3096
3656
  }
3097
3657
  ],
3098
3658
  "direction": "horizontal",
@@ -3100,10 +3660,70 @@
3100
3660
  "type": "stack"
3101
3661
  },
3102
3662
  {
3103
- "label": "Score",
3104
- "max": "@entity.attemptedCount",
3663
+ "label": [
3664
+ "if",
3665
+ [
3666
+ ">",
3667
+ "@config.passScore",
3668
+ 0.0
3669
+ ],
3670
+ [
3671
+ "str/concat",
3672
+ "Score — pass at ",
3673
+ "@config.passScore"
3674
+ ],
3675
+ "Score"
3676
+ ],
3677
+ "max": [
3678
+ "if",
3679
+ [
3680
+ "or",
3681
+ [
3682
+ "!=",
3683
+ "@config.pointsPerCorrect",
3684
+ 1.0
3685
+ ],
3686
+ [
3687
+ ">",
3688
+ "@config.penaltyPerMiss",
3689
+ 0.0
3690
+ ]
3691
+ ],
3692
+ [
3693
+ "if",
3694
+ [
3695
+ ">",
3696
+ "@config.scoreCap",
3697
+ 0.0
3698
+ ],
3699
+ "@config.scoreCap",
3700
+ [
3701
+ "*",
3702
+ "@entity.totalItems",
3703
+ "@config.pointsPerCorrect"
3704
+ ]
3705
+ ],
3706
+ "@entity.attemptedCount"
3707
+ ],
3105
3708
  "type": "stat-display",
3106
- "value": "@entity.correctCount"
3709
+ "value": [
3710
+ "if",
3711
+ [
3712
+ "or",
3713
+ [
3714
+ "!=",
3715
+ "@config.pointsPerCorrect",
3716
+ 1.0
3717
+ ],
3718
+ [
3719
+ ">",
3720
+ "@config.penaltyPerMiss",
3721
+ 0.0
3722
+ ]
3723
+ ],
3724
+ "@entity.score",
3725
+ "@entity.correctCount"
3726
+ ]
3107
3727
  }
3108
3728
  ]
3109
3729
  ]
@@ -3223,12 +3843,19 @@
3223
3843
  [
3224
3844
  "isLast",
3225
3845
  [
3226
- ">=",
3227
- "@entity.itemIndex",
3846
+ "and",
3228
3847
  [
3229
- "-",
3230
- "@entity.totalItems",
3231
- 1.0
3848
+ "not",
3849
+ "@config.loopRound"
3850
+ ],
3851
+ [
3852
+ ">=",
3853
+ [
3854
+ "+",
3855
+ "@entity.itemIndex",
3856
+ "@config.orderStride"
3857
+ ],
3858
+ "@entity.totalItems"
3232
3859
  ]
3233
3860
  ]
3234
3861
  ]
@@ -3265,9 +3892,22 @@
3265
3892
  [
3266
3893
  "nextIndex",
3267
3894
  [
3268
- "+",
3269
- "@entity.itemIndex",
3270
- 1.0
3895
+ "if",
3896
+ "@config.loopRound",
3897
+ [
3898
+ "math/mod",
3899
+ [
3900
+ "+",
3901
+ "@entity.itemIndex",
3902
+ "@config.orderStride"
3903
+ ],
3904
+ "@entity.totalItems"
3905
+ ],
3906
+ [
3907
+ "+",
3908
+ "@entity.itemIndex",
3909
+ "@config.orderStride"
3910
+ ]
3271
3911
  ]
3272
3912
  ],
3273
3913
  [
@@ -3777,9 +4417,13 @@
3777
4417
  [
3778
4418
  "if",
3779
4419
  [
3780
- "!=",
3781
- "@entity.itemHint",
3782
- ""
4420
+ "and",
4421
+ "@config.showHint",
4422
+ [
4423
+ "!=",
4424
+ "@entity.itemHint",
4425
+ ""
4426
+ ]
3783
4427
  ],
3784
4428
  [
3785
4429
  {
@@ -3809,45 +4453,113 @@
3809
4453
  },
3810
4454
  {
3811
4455
  "children": [
3812
- "array/map",
4456
+ "let",
3813
4457
  [
3814
- "array/reverse",
3815
- "@config.categories"
4458
+ [
4459
+ "itemOptions",
4460
+ [
4461
+ "object/get",
4462
+ [
4463
+ "array/nth",
4464
+ "@config.items",
4465
+ "@entity.itemIndex"
4466
+ ],
4467
+ "options",
4468
+ []
4469
+ ]
4470
+ ]
3816
4471
  ],
3817
4472
  [
3818
- "fn",
3819
- "c",
3820
- {
3821
- "action": "PICK",
3822
- "actionPayload": {
3823
- "category": [
3824
- "object/get",
3825
- "@c",
3826
- "value"
3827
- ]
3828
- },
3829
- "label": [
3830
- "object/get",
3831
- "@c",
3832
- "label"
4473
+ "if",
4474
+ [
4475
+ ">",
4476
+ [
4477
+ "array/len",
4478
+ "@itemOptions"
3833
4479
  ],
3834
- "size": "sm",
3835
- "type": "button",
3836
- "variant": [
3837
- "if",
3838
- [
3839
- "==",
3840
- "@entity.selectedCategory",
3841
- [
4480
+ 0.0
4481
+ ],
4482
+ [
4483
+ "array/map",
4484
+ "@itemOptions",
4485
+ [
4486
+ "fn",
4487
+ "o",
4488
+ {
4489
+ "action": "PICK",
4490
+ "actionPayload": {
4491
+ "category": [
4492
+ "object/get",
4493
+ "@o",
4494
+ "category"
4495
+ ]
4496
+ },
4497
+ "label": [
4498
+ "object/get",
4499
+ "@o",
4500
+ "label"
4501
+ ],
4502
+ "size": "sm",
4503
+ "type": "button",
4504
+ "variant": [
4505
+ "if",
4506
+ [
4507
+ "==",
4508
+ "@entity.selectedCategory",
4509
+ [
4510
+ "object/get",
4511
+ "@o",
4512
+ "category"
4513
+ ]
4514
+ ],
4515
+ "primary",
4516
+ "secondary"
4517
+ ]
4518
+ }
4519
+ ]
4520
+ ],
4521
+ [
4522
+ "array/map",
4523
+ [
4524
+ "array/reverse",
4525
+ "@config.categories"
4526
+ ],
4527
+ [
4528
+ "fn",
4529
+ "c",
4530
+ {
4531
+ "action": "PICK",
4532
+ "actionPayload": {
4533
+ "category": [
4534
+ "object/get",
4535
+ "@c",
4536
+ "value"
4537
+ ]
4538
+ },
4539
+ "label": [
3842
4540
  "object/get",
3843
4541
  "@c",
3844
- "value"
4542
+ "label"
4543
+ ],
4544
+ "size": "sm",
4545
+ "type": "button",
4546
+ "variant": [
4547
+ "if",
4548
+ [
4549
+ "==",
4550
+ "@entity.selectedCategory",
4551
+ [
4552
+ "object/get",
4553
+ "@c",
4554
+ "value"
4555
+ ]
4556
+ ],
4557
+ "primary",
4558
+ "secondary"
3845
4559
  ]
3846
- ],
3847
- "primary",
3848
- "secondary"
4560
+ }
3849
4561
  ]
3850
- }
4562
+ ]
3851
4563
  ]
3852
4564
  ],
3853
4565
  "direction": "horizontal",
@@ -3920,6 +4632,17 @@
3920
4632
  "label": "@config.advanceLabel",
3921
4633
  "type": "button",
3922
4634
  "variant": "primary"
4635
+ },
4636
+ {
4637
+ "action": "TOGGLE_RUN",
4638
+ "label": [
4639
+ "if",
4640
+ "@entity.running",
4641
+ "Pause",
4642
+ "Auto"
4643
+ ],
4644
+ "type": "button",
4645
+ "variant": "ghost"
3923
4646
  }
3924
4647
  ],
3925
4648
  "direction": "horizontal",
@@ -3927,10 +4650,70 @@
3927
4650
  "type": "stack"
3928
4651
  },
3929
4652
  {
3930
- "label": "Score",
3931
- "max": "@entity.attemptedCount",
4653
+ "label": [
4654
+ "if",
4655
+ [
4656
+ ">",
4657
+ "@config.passScore",
4658
+ 0.0
4659
+ ],
4660
+ [
4661
+ "str/concat",
4662
+ "Score — pass at ",
4663
+ "@config.passScore"
4664
+ ],
4665
+ "Score"
4666
+ ],
4667
+ "max": [
4668
+ "if",
4669
+ [
4670
+ "or",
4671
+ [
4672
+ "!=",
4673
+ "@config.pointsPerCorrect",
4674
+ 1.0
4675
+ ],
4676
+ [
4677
+ ">",
4678
+ "@config.penaltyPerMiss",
4679
+ 0.0
4680
+ ]
4681
+ ],
4682
+ [
4683
+ "if",
4684
+ [
4685
+ ">",
4686
+ "@config.scoreCap",
4687
+ 0.0
4688
+ ],
4689
+ "@config.scoreCap",
4690
+ [
4691
+ "*",
4692
+ "@entity.totalItems",
4693
+ "@config.pointsPerCorrect"
4694
+ ]
4695
+ ],
4696
+ "@entity.attemptedCount"
4697
+ ],
3932
4698
  "type": "stat-display",
3933
- "value": "@entity.correctCount"
4699
+ "value": [
4700
+ "if",
4701
+ [
4702
+ "or",
4703
+ [
4704
+ "!=",
4705
+ "@config.pointsPerCorrect",
4706
+ 1.0
4707
+ ],
4708
+ [
4709
+ ">",
4710
+ "@config.penaltyPerMiss",
4711
+ 0.0
4712
+ ]
4713
+ ],
4714
+ "@entity.score",
4715
+ "@entity.correctCount"
4716
+ ]
3934
4717
  }
3935
4718
  ]
3936
4719
  ]
@@ -4049,6 +4832,21 @@
4049
4832
  "@entity.active",
4050
4833
  true
4051
4834
  ],
4835
+ [
4836
+ "set",
4837
+ "@entity.running",
4838
+ "@config.autoRun"
4839
+ ],
4840
+ [
4841
+ "set",
4842
+ "@entity.elapsedMs",
4843
+ 0.0
4844
+ ],
4845
+ [
4846
+ "set",
4847
+ "@entity.score",
4848
+ 0.0
4849
+ ],
4052
4850
  [
4053
4851
  "set",
4054
4852
  "@entity.itemIndex",
@@ -4598,9 +5396,13 @@
4598
5396
  [
4599
5397
  "if",
4600
5398
  [
4601
- "!=",
4602
- "@entity.itemHint",
4603
- ""
5399
+ "and",
5400
+ "@config.showHint",
5401
+ [
5402
+ "!=",
5403
+ "@entity.itemHint",
5404
+ ""
5405
+ ]
4604
5406
  ],
4605
5407
  [
4606
5408
  {
@@ -4630,45 +5432,113 @@
4630
5432
  },
4631
5433
  {
4632
5434
  "children": [
4633
- "array/map",
5435
+ "let",
4634
5436
  [
4635
- "array/reverse",
4636
- "@config.categories"
5437
+ [
5438
+ "itemOptions",
5439
+ [
5440
+ "object/get",
5441
+ [
5442
+ "array/nth",
5443
+ "@config.items",
5444
+ "@entity.itemIndex"
5445
+ ],
5446
+ "options",
5447
+ []
5448
+ ]
5449
+ ]
4637
5450
  ],
4638
5451
  [
4639
- "fn",
4640
- "c",
4641
- {
4642
- "action": "PICK",
4643
- "actionPayload": {
4644
- "category": [
4645
- "object/get",
4646
- "@c",
4647
- "value"
4648
- ]
4649
- },
4650
- "label": [
4651
- "object/get",
4652
- "@c",
4653
- "label"
5452
+ "if",
5453
+ [
5454
+ ">",
5455
+ [
5456
+ "array/len",
5457
+ "@itemOptions"
4654
5458
  ],
4655
- "size": "sm",
4656
- "type": "button",
4657
- "variant": [
4658
- "if",
4659
- [
4660
- "==",
4661
- "@entity.selectedCategory",
4662
- [
5459
+ 0.0
5460
+ ],
5461
+ [
5462
+ "array/map",
5463
+ "@itemOptions",
5464
+ [
5465
+ "fn",
5466
+ "o",
5467
+ {
5468
+ "action": "PICK",
5469
+ "actionPayload": {
5470
+ "category": [
5471
+ "object/get",
5472
+ "@o",
5473
+ "category"
5474
+ ]
5475
+ },
5476
+ "label": [
5477
+ "object/get",
5478
+ "@o",
5479
+ "label"
5480
+ ],
5481
+ "size": "sm",
5482
+ "type": "button",
5483
+ "variant": [
5484
+ "if",
5485
+ [
5486
+ "==",
5487
+ "@entity.selectedCategory",
5488
+ [
5489
+ "object/get",
5490
+ "@o",
5491
+ "category"
5492
+ ]
5493
+ ],
5494
+ "primary",
5495
+ "secondary"
5496
+ ]
5497
+ }
5498
+ ]
5499
+ ],
5500
+ [
5501
+ "array/map",
5502
+ [
5503
+ "array/reverse",
5504
+ "@config.categories"
5505
+ ],
5506
+ [
5507
+ "fn",
5508
+ "c",
5509
+ {
5510
+ "action": "PICK",
5511
+ "actionPayload": {
5512
+ "category": [
5513
+ "object/get",
5514
+ "@c",
5515
+ "value"
5516
+ ]
5517
+ },
5518
+ "label": [
4663
5519
  "object/get",
4664
5520
  "@c",
4665
- "value"
5521
+ "label"
5522
+ ],
5523
+ "size": "sm",
5524
+ "type": "button",
5525
+ "variant": [
5526
+ "if",
5527
+ [
5528
+ "==",
5529
+ "@entity.selectedCategory",
5530
+ [
5531
+ "object/get",
5532
+ "@c",
5533
+ "value"
5534
+ ]
5535
+ ],
5536
+ "primary",
5537
+ "secondary"
4666
5538
  ]
4667
- ],
4668
- "primary",
4669
- "secondary"
5539
+ }
4670
5540
  ]
4671
- }
5541
+ ]
4672
5542
  ]
4673
5543
  ],
4674
5544
  "direction": "horizontal",
@@ -4741,6 +5611,17 @@
4741
5611
  "label": "@config.advanceLabel",
4742
5612
  "type": "button",
4743
5613
  "variant": "primary"
5614
+ },
5615
+ {
5616
+ "action": "TOGGLE_RUN",
5617
+ "label": [
5618
+ "if",
5619
+ "@entity.running",
5620
+ "Pause",
5621
+ "Auto"
5622
+ ],
5623
+ "type": "button",
5624
+ "variant": "ghost"
4744
5625
  }
4745
5626
  ],
4746
5627
  "direction": "horizontal",
@@ -4748,10 +5629,70 @@
4748
5629
  "type": "stack"
4749
5630
  },
4750
5631
  {
4751
- "label": "Score",
4752
- "max": "@entity.attemptedCount",
5632
+ "label": [
5633
+ "if",
5634
+ [
5635
+ ">",
5636
+ "@config.passScore",
5637
+ 0.0
5638
+ ],
5639
+ [
5640
+ "str/concat",
5641
+ "Score — pass at ",
5642
+ "@config.passScore"
5643
+ ],
5644
+ "Score"
5645
+ ],
5646
+ "max": [
5647
+ "if",
5648
+ [
5649
+ "or",
5650
+ [
5651
+ "!=",
5652
+ "@config.pointsPerCorrect",
5653
+ 1.0
5654
+ ],
5655
+ [
5656
+ ">",
5657
+ "@config.penaltyPerMiss",
5658
+ 0.0
5659
+ ]
5660
+ ],
5661
+ [
5662
+ "if",
5663
+ [
5664
+ ">",
5665
+ "@config.scoreCap",
5666
+ 0.0
5667
+ ],
5668
+ "@config.scoreCap",
5669
+ [
5670
+ "*",
5671
+ "@entity.totalItems",
5672
+ "@config.pointsPerCorrect"
5673
+ ]
5674
+ ],
5675
+ "@entity.attemptedCount"
5676
+ ],
4753
5677
  "type": "stat-display",
4754
- "value": "@entity.correctCount"
5678
+ "value": [
5679
+ "if",
5680
+ [
5681
+ "or",
5682
+ [
5683
+ "!=",
5684
+ "@config.pointsPerCorrect",
5685
+ 1.0
5686
+ ],
5687
+ [
5688
+ ">",
5689
+ "@config.penaltyPerMiss",
5690
+ 0.0
5691
+ ]
5692
+ ],
5693
+ "@entity.score",
5694
+ "@entity.correctCount"
5695
+ ]
4755
5696
  }
4756
5697
  ]
4757
5698
  ]
@@ -4854,9 +5795,159 @@
4854
5795
  true
4855
5796
  ],
4856
5797
  "to": "idle"
5798
+ },
5799
+ {
5800
+ "effects": [
5801
+ [
5802
+ "set",
5803
+ "@entity.running",
5804
+ [
5805
+ "not",
5806
+ "@entity.running"
5807
+ ]
5808
+ ],
5809
+ [
5810
+ "set",
5811
+ "@entity.elapsedMs",
5812
+ 0.0
5813
+ ],
5814
+ [
5815
+ "render-ui",
5816
+ "main",
5817
+ {
5818
+ "children": [
5819
+ {
5820
+ "children": [
5821
+ {
5822
+ "content": "@entity.title",
5823
+ "type": "typography",
5824
+ "variant": "h4"
5825
+ },
5826
+ {
5827
+ "label": [
5828
+ "str/concat",
5829
+ "Item ",
5830
+ [
5831
+ "str/concat",
5832
+ "",
5833
+ [
5834
+ "+",
5835
+ "@entity.itemIndex",
5836
+ 1.0
5837
+ ]
5838
+ ],
5839
+ " of ",
5840
+ [
5841
+ "str/concat",
5842
+ "",
5843
+ "@entity.totalItems"
5844
+ ]
5845
+ ],
5846
+ "max": "@entity.totalItems",
5847
+ "showPercentage": false,
5848
+ "type": "progress-bar",
5849
+ "value": [
5850
+ "+",
5851
+ "@entity.itemIndex",
5852
+ 1.0
5853
+ ]
5854
+ },
5855
+ {
5856
+ "children": "@entity.roundView",
5857
+ "direction": "vertical",
5858
+ "gap": "md",
5859
+ "type": "stack"
5860
+ }
5861
+ ],
5862
+ "direction": "vertical",
5863
+ "gap": "md",
5864
+ "type": "stack"
5865
+ }
5866
+ ],
5867
+ "padding": "md",
5868
+ "type": "box"
5869
+ }
5870
+ ]
5871
+ ],
5872
+ "event": "TOGGLE_RUN",
5873
+ "eventId": "evt_01M0C5Q7CX6XJDQZ9YRAZJGB0K",
5874
+ "from": "idle",
5875
+ "guard": [
5876
+ "and",
5877
+ [
5878
+ "==",
5879
+ "@entity.active",
5880
+ true
5881
+ ],
5882
+ [
5883
+ "==",
5884
+ "@entity.roundComplete",
5885
+ false
5886
+ ]
5887
+ ],
5888
+ "to": "idle"
4857
5889
  }
4858
5890
  ]
4859
- }
5891
+ },
5892
+ "ticks": [
5893
+ {
5894
+ "effects": [
5895
+ [
5896
+ "set",
5897
+ "@entity.elapsedMs",
5898
+ [
5899
+ "+",
5900
+ "@entity.elapsedMs",
5901
+ 32.0
5902
+ ]
5903
+ ],
5904
+ [
5905
+ "when",
5906
+ [
5907
+ ">=",
5908
+ "@entity.elapsedMs",
5909
+ "@config.advanceMs"
5910
+ ],
5911
+ [
5912
+ "do",
5913
+ [
5914
+ "set",
5915
+ "@entity.elapsedMs",
5916
+ 0.0
5917
+ ],
5918
+ [
5919
+ "emit",
5920
+ "ADVANCE",
5921
+ {}
5922
+ ]
5923
+ ]
5924
+ ]
5925
+ ],
5926
+ "guard": [
5927
+ "and",
5928
+ [
5929
+ "==",
5930
+ "@entity.active",
5931
+ true
5932
+ ],
5933
+ [
5934
+ "and",
5935
+ [
5936
+ "==",
5937
+ "@entity.running",
5938
+ true
5939
+ ],
5940
+ [
5941
+ "==",
5942
+ "@entity.roundComplete",
5943
+ false
5944
+ ]
5945
+ ]
5946
+ ],
5947
+ "interval": 32.0,
5948
+ "name": "advanceTick"
5949
+ }
5950
+ ]
4860
5951
  }
4861
5952
  ]
4862
5953
  }