@almadar/std 16.239.0 → 16.242.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/behaviors/behaviors-registry.json +4814 -553
  2. package/behaviors/lolo/agent/atoms/std-agent-memory.lolo +38 -1
  3. package/behaviors/lolo/agent/atoms/std-agent-session.lolo +1074 -47
  4. package/behaviors/lolo/agent/atoms/std-agent-tool-loop.lolo +8 -7
  5. package/behaviors/lolo/agent/organisms/std-agent-assistant.lolo +56 -37
  6. package/behaviors/lolo/infra/atoms/std-page-open.lolo +59 -0
  7. package/behaviors/lolo/infra/atoms/std-page-search.lolo +134 -0
  8. package/behaviors/lolo/infra/atoms/std-page-treat.lolo +59 -0
  9. package/behaviors/lolo/infra/atoms/std-page-watch.lolo +86 -0
  10. package/behaviors/lolo/ui/core/atoms/std-board.lolo +53 -6
  11. package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +25 -1
  12. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +9 -0
  13. package/behaviors/lolo/ui/core/atoms/std-doc-page.lolo +153 -0
  14. package/behaviors/lolo/ui/core/atoms/std-site-header.lolo +15 -3
  15. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +2 -2
  16. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +7 -7
  17. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +1 -1
  18. package/behaviors/lolo/ui/core/molecules/ui-header.lolo +5 -0
  19. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +124 -92
  20. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +114 -55
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +40 -14
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +363 -123
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +93 -48
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-diagram.lolo +60 -28
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +193 -96
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +75 -32
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +142 -86
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +266 -98
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +103 -65
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-live-sim.lolo +223 -109
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +232 -64
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-param-explorer.lolo +69 -29
  33. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +363 -123
  34. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +73 -41
  35. package/behaviors/lolo/ui/learning/atoms/std-learn-sample-accumulator.lolo +96 -38
  36. package/behaviors/lolo/ui/learning/atoms/std-learn-sandbox.lolo +65 -45
  37. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +243 -117
  38. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +76 -28
  39. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +228 -109
  40. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +95 -44
  41. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +199 -125
  42. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +92 -48
  43. package/behaviors/lolo/ui/learning/atoms/std-learn-trace-player.lolo +239 -78
  44. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +147 -38
  45. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +123 -58
  46. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +22 -0
  47. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +26 -0
  48. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +26 -0
  49. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +27 -1
  50. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +27 -1
  51. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +29 -9
  52. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +26 -0
  53. package/behaviors/lolo-behavior-contracts.json +1 -1
  54. package/behaviors/registry/agent/atoms/std-agent-memory.orb +372 -2
  55. package/behaviors/registry/agent/atoms/std-agent-session.orb +4752 -348
  56. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +54 -42
  57. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +356 -122
  58. package/behaviors/registry/factory-signatures.json +1 -1
  59. package/behaviors/registry/infra/atoms/std-page-open.orb +435 -0
  60. package/behaviors/registry/infra/atoms/std-page-search.orb +867 -0
  61. package/behaviors/registry/infra/atoms/std-page-treat.orb +494 -0
  62. package/behaviors/registry/infra/atoms/std-page-watch.orb +554 -0
  63. package/behaviors/registry/ui/core/atoms/std-board.orb +110 -14
  64. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +119 -0
  65. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +61 -0
  66. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +594 -0
  67. package/behaviors/registry/ui/core/atoms/std-site-header.orb +40 -2
  68. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +2 -0
  69. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +24 -0
  70. package/behaviors/registry/ui/core/atoms/std-version-history.orb +8 -1
  71. package/behaviors/registry/ui/core/molecules/ui-header.orb +7 -0
  72. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +903 -369
  73. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1002 -232
  74. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +253 -74
  75. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3624 -921
  76. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +685 -144
  77. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +404 -52
  78. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1787 -210
  79. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +699 -71
  80. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1102 -578
  81. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +2760 -872
  82. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +689 -152
  83. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1431 -633
  84. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +2485 -512
  85. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +501 -197
  86. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +3642 -928
  87. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +705 -125
  88. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +624 -114
  89. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +405 -153
  90. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1911 -611
  91. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +436 -128
  92. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +2482 -485
  93. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +896 -192
  94. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +2001 -759
  95. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +734 -228
  96. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +2501 -764
  97. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1591 -173
  98. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +883 -122
  99. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +176 -0
  100. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +211 -0
  101. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +211 -0
  102. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +212 -1
  103. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +212 -1
  104. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +203 -9
  105. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +211 -0
  106. package/behaviors/signatures.lolo +325 -655
  107. package/canonical-operators.json +35 -1
  108. package/dist/behaviors/exports-reader.js +41980 -35508
  109. package/dist/behaviors/functions/index.d.ts +1063 -140
  110. package/dist/behaviors/functions/index.js +41951 -35506
  111. package/dist/behaviors/index.d.ts +1 -1
  112. package/dist/behaviors/index.js +41981 -35509
  113. package/dist/behaviors/query.js +41980 -35508
  114. package/dist/behaviors-embeddings.hash.json +3 -3
  115. package/dist/behaviors-embeddings.json +47 -27
  116. package/dist/behaviors-registry.json +4814 -553
  117. package/dist/index.d.ts +4 -4
  118. package/dist/index.js +42019 -35509
  119. package/dist/knob-embeddings.hash.json +3 -3
  120. package/dist/knob-embeddings.json +623 -263
  121. package/dist/modules/anim.d.ts +1 -1
  122. package/dist/modules/array.d.ts +1 -1
  123. package/dist/modules/async.d.ts +1 -1
  124. package/dist/modules/behavior.d.ts +1 -1
  125. package/dist/modules/browser.d.ts +1 -1
  126. package/dist/modules/composition.d.ts +1 -1
  127. package/dist/modules/contract.d.ts +1 -1
  128. package/dist/modules/core.d.ts +1 -1
  129. package/dist/modules/core.js +2 -0
  130. package/dist/modules/data.d.ts +1 -1
  131. package/dist/modules/ease.d.ts +1 -1
  132. package/dist/modules/format.d.ts +1 -1
  133. package/dist/modules/geo.d.ts +1 -1
  134. package/dist/modules/graph.d.ts +1 -1
  135. package/dist/modules/grid.d.ts +1 -1
  136. package/dist/modules/i18n.d.ts +17 -0
  137. package/dist/modules/i18n.js +22 -0
  138. package/dist/modules/index.d.ts +2 -1
  139. package/dist/modules/index.js +24 -1
  140. package/dist/modules/integration.d.ts +1 -1
  141. package/dist/modules/json.d.ts +1 -1
  142. package/dist/modules/llm.d.ts +1 -1
  143. package/dist/modules/math.d.ts +1 -1
  144. package/dist/modules/memory.d.ts +1 -1
  145. package/dist/modules/nn.d.ts +1 -1
  146. package/dist/modules/noise.d.ts +1 -1
  147. package/dist/modules/object.d.ts +1 -1
  148. package/dist/modules/os.d.ts +1 -1
  149. package/dist/modules/path.d.ts +1 -1
  150. package/dist/modules/prob.d.ts +1 -1
  151. package/dist/modules/session.d.ts +1 -1
  152. package/dist/modules/str.d.ts +1 -1
  153. package/dist/modules/tensor.d.ts +1 -1
  154. package/dist/modules/time.d.ts +1 -1
  155. package/dist/modules/trace.d.ts +1 -1
  156. package/dist/modules/train.d.ts +1 -1
  157. package/dist/modules/validate.d.ts +1 -1
  158. package/dist/modules/vector.d.ts +1 -1
  159. package/dist/modules/workspace.d.ts +1 -1
  160. package/dist/registry/factory-signatures.json +1 -1
  161. package/dist/registry.d.ts +10 -3
  162. package/dist/registry.js +31 -1
  163. package/dist/{types-DLx38UFZ.d.ts → types-Cdb321uM.d.ts} +9 -3
  164. package/i18n/ar.json +1 -0
  165. package/i18n/en.json +1 -0
  166. package/i18n/sl.json +1 -0
  167. package/package.json +3 -3
