@almadar/std 16.241.0 → 16.243.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/behaviors/behaviors-registry.json +4650 -535
  2. package/behaviors/lolo/agent/atoms/std-agent-memory.lolo +38 -1
  3. package/behaviors/lolo/agent/atoms/std-agent-session.lolo +1074 -47
  4. package/behaviors/lolo/agent/atoms/std-agent-tool-loop.lolo +8 -7
  5. package/behaviors/lolo/agent/organisms/std-agent-assistant.lolo +56 -37
  6. package/behaviors/lolo/infra/atoms/std-page-open.lolo +59 -0
  7. package/behaviors/lolo/infra/atoms/std-page-search.lolo +136 -0
  8. package/behaviors/lolo/infra/atoms/std-page-treat.lolo +59 -0
  9. package/behaviors/lolo/infra/atoms/std-page-watch.lolo +88 -0
  10. package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +25 -1
  11. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +9 -0
  12. package/behaviors/lolo/ui/core/atoms/std-doc-page.lolo +153 -0
  13. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +124 -92
  14. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +114 -55
  15. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +40 -14
  16. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +363 -123
  17. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +93 -48
  18. package/behaviors/lolo/ui/learning/atoms/std-learn-diagram.lolo +60 -28
  19. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +193 -96
  20. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +75 -32
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +142 -86
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +266 -98
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +103 -65
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-live-sim.lolo +223 -109
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +232 -64
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-param-explorer.lolo +69 -29
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +363 -123
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +73 -41
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-sample-accumulator.lolo +96 -38
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-sandbox.lolo +65 -45
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +243 -117
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +76 -28
  33. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +228 -109
  34. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +95 -44
  35. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +199 -125
  36. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +92 -48
  37. package/behaviors/lolo/ui/learning/atoms/std-learn-trace-player.lolo +239 -78
  38. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +147 -38
  39. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +123 -58
  40. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +22 -0
  41. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +26 -0
  42. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +26 -0
  43. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +27 -1
  44. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +27 -1
  45. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +29 -9
  46. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +26 -0
  47. package/behaviors/lolo-behavior-contracts.json +1 -1
  48. package/behaviors/registry/agent/atoms/std-agent-memory.orb +372 -2
  49. package/behaviors/registry/agent/atoms/std-agent-session.orb +4752 -348
  50. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +54 -42
  51. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +356 -122
  52. package/behaviors/registry/factory-signatures.json +1 -1
  53. package/behaviors/registry/infra/atoms/std-page-open.orb +435 -0
  54. package/behaviors/registry/infra/atoms/std-page-search.orb +885 -0
  55. package/behaviors/registry/infra/atoms/std-page-treat.orb +494 -0
  56. package/behaviors/registry/infra/atoms/std-page-watch.orb +572 -0
  57. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +119 -0
  58. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +61 -0
  59. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +594 -0
  60. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +903 -369
  61. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1002 -232
  62. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +253 -74
  63. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3624 -921
  64. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +685 -144
  65. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +404 -52
  66. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1787 -210
  67. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +699 -71
  68. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1102 -578
  69. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +2760 -872
  70. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +689 -152
  71. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1431 -633
  72. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +2485 -512
  73. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +501 -197
  74. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +3642 -928
  75. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +705 -125
  76. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +624 -114
  77. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +405 -153
  78. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1911 -611
  79. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +436 -128
  80. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +2482 -485
  81. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +896 -192
  82. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +2001 -759
  83. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +734 -228
  84. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +2501 -764
  85. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1591 -173
  86. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +883 -122
  87. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +176 -0
  88. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +211 -0
  89. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +211 -0
  90. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +212 -1
  91. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +212 -1
  92. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +203 -9
  93. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +211 -0
  94. package/behaviors/signatures.lolo +325 -655
  95. package/dist/behaviors/exports-reader.js +16092 -9747
  96. package/dist/behaviors/functions/index.d.ts +1052 -136
  97. package/dist/behaviors/functions/index.js +16063 -9745
  98. package/dist/behaviors/index.d.ts +1 -1
  99. package/dist/behaviors/index.js +16093 -9748
  100. package/dist/behaviors/query.js +16092 -9747
  101. package/dist/behaviors-embeddings.hash.json +3 -3
  102. package/dist/behaviors-embeddings.json +45 -25
  103. package/dist/behaviors-registry.json +4650 -535
  104. package/dist/index.d.ts +1 -1
  105. package/dist/index.js +16093 -9748
  106. package/dist/knob-embeddings.hash.json +3 -3
  107. package/dist/knob-embeddings.json +607 -263
  108. package/dist/registry/factory-signatures.json +1 -1
  109. package/package.json +3 -3
@@ -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
  }