@almadar/std 16.174.0 → 16.176.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 (45) hide show
  1. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +4 -9
  2. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +132 -22
  3. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +428 -0
  4. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +520 -0
  5. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +805 -0
  6. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +31 -2
  7. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +186 -0
  8. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +522 -0
  9. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +192 -0
  10. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +111 -2
  11. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +150 -1
  12. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +132 -1
  13. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +48 -1
  14. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +141 -1
  15. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +199 -1
  16. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +4 -39
  17. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1288 -197
  18. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +2512 -0
  19. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +3678 -0
  20. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +6539 -0
  21. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +173 -2
  22. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +986 -0
  23. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +3333 -0
  24. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +716 -0
  25. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +506 -1
  26. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +684 -0
  27. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +634 -0
  28. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +256 -0
  29. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +736 -12
  30. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1061 -33
  31. package/dist/behaviors/exports-reader.js +2448 -2184
  32. package/dist/behaviors/functions/index.d.ts +800 -13
  33. package/dist/behaviors/functions/index.js +2431 -2185
  34. package/dist/behaviors/index.d.ts +1 -1
  35. package/dist/behaviors/index.js +2449 -2185
  36. package/dist/behaviors/query.js +2448 -2184
  37. package/dist/behaviors-embeddings.hash.json +3 -3
  38. package/dist/behaviors-embeddings.json +318 -294
  39. package/dist/behaviors-registry.json +4391 -1298
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +2449 -2185
  42. package/dist/knob-embeddings.hash.json +3 -3
  43. package/dist/knob-embeddings.json +1 -1
  44. package/dist/registry/factory-signatures.json +1 -1
  45. package/package.json +2 -2