@@ -90,12 +90,19 @@ orbital LearnTour3DOrbital {
90
90
  padding: md
91
91
  children: [
92
92
  { type: stack, direction: vertical, gap: md, children: [
93
- { type: typography, variant: h4, content: @entity.title },
94
- { type: stack, direction: horizontal, gap: sm, children: [
95
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
96
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
93
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
94
+ { type: stack, direction: vertical, gap: xs, children: [
95
+ { type: typography, variant: h4, content: @entity.title },
96
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
97
+ ] },
98
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
99
+ ] },
100
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
101
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
102
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
103
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
97
104
  ] },
98
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
105
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
99
106
  mode: "3d",
100
107
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
101
108
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -106,13 +113,16 @@ orbital LearnTour3DOrbital {
106
113
  interactive: true,
107
114
  onShapeClick: "SELECT_STATION"
108
115
  },
109
- { type: typography, variant: body, content: @entity.narration },
110
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
116
+ { type: typography, variant: body, content: @entity.narration }
111
117
  ] }
112
118
  ]
113
119
  })
114
120
  (emit TOUR_3D_UPDATED { id: @entity.selectedId, name: (object/get (array/nth @entity.stations 0) name), caption: (object/get (array/nth @entity.stations 0) caption), visited: (array/len @entity.visitedIds), total: (array/len @entity.stations), tourComplete: false })
