@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
@@ -0,0 +1,3118 @@
1
+ {
2
+ "description": "Generic guided-tour-over-3D-stations instrument. Contract: a config-declared roster of stations (id, name, caption, x, y, z, radius, color, shape, opacity) plus optional connector edges (from, to, color, label), rendered as an orbit-rotatable volumetric scene on a biology-canvas in 3D mode; pressing Tour advances the selection to the next station (mod the roster length) and clicking a shape selects its station — either way the camera retargets onto the selected station's x/y/z, the station enlarges, a name — caption narration renders, and a progress readout tracks visited stations until every station has been toured. A `backdrop` knob renders non-station scene geometry under the stations (painted, never toured). SYNC_STATIONS hot-swaps the roster mid-flight (a composed preset coordinator emits it with new stations/edges/backdrop; the tour adopts them and restarts progress at the first new station) — the single-writer entry point for dynamic rosters. Composed of a biology-canvas in 3D mode plus a tour state machine. Standalone by default; behind a lab router set matchMode and it renders only when MODE_SELECTED matches.",
3
+ "ledger": {
4
+ "entries": {
5
+ "ent_01M07RCKW08Q8GTWHGYP9HVQP1": {
6
+ "bakedName": "Learn3DTourScene",
7
+ "curName": "Learn3DTourScene",
8
+ "id": "ent_01M07RCKW08Q8GTWHGYP9HVQP1",
9
+ "kind": "entity",
10
+ "owner": "workspace",
11
+ "renames": []
12
+ },
13
+ "evt_01M07RCKW0YARJ2BYJ1MZGFTRD": {
14
+ "bakedName": "INIT",
15
+ "curName": "INIT",
16
+ "id": "evt_01M07RCKW0YARJ2BYJ1MZGFTRD",
17
+ "kind": "event",
18
+ "owner": "workspace",
19
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
20
+ "renames": []
21
+ },
22
+ "evt_01M07RCKW2AHK7EHDEZAS9BHQD": {
23
+ "bakedName": "RESET",
24
+ "curName": "RESET",
25
+ "id": "evt_01M07RCKW2AHK7EHDEZAS9BHQD",
26
+ "kind": "event",
27
+ "owner": "workspace",
28
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
29
+ "renames": []
30
+ },
31
+ "evt_01M07RCKW2DPWA14T0FDP9S669": {
32
+ "bakedName": "TOUR_3D_UPDATED",
33
+ "curName": "TOUR_3D_UPDATED",
34
+ "id": "evt_01M07RCKW2DPWA14T0FDP9S669",
35
+ "kind": "event",
36
+ "owner": "workspace",
37
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
38
+ "renames": []
39
+ },
40
+ "evt_01M07RCKW2DSDNYZ59EYX7RSHP": {
41
+ "bakedName": "TOUR",
42
+ "curName": "TOUR",
43
+ "id": "evt_01M07RCKW2DSDNYZ59EYX7RSHP",
44
+ "kind": "event",
45
+ "owner": "workspace",
46
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
47
+ "renames": []
48
+ },
49
+ "evt_01M07RCKW2FDQK2QD7WX4GTRMJ": {
50
+ "bakedName": "MODE_SELECTED",
51
+ "curName": "MODE_SELECTED",
52
+ "id": "evt_01M07RCKW2FDQK2QD7WX4GTRMJ",
53
+ "kind": "event",
54
+ "owner": "workspace",
55
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
56
+ "renames": []
57
+ },
58
+ "evt_01M07RCKW2MSXSKE1G2F9GKPBR": {
59
+ "bakedName": "SELECT_STATION",
60
+ "curName": "SELECT_STATION",
61
+ "id": "evt_01M07RCKW2MSXSKE1G2F9GKPBR",
62
+ "kind": "event",
63
+ "owner": "workspace",
64
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
65
+ "renames": []
66
+ },
67
+ "evt_01M09E8V0NEH4QP51HH0HZ80ST": {
68
+ "bakedName": "SYNC_STATIONS",
69
+ "curName": "SYNC_STATIONS",
70
+ "id": "evt_01M09E8V0NEH4QP51HH0HZ80ST",
71
+ "kind": "event",
72
+ "owner": "workspace",
73
+ "parent": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
74
+ "renames": []
75
+ },
76
+ "orb_01M07RCKW09E3TNXAZ8BMJS742": {
77
+ "bakedName": "LearnTour3DOrbital",
78
+ "curName": "LearnTour3DOrbital",
79
+ "id": "orb_01M07RCKW09E3TNXAZ8BMJS742",
80
+ "kind": "orbital",
81
+ "owner": "workspace",
82
+ "renames": []
83
+ },
84
+ "pag_01M07RCKW3P456Q0EW3Y838624": {
85
+ "bakedName": "Learn3DTourPage",
86
+ "curName": "Learn3DTourPage",
87
+ "id": "pag_01M07RCKW3P456Q0EW3Y838624",
88
+ "kind": "page",
89
+ "owner": "workspace",
90
+ "renames": []
91
+ },
92
+ "trt_01M07RCKW0YDADRTWKMBVKDWW3": {
93
+ "bakedName": "Learn3DTourSim",
94
+ "curName": "Learn3DTourSim",
95
+ "id": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
96
+ "kind": "trait",
97
+ "owner": "workspace",
98
+ "renames": []
99
+ }
100
+ },
101
+ "schemaVersion": 1
102
+ },
103
+ "name": "std-learn-tour-3d",
104
+ "orbitals": [
105
+ {
106
+ "entity": {
107
+ "fields": [
108
+ {
109
+ "name": "id",
110
+ "required": true,
111
+ "type": "string"
112
+ },
113
+ {
114
+ "default": false,
115
+ "name": "active",
116
+ "type": "boolean"
117
+ },
118
+ {
119
+ "name": "title",
120
+ "type": "string"
121
+ },
122
+ {
123
+ "items": {
124
+ "properties": {
125
+ "caption": {
126
+ "name": "caption",
127
+ "required": false,
128
+ "type": "string"
129
+ },
130
+ "color": {
131
+ "name": "color",
132
+ "required": false,
133
+ "type": "string"
134
+ },
135
+ "id": {
136
+ "name": "id",
137
+ "required": true,
138
+ "type": "string"
139
+ },
140
+ "name": {
141
+ "name": "name",
142
+ "required": true,
143
+ "type": "string"
144
+ },
145
+ "opacity": {
146
+ "name": "opacity",
147
+ "required": false,
148
+ "type": "number"
149
+ },
150
+ "radius": {
151
+ "name": "radius",
152
+ "required": false,
153
+ "type": "number"
154
+ },
155
+ "shape": {
156
+ "name": "shape",
157
+ "required": false,
158
+ "type": "string"
159
+ },
160
+ "x": {
161
+ "name": "x",
162
+ "required": true,
163
+ "type": "number"
164
+ },
165
+ "y": {
166
+ "name": "y",
167
+ "required": true,
168
+ "type": "number"
169
+ },
170
+ "z": {
171
+ "name": "z",
172
+ "required": true,
173
+ "type": "number"
174
+ }
175
+ },
176
+ "type": "object"
177
+ },
178
+ "name": "stations",
179
+ "type": "array"
180
+ },
181
+ {
182
+ "default": [],
183
+ "items": {
184
+ "properties": {
185
+ "caption": {
186
+ "name": "caption",
187
+ "required": false,
188
+ "type": "string"
189
+ },
190
+ "color": {
191
+ "name": "color",
192
+ "required": false,
193
+ "type": "string"
194
+ },
195
+ "id": {
196
+ "name": "id",
197
+ "required": true,
198
+ "type": "string"
199
+ },
200
+ "name": {
201
+ "name": "name",
202
+ "required": true,
203
+ "type": "string"
204
+ },
205
+ "opacity": {
206
+ "name": "opacity",
207
+ "required": false,
208
+ "type": "number"
209
+ },
210
+ "radius": {
211
+ "name": "radius",
212
+ "required": false,
213
+ "type": "number"
214
+ },
215
+ "shape": {
216
+ "name": "shape",
217
+ "required": false,
218
+ "type": "string"
219
+ },
220
+ "x": {
221
+ "name": "x",
222
+ "required": true,
223
+ "type": "number"
224
+ },
225
+ "y": {
226
+ "name": "y",
227
+ "required": true,
228
+ "type": "number"
229
+ },
230
+ "z": {
231
+ "name": "z",
232
+ "required": true,
233
+ "type": "number"
234
+ }
235
+ },
236
+ "type": "object"
237
+ },
238
+ "name": "backdrop",
239
+ "type": "array"
240
+ },
241
+ {
242
+ "items": {
243
+ "properties": {
244
+ "color": {
245
+ "name": "color",
246
+ "required": false,
247
+ "type": "string"
248
+ },
249
+ "from": {
250
+ "name": "from",
251
+ "required": true,
252
+ "type": "string"
253
+ },
254
+ "label": {
255
+ "name": "label",
256
+ "required": false,
257
+ "type": "string"
258
+ },
259
+ "to": {
260
+ "name": "to",
261
+ "required": true,
262
+ "type": "string"
263
+ }
264
+ },
265
+ "type": "object"
266
+ },
267
+ "name": "edges",
268
+ "type": "array"
269
+ },
270
+ {
271
+ "default": 0.0,
272
+ "name": "selectedIndex",
273
+ "type": "number"
274
+ },
275
+ {
276
+ "default": "",
277
+ "name": "selectedId",
278
+ "type": "string"
279
+ },
280
+ {
281
+ "default": [],
282
+ "items": {
283
+ "type": "string"
284
+ },
285
+ "name": "visitedIds",
286
+ "type": "array"
287
+ },
288
+ {
289
+ "default": false,
290
+ "name": "tourComplete",
291
+ "type": "boolean"
292
+ },
293
+ {
294
+ "default": "",
295
+ "name": "narration",
296
+ "type": "string"
297
+ }
298
+ ],
299
+ "id": "ent_01M07RCKW08Q8GTWHGYP9HVQP1",
300
+ "name": "Learn3DTourScene",
301
+ "persistence": "runtime"
302
+ },
303
+ "id": "orb_01M07RCKW09E3TNXAZ8BMJS742",
304
+ "name": "LearnTour3DOrbital",
305
+ "pages": [
306
+ {
307
+ "id": "pag_01M07RCKW3P456Q0EW3Y838624",
308
+ "name": "Learn3DTourPage",
309
+ "path": "/learn-tour-3d",
310
+ "traits": [
311
+ {
312
+ "ref": "Learn3DTourSim",
313
+ "refId": "trt_01M07RCKW0YDADRTWKMBVKDWW3"
314
+ }
315
+ ]
316
+ }
317
+ ],
318
+ "traits": [
319
+ {
320
+ "category": "interaction",
321
+ "config": {
322
+ "azimuth": {
323
+ "default": 0.6,
324
+ "description": "Camera orbit azimuth in radians; the learner can orbit freely on top of this.",
325
+ "label": "Azimuth",
326
+ "tier": "presentation",
327
+ "type": "number"
328
+ },
329
+ "backdrop": {
330
+ "default": [],
331
+ "description": "Non-station scene geometry rendered under the tour stations (painted first, stations on top) — painted but never tour stops and never highlight-selected; SYNC_STATIONS swaps it together with the roster, so a composed preset coordinator can re-skin the whole scene per preset.",
332
+ "items": {
333
+ "properties": {
334
+ "caption": {
335
+ "name": "caption",
336
+ "required": false,
337
+ "type": "string"
338
+ },
339
+ "color": {
340
+ "name": "color",
341
+ "required": false,
342
+ "type": "string"
343
+ },
344
+ "id": {
345
+ "name": "id",
346
+ "required": true,
347
+ "type": "string"
348
+ },
349
+ "name": {
350
+ "name": "name",
351
+ "required": true,
352
+ "type": "string"
353
+ },
354
+ "opacity": {
355
+ "name": "opacity",
356
+ "required": false,
357
+ "type": "number"
358
+ },
359
+ "radius": {
360
+ "name": "radius",
361
+ "required": false,
362
+ "type": "number"
363
+ },
364
+ "shape": {
365
+ "name": "shape",
366
+ "required": false,
367
+ "type": "string"
368
+ },
369
+ "x": {
370
+ "name": "x",
371
+ "required": true,
372
+ "type": "number"
373
+ },
374
+ "y": {
375
+ "name": "y",
376
+ "required": true,
377
+ "type": "number"
378
+ },
379
+ "z": {
380
+ "name": "z",
381
+ "required": true,
382
+ "type": "number"
383
+ }
384
+ },
385
+ "type": "object"
386
+ },
387
+ "label": "Backdrop Nodes",
388
+ "synonyms": "backdrop, scenery, geometry, context nodes, 3d",
389
+ "tier": "domain",
390
+ "type": "[Learn3DStation]"
391
+ },
392
+ "backgroundColor": {
393
+ "default": "#0f172a",
394
+ "description": "Canvas background color — a dark stage makes translucent shells and station colors read in 3D.",
395
+ "label": "Background Color",
396
+ "tier": "presentation",
397
+ "type": "string"
398
+ },
399
+ "edges": {
400
+ "default": [],
401
+ "description": "Optional connector lines drawn between stations, by id.",
402
+ "items": {
403
+ "properties": {
404
+ "color": {
405
+ "name": "color",
406
+ "required": false,
407
+ "type": "string"
408
+ },
409
+ "from": {
410
+ "name": "from",
411
+ "required": true,
412
+ "type": "string"
413
+ },
414
+ "label": {
415
+ "name": "label",
416
+ "required": false,
417
+ "type": "string"
418
+ },
419
+ "to": {
420
+ "name": "to",
421
+ "required": true,
422
+ "type": "string"
423
+ }
424
+ },
425
+ "type": "object"
426
+ },
427
+ "label": "Edges",
428
+ "synonyms": "edge, link, connector, tether",
429
+ "tier": "domain",
430
+ "type": "[Learn3DEdge]"
431
+ },
432
+ "fov": {
433
+ "default": 50.0,
434
+ "description": "Perspective camera field of view in degrees.",
435
+ "label": "Field of View",
436
+ "tier": "presentation",
437
+ "type": "number"
438
+ },
439
+ "height": {
440
+ "default": 400.0,
441
+ "description": "Canvas height in pixels.",
442
+ "label": "Height",
443
+ "tier": "presentation",
444
+ "type": "number"
445
+ },
446
+ "lighting": {
447
+ "default": {},
448
+ "description": "3D scene light rig as data; empty object uses the standard rig.",
449
+ "label": "Lighting",
450
+ "properties": {
451
+ "ambient": {
452
+ "name": "ambient",
453
+ "properties": {
454
+ "color": {
455
+ "name": "color",
456
+ "required": false,
457
+ "type": "string"
458
+ },
459
+ "intensity": {
460
+ "name": "intensity",
461
+ "required": false,
462
+ "type": "number"
463
+ },
464
+ "position": {
465
+ "items": {
466
+ "type": "number"
467
+ },
468
+ "name": "position",
469
+ "required": false,
470
+ "type": "array"
471
+ }
472
+ },
473
+ "required": false,
474
+ "type": "object"
475
+ },
476
+ "directional": {
477
+ "name": "directional",
478
+ "properties": {
479
+ "color": {
480
+ "name": "color",
481
+ "required": false,
482
+ "type": "string"
483
+ },
484
+ "intensity": {
485
+ "name": "intensity",
486
+ "required": false,
487
+ "type": "number"
488
+ },
489
+ "position": {
490
+ "items": {
491
+ "type": "number"
492
+ },
493
+ "name": "position",
494
+ "required": false,
495
+ "type": "array"
496
+ }
497
+ },
498
+ "required": false,
499
+ "type": "object"
500
+ },
501
+ "environment": {
502
+ "name": "environment",
503
+ "required": false,
504
+ "type": "string",
505
+ "values": [
506
+ "room",
507
+ "none"
508
+ ]
509
+ },
510
+ "hemisphere": {
511
+ "name": "hemisphere",
512
+ "properties": {
513
+ "color": {
514
+ "name": "color",
515
+ "required": false,
516
+ "type": "string"
517
+ },
518
+ "groundColor": {
519
+ "name": "groundColor",
520
+ "required": false,
521
+ "type": "string"
522
+ },
523
+ "intensity": {
524
+ "name": "intensity",
525
+ "required": false,
526
+ "type": "number"
527
+ }
528
+ },
529
+ "required": false,
530
+ "type": "object"
531
+ },
532
+ "points": {
533
+ "items": {
534
+ "properties": {
535
+ "color": {
536
+ "name": "color",
537
+ "required": false,
538
+ "type": "string"
539
+ },
540
+ "decay": {
541
+ "name": "decay",
542
+ "required": false,
543
+ "type": "number"
544
+ },
545
+ "distance": {
546
+ "name": "distance",
547
+ "required": false,
548
+ "type": "number"
549
+ },
550
+ "intensity": {
551
+ "name": "intensity",
552
+ "required": false,
553
+ "type": "number"
554
+ },
555
+ "position": {
556
+ "items": {
557
+ "type": "number"
558
+ },
559
+ "name": "position",
560
+ "required": true,
561
+ "type": "array"
562
+ }
563
+ },
564
+ "type": "object"
565
+ },
566
+ "name": "points",
567
+ "required": false,
568
+ "type": "array"
569
+ },
570
+ "toneMapping": {
571
+ "name": "toneMapping",
572
+ "required": false,
573
+ "type": "string",
574
+ "values": [
575
+ "aces",
576
+ "none"
577
+ ]
578
+ }
579
+ },
580
+ "tier": "presentation",
581
+ "type": "Lighting3D"
582
+ },
583
+ "matchMode": {
584
+ "default": "",
585
+ "description": "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT.",
586
+ "label": "Match Mode",
587
+ "tier": "presentation",
588
+ "type": "string"
589
+ },
590
+ "post": {
591
+ "default": {},
592
+ "description": "3D post-processing stack (bloom/vignette) as data; empty object disables it.",
593
+ "label": "Post Processing",
594
+ "properties": {
595
+ "bloom": {
596
+ "name": "bloom",
597
+ "properties": {
598
+ "intensity": {
599
+ "name": "intensity",
600
+ "required": false,
601
+ "type": "number"
602
+ },
603
+ "smoothing": {
604
+ "name": "smoothing",
605
+ "required": false,
606
+ "type": "number"
607
+ },
608
+ "threshold": {
609
+ "name": "threshold",
610
+ "required": false,
611
+ "type": "number"
612
+ }
613
+ },
614
+ "required": false,
615
+ "type": "object"
616
+ },
617
+ "vignette": {
618
+ "name": "vignette",
619
+ "properties": {
620
+ "darkness": {
621
+ "name": "darkness",
622
+ "required": false,
623
+ "type": "number"
624
+ },
625
+ "offset": {
626
+ "name": "offset",
627
+ "required": false,
628
+ "type": "number"
629
+ }
630
+ },
631
+ "required": false,
632
+ "type": "object"
633
+ }
634
+ },
635
+ "tier": "presentation",
636
+ "type": "Post3D"
637
+ },
638
+ "resetLabel": {
639
+ "default": "Reset",
640
+ "description": "Label text for the button that returns the tour to the first station.",
641
+ "label": "Reset Button Label",
642
+ "tier": "presentation",
643
+ "type": "string"
644
+ },
645
+ "stations": {
646
+ "default": [
647
+ {
648
+ "caption": "The first stop on the tour — the camera retargets here and the narration reads its caption.",
649
+ "color": "#2563eb",
650
+ "id": "alpha",
651
+ "name": "Station Alpha",
652
+ "opacity": 1.0,
653
+ "radius": 1.0,
654
+ "shape": "sphere",
655
+ "x": 0.0,
656
+ "y": 0.0,
657
+ "z": 0.0
658
+ },
659
+ {
660
+ "caption": "The second stop — press Tour again or click a shape to advance the selection.",
661
+ "color": "#7c3aed",
662
+ "id": "beta",
663
+ "name": "Station Beta",
664
+ "opacity": 1.0,
665
+ "radius": 0.8,
666
+ "shape": "sphere",
667
+ "x": 3.0,
668
+ "y": 1.0,
669
+ "z": -1.0
670
+ },
671
+ {
672
+ "caption": "The final stop — once every station has been visited the tour marks itself complete.",
673
+ "color": "#0891b2",
674
+ "id": "gamma",
675
+ "name": "Station Gamma",
676
+ "opacity": 1.0,
677
+ "radius": 0.8,
678
+ "shape": "sphere",
679
+ "x": -3.0,
680
+ "y": -1.0,
681
+ "z": 1.0
682
+ }
683
+ ],
684
+ "description": "The station roster in didactic tour order — each with scene position, mesh shape, and a caption. Tour and clicks enlarge the selected station, retarget the camera onto its x/y/z, and narrate its caption.",
685
+ "items": {
686
+ "properties": {
687
+ "caption": {
688
+ "name": "caption",
689
+ "required": false,
690
+ "type": "string"
691
+ },
692
+ "color": {
693
+ "name": "color",
694
+ "required": false,
695
+ "type": "string"
696
+ },
697
+ "id": {
698
+ "name": "id",
699
+ "required": true,
700
+ "type": "string"
701
+ },
702
+ "name": {
703
+ "name": "name",
704
+ "required": true,
705
+ "type": "string"
706
+ },
707
+ "opacity": {
708
+ "name": "opacity",
709
+ "required": false,
710
+ "type": "number"
711
+ },
712
+ "radius": {
713
+ "name": "radius",
714
+ "required": false,
715
+ "type": "number"
716
+ },
717
+ "shape": {
718
+ "name": "shape",
719
+ "required": false,
720
+ "type": "string"
721
+ },
722
+ "x": {
723
+ "name": "x",
724
+ "required": true,
725
+ "type": "number"
726
+ },
727
+ "y": {
728
+ "name": "y",
729
+ "required": true,
730
+ "type": "number"
731
+ },
732
+ "z": {
733
+ "name": "z",
734
+ "required": true,
735
+ "type": "number"
736
+ }
737
+ },
738
+ "type": "object"
739
+ },
740
+ "label": "Stations",
741
+ "synonyms": "station, stop, waypoint, tour, landmark, 3d",
742
+ "tier": "domain",
743
+ "type": "[Learn3DStation]"
744
+ },
745
+ "title": {
746
+ "default": "3D Guided Tour",
747
+ "description": "Title shown above the canvas.",
748
+ "label": "Title",
749
+ "tier": "presentation",
750
+ "type": "string"
751
+ },
752
+ "tourLabel": {
753
+ "default": "Tour",
754
+ "description": "Label text for the button that advances the tour to the next station.",
755
+ "label": "Tour Button Label",
756
+ "tier": "presentation",
757
+ "type": "string"
758
+ },
759
+ "width": {
760
+ "default": 600.0,
761
+ "description": "Canvas width in pixels.",
762
+ "label": "Width",
763
+ "tier": "presentation",
764
+ "type": "number"
765
+ },
766
+ "zoom": {
767
+ "default": 1.0,
768
+ "description": "Camera zoom factor for the 3D scene.",
769
+ "label": "Zoom",
770
+ "tier": "presentation",
771
+ "type": "number"
772
+ }
773
+ },
774
+ "emits": [
775
+ {
776
+ "description": "Fires on INIT/MODE_SELECTED/Tour/click/Reset with the currently selected station's id, name, and caption, plus visited/total progress and whether every station has now been visited — a composed listener (readout, quiz) can subscribe; a harmless no-op when the atom runs standalone.",
777
+ "event": "TOUR_3D_UPDATED",
778
+ "eventId": "evt_01M07RCKW2DPWA14T0FDP9S669",
779
+ "payloadSchema": [
780
+ {
781
+ "name": "id",
782
+ "type": "string"
783
+ },
784
+ {
785
+ "name": "name",
786
+ "type": "string"
787
+ },
788
+ {
789
+ "name": "caption",
790
+ "type": "string"
791
+ },
792
+ {
793
+ "name": "visited",
794
+ "type": "number"
795
+ },
796
+ {
797
+ "name": "total",
798
+ "type": "number"
799
+ },
800
+ {
801
+ "name": "tourComplete",
802
+ "type": "boolean"
803
+ }
804
+ ],
805
+ "scope": "external",
806
+ "synonyms": "select, choose, station, explore, tour, flythrough, pick",
807
+ "tier": "domain"
808
+ }
809
+ ],
810
+ "entityContract": {
811
+ "provides": [
812
+ "active",
813
+ "backdrop",
814
+ "edges",
815
+ "narration",
816
+ "selectedId",
817
+ "selectedIndex",
818
+ "stations",
819
+ "title",
820
+ "tourComplete",
821
+ "visitedIds"
822
+ ],
823
+ "requires": []
824
+ },
825
+ "entityRebindable": true,
826
+ "entityRefIds": {
827
+ "Learn3DTourScene": "ent_01M07RCKW08Q8GTWHGYP9HVQP1"
828
+ },
829
+ "id": "trt_01M07RCKW0YDADRTWKMBVKDWW3",
830
+ "linkedEntity": "Learn3DTourScene",
831
+ "linkedEntityId": "ent_01M07RCKW08Q8GTWHGYP9HVQP1",
832
+ "name": "Learn3DTourSim",
833
+ "scope": "instance",
834
+ "stateMachine": {
835
+ "events": [
836
+ {
837
+ "id": "evt_01M07RCKW0YARJ2BYJ1MZGFTRD",
838
+ "key": "INIT",
839
+ "name": "Initialize"
840
+ },
841
+ {
842
+ "description": "Lab router broadcast naming the active mode; this instrument renders when the mode equals matchMode, otherwise renders null.",
843
+ "id": "evt_01M07RCKW2FDQK2QD7WX4GTRMJ",
844
+ "key": "MODE_SELECTED",
845
+ "name": "Mode Selected",
846
+ "payloadSchema": [
847
+ {
848
+ "name": "mode",
849
+ "type": "string"
850
+ }
851
+ ],
852
+ "tier": "domain"
853
+ },
854
+ {
855
+ "id": "evt_01M07RCKW2DSDNYZ59EYX7RSHP",
856
+ "key": "TOUR",
857
+ "name": "Tour"
858
+ },
859
+ {
860
+ "description": "Canvas shape-click from the 3D scene (biology-canvas onShapeClick) carrying the clicked station's id, type, and roster index.",
861
+ "id": "evt_01M07RCKW2MSXSKE1G2F9GKPBR",
862
+ "key": "SELECT_STATION",
863
+ "name": "Select Station",
864
+ "payloadSchema": [
865
+ {
866
+ "name": "payload",
867
+ "properties": [
868
+ {
869
+ "name": "id",
870
+ "type": "string"
871
+ },
872
+ {
873
+ "name": "type",
874
+ "type": "string"
875
+ },
876
+ {
877
+ "name": "index",
878
+ "required": true,
879
+ "type": "number"
880
+ }
881
+ ],
882
+ "type": "object"
883
+ }
884
+ ],
885
+ "tier": "domain"
886
+ },
887
+ {
888
+ "id": "evt_01M07RCKW2AHK7EHDEZAS9BHQD",
889
+ "key": "RESET",
890
+ "name": "Reset"
891
+ },
892
+ {
893
+ "description": "Roster hot-swap from a composed preset coordinator — the tour adopts the new stations/edges/backdrop and restarts progress at the first new station; the single-writer entry point for dynamic rosters.",
894
+ "id": "evt_01M09E8V0NEH4QP51HH0HZ80ST",
895
+ "key": "SYNC_STATIONS",
896
+ "name": "Sync Stations",
897
+ "payloadSchema": [
898
+ {
899
+ "name": "stations",
900
+ "properties": [
901
+ {
902
+ "name": "id",
903
+ "required": true,
904
+ "type": "string"
905
+ },
906
+ {
907
+ "name": "name",
908
+ "required": true,
909
+ "type": "string"
910
+ },
911
+ {
912
+ "name": "caption",
913
+ "type": "string"
914
+ },
915
+ {
916
+ "name": "x",
917
+ "required": true,
918
+ "type": "number"
919
+ },
920
+ {
921
+ "name": "y",
922
+ "required": true,
923
+ "type": "number"
924
+ },
925
+ {
926
+ "name": "z",
927
+ "required": true,
928
+ "type": "number"
929
+ },
930
+ {
931
+ "name": "radius",
932
+ "type": "number"
933
+ },
934
+ {
935
+ "name": "color",
936
+ "type": "string"
937
+ },
938
+ {
939
+ "name": "shape",
940
+ "type": "string"
941
+ },
942
+ {
943
+ "name": "opacity",
944
+ "type": "number"
945
+ }
946
+ ],
947
+ "type": "[object]"
948
+ },
949
+ {
950
+ "name": "edges",
951
+ "properties": [
952
+ {
953
+ "name": "from",
954
+ "required": true,
955
+ "type": "string"
956
+ },
957
+ {
958
+ "name": "to",
959
+ "required": true,
960
+ "type": "string"
961
+ },
962
+ {
963
+ "name": "color",
964
+ "type": "string"
965
+ },
966
+ {
967
+ "name": "label",
968
+ "type": "string"
969
+ }
970
+ ],
971
+ "type": "[object]"
972
+ },
973
+ {
974
+ "name": "backdrop",
975
+ "properties": [
976
+ {
977
+ "name": "id",
978
+ "required": true,
979
+ "type": "string"
980
+ },
981
+ {
982
+ "name": "name",
983
+ "required": true,
984
+ "type": "string"
985
+ },
986
+ {
987
+ "name": "caption",
988
+ "type": "string"
989
+ },
990
+ {
991
+ "name": "x",
992
+ "required": true,
993
+ "type": "number"
994
+ },
995
+ {
996
+ "name": "y",
997
+ "required": true,
998
+ "type": "number"
999
+ },
1000
+ {
1001
+ "name": "z",
1002
+ "required": true,
1003
+ "type": "number"
1004
+ },
1005
+ {
1006
+ "name": "radius",
1007
+ "type": "number"
1008
+ },
1009
+ {
1010
+ "name": "color",
1011
+ "type": "string"
1012
+ },
1013
+ {
1014
+ "name": "shape",
1015
+ "type": "string"
1016
+ },
1017
+ {
1018
+ "name": "opacity",
1019
+ "type": "number"
1020
+ }
1021
+ ],
1022
+ "type": "[object]"
1023
+ }
1024
+ ],
1025
+ "tier": "domain"
1026
+ },
1027
+ {
1028
+ "description": "Fires on INIT/MODE_SELECTED/Tour/click/Reset with the currently selected station's id, name, and caption, plus visited/total progress and whether every station has now been visited — a composed listener (readout, quiz) can subscribe; a harmless no-op when the atom runs standalone.",
1029
+ "id": "evt_01M07RCKW2DPWA14T0FDP9S669",
1030
+ "key": "TOUR_3D_UPDATED",
1031
+ "name": "Tour 3d Updated",
1032
+ "payloadSchema": [
1033
+ {
1034
+ "name": "id",
1035
+ "type": "string"
1036
+ },
1037
+ {
1038
+ "name": "name",
1039
+ "type": "string"
1040
+ },
1041
+ {
1042
+ "name": "caption",
1043
+ "type": "string"
1044
+ },
1045
+ {
1046
+ "name": "visited",
1047
+ "type": "number"
1048
+ },
1049
+ {
1050
+ "name": "total",
1051
+ "type": "number"
1052
+ },
1053
+ {
1054
+ "name": "tourComplete",
1055
+ "type": "boolean"
1056
+ }
1057
+ ],
1058
+ "synonyms": "select, choose, station, explore, tour, flythrough, pick",
1059
+ "tier": "domain"
1060
+ }
1061
+ ],
1062
+ "states": [
1063
+ {
1064
+ "isInitial": true,
1065
+ "name": "idle"
1066
+ }
1067
+ ],
1068
+ "transitions": [
1069
+ {
1070
+ "effects": [
1071
+ [
1072
+ "set",
1073
+ "@entity.active",
1074
+ true
1075
+ ],
1076
+ [
1077
+ "set",
1078
+ "@entity.title",
1079
+ "@config.title"
1080
+ ],
1081
+ [
1082
+ "set",
1083
+ "@entity.stations",
1084
+ "@config.stations"
1085
+ ],
1086
+ [
1087
+ "set",
1088
+ "@entity.backdrop",
1089
+ "@config.backdrop"
1090
+ ],
1091
+ [
1092
+ "set",
1093
+ "@entity.edges",
1094
+ "@config.edges"
1095
+ ],
1096
+ [
1097
+ "set",
1098
+ "@entity.selectedIndex",
1099
+ 0.0
1100
+ ],
1101
+ [
1102
+ "set",
1103
+ "@entity.selectedId",
1104
+ [
1105
+ "object/get",
1106
+ [
1107
+ "array/nth",
1108
+ "@entity.stations",
1109
+ 0.0
1110
+ ],
1111
+ "id"
1112
+ ]
1113
+ ],
1114
+ [
1115
+ "set",
1116
+ "@entity.visitedIds",
1117
+ [
1118
+ [
1119
+ "object/get",
1120
+ [
1121
+ "array/nth",
1122
+ "@entity.stations",
1123
+ 0.0
1124
+ ],
1125
+ "id"
1126
+ ]
1127
+ ]
1128
+ ],
1129
+ [
1130
+ "set",
1131
+ "@entity.tourComplete",
1132
+ false
1133
+ ],
1134
+ [
1135
+ "set",
1136
+ "@entity.narration",
1137
+ [
1138
+ "str/concat",
1139
+ [
1140
+ "object/get",
1141
+ [
1142
+ "array/nth",
1143
+ "@entity.stations",
1144
+ 0.0
1145
+ ],
1146
+ "name"
1147
+ ],
1148
+ " — ",
1149
+ [
1150
+ "object/get",
1151
+ [
1152
+ "array/nth",
1153
+ "@entity.stations",
1154
+ 0.0
1155
+ ],
1156
+ "caption"
1157
+ ]
1158
+ ]
1159
+ ],
1160
+ [
1161
+ "render-ui",
1162
+ "main",
1163
+ {
1164
+ "children": [
1165
+ {
1166
+ "children": [
1167
+ {
1168
+ "content": "@entity.title",
1169
+ "type": "typography",
1170
+ "variant": "h4"
1171
+ },
1172
+ {
1173
+ "children": [
1174
+ {
1175
+ "action": "TOUR",
1176
+ "label": "@config.tourLabel",
1177
+ "type": "button",
1178
+ "variant": "primary"
1179
+ },
1180
+ {
1181
+ "action": "RESET",
1182
+ "label": "@config.resetLabel",
1183
+ "type": "button",
1184
+ "variant": "ghost"
1185
+ }
1186
+ ],
1187
+ "direction": "horizontal",
1188
+ "gap": "sm",
1189
+ "type": "stack"
1190
+ },
1191
+ {
1192
+ "backgroundColor": "@config.backgroundColor",
1193
+ "camera": {
1194
+ "azimuth": "@config.azimuth",
1195
+ "fov": "@config.fov",
1196
+ "mode": "perspective",
1197
+ "target": {
1198
+ "x": [
1199
+ "object/get",
1200
+ [
1201
+ "array/nth",
1202
+ "@entity.stations",
1203
+ "@entity.selectedIndex"
1204
+ ],
1205
+ "x"
1206
+ ],
1207
+ "y": [
1208
+ "object/get",
1209
+ [
1210
+ "array/nth",
1211
+ "@entity.stations",
1212
+ "@entity.selectedIndex"
1213
+ ],
1214
+ "y"
1215
+ ],
1216
+ "z": [
1217
+ "object/get",
1218
+ [
1219
+ "array/nth",
1220
+ "@entity.stations",
1221
+ "@entity.selectedIndex"
1222
+ ],
1223
+ "z"
1224
+ ]
1225
+ },
1226
+ "zoom": "@config.zoom"
1227
+ },
1228
+ "edges": "@entity.edges",
1229
+ "height": "@config.height",
1230
+ "interactive": true,
1231
+ "lighting": "@config.lighting",
1232
+ "mode": "3d",
1233
+ "nodes": [
1234
+ "array/map",
1235
+ [
1236
+ "array/concat",
1237
+ "@entity.backdrop",
1238
+ "@entity.stations"
1239
+ ],
1240
+ [
1241
+ "fn",
1242
+ "n",
1243
+ {
1244
+ "color": [
1245
+ "object/get",
1246
+ "@n",
1247
+ "color"
1248
+ ],
1249
+ "id": [
1250
+ "object/get",
1251
+ "@n",
1252
+ "id"
1253
+ ],
1254
+ "label": [
1255
+ "object/get",
1256
+ "@n",
1257
+ "name"
1258
+ ],
1259
+ "opacity": [
1260
+ "object/get",
1261
+ "@n",
1262
+ "opacity"
1263
+ ],
1264
+ "radius": [
1265
+ "if",
1266
+ [
1267
+ "==",
1268
+ [
1269
+ "object/get",
1270
+ "@n",
1271
+ "id"
1272
+ ],
1273
+ "@entity.selectedId"
1274
+ ],
1275
+ [
1276
+ "*",
1277
+ [
1278
+ "object/get",
1279
+ "@n",
1280
+ "radius"
1281
+ ],
1282
+ 1.4
1283
+ ],
1284
+ [
1285
+ "object/get",
1286
+ "@n",
1287
+ "radius"
1288
+ ]
1289
+ ],
1290
+ "shape": [
1291
+ "object/get",
1292
+ "@n",
1293
+ "shape"
1294
+ ],
1295
+ "x": [
1296
+ "object/get",
1297
+ "@n",
1298
+ "x"
1299
+ ],
1300
+ "y": [
1301
+ "object/get",
1302
+ "@n",
1303
+ "y"
1304
+ ],
1305
+ "z": [
1306
+ "object/get",
1307
+ "@n",
1308
+ "z"
1309
+ ]
1310
+ }
1311
+ ]
1312
+ ],
1313
+ "onShapeClick": "SELECT_STATION",
1314
+ "post": "@config.post",
1315
+ "type": "biology-canvas",
1316
+ "width": "@config.width"
1317
+ },
1318
+ {
1319
+ "content": "@entity.narration",
1320
+ "type": "typography",
1321
+ "variant": "body"
1322
+ },
1323
+ {
1324
+ "content": [
1325
+ "str/concat",
1326
+ "Explored ",
1327
+ [
1328
+ "str/concat",
1329
+ "",
1330
+ [
1331
+ "array/len",
1332
+ "@entity.visitedIds"
1333
+ ]
1334
+ ],
1335
+ " of ",
1336
+ [
1337
+ "str/concat",
1338
+ "",
1339
+ [
1340
+ "array/len",
1341
+ "@entity.stations"
1342
+ ]
1343
+ ],
1344
+ [
1345
+ "if",
1346
+ "@entity.tourComplete",
1347
+ " — tour complete!",
1348
+ ""
1349
+ ]
1350
+ ],
1351
+ "type": "typography",
1352
+ "variant": "caption"
1353
+ }
1354
+ ],
1355
+ "direction": "vertical",
1356
+ "gap": "md",
1357
+ "type": "stack"
1358
+ }
1359
+ ],
1360
+ "padding": "md",
1361
+ "type": "box"
1362
+ }
1363
+ ],
1364
+ [
1365
+ "emit",
1366
+ "TOUR_3D_UPDATED",
1367
+ {
1368
+ "caption": [
1369
+ "object/get",
1370
+ [
1371
+ "array/nth",
1372
+ "@entity.stations",
1373
+ 0.0
1374
+ ],
1375
+ "caption"
1376
+ ],
1377
+ "id": "@entity.selectedId",
1378
+ "name": [
1379
+ "object/get",
1380
+ [
1381
+ "array/nth",
1382
+ "@entity.stations",
1383
+ 0.0
1384
+ ],
1385
+ "name"
1386
+ ],
1387
+ "total": [
1388
+ "array/len",
1389
+ "@entity.stations"
1390
+ ],
1391
+ "tourComplete": false,
1392
+ "visited": [
1393
+ "array/len",
1394
+ "@entity.visitedIds"
1395
+ ]
1396
+ }
1397
+ ]
1398
+ ],
1399
+ "event": "INIT",
1400
+ "eventId": "evt_01M07RCKW0YARJ2BYJ1MZGFTRD",
1401
+ "from": "idle",
1402
+ "guard": [
1403
+ "==",
1404
+ "@config.matchMode",
1405
+ ""
1406
+ ],
1407
+ "to": "idle"
1408
+ },
1409
+ {
1410
+ "effects": [
1411
+ [
1412
+ "set",
1413
+ "@entity.active",
1414
+ true
1415
+ ],
1416
+ [
1417
+ "set",
1418
+ "@entity.title",
1419
+ "@config.title"
1420
+ ],
1421
+ [
1422
+ "set",
1423
+ "@entity.stations",
1424
+ "@config.stations"
1425
+ ],
1426
+ [
1427
+ "set",
1428
+ "@entity.backdrop",
1429
+ "@config.backdrop"
1430
+ ],
1431
+ [
1432
+ "set",
1433
+ "@entity.edges",
1434
+ "@config.edges"
1435
+ ],
1436
+ [
1437
+ "set",
1438
+ "@entity.selectedIndex",
1439
+ 0.0
1440
+ ],
1441
+ [
1442
+ "set",
1443
+ "@entity.selectedId",
1444
+ [
1445
+ "object/get",
1446
+ [
1447
+ "array/nth",
1448
+ "@entity.stations",
1449
+ 0.0
1450
+ ],
1451
+ "id"
1452
+ ]
1453
+ ],
1454
+ [
1455
+ "set",
1456
+ "@entity.visitedIds",
1457
+ [
1458
+ [
1459
+ "object/get",
1460
+ [
1461
+ "array/nth",
1462
+ "@entity.stations",
1463
+ 0.0
1464
+ ],
1465
+ "id"
1466
+ ]
1467
+ ]
1468
+ ],
1469
+ [
1470
+ "set",
1471
+ "@entity.tourComplete",
1472
+ false
1473
+ ],
1474
+ [
1475
+ "set",
1476
+ "@entity.narration",
1477
+ [
1478
+ "str/concat",
1479
+ [
1480
+ "object/get",
1481
+ [
1482
+ "array/nth",
1483
+ "@entity.stations",
1484
+ 0.0
1485
+ ],
1486
+ "name"
1487
+ ],
1488
+ " — ",
1489
+ [
1490
+ "object/get",
1491
+ [
1492
+ "array/nth",
1493
+ "@entity.stations",
1494
+ 0.0
1495
+ ],
1496
+ "caption"
1497
+ ]
1498
+ ]
1499
+ ],
1500
+ [
1501
+ "render-ui",
1502
+ "main",
1503
+ {
1504
+ "children": [
1505
+ {
1506
+ "children": [
1507
+ {
1508
+ "content": "@entity.title",
1509
+ "type": "typography",
1510
+ "variant": "h4"
1511
+ },
1512
+ {
1513
+ "children": [
1514
+ {
1515
+ "action": "TOUR",
1516
+ "label": "@config.tourLabel",
1517
+ "type": "button",
1518
+ "variant": "primary"
1519
+ },
1520
+ {
1521
+ "action": "RESET",
1522
+ "label": "@config.resetLabel",
1523
+ "type": "button",
1524
+ "variant": "ghost"
1525
+ }
1526
+ ],
1527
+ "direction": "horizontal",
1528
+ "gap": "sm",
1529
+ "type": "stack"
1530
+ },
1531
+ {
1532
+ "backgroundColor": "@config.backgroundColor",
1533
+ "camera": {
1534
+ "azimuth": "@config.azimuth",
1535
+ "fov": "@config.fov",
1536
+ "mode": "perspective",
1537
+ "target": {
1538
+ "x": [
1539
+ "object/get",
1540
+ [
1541
+ "array/nth",
1542
+ "@entity.stations",
1543
+ "@entity.selectedIndex"
1544
+ ],
1545
+ "x"
1546
+ ],
1547
+ "y": [
1548
+ "object/get",
1549
+ [
1550
+ "array/nth",
1551
+ "@entity.stations",
1552
+ "@entity.selectedIndex"
1553
+ ],
1554
+ "y"
1555
+ ],
1556
+ "z": [
1557
+ "object/get",
1558
+ [
1559
+ "array/nth",
1560
+ "@entity.stations",
1561
+ "@entity.selectedIndex"
1562
+ ],
1563
+ "z"
1564
+ ]
1565
+ },
1566
+ "zoom": "@config.zoom"
1567
+ },
1568
+ "edges": "@entity.edges",
1569
+ "height": "@config.height",
1570
+ "interactive": true,
1571
+ "lighting": "@config.lighting",
1572
+ "mode": "3d",
1573
+ "nodes": [
1574
+ "array/map",
1575
+ [
1576
+ "array/concat",
1577
+ "@entity.backdrop",
1578
+ "@entity.stations"
1579
+ ],
1580
+ [
1581
+ "fn",
1582
+ "n",
1583
+ {
1584
+ "color": [
1585
+ "object/get",
1586
+ "@n",
1587
+ "color"
1588
+ ],
1589
+ "id": [
1590
+ "object/get",
1591
+ "@n",
1592
+ "id"
1593
+ ],
1594
+ "label": [
1595
+ "object/get",
1596
+ "@n",
1597
+ "name"
1598
+ ],
1599
+ "opacity": [
1600
+ "object/get",
1601
+ "@n",
1602
+ "opacity"
1603
+ ],
1604
+ "radius": [
1605
+ "if",
1606
+ [
1607
+ "==",
1608
+ [
1609
+ "object/get",
1610
+ "@n",
1611
+ "id"
1612
+ ],
1613
+ "@entity.selectedId"
1614
+ ],
1615
+ [
1616
+ "*",
1617
+ [
1618
+ "object/get",
1619
+ "@n",
1620
+ "radius"
1621
+ ],
1622
+ 1.4
1623
+ ],
1624
+ [
1625
+ "object/get",
1626
+ "@n",
1627
+ "radius"
1628
+ ]
1629
+ ],
1630
+ "shape": [
1631
+ "object/get",
1632
+ "@n",
1633
+ "shape"
1634
+ ],
1635
+ "x": [
1636
+ "object/get",
1637
+ "@n",
1638
+ "x"
1639
+ ],
1640
+ "y": [
1641
+ "object/get",
1642
+ "@n",
1643
+ "y"
1644
+ ],
1645
+ "z": [
1646
+ "object/get",
1647
+ "@n",
1648
+ "z"
1649
+ ]
1650
+ }
1651
+ ]
1652
+ ],
1653
+ "onShapeClick": "SELECT_STATION",
1654
+ "post": "@config.post",
1655
+ "type": "biology-canvas",
1656
+ "width": "@config.width"
1657
+ },
1658
+ {
1659
+ "content": "@entity.narration",
1660
+ "type": "typography",
1661
+ "variant": "body"
1662
+ },
1663
+ {
1664
+ "content": [
1665
+ "str/concat",
1666
+ "Explored ",
1667
+ [
1668
+ "str/concat",
1669
+ "",
1670
+ [
1671
+ "array/len",
1672
+ "@entity.visitedIds"
1673
+ ]
1674
+ ],
1675
+ " of ",
1676
+ [
1677
+ "str/concat",
1678
+ "",
1679
+ [
1680
+ "array/len",
1681
+ "@entity.stations"
1682
+ ]
1683
+ ],
1684
+ [
1685
+ "if",
1686
+ "@entity.tourComplete",
1687
+ " — tour complete!",
1688
+ ""
1689
+ ]
1690
+ ],
1691
+ "type": "typography",
1692
+ "variant": "caption"
1693
+ }
1694
+ ],
1695
+ "direction": "vertical",
1696
+ "gap": "md",
1697
+ "type": "stack"
1698
+ }
1699
+ ],
1700
+ "padding": "md",
1701
+ "type": "box"
1702
+ }
1703
+ ],
1704
+ [
1705
+ "emit",
1706
+ "TOUR_3D_UPDATED",
1707
+ {
1708
+ "caption": [
1709
+ "object/get",
1710
+ [
1711
+ "array/nth",
1712
+ "@entity.stations",
1713
+ 0.0
1714
+ ],
1715
+ "caption"
1716
+ ],
1717
+ "id": "@entity.selectedId",
1718
+ "name": [
1719
+ "object/get",
1720
+ [
1721
+ "array/nth",
1722
+ "@entity.stations",
1723
+ 0.0
1724
+ ],
1725
+ "name"
1726
+ ],
1727
+ "total": [
1728
+ "array/len",
1729
+ "@entity.stations"
1730
+ ],
1731
+ "tourComplete": false,
1732
+ "visited": [
1733
+ "array/len",
1734
+ "@entity.visitedIds"
1735
+ ]
1736
+ }
1737
+ ]
1738
+ ],
1739
+ "event": "MODE_SELECTED",
1740
+ "eventId": "evt_01M07RCKW2FDQK2QD7WX4GTRMJ",
1741
+ "from": "idle",
1742
+ "guard": [
1743
+ "==",
1744
+ "@payload.mode",
1745
+ "@config.matchMode"
1746
+ ],
1747
+ "to": "idle"
1748
+ },
1749
+ {
1750
+ "effects": [
1751
+ [
1752
+ "set",
1753
+ "@entity.selectedIndex",
1754
+ [
1755
+ "math/mod",
1756
+ [
1757
+ "+",
1758
+ "@entity.selectedIndex",
1759
+ 1.0
1760
+ ],
1761
+ [
1762
+ "array/len",
1763
+ "@entity.stations"
1764
+ ]
1765
+ ]
1766
+ ],
1767
+ [
1768
+ "set",
1769
+ "@entity.selectedId",
1770
+ [
1771
+ "object/get",
1772
+ [
1773
+ "array/nth",
1774
+ "@entity.stations",
1775
+ "@entity.selectedIndex"
1776
+ ],
1777
+ "id"
1778
+ ]
1779
+ ],
1780
+ [
1781
+ "set",
1782
+ "@entity.visitedIds",
1783
+ [
1784
+ "if",
1785
+ [
1786
+ "array/includes",
1787
+ "@entity.visitedIds",
1788
+ "@entity.selectedId"
1789
+ ],
1790
+ "@entity.visitedIds",
1791
+ [
1792
+ "array/append",
1793
+ "@entity.visitedIds",
1794
+ "@entity.selectedId"
1795
+ ]
1796
+ ]
1797
+ ],
1798
+ [
1799
+ "set",
1800
+ "@entity.tourComplete",
1801
+ [
1802
+ "==",
1803
+ [
1804
+ "array/len",
1805
+ "@entity.visitedIds"
1806
+ ],
1807
+ [
1808
+ "array/len",
1809
+ "@entity.stations"
1810
+ ]
1811
+ ]
1812
+ ],
1813
+ [
1814
+ "set",
1815
+ "@entity.narration",
1816
+ [
1817
+ "str/concat",
1818
+ [
1819
+ "object/get",
1820
+ [
1821
+ "array/nth",
1822
+ "@entity.stations",
1823
+ "@entity.selectedIndex"
1824
+ ],
1825
+ "name"
1826
+ ],
1827
+ " — ",
1828
+ [
1829
+ "object/get",
1830
+ [
1831
+ "array/nth",
1832
+ "@entity.stations",
1833
+ "@entity.selectedIndex"
1834
+ ],
1835
+ "caption"
1836
+ ]
1837
+ ]
1838
+ ],
1839
+ [
1840
+ "render-ui",
1841
+ "main",
1842
+ {
1843
+ "children": [
1844
+ {
1845
+ "children": [
1846
+ {
1847
+ "content": "@entity.title",
1848
+ "type": "typography",
1849
+ "variant": "h4"
1850
+ },
1851
+ {
1852
+ "children": [
1853
+ {
1854
+ "action": "TOUR",
1855
+ "label": "@config.tourLabel",
1856
+ "type": "button",
1857
+ "variant": "primary"
1858
+ },
1859
+ {
1860
+ "action": "RESET",
1861
+ "label": "@config.resetLabel",
1862
+ "type": "button",
1863
+ "variant": "ghost"
1864
+ }
1865
+ ],
1866
+ "direction": "horizontal",
1867
+ "gap": "sm",
1868
+ "type": "stack"
1869
+ },
1870
+ {
1871
+ "backgroundColor": "@config.backgroundColor",
1872
+ "camera": {
1873
+ "azimuth": "@config.azimuth",
1874
+ "fov": "@config.fov",
1875
+ "mode": "perspective",
1876
+ "target": {
1877
+ "x": [
1878
+ "object/get",
1879
+ [
1880
+ "array/nth",
1881
+ "@entity.stations",
1882
+ "@entity.selectedIndex"
1883
+ ],
1884
+ "x"
1885
+ ],
1886
+ "y": [
1887
+ "object/get",
1888
+ [
1889
+ "array/nth",
1890
+ "@entity.stations",
1891
+ "@entity.selectedIndex"
1892
+ ],
1893
+ "y"
1894
+ ],
1895
+ "z": [
1896
+ "object/get",
1897
+ [
1898
+ "array/nth",
1899
+ "@entity.stations",
1900
+ "@entity.selectedIndex"
1901
+ ],
1902
+ "z"
1903
+ ]
1904
+ },
1905
+ "zoom": "@config.zoom"
1906
+ },
1907
+ "edges": "@entity.edges",
1908
+ "height": "@config.height",
1909
+ "interactive": true,
1910
+ "lighting": "@config.lighting",
1911
+ "mode": "3d",
1912
+ "nodes": [
1913
+ "array/map",
1914
+ [
1915
+ "array/concat",
1916
+ "@entity.backdrop",
1917
+ "@entity.stations"
1918
+ ],
1919
+ [
1920
+ "fn",
1921
+ "n",
1922
+ {
1923
+ "color": [
1924
+ "object/get",
1925
+ "@n",
1926
+ "color"
1927
+ ],
1928
+ "id": [
1929
+ "object/get",
1930
+ "@n",
1931
+ "id"
1932
+ ],
1933
+ "label": [
1934
+ "object/get",
1935
+ "@n",
1936
+ "name"
1937
+ ],
1938
+ "opacity": [
1939
+ "object/get",
1940
+ "@n",
1941
+ "opacity"
1942
+ ],
1943
+ "radius": [
1944
+ "if",
1945
+ [
1946
+ "==",
1947
+ [
1948
+ "object/get",
1949
+ "@n",
1950
+ "id"
1951
+ ],
1952
+ "@entity.selectedId"
1953
+ ],
1954
+ [
1955
+ "*",
1956
+ [
1957
+ "object/get",
1958
+ "@n",
1959
+ "radius"
1960
+ ],
1961
+ 1.4
1962
+ ],
1963
+ [
1964
+ "object/get",
1965
+ "@n",
1966
+ "radius"
1967
+ ]
1968
+ ],
1969
+ "shape": [
1970
+ "object/get",
1971
+ "@n",
1972
+ "shape"
1973
+ ],
1974
+ "x": [
1975
+ "object/get",
1976
+ "@n",
1977
+ "x"
1978
+ ],
1979
+ "y": [
1980
+ "object/get",
1981
+ "@n",
1982
+ "y"
1983
+ ],
1984
+ "z": [
1985
+ "object/get",
1986
+ "@n",
1987
+ "z"
1988
+ ]
1989
+ }
1990
+ ]
1991
+ ],
1992
+ "onShapeClick": "SELECT_STATION",
1993
+ "post": "@config.post",
1994
+ "type": "biology-canvas",
1995
+ "width": "@config.width"
1996
+ },
1997
+ {
1998
+ "content": "@entity.narration",
1999
+ "type": "typography",
2000
+ "variant": "body"
2001
+ },
2002
+ {
2003
+ "content": [
2004
+ "str/concat",
2005
+ "Explored ",
2006
+ [
2007
+ "str/concat",
2008
+ "",
2009
+ [
2010
+ "array/len",
2011
+ "@entity.visitedIds"
2012
+ ]
2013
+ ],
2014
+ " of ",
2015
+ [
2016
+ "str/concat",
2017
+ "",
2018
+ [
2019
+ "array/len",
2020
+ "@entity.stations"
2021
+ ]
2022
+ ],
2023
+ [
2024
+ "if",
2025
+ "@entity.tourComplete",
2026
+ " — tour complete!",
2027
+ ""
2028
+ ]
2029
+ ],
2030
+ "type": "typography",
2031
+ "variant": "caption"
2032
+ }
2033
+ ],
2034
+ "direction": "vertical",
2035
+ "gap": "md",
2036
+ "type": "stack"
2037
+ }
2038
+ ],
2039
+ "padding": "md",
2040
+ "type": "box"
2041
+ }
2042
+ ],
2043
+ [
2044
+ "emit",
2045
+ "TOUR_3D_UPDATED",
2046
+ {
2047
+ "caption": [
2048
+ "object/get",
2049
+ [
2050
+ "array/nth",
2051
+ "@entity.stations",
2052
+ "@entity.selectedIndex"
2053
+ ],
2054
+ "caption"
2055
+ ],
2056
+ "id": "@entity.selectedId",
2057
+ "name": [
2058
+ "object/get",
2059
+ [
2060
+ "array/nth",
2061
+ "@entity.stations",
2062
+ "@entity.selectedIndex"
2063
+ ],
2064
+ "name"
2065
+ ],
2066
+ "total": [
2067
+ "array/len",
2068
+ "@entity.stations"
2069
+ ],
2070
+ "tourComplete": "@entity.tourComplete",
2071
+ "visited": [
2072
+ "array/len",
2073
+ "@entity.visitedIds"
2074
+ ]
2075
+ }
2076
+ ]
2077
+ ],
2078
+ "event": "TOUR",
2079
+ "eventId": "evt_01M07RCKW2DSDNYZ59EYX7RSHP",
2080
+ "from": "idle",
2081
+ "guard": [
2082
+ "==",
2083
+ "@entity.active",
2084
+ true
2085
+ ],
2086
+ "to": "idle"
2087
+ },
2088
+ {
2089
+ "effects": [
2090
+ [
2091
+ "let",
2092
+ [
2093
+ [
2094
+ "clickedId",
2095
+ [
2096
+ "object/get",
2097
+ "@payload.payload",
2098
+ "id"
2099
+ ]
2100
+ ],
2101
+ [
2102
+ "found",
2103
+ [
2104
+ "array/findIndex",
2105
+ "@entity.stations",
2106
+ [
2107
+ "fn",
2108
+ "n",
2109
+ [
2110
+ "==",
2111
+ [
2112
+ "object/get",
2113
+ "@n",
2114
+ "id"
2115
+ ],
2116
+ "@clickedId"
2117
+ ]
2118
+ ]
2119
+ ]
2120
+ ],
2121
+ [
2122
+ "idx",
2123
+ [
2124
+ "if",
2125
+ [
2126
+ ">=",
2127
+ "@found",
2128
+ 0.0
2129
+ ],
2130
+ "@found",
2131
+ "@entity.selectedIndex"
2132
+ ]
2133
+ ]
2134
+ ],
2135
+ [
2136
+ "do",
2137
+ [
2138
+ "set",
2139
+ "@entity.selectedIndex",
2140
+ "@idx"
2141
+ ],
2142
+ [
2143
+ "set",
2144
+ "@entity.selectedId",
2145
+ [
2146
+ "object/get",
2147
+ [
2148
+ "array/nth",
2149
+ "@entity.stations",
2150
+ "@idx"
2151
+ ],
2152
+ "id"
2153
+ ]
2154
+ ],
2155
+ [
2156
+ "set",
2157
+ "@entity.visitedIds",
2158
+ [
2159
+ "if",
2160
+ [
2161
+ "array/includes",
2162
+ "@entity.visitedIds",
2163
+ "@entity.selectedId"
2164
+ ],
2165
+ "@entity.visitedIds",
2166
+ [
2167
+ "array/append",
2168
+ "@entity.visitedIds",
2169
+ "@entity.selectedId"
2170
+ ]
2171
+ ]
2172
+ ],
2173
+ [
2174
+ "set",
2175
+ "@entity.tourComplete",
2176
+ [
2177
+ "==",
2178
+ [
2179
+ "array/len",
2180
+ "@entity.visitedIds"
2181
+ ],
2182
+ [
2183
+ "array/len",
2184
+ "@entity.stations"
2185
+ ]
2186
+ ]
2187
+ ],
2188
+ [
2189
+ "set",
2190
+ "@entity.narration",
2191
+ [
2192
+ "str/concat",
2193
+ [
2194
+ "object/get",
2195
+ [
2196
+ "array/nth",
2197
+ "@entity.stations",
2198
+ "@idx"
2199
+ ],
2200
+ "name"
2201
+ ],
2202
+ " — ",
2203
+ [
2204
+ "object/get",
2205
+ [
2206
+ "array/nth",
2207
+ "@entity.stations",
2208
+ "@idx"
2209
+ ],
2210
+ "caption"
2211
+ ]
2212
+ ]
2213
+ ],
2214
+ [
2215
+ "render-ui",
2216
+ "main",
2217
+ {
2218
+ "children": [
2219
+ {
2220
+ "children": [
2221
+ {
2222
+ "content": "@entity.title",
2223
+ "type": "typography",
2224
+ "variant": "h4"
2225
+ },
2226
+ {
2227
+ "children": [
2228
+ {
2229
+ "action": "TOUR",
2230
+ "label": "@config.tourLabel",
2231
+ "type": "button",
2232
+ "variant": "primary"
2233
+ },
2234
+ {
2235
+ "action": "RESET",
2236
+ "label": "@config.resetLabel",
2237
+ "type": "button",
2238
+ "variant": "ghost"
2239
+ }
2240
+ ],
2241
+ "direction": "horizontal",
2242
+ "gap": "sm",
2243
+ "type": "stack"
2244
+ },
2245
+ {
2246
+ "backgroundColor": "@config.backgroundColor",
2247
+ "camera": {
2248
+ "azimuth": "@config.azimuth",
2249
+ "fov": "@config.fov",
2250
+ "mode": "perspective",
2251
+ "target": {
2252
+ "x": [
2253
+ "object/get",
2254
+ [
2255
+ "array/nth",
2256
+ "@entity.stations",
2257
+ "@entity.selectedIndex"
2258
+ ],
2259
+ "x"
2260
+ ],
2261
+ "y": [
2262
+ "object/get",
2263
+ [
2264
+ "array/nth",
2265
+ "@entity.stations",
2266
+ "@entity.selectedIndex"
2267
+ ],
2268
+ "y"
2269
+ ],
2270
+ "z": [
2271
+ "object/get",
2272
+ [
2273
+ "array/nth",
2274
+ "@entity.stations",
2275
+ "@entity.selectedIndex"
2276
+ ],
2277
+ "z"
2278
+ ]
2279
+ },
2280
+ "zoom": "@config.zoom"
2281
+ },
2282
+ "edges": "@entity.edges",
2283
+ "height": "@config.height",
2284
+ "interactive": true,
2285
+ "lighting": "@config.lighting",
2286
+ "mode": "3d",
2287
+ "nodes": [
2288
+ "array/map",
2289
+ [
2290
+ "array/concat",
2291
+ "@entity.backdrop",
2292
+ "@entity.stations"
2293
+ ],
2294
+ [
2295
+ "fn",
2296
+ "n",
2297
+ {
2298
+ "color": [
2299
+ "object/get",
2300
+ "@n",
2301
+ "color"
2302
+ ],
2303
+ "id": [
2304
+ "object/get",
2305
+ "@n",
2306
+ "id"
2307
+ ],
2308
+ "label": [
2309
+ "object/get",
2310
+ "@n",
2311
+ "name"
2312
+ ],
2313
+ "opacity": [
2314
+ "object/get",
2315
+ "@n",
2316
+ "opacity"
2317
+ ],
2318
+ "radius": [
2319
+ "if",
2320
+ [
2321
+ "==",
2322
+ [
2323
+ "object/get",
2324
+ "@n",
2325
+ "id"
2326
+ ],
2327
+ "@entity.selectedId"
2328
+ ],
2329
+ [
2330
+ "*",
2331
+ [
2332
+ "object/get",
2333
+ "@n",
2334
+ "radius"
2335
+ ],
2336
+ 1.4
2337
+ ],
2338
+ [
2339
+ "object/get",
2340
+ "@n",
2341
+ "radius"
2342
+ ]
2343
+ ],
2344
+ "shape": [
2345
+ "object/get",
2346
+ "@n",
2347
+ "shape"
2348
+ ],
2349
+ "x": [
2350
+ "object/get",
2351
+ "@n",
2352
+ "x"
2353
+ ],
2354
+ "y": [
2355
+ "object/get",
2356
+ "@n",
2357
+ "y"
2358
+ ],
2359
+ "z": [
2360
+ "object/get",
2361
+ "@n",
2362
+ "z"
2363
+ ]
2364
+ }
2365
+ ]
2366
+ ],
2367
+ "onShapeClick": "SELECT_STATION",
2368
+ "post": "@config.post",
2369
+ "type": "biology-canvas",
2370
+ "width": "@config.width"
2371
+ },
2372
+ {
2373
+ "content": "@entity.narration",
2374
+ "type": "typography",
2375
+ "variant": "body"
2376
+ },
2377
+ {
2378
+ "content": [
2379
+ "str/concat",
2380
+ "Explored ",
2381
+ [
2382
+ "str/concat",
2383
+ "",
2384
+ [
2385
+ "array/len",
2386
+ "@entity.visitedIds"
2387
+ ]
2388
+ ],
2389
+ " of ",
2390
+ [
2391
+ "str/concat",
2392
+ "",
2393
+ [
2394
+ "array/len",
2395
+ "@entity.stations"
2396
+ ]
2397
+ ],
2398
+ [
2399
+ "if",
2400
+ "@entity.tourComplete",
2401
+ " — tour complete!",
2402
+ ""
2403
+ ]
2404
+ ],
2405
+ "type": "typography",
2406
+ "variant": "caption"
2407
+ }
2408
+ ],
2409
+ "direction": "vertical",
2410
+ "gap": "md",
2411
+ "type": "stack"
2412
+ }
2413
+ ],
2414
+ "padding": "md",
2415
+ "type": "box"
2416
+ }
2417
+ ],
2418
+ [
2419
+ "emit",
2420
+ "TOUR_3D_UPDATED",
2421
+ {
2422
+ "caption": [
2423
+ "object/get",
2424
+ [
2425
+ "array/nth",
2426
+ "@entity.stations",
2427
+ "@idx"
2428
+ ],
2429
+ "caption"
2430
+ ],
2431
+ "id": "@entity.selectedId",
2432
+ "name": [
2433
+ "object/get",
2434
+ [
2435
+ "array/nth",
2436
+ "@entity.stations",
2437
+ "@idx"
2438
+ ],
2439
+ "name"
2440
+ ],
2441
+ "total": [
2442
+ "array/len",
2443
+ "@entity.stations"
2444
+ ],
2445
+ "tourComplete": "@entity.tourComplete",
2446
+ "visited": [
2447
+ "array/len",
2448
+ "@entity.visitedIds"
2449
+ ]
2450
+ }
2451
+ ]
2452
+ ]
2453
+ ]
2454
+ ],
2455
+ "event": "SELECT_STATION",
2456
+ "eventId": "evt_01M07RCKW2MSXSKE1G2F9GKPBR",
2457
+ "from": "idle",
2458
+ "guard": [
2459
+ "==",
2460
+ "@entity.active",
2461
+ true
2462
+ ],
2463
+ "to": "idle"
2464
+ },
2465
+ {
2466
+ "effects": [
2467
+ [
2468
+ "set",
2469
+ "@entity.selectedIndex",
2470
+ 0.0
2471
+ ],
2472
+ [
2473
+ "set",
2474
+ "@entity.selectedId",
2475
+ [
2476
+ "object/get",
2477
+ [
2478
+ "array/nth",
2479
+ "@entity.stations",
2480
+ 0.0
2481
+ ],
2482
+ "id"
2483
+ ]
2484
+ ],
2485
+ [
2486
+ "set",
2487
+ "@entity.visitedIds",
2488
+ [
2489
+ [
2490
+ "object/get",
2491
+ [
2492
+ "array/nth",
2493
+ "@entity.stations",
2494
+ 0.0
2495
+ ],
2496
+ "id"
2497
+ ]
2498
+ ]
2499
+ ],
2500
+ [
2501
+ "set",
2502
+ "@entity.tourComplete",
2503
+ false
2504
+ ],
2505
+ [
2506
+ "set",
2507
+ "@entity.narration",
2508
+ [
2509
+ "str/concat",
2510
+ [
2511
+ "object/get",
2512
+ [
2513
+ "array/nth",
2514
+ "@entity.stations",
2515
+ 0.0
2516
+ ],
2517
+ "name"
2518
+ ],
2519
+ " — ",
2520
+ [
2521
+ "object/get",
2522
+ [
2523
+ "array/nth",
2524
+ "@entity.stations",
2525
+ 0.0
2526
+ ],
2527
+ "caption"
2528
+ ]
2529
+ ]
2530
+ ],
2531
+ [
2532
+ "render-ui",
2533
+ "main",
2534
+ {
2535
+ "children": [
2536
+ {
2537
+ "children": [
2538
+ {
2539
+ "content": "@entity.title",
2540
+ "type": "typography",
2541
+ "variant": "h4"
2542
+ },
2543
+ {
2544
+ "children": [
2545
+ {
2546
+ "action": "TOUR",
2547
+ "label": "@config.tourLabel",
2548
+ "type": "button",
2549
+ "variant": "primary"
2550
+ },
2551
+ {
2552
+ "action": "RESET",
2553
+ "label": "@config.resetLabel",
2554
+ "type": "button",
2555
+ "variant": "ghost"
2556
+ }
2557
+ ],
2558
+ "direction": "horizontal",
2559
+ "gap": "sm",
2560
+ "type": "stack"
2561
+ },
2562
+ {
2563
+ "backgroundColor": "@config.backgroundColor",
2564
+ "camera": {
2565
+ "azimuth": "@config.azimuth",
2566
+ "fov": "@config.fov",
2567
+ "mode": "perspective",
2568
+ "target": {
2569
+ "x": [
2570
+ "object/get",
2571
+ [
2572
+ "array/nth",
2573
+ "@entity.stations",
2574
+ "@entity.selectedIndex"
2575
+ ],
2576
+ "x"
2577
+ ],
2578
+ "y": [
2579
+ "object/get",
2580
+ [
2581
+ "array/nth",
2582
+ "@entity.stations",
2583
+ "@entity.selectedIndex"
2584
+ ],
2585
+ "y"
2586
+ ],
2587
+ "z": [
2588
+ "object/get",
2589
+ [
2590
+ "array/nth",
2591
+ "@entity.stations",
2592
+ "@entity.selectedIndex"
2593
+ ],
2594
+ "z"
2595
+ ]
2596
+ },
2597
+ "zoom": "@config.zoom"
2598
+ },
2599
+ "edges": "@entity.edges",
2600
+ "height": "@config.height",
2601
+ "interactive": true,
2602
+ "lighting": "@config.lighting",
2603
+ "mode": "3d",
2604
+ "nodes": [
2605
+ "array/map",
2606
+ [
2607
+ "array/concat",
2608
+ "@entity.backdrop",
2609
+ "@entity.stations"
2610
+ ],
2611
+ [
2612
+ "fn",
2613
+ "n",
2614
+ {
2615
+ "color": [
2616
+ "object/get",
2617
+ "@n",
2618
+ "color"
2619
+ ],
2620
+ "id": [
2621
+ "object/get",
2622
+ "@n",
2623
+ "id"
2624
+ ],
2625
+ "label": [
2626
+ "object/get",
2627
+ "@n",
2628
+ "name"
2629
+ ],
2630
+ "opacity": [
2631
+ "object/get",
2632
+ "@n",
2633
+ "opacity"
2634
+ ],
2635
+ "radius": [
2636
+ "if",
2637
+ [
2638
+ "==",
2639
+ [
2640
+ "object/get",
2641
+ "@n",
2642
+ "id"
2643
+ ],
2644
+ "@entity.selectedId"
2645
+ ],
2646
+ [
2647
+ "*",
2648
+ [
2649
+ "object/get",
2650
+ "@n",
2651
+ "radius"
2652
+ ],
2653
+ 1.4
2654
+ ],
2655
+ [
2656
+ "object/get",
2657
+ "@n",
2658
+ "radius"
2659
+ ]
2660
+ ],
2661
+ "shape": [
2662
+ "object/get",
2663
+ "@n",
2664
+ "shape"
2665
+ ],
2666
+ "x": [
2667
+ "object/get",
2668
+ "@n",
2669
+ "x"
2670
+ ],
2671
+ "y": [
2672
+ "object/get",
2673
+ "@n",
2674
+ "y"
2675
+ ],
2676
+ "z": [
2677
+ "object/get",
2678
+ "@n",
2679
+ "z"
2680
+ ]
2681
+ }
2682
+ ]
2683
+ ],
2684
+ "onShapeClick": "SELECT_STATION",
2685
+ "post": "@config.post",
2686
+ "type": "biology-canvas",
2687
+ "width": "@config.width"
2688
+ },
2689
+ {
2690
+ "content": "@entity.narration",
2691
+ "type": "typography",
2692
+ "variant": "body"
2693
+ },
2694
+ {
2695
+ "content": [
2696
+ "str/concat",
2697
+ "Explored ",
2698
+ [
2699
+ "str/concat",
2700
+ "",
2701
+ [
2702
+ "array/len",
2703
+ "@entity.visitedIds"
2704
+ ]
2705
+ ],
2706
+ " of ",
2707
+ [
2708
+ "str/concat",
2709
+ "",
2710
+ [
2711
+ "array/len",
2712
+ "@entity.stations"
2713
+ ]
2714
+ ],
2715
+ [
2716
+ "if",
2717
+ "@entity.tourComplete",
2718
+ " — tour complete!",
2719
+ ""
2720
+ ]
2721
+ ],
2722
+ "type": "typography",
2723
+ "variant": "caption"
2724
+ }
2725
+ ],
2726
+ "direction": "vertical",
2727
+ "gap": "md",
2728
+ "type": "stack"
2729
+ }
2730
+ ],
2731
+ "padding": "md",
2732
+ "type": "box"
2733
+ }
2734
+ ],
2735
+ [
2736
+ "emit",
2737
+ "TOUR_3D_UPDATED",
2738
+ {
2739
+ "caption": [
2740
+ "object/get",
2741
+ [
2742
+ "array/nth",
2743
+ "@entity.stations",
2744
+ 0.0
2745
+ ],
2746
+ "caption"
2747
+ ],
2748
+ "id": "@entity.selectedId",
2749
+ "name": [
2750
+ "object/get",
2751
+ [
2752
+ "array/nth",
2753
+ "@entity.stations",
2754
+ 0.0
2755
+ ],
2756
+ "name"
2757
+ ],
2758
+ "total": [
2759
+ "array/len",
2760
+ "@entity.stations"
2761
+ ],
2762
+ "tourComplete": false,
2763
+ "visited": [
2764
+ "array/len",
2765
+ "@entity.visitedIds"
2766
+ ]
2767
+ }
2768
+ ]
2769
+ ],
2770
+ "event": "RESET",
2771
+ "eventId": "evt_01M07RCKW2AHK7EHDEZAS9BHQD",
2772
+ "from": "idle",
2773
+ "guard": [
2774
+ "==",
2775
+ "@entity.active",
2776
+ true
2777
+ ],
2778
+ "to": "idle"
2779
+ },
2780
+ {
2781
+ "effects": [
2782
+ [
2783
+ "set",
2784
+ "@entity.stations",
2785
+ "@payload.stations"
2786
+ ],
2787
+ [
2788
+ "set",
2789
+ "@entity.backdrop",
2790
+ "@payload.backdrop"
2791
+ ],
2792
+ [
2793
+ "set",
2794
+ "@entity.edges",
2795
+ "@payload.edges"
2796
+ ],
2797
+ [
2798
+ "set",
2799
+ "@entity.selectedIndex",
2800
+ 0.0
2801
+ ],
2802
+ [
2803
+ "set",
2804
+ "@entity.selectedId",
2805
+ [
2806
+ "object/get",
2807
+ [
2808
+ "array/nth",
2809
+ "@entity.stations",
2810
+ 0.0
2811
+ ],
2812
+ "id"
2813
+ ]
2814
+ ],
2815
+ [
2816
+ "set",
2817
+ "@entity.visitedIds",
2818
+ [
2819
+ [
2820
+ "object/get",
2821
+ [
2822
+ "array/nth",
2823
+ "@entity.stations",
2824
+ 0.0
2825
+ ],
2826
+ "id"
2827
+ ]
2828
+ ]
2829
+ ],
2830
+ [
2831
+ "set",
2832
+ "@entity.tourComplete",
2833
+ false
2834
+ ],
2835
+ [
2836
+ "set",
2837
+ "@entity.narration",
2838
+ [
2839
+ "str/concat",
2840
+ [
2841
+ "object/get",
2842
+ [
2843
+ "array/nth",
2844
+ "@entity.stations",
2845
+ 0.0
2846
+ ],
2847
+ "name"
2848
+ ],
2849
+ " — ",
2850
+ [
2851
+ "object/get",
2852
+ [
2853
+ "array/nth",
2854
+ "@entity.stations",
2855
+ 0.0
2856
+ ],
2857
+ "caption"
2858
+ ]
2859
+ ]
2860
+ ],
2861
+ [
2862
+ "render-ui",
2863
+ "main",
2864
+ {
2865
+ "children": [
2866
+ {
2867
+ "children": [
2868
+ {
2869
+ "content": "@entity.title",
2870
+ "type": "typography",
2871
+ "variant": "h4"
2872
+ },
2873
+ {
2874
+ "children": [
2875
+ {
2876
+ "action": "TOUR",
2877
+ "label": "@config.tourLabel",
2878
+ "type": "button",
2879
+ "variant": "primary"
2880
+ },
2881
+ {
2882
+ "action": "RESET",
2883
+ "label": "@config.resetLabel",
2884
+ "type": "button",
2885
+ "variant": "ghost"
2886
+ }
2887
+ ],
2888
+ "direction": "horizontal",
2889
+ "gap": "sm",
2890
+ "type": "stack"
2891
+ },
2892
+ {
2893
+ "backgroundColor": "@config.backgroundColor",
2894
+ "camera": {
2895
+ "azimuth": "@config.azimuth",
2896
+ "fov": "@config.fov",
2897
+ "mode": "perspective",
2898
+ "target": {
2899
+ "x": [
2900
+ "object/get",
2901
+ [
2902
+ "array/nth",
2903
+ "@entity.stations",
2904
+ "@entity.selectedIndex"
2905
+ ],
2906
+ "x"
2907
+ ],
2908
+ "y": [
2909
+ "object/get",
2910
+ [
2911
+ "array/nth",
2912
+ "@entity.stations",
2913
+ "@entity.selectedIndex"
2914
+ ],
2915
+ "y"
2916
+ ],
2917
+ "z": [
2918
+ "object/get",
2919
+ [
2920
+ "array/nth",
2921
+ "@entity.stations",
2922
+ "@entity.selectedIndex"
2923
+ ],
2924
+ "z"
2925
+ ]
2926
+ },
2927
+ "zoom": "@config.zoom"
2928
+ },
2929
+ "edges": "@entity.edges",
2930
+ "height": "@config.height",
2931
+ "interactive": true,
2932
+ "lighting": "@config.lighting",
2933
+ "mode": "3d",
2934
+ "nodes": [
2935
+ "array/map",
2936
+ [
2937
+ "array/concat",
2938
+ "@entity.backdrop",
2939
+ "@entity.stations"
2940
+ ],
2941
+ [
2942
+ "fn",
2943
+ "n",
2944
+ {
2945
+ "color": [
2946
+ "object/get",
2947
+ "@n",
2948
+ "color"
2949
+ ],
2950
+ "id": [
2951
+ "object/get",
2952
+ "@n",
2953
+ "id"
2954
+ ],
2955
+ "label": [
2956
+ "object/get",
2957
+ "@n",
2958
+ "name"
2959
+ ],
2960
+ "opacity": [
2961
+ "object/get",
2962
+ "@n",
2963
+ "opacity"
2964
+ ],
2965
+ "radius": [
2966
+ "if",
2967
+ [
2968
+ "==",
2969
+ [
2970
+ "object/get",
2971
+ "@n",
2972
+ "id"
2973
+ ],
2974
+ "@entity.selectedId"
2975
+ ],
2976
+ [
2977
+ "*",
2978
+ [
2979
+ "object/get",
2980
+ "@n",
2981
+ "radius"
2982
+ ],
2983
+ 1.4
2984
+ ],
2985
+ [
2986
+ "object/get",
2987
+ "@n",
2988
+ "radius"
2989
+ ]
2990
+ ],
2991
+ "shape": [
2992
+ "object/get",
2993
+ "@n",
2994
+ "shape"
2995
+ ],
2996
+ "x": [
2997
+ "object/get",
2998
+ "@n",
2999
+ "x"
3000
+ ],
3001
+ "y": [
3002
+ "object/get",
3003
+ "@n",
3004
+ "y"
3005
+ ],
3006
+ "z": [
3007
+ "object/get",
3008
+ "@n",
3009
+ "z"
3010
+ ]
3011
+ }
3012
+ ]
3013
+ ],
3014
+ "onShapeClick": "SELECT_STATION",
3015
+ "post": "@config.post",
3016
+ "type": "biology-canvas",
3017
+ "width": "@config.width"
3018
+ },
3019
+ {
3020
+ "content": "@entity.narration",
3021
+ "type": "typography",
3022
+ "variant": "body"
3023
+ },
3024
+ {
3025
+ "content": [
3026
+ "str/concat",
3027
+ "Explored ",
3028
+ [
3029
+ "str/concat",
3030
+ "",
3031
+ [
3032
+ "array/len",
3033
+ "@entity.visitedIds"
3034
+ ]
3035
+ ],
3036
+ " of ",
3037
+ [
3038
+ "str/concat",
3039
+ "",
3040
+ [
3041
+ "array/len",
3042
+ "@entity.stations"
3043
+ ]
3044
+ ],
3045
+ [
3046
+ "if",
3047
+ "@entity.tourComplete",
3048
+ " — tour complete!",
3049
+ ""
3050
+ ]
3051
+ ],
3052
+ "type": "typography",
3053
+ "variant": "caption"
3054
+ }
3055
+ ],
3056
+ "direction": "vertical",
3057
+ "gap": "md",
3058
+ "type": "stack"
3059
+ }
3060
+ ],
3061
+ "padding": "md",
3062
+ "type": "box"
3063
+ }
3064
+ ],
3065
+ [
3066
+ "emit",
3067
+ "TOUR_3D_UPDATED",
3068
+ {
3069
+ "caption": [
3070
+ "object/get",
3071
+ [
3072
+ "array/nth",
3073
+ "@entity.stations",
3074
+ 0.0
3075
+ ],
3076
+ "caption"
3077
+ ],
3078
+ "id": "@entity.selectedId",
3079
+ "name": [
3080
+ "object/get",
3081
+ [
3082
+ "array/nth",
3083
+ "@entity.stations",
3084
+ 0.0
3085
+ ],
3086
+ "name"
3087
+ ],
3088
+ "total": [
3089
+ "array/len",
3090
+ "@entity.stations"
3091
+ ],
3092
+ "tourComplete": false,
3093
+ "visited": [
3094
+ "array/len",
3095
+ "@entity.visitedIds"
3096
+ ]
3097
+ }
3098
+ ]
3099
+ ],
3100
+ "event": "SYNC_STATIONS",
3101
+ "eventId": "evt_01M09E8V0NEH4QP51HH0HZ80ST",
3102
+ "from": "idle",
3103
+ "guard": [
3104
+ "==",
3105
+ "@entity.active",
3106
+ true
3107
+ ],
3108
+ "to": "idle"
3109
+ }
3110
+ ]
3111
+ }
3112
+ }
3113
+ ]
3114
+ }
3115
+ ],
3116
+ "schemaVersion": 1,
3117
+ "version": "1.0.0"
3118
+ }