@@ -0,0 +1,192 @@
1
+ app ui-algo-graph-canvas "1.0.0"
2
+ "AlgoGraphCanvas — UI factory (1:1 with the @almadar/ui algo-graph-canvas pattern)."
3
+ orbital AlgoGraphCanvasOrbital {
4
+ type AlgoGraphCanvasNodesItem = {
5
+ id : string!
6
+ x : number
7
+ y : number
8
+ label : string
9
+ state : "unvisited" | "frontier" | "current" | "visited" | "goal" | "path"
10
+ color : string
11
+ radius : number
12
+ badge : AlgoGraphCanvasNodesItemBadge
13
+ }
14
+ type AlgoGraphCanvasNodesItemBadge = {
15
+ text : string!
16
+ color : string
17
+ }
18
+ type AlgoGraphCanvasEdgesItem = {
19
+ from : string!
20
+ to : string!
21
+ directed : boolean
22
+ weight : number
23
+ label : string
24
+ state : "default" | "tree" | "relaxed" | "candidate" | "path"
25
+ color : string
26
+ }
27
+ type AlgoGraphCanvasShapesItem = {
28
+ type : "line" | "arrow" | "circle" | "ellipse" | "rect" | "polygon" | "path" | "text" | "axis" | "grid" | "venn-region"!
29
+ id : string
30
+ x : number
31
+ y : number
32
+ x1 : number
33
+ y1 : number
34
+ x2 : number
35
+ y2 : number
36
+ radius : number
37
+ width : number
38
+ height : number
39
+ points : [AlgoGraphCanvasShapesItemPointsItem]
40
+ path : string
41
+ text : string
42
+ label : string
43
+ fontSize : number
44
+ align : "left" | "center" | "right"
45
+ axis : "x" | "y"
46
+ min : number
47
+ max : number
48
+ step : number
49
+ color : string
50
+ fill : string
51
+ lineWidth : number
52
+ opacity : number
53
+ startAngle : number
54
+ endAngle : number
55
+ dash : "dashed" | "dotted"
56
+ inside : [string]
57
+ outside : [string]
58
+ }
59
+ type AlgoGraphCanvasShapesItemPointsItem = {
60
+ x : number!
61
+ y : number!
62
+ }
63
+ type AlgoGraphCanvasError = {
64
+ message : string!
65
+ name : string
66
+ code : string
67
+ stack : string
68
+ }
69
+ type AlgoGraphCanvasSHAPECLICKPayload = {
70
+ id : string
71
+ type : string
72
+ index : number!
73
+ }
74
+ type AlgoGraphCanvasNODECLICKPayload = {
75
+ id : string!
76
+ label : string
77
+ index : number!
78
+ }
79
+
80
+ entity AlgoGraphCanvasItem [runtime] {
81
+ id : string!
82
+ }
83
+
84
+ trait AlgoGraphCanvasRender -> @rebindable AlgoGraphCanvasItem [interaction, instance] {
85
+ initial: idle
86
+
87
+ state idle {
88
+ INIT -> idle
89
+ (render-ui main {
90
+ className: @config.className
91
+ width: @config.width
92
+ height: @config.height
93
+ title: @config.title
94
+ backgroundColor: @config.backgroundColor
95
+ nodes: @config.nodes
96
+ edges: @config.edges
97
+ layout: @config.layout
98
+ root: @config.root
99
+ shapes: @config.shapes
100
+ interactive: @config.interactive
101
+ animate: @config.animate
102
+ onShapeClick: @config.onShapeClick
103
+ onNodeClick: @config.onNodeClick
104
+ isLoading: @config.isLoading
105
+ error: @config.error
106
+ type: algo-graph-canvas
107
+ })
108
+ }
109
+
110
+ emits {
111
+ @config.onShapeClick -> external {
112
+ payload : AlgoGraphCanvasSHAPECLICKPayload
113
+ }
114
+ @description "onShapeClick prop"
115
+ @tier "essential"
116
+ @config.onNodeClick -> external {
117
+ payload : AlgoGraphCanvasNODECLICKPayload
118
+ }
119
+ @description "Fires when a node circle is clicked, alongside `onShapeClick`."
120
+ @tier "essential"
121
+ }
122
+
123
+ config {
124
+ className : string
125
+ @label "Class Name"
126
+ @description "className prop"
127
+ @tier "presentation"
128
+ width : number = 600
129
+ @label "Width"
130
+ @description "width prop"
131
+ @tier "presentation"
132
+ height : number = 400
133
+ @label "Height"
134
+ @description "height prop"
135
+ @tier "presentation"
136
+ title : string
137
+ @label "Title"
138
+ @description "title prop"
139
+ @tier "presentation"
140
+ backgroundColor : string
141
+ @label "Background Color"
142
+ @description "backgroundColor prop"
143
+ @tier "presentation"
144
+ nodes : [AlgoGraphCanvasNodesItem] = []
145
+ @label "Nodes"
146
+ @description "nodes prop"
147
+ @tier "presentation"
148
+ edges : [AlgoGraphCanvasEdgesItem] = []
149
+ @label "Edges"
150
+ @description "edges prop"
151
+ @tier "presentation"
152
+ layout : "manual" | "tree" | "layered" | "circle" = manual
153
+ @label "Layout"
154
+ @description "Deterministic layout to compute node positions; `manual` passes through `x`/`y`."
155
+ @tier "presentation"
156
+ root : string
157
+ @label "Root"
158
+ @description "`tree` layout only: preferred root id. Falls back to the first indegree-0 node."
159
+ @tier "presentation"
160
+ shapes : [AlgoGraphCanvasShapesItem] = []
161
+ @label "Shapes"
162
+ @description "Extra declarative shapes in canvas pixel coordinates."
163
+ @tier "presentation"
164
+ interactive : boolean = false
165
+ @label "Interactive"
166
+ @description "interactive prop"
167
+ @tier "presentation"
168
+ animate : boolean = false
169
+ @label "Animate"
170
+ @description "animate prop"
171
+ @tier "presentation"
172
+ onShapeClick : string = "SHAPE_CLICK"
173
+ @label "On Shape Click"
174
+ @description "onShapeClick prop"
175
+ @tier "presentation"
176
+ onNodeClick : string = "NODE_CLICK"
177
+ @label "On Node Click"
178
+ @description "Fires when a node circle is clicked, alongside `onShapeClick`."
179
+ @tier "presentation"
180
+ isLoading : boolean
181
+ @label "Is Loading"
182
+ @description "isLoading prop"
183
+ @tier "presentation"
184
+ error : AlgoGraphCanvasError
185
+ @label "Error"
186
+ @description "error prop"
187
+ @tier "presentation"
188
+ }
189
+ }
190
+
191
+ page "/algo-graph-canvas" as AlgoGraphCanvasPage -> AlgoGraphCanvasRender
192
+ }
@@ -12,14 +12,63 @@ orbital AlgorithmCanvasOrbital {
12
12
  value : number
13
13
  color : string
14
14
  label : string
15
+ corner : AlgorithmCanvasCellsItemCorner
16
+ }
17
+ type AlgorithmCanvasCellsItemCorner = {
18
+ tl : string
19
+ tr : string
20
+ bl : string
21
+ br : string
15
22
  }