115
121
 
122
+ MODE_SELECTED -> idle when (and (not (== @config.matchMode "")) (not (== ?mode @config.matchMode)))
123
+ (set @entity.active false)
124
+ (render-ui main null)
125
+
116
126
  MODE_SELECTED -> idle when (== ?mode @config.matchMode)
117
127
  (set @entity.active true)
118
128
  (set @entity.title @config.title)
@@ -129,12 +139,19 @@ orbital LearnTour3DOrbital {
129
139
  padding: md
130
140
  children: [
131
141
  { type: stack, direction: vertical, gap: md, children: [
132
- { type: typography, variant: h4, content: @entity.title },
133
- { type: stack, direction: horizontal, gap: sm, children: [
134
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
135
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
142
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
143
+ { type: stack, direction: vertical, gap: xs, children: [
144
+ { type: typography, variant: h4, content: @entity.title },
145
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
146
+ ] },
147
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
136
148
  ] },
137
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
149
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
150
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
151
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
152
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
153
+ ] },
154
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
138
155
  mode: "3d",
139
156
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
140
157
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -145,8 +162,7 @@ orbital LearnTour3DOrbital {
145
162
  interactive: true,
146
163
  onShapeClick: "SELECT_STATION"
147
164
  },
148
- { type: typography, variant: body, content: @entity.narration },
149
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
165
+ { type: typography, variant: body, content: @entity.narration }
150
166
  ] }
151
167
  ]
152
168
  })
@@ -164,12 +180,19 @@ orbital LearnTour3DOrbital {
164
180
  padding: md
165
181
  children: [
166
182
  { type: stack, direction: vertical, gap: md, children: [
167
- { type: typography, variant: h4, content: @entity.title },
168
- { type: stack, direction: horizontal, gap: sm, children: [
169
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
170
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
183
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
184
+ { type: stack, direction: vertical, gap: xs, children: [
185
+ { type: typography, variant: h4, content: @entity.title },
186
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
187
+ ] },
188
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
189
+ ] },
190
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
191
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
192
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
193
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
171
194
  ] },
172
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
195
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
173
196
  mode: "3d",
174
197
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
175
198
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -180,8 +203,7 @@ orbital LearnTour3DOrbital {
180
203
  interactive: true,
181
204
  onShapeClick: "SELECT_STATION"
182
205
  },
183
- { type: typography, variant: body, content: @entity.narration },
184
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
206
+ { type: typography, variant: body, content: @entity.narration }
185
207
  ] }
186
208
  ]
187
209
  })
@@ -205,12 +227,19 @@ orbital LearnTour3DOrbital {
205
227
  padding: md
206
228
  children: [
207
229
  { type: stack, direction: vertical, gap: md, children: [
208
- { type: typography, variant: h4, content: @entity.title },
209
- { type: stack, direction: horizontal, gap: sm, children: [
210
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
211
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
230
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
231
+ { type: stack, direction: vertical, gap: xs, children: [
232
+ { type: typography, variant: h4, content: @entity.title },
233
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
234
+ ] },
235
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
212
236
  ] },
213
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
237
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
238
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
239
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
240
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
241
+ ] },
242
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
214
243
  mode: "3d",
215
244
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
216
245
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -221,8 +250,7 @@ orbital LearnTour3DOrbital {
221
250
  interactive: true,
222
251
  onShapeClick: "SELECT_STATION"
223
252
  },
224
- { type: typography, variant: body, content: @entity.narration },
225
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
253
+ { type: typography, variant: body, content: @entity.narration }
226
254
  ] }
227
255
  ]
228
256
  })
@@ -241,12 +269,19 @@ orbital LearnTour3DOrbital {
241
269
  padding: md
242
270
  children: [
243
271
  { type: stack, direction: vertical, gap: md, children: [
244
- { type: typography, variant: h4, content: @entity.title },
245
- { type: stack, direction: horizontal, gap: sm, children: [
246
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
247
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
272
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
273
+ { type: stack, direction: vertical, gap: xs, children: [
274
+ { type: typography, variant: h4, content: @entity.title },
275
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
276
+ ] },
277
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
278
+ ] },
279
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
280
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
281
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
282
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
248
283
  ] },
249
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
284
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
250
285
  mode: "3d",
251
286
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
252
287
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -257,8 +292,7 @@ orbital LearnTour3DOrbital {
257
292
  interactive: true,
258
293
  onShapeClick: "SELECT_STATION"
259
294
  },
260
- { type: typography, variant: body, content: @entity.narration },
261
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
295
+ { type: typography, variant: body, content: @entity.narration }
262
296
  ] }
263
297
  ]
264
298
  })