16
23
  type AlgorithmCanvasPointersItem = {
17
24
  index : number!
18
25
  label : string
19
26
  color : string
20
27
  }
28
+ type AlgorithmCanvasRangesItem = {
29
+ from : number!
30
+ to : number!
31
+ color : string
32
+ label : string
33
+ kind : "fill" | "bracket"
34
+ }
35
+ type AlgorithmCanvasSlotsItem = {
36
+ value : string
37
+ state : "empty" | "filled" | "highlight"
38
+ color : string
39
+ }
40
+ type AlgorithmCanvasFramesItem = {
41
+ label : string!
42
+ detail : string
43
+ state : "active" | "returning" | "done"
44
+ color : string
45
+ }
46
+ type AlgorithmCanvasBucketsItem = {
47
+ index : number!
48
+ entries : [AlgorithmCanvasBucketsItemEntriesItem]!
49
+ }
50
+ type AlgorithmCanvasBucketsItemEntriesItem = {
51
+ label : string!
52
+ state : "default" | "highlight" | "probing"
53
+ color : string
54
+ }
55
+ type AlgorithmCanvasAuxBarsItem = {
56
+ value : number!
57
+ color : string
58
+ label : string
59
+ }
60
+ type AlgorithmCanvasRowLabelsItem = {
61
+ index : number!
62
+ text : string!
63
+ color : string
64
+ }
65
+ type AlgorithmCanvasColLabelsItem = {
66
+ index : number!
67
+ text : string!
68
+ color : string
69
+ }
21
70
  type AlgorithmCanvasShapesItem = {
22
- type : "line" | "arrow" | "circle" | "rect" | "polygon" | "path" | "text" | "axis" | "grid"!
71
+ type : "line" | "arrow" | "circle" | "ellipse" | "rect" | "polygon" | "path" | "text" | "axis" | "grid" | "venn-region"!
23
72
  id : string
24
73
  x : number
25
74
  y : number
@@ -44,6 +93,11 @@ orbital AlgorithmCanvasOrbital {
44
93
  fill : string
45
94
  lineWidth : number
46
95
  opacity : number
96
+ startAngle : number
97
+ endAngle : number
98
+ dash : "dashed" | "dotted"
99
+ inside : [string]
100
+ outside : [string]
47
101
  }
48
102
  type AlgorithmCanvasShapesItemPointsItem = {
49
103
  x : number!
@@ -79,6 +133,14 @@ orbital AlgorithmCanvasOrbital {
79
133
  bars: @config.bars
80
134
  cells: @config.cells
81
135
  pointers: @config.pointers
136
+ ranges: @config.ranges
137
+ slots: @config.slots
138
+ slotOrientation: @config.slotOrientation
139
+ frames: @config.frames
140
+ buckets: @config.buckets
141
+ auxBars: @config.auxBars
142
+ rowLabels: @config.rowLabels
143
+ colLabels: @config.colLabels
82
144
  shapes: @config.shapes
83
145
  interactive: @config.interactive
84
146
  animate: @config.animate
@@ -97,6 +159,14 @@ orbital AlgorithmCanvasOrbital {
97
159
  bars: @payload.bars
98
160
  cells: @payload.cells
99
161
  pointers: @payload.pointers
162
+ ranges: @payload.ranges
163
+ slots: @payload.slots
164
+ slotOrientation: @config.slotOrientation
165
+ frames: @payload.frames
166
+ buckets: @payload.buckets
167
+ auxBars: @payload.auxBars
168
+ rowLabels: @payload.rowLabels
169
+ colLabels: @payload.colLabels
100
170
  shapes: @payload.shapes
101
171
  interactive: @config.interactive
102
172
  animate: @config.animate
@@ -120,6 +190,13 @@ orbital AlgorithmCanvasOrbital {
120
190
  bars : [AlgorithmCanvasBarsItem]
121
191
  cells : [AlgorithmCanvasCellsItem]
122
192
  pointers : [AlgorithmCanvasPointersItem]
193
+ ranges : [AlgorithmCanvasRangesItem]
194
+ slots : [AlgorithmCanvasSlotsItem]
195
+ frames : [AlgorithmCanvasFramesItem]
196
+ buckets : [AlgorithmCanvasBucketsItem]
197
+ auxBars : [AlgorithmCanvasAuxBarsItem]
198
+ rowLabels : [AlgorithmCanvasRowLabelsItem]
199
+ colLabels : [AlgorithmCanvasColLabelsItem]
123
200
  shapes : [AlgorithmCanvasShapesItem]
124
201
  }
125
202
  @description "Live scene update; payload carries the current drawable state."
@@ -158,7 +235,39 @@ orbital AlgorithmCanvasOrbital {
158
235
  @tier "presentation"
159
236
  pointers : [AlgorithmCanvasPointersItem] = []
160
237
  @label "Pointers"
161
- @description "Index cursors (i/j/lo/hi/mid); drawn as markers beneath the referenced bar/cell column."
238
+ @description "Index cursors (i/j/lo/hi/mid); drawn as markers beneath the referenced bar/slot column."
239
+ @tier "presentation"
240
+ ranges : [AlgorithmCanvasRangesItem] = []
241
+ @label "Ranges"
242
+ @description "Highlighted index ranges over the bars panel (translucent fill bands or labeled brackets)."
243
+ @tier "presentation"
244
+ slots : [AlgorithmCanvasSlotsItem] = []
245
+ @label "Slots"
246
+ @description "Discrete value slots (registers/variables); laid out in a row or a vertical stack."
247
+ @tier "presentation"
248
+ slotOrientation : "horizontal" | "vertical" = horizontal
249
+ @label "Slot Orientation"
250
+ @description "Slot stack direction; horizontal lays slots left-to-right, vertical stacks bottom-up."
251
+ @tier "presentation"
252
+ frames : [AlgorithmCanvasFramesItem] = []
253
+ @label "Frames"
254
+ @description "Recursion/call-stack frames; laid out bottom-up like a real call stack."
255
+ @tier "presentation"
256
+ buckets : [AlgorithmCanvasBucketsItem] = []
257
+ @label "Buckets"
258
+ @description "Hash-table buckets; each row is an index chip plus its chained entries."
259
+ @tier "presentation"
260
+ auxBars : [AlgorithmCanvasAuxBarsItem] = []
261
+ @label "Aux Bars"
262
+ @description "Secondary bar strip inside the bars panel (e.g. a running total beside the primary values)."
263
+ @tier "presentation"
264
+ rowLabels : [AlgorithmCanvasRowLabelsItem] = []
265
+ @label "Row Labels"
266
+ @description "Row-header labels drawn to the left of the cells grid."
267
+ @tier "presentation"
268
+ colLabels : [AlgorithmCanvasColLabelsItem] = []
269
+ @label "Col Labels"
270
+ @description "Column-header labels drawn above the cells grid."
162
271
  @tier "presentation"
163
272
  shapes : [AlgorithmCanvasShapesItem] = []
164
273
  @label "Shapes"
@@ -12,15 +12,76 @@ orbital BiologyCanvasOrbital {
12
12
  kind : "cell" | "organelle" | "molecule" | "organism"
13
13
  shape : "box" | "sphere" | "capsule" | "cylinder" | "cone" | "torus" | "plane" | "circle" | "polyhedron"
14
14
  opacity : number
15
+ state : "default" | "highlight" | "muted"
15
16
  }
16
17
  type BiologyCanvasEdgesItem = {
17
18
  from : string!
18
19
  to : string!
19
20
  color : string
20
21
  label : string
22
+ directed : boolean
23
+ }
24
+ type BiologyCanvasCompartmentsItem = {
25
+ x : number!
26
+ y : number!
27
+ width : number!
28
+ height : number!
29
+ label : string
30
+ color : string
31
+ fill : string
32
+ dash : "dashed" | "dotted"
33
+ lineWidth : number
34
+ }
35
+ type BiologyCanvasBandsItem = {
36
+ label : string
37
+ color : string
38
+ }
39
+ type BiologyCanvasStagesItem = {
40
+ label : string!
41
+ state : "pending" | "active" | "done"
42
+ color : string
43
+ }
44
+ type BiologyCanvasHelix = {
45
+ x : number
46
+ y : number
47
+ width : number
48
+ height : number
49
+ rungs : [BiologyCanvasHelixRungsItem]!
50
+ fork : number
51
+ colorA : string
52
+ colorB : string
53
+ rungColor : string
54
+ }
55
+ type BiologyCanvasHelixRungsItem = {
56
+ a : string
57
+ b : string
58
+ state : "paired" | "open" | "new"
59
+ color : string
60
+ }
61
+ type BiologyCanvasHelix3d = {
62
+ count : number
63
+ rungs : [BiologyCanvasHelix3dRungsItem]
64
+ radius : number
65
+ rise : number
66
+ twistDeg : number
67
+ strandAColor : string
68
+ strandBColor : string
69
+ backboneRadius : number
70
+ rungRadius : number
71
+ x : number
72
+ y : number
73
+ z : number
74
+ unwoundCount : number
75
+ unwindSpread : number
76
+ }
77
+ type BiologyCanvasHelix3dRungsItem = {
78
+ id : string
79
+ color : string
80
+ radius : number
81
+ label : string
21
82
  }
22
83
  type BiologyCanvasShapesItem = {
23
- type : "line" | "arrow" | "circle" | "rect" | "polygon" | "path" | "text" | "axis" | "grid"!
84
+ type : "line" | "arrow" | "circle" | "ellipse" | "rect" | "polygon" | "path" | "text" | "axis" | "grid" | "venn-region"!
24
85
  id : string
25
86
  x : number
26
87
  y : number
@@ -45,11 +106,42 @@ orbital BiologyCanvasOrbital {
45
106
  fill : string
46
107
  lineWidth : number
47
108
  opacity : number
109
+ startAngle : number
110
+ endAngle : number
111
+ dash : "dashed" | "dotted"
112
+ inside : [string]
113
+ outside : [string]
48
114
  }
49
115
  type BiologyCanvasShapesItemPointsItem = {
50
116
  x : number!
51
117
  y : number!
52
118
  }
119
+ type BiologyCanvasReadoutsItem = {
120
+ label : string!
121
+ value : string!
122
+ color : string
123
+ }
124
+ type BiologyCanvasTracesItem = {
125
+ x : number
126
+ y : number
127
+ width : number
128
+ height : number
129
+ series : [BiologyCanvasTracesItemSeriesItem]!
130
+ xLabel : string
131
+ yLabel : string
132
+ frameColor : string
133
+ backgroundColor : string
134
+ backgroundOpacity : number
135
+ }
136
+ type BiologyCanvasTracesItemSeriesItem = {
137
+ samples : [BiologyCanvasTracesItemSeriesItemSamplesItem]!
138
+ color : string
139
+ label : string
140
+ }
141
+ type BiologyCanvasTracesItemSeriesItemSamplesItem = {
142
+ x : number!
143
+ y : number!
144
+ }
53
145
  type BiologyCanvasError = {
54
146
  message : string!
55
147
  name : string
@@ -83,7 +175,15 @@ orbital BiologyCanvasOrbital {
83
175
  post: @config.post
84
176
  nodes: @config.nodes
85
177
  edges: @config.edges
178
+ compartments: @config.compartments
179
+ bands: @config.bands
180
+ stages: @config.stages
181
+ stageStyle: @config.stageStyle
182
+ helix: @config.helix
183
+ helix3d: @config.helix3d
86
184
  shapes: @config.shapes
185
+ readouts: @config.readouts
186
+ traces: @config.traces
87
187
  showGrid: @config.showGrid
88
188
  shadows: @config.shadows
89
189
  interactive: @config.interactive
@@ -106,7 +206,15 @@ orbital BiologyCanvasOrbital {
106
206
  post: @config.post
107
207
  nodes: @payload.nodes
108
208
  edges: @payload.edges
209
+ compartments: @payload.compartments
210
+ bands: @payload.bands
211
+ stages: @payload.stages
212
+ stageStyle: @config.stageStyle
213
+ helix: @config.helix
214
+ helix3d: @config.helix3d
109
215
  shapes: @payload.shapes
216
+ readouts: @payload.readouts
217
+ traces: @payload.traces
110
218
  showGrid: @config.showGrid
111
219
  shadows: @config.shadows
112
220
  interactive: @config.interactive
@@ -130,7 +238,12 @@ orbital BiologyCanvasOrbital {
130
238
  UPDATE {
131
239
  nodes : [BiologyCanvasNodesItem]
132
240
  edges : [BiologyCanvasEdgesItem]
241
+ compartments : [BiologyCanvasCompartmentsItem]
242
+ bands : [BiologyCanvasBandsItem]
243
+ stages : [BiologyCanvasStagesItem]
133
244
  shapes : [BiologyCanvasShapesItem]
245
+ readouts : [BiologyCanvasReadoutsItem]
246
+ traces : [BiologyCanvasTracesItem]
134
247
  }
135
248
  @description "Live scene update; payload carries the current drawable state."
136
249
  @synonyms "tick, redraw, animate, frame"
@@ -182,10 +295,46 @@ orbital BiologyCanvasOrbital {
182
295
  @label "Edges"
183
296
  @description "edges prop"
184
297
  @tier "presentation"
298
+ compartments : [BiologyCanvasCompartmentsItem] = []
299
+ @label "Compartments"
300
+ @description "Organelle/membrane/cell-boundary ellipses (2D only)."
301
+ @synonyms "membrane, organelle region, cell boundary"
302
+ @tier "presentation"
303
+ bands : [BiologyCanvasBandsItem] = []
304
+ @label "Bands"
305
+ @description "Full-width horizontal background stripes, drawn first (2D only)."
306
+ @synonyms "trophic levels, zones, layers"
307
+ @tier "presentation"
308
+ stages : [BiologyCanvasStagesItem] = []
309
+ @label "Stages"
310
+ @description "Phase/step chips (2D only)."
311
+ @synonyms "phases, timeline, cycle"
312
+ @tier "presentation"
313
+ stageStyle : "timeline" | "ring" = timeline
314
+ @label "Stage Style"
315
+ @description "Layout for `stages`: a bottom timeline strip (default) or a radial ring."
316
+ @tier "presentation"
317
+ helix : BiologyCanvasHelix
318
+ @label "Helix"
319
+ @description "A DNA double-helix ladder panel (2D only)."
320
+ @synonyms "DNA ladder, replication fork, base pairs"
321
+ @tier "presentation"
322
+ helix3d : BiologyCanvasHelix3d
323
+ @label "Helix3d"
324
+ @description "A 3D DNA double-helix ladder. 3D only."
325
+ @tier "presentation"
185
326
  shapes : [BiologyCanvasShapesItem] = []
186
327
  @label "Shapes"
187
328
  @description "Extra declarative shapes in canvas pixel coordinates (2D mode only — ignored in 3D)."
188
329
  @tier "presentation"
330
+ readouts : [BiologyCanvasReadoutsItem] = []
331
+ @label "Readouts"
332
+ @description "Top-right status chip row, forwarded to LearningCanvas verbatim."
333
+ @tier "presentation"
334
+ traces : [BiologyCanvasTracesItem] = []
335
+ @label "Traces"
336
+ @description "Inset sparkline panels, forwarded to LearningCanvas verbatim."
337
+ @tier "presentation"
189
338
  showGrid : boolean
190
339
  @label "Show Grid"
191
340
  @description "3D only: show the ground grid (default off)."