@@ -278,12 +312,19 @@ orbital LearnTour3DOrbital {
278
312
  padding: md
279
313
  children: [
280
314
  { type: stack, direction: vertical, gap: md, children: [
281
- { type: typography, variant: h4, content: @entity.title },
282
- { type: stack, direction: horizontal, gap: sm, children: [
283
- { type: button, action: TOUR, label: @config.tourLabel, variant: primary },
284
- { type: button, action: RESET, label: @config.resetLabel, variant: ghost }
315
+ { type: stack, direction: horizontal, justify: between, align: start, gap: md, children: [
316
+ { type: stack, direction: vertical, gap: xs, children: [
317
+ { type: typography, variant: h4, content: @entity.title },
318
+ (if (== @config.summary "") null { type: typography, variant: body2, color: muted, content: @config.summary })
319
+ ] },
320
+ { type: badge, label: (if @entity.tourComplete "Complete" (str/concat "Station " (str/concat "" (+ @entity.selectedIndex 1)) " of " (str/concat "" (array/len @entity.stations)))), variant: (if @entity.tourComplete "success" "neutral") }
321
+ ] },
322
+ { type: stack, direction: horizontal, align: center, gap: sm, wrap: true, children: [
323
+ { type: button, action: TOUR, label: @config.tourLabel, icon: "chevron-right", variant: primary },
324
+ { type: button, action: RESET, label: @config.resetLabel, icon: "rotate-ccw", variant: ghost },
325
+ { type: typography, variant: caption, color: muted, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
285
326
  ] },
286
- { type: biology-canvas, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
327
+ { type: biology-canvas, keyMap: { Space: TOUR, ArrowRight: TOUR, KeyR: RESET }, width: @config.width, height: @config.height, backgroundColor: @config.backgroundColor,
287
328
  mode: "3d",
288
329
  camera: { mode: "perspective", zoom: @config.zoom, fov: @config.fov, azimuth: @config.azimuth,
289
330
  target: { x: (object/get (array/nth @entity.stations @entity.selectedIndex) x), y: (object/get (array/nth @entity.stations @entity.selectedIndex) y), z: (object/get (array/nth @entity.stations @entity.selectedIndex) z) } },
@@ -294,8 +335,7 @@ orbital LearnTour3DOrbital {
294
335
  interactive: true,
295
336
  onShapeClick: "SELECT_STATION"
296
337
  },
297
- { type: typography, variant: body, content: @entity.narration },
298
- { type: typography, variant: caption, content: (str/concat "Explored " (str/concat "" (array/len @entity.visitedIds)) " of " (str/concat "" (array/len @entity.stations)) (if @entity.tourComplete " — tour complete!" "")) }
338
+ { type: typography, variant: body, content: @entity.narration }
299
339
  ] }
300
340
  ]
301
341
  })
@@ -352,10 +392,14 @@ orbital LearnTour3DOrbital {
352
392
  @label "Title"
353
393
  @description "Title shown above the canvas."
354
394
  @tier "presentation"
395
+ summary : string = ""
396
+ @label "Concept"
397
+ @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line."
398
+ @tier "presentation"
355
399
  stations : [Learn3DStation] = [
356
- { id: "alpha", name: "Station Alpha", caption: "The first stop on the tour — the camera retargets here and the narration reads its caption.", x: 0, y: 0, z: 0, radius: 1, color: "#2563eb", shape: sphere, opacity: 1 },
357
- { id: "beta", name: "Station Beta", caption: "The second stop — press Tour again or click a shape to advance the selection.", x: 3, y: 1, z: -1, radius: 0.8, color: "#7c3aed", shape: sphere, opacity: 1 },
358
- { id: "gamma", name: "Station Gamma", caption: "The final stop — once every station has been visited the tour marks itself complete.", x: -3, y: -1, z: 1, radius: 0.8, color: "#0891b2", shape: sphere, opacity: 1 }
400
+ { id: "alpha", name: "Station Alpha", caption: "The first stop on the tour — the camera retargets here and the narration reads its caption.", x: 0, y: 0, z: 0, radius: 1, color: "series-1", shape: sphere, opacity: 1 },
401
+ { id: "beta", name: "Station Beta", caption: "The second stop — press Tour again or click a shape to advance the selection.", x: 3, y: 1, z: -1, radius: 0.8, color: "series-2", shape: sphere, opacity: 1 },
402
+ { id: "gamma", name: "Station Gamma", caption: "The final stop — once every station has been visited the tour marks itself complete.", x: -3, y: -1, z: 1, radius: 0.8, color: "series-3", shape: sphere, opacity: 1 }
359
403
  ]
360
404
  @label "Stations"
361
405
  @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."
@@ -371,7 +415,7 @@ orbital LearnTour3DOrbital {
371
415
  @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."
372
416
  @synonyms "backdrop, scenery, geometry, context nodes, 3d"
373
417
  @tier "domain"
374
- tourLabel : string = "Tour"
418
+ tourLabel : string = "Next station"
375
419
  @label "Tour Button Label"
376
420
  @description "Label text for the button that advances the tour to the next station."
377
421
  @tier "presentation"
@@ -407,9 +451,9 @@ orbital LearnTour3DOrbital {
407
451
  @label "Height"
408
452
  @description "Canvas height in pixels."
409
453
  @tier "presentation"
410
- backgroundColor : string = "#0f172a"
454
+ backgroundColor : string = ""
411
455
  @label "Background Color"
412
- @description "Canvas background color — a dark stage makes translucent shells and station colors read in 3D."
456
+ @description "Canvas ground. Empty uses the theme drawing ground."
413
457
  @tier "presentation"
414
458
  }
415
459
  }