@teachinglab/omd 0.6.1 → 0.6.3

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 (198) hide show
  1. package/README.md +257 -251
  2. package/README.old.md +137 -137
  3. package/canvas/core/canvasConfig.js +202 -202
  4. package/canvas/drawing/segment.js +167 -167
  5. package/canvas/drawing/stroke.js +385 -385
  6. package/canvas/events/eventManager.js +444 -444
  7. package/canvas/events/pointerEventHandler.js +262 -262
  8. package/canvas/index.js +48 -48
  9. package/canvas/tools/PointerTool.js +71 -71
  10. package/canvas/tools/tool.js +222 -222
  11. package/canvas/utils/boundingBox.js +377 -377
  12. package/canvas/utils/mathUtils.js +258 -258
  13. package/docs/api/configuration-options.md +198 -198
  14. package/docs/api/eventManager.md +82 -82
  15. package/docs/api/focusFrameManager.md +144 -144
  16. package/docs/api/index.md +105 -105
  17. package/docs/api/main.md +62 -62
  18. package/docs/api/omdBinaryExpressionNode.md +86 -86
  19. package/docs/api/omdCanvas.md +83 -83
  20. package/docs/api/omdConfigManager.md +112 -112
  21. package/docs/api/omdConstantNode.md +52 -52
  22. package/docs/api/omdDisplay.md +87 -87
  23. package/docs/api/omdEquationNode.md +174 -174
  24. package/docs/api/omdEquationSequenceNode.md +258 -258
  25. package/docs/api/omdEquationStack.md +192 -192
  26. package/docs/api/omdFunctionNode.md +82 -82
  27. package/docs/api/omdGroupNode.md +78 -78
  28. package/docs/api/omdHelpers.md +87 -87
  29. package/docs/api/omdLeafNode.md +85 -85
  30. package/docs/api/omdNode.md +201 -201
  31. package/docs/api/omdOperationDisplayNode.md +117 -117
  32. package/docs/api/omdOperatorNode.md +91 -91
  33. package/docs/api/omdParenthesisNode.md +133 -133
  34. package/docs/api/omdPopup.md +191 -191
  35. package/docs/api/omdPowerNode.md +131 -131
  36. package/docs/api/omdRationalNode.md +144 -144
  37. package/docs/api/omdSequenceNode.md +128 -128
  38. package/docs/api/omdSimplification.md +78 -78
  39. package/docs/api/omdSqrtNode.md +144 -144
  40. package/docs/api/omdStepVisualizer.md +146 -146
  41. package/docs/api/omdStepVisualizerHighlighting.md +65 -65
  42. package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  43. package/docs/api/omdStepVisualizerLayout.md +70 -70
  44. package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
  45. package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
  46. package/docs/api/omdToolbar.md +130 -130
  47. package/docs/api/omdTranscriptionService.md +95 -95
  48. package/docs/api/omdTreeDiff.md +169 -169
  49. package/docs/api/omdUnaryExpressionNode.md +137 -137
  50. package/docs/api/omdUtilities.md +82 -82
  51. package/docs/api/omdVariableNode.md +123 -123
  52. package/docs/api/selectTool.md +74 -74
  53. package/docs/api/simplificationEngine.md +97 -97
  54. package/docs/api/simplificationRules.md +76 -76
  55. package/docs/api/simplificationUtils.md +64 -64
  56. package/docs/api/transcribe.md +43 -43
  57. package/docs/api-reference.md +85 -85
  58. package/docs/index.html +453 -453
  59. package/docs/index.md +38 -38
  60. package/docs/omd-objects.md +258 -258
  61. package/index.js +79 -79
  62. package/jsvg/index.js +3 -0
  63. package/jsvg/jsvg.js +898 -898
  64. package/jsvg/jsvgComponents.js +357 -358
  65. package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
  66. package/npm-docs/README.md +251 -251
  67. package/npm-docs/api/api-reference.md +85 -85
  68. package/npm-docs/api/configuration-options.md +198 -198
  69. package/npm-docs/api/eventManager.md +82 -82
  70. package/npm-docs/api/expression-nodes.md +561 -561
  71. package/npm-docs/api/focusFrameManager.md +144 -144
  72. package/npm-docs/api/index.md +105 -105
  73. package/npm-docs/api/main.md +62 -62
  74. package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
  75. package/npm-docs/api/omdCanvas.md +83 -83
  76. package/npm-docs/api/omdConfigManager.md +112 -112
  77. package/npm-docs/api/omdConstantNode.md +52 -52
  78. package/npm-docs/api/omdDisplay.md +87 -87
  79. package/npm-docs/api/omdEquationNode.md +174 -174
  80. package/npm-docs/api/omdEquationSequenceNode.md +258 -258
  81. package/npm-docs/api/omdEquationStack.md +192 -192
  82. package/npm-docs/api/omdFunctionNode.md +82 -82
  83. package/npm-docs/api/omdGroupNode.md +78 -78
  84. package/npm-docs/api/omdHelpers.md +87 -87
  85. package/npm-docs/api/omdLeafNode.md +85 -85
  86. package/npm-docs/api/omdNode.md +201 -201
  87. package/npm-docs/api/omdOperationDisplayNode.md +117 -117
  88. package/npm-docs/api/omdOperatorNode.md +91 -91
  89. package/npm-docs/api/omdParenthesisNode.md +133 -133
  90. package/npm-docs/api/omdPopup.md +191 -191
  91. package/npm-docs/api/omdPowerNode.md +131 -131
  92. package/npm-docs/api/omdRationalNode.md +144 -144
  93. package/npm-docs/api/omdSequenceNode.md +128 -128
  94. package/npm-docs/api/omdSimplification.md +78 -78
  95. package/npm-docs/api/omdSqrtNode.md +144 -144
  96. package/npm-docs/api/omdStepVisualizer.md +146 -146
  97. package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
  98. package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  99. package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
  100. package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
  101. package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
  102. package/npm-docs/api/omdToolbar.md +130 -130
  103. package/npm-docs/api/omdTranscriptionService.md +95 -95
  104. package/npm-docs/api/omdTreeDiff.md +169 -169
  105. package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
  106. package/npm-docs/api/omdUtilities.md +82 -82
  107. package/npm-docs/api/omdVariableNode.md +123 -123
  108. package/npm-docs/api/selectTool.md +74 -74
  109. package/npm-docs/api/simplificationEngine.md +97 -97
  110. package/npm-docs/api/simplificationRules.md +76 -76
  111. package/npm-docs/api/simplificationUtils.md +64 -64
  112. package/npm-docs/api/transcribe.md +43 -43
  113. package/npm-docs/guides/equations.md +854 -854
  114. package/npm-docs/guides/factory-functions.md +354 -354
  115. package/npm-docs/guides/getting-started.md +318 -318
  116. package/npm-docs/guides/quick-examples.md +525 -525
  117. package/npm-docs/guides/visualizations.md +682 -682
  118. package/npm-docs/index.html +12 -0
  119. package/npm-docs/json-schemas.md +826 -826
  120. package/omd/config/omdConfigManager.js +279 -267
  121. package/omd/core/index.js +158 -158
  122. package/omd/core/omdEquationStack.js +606 -547
  123. package/omd/core/omdUtilities.js +113 -113
  124. package/omd/display/omdDisplay.js +1045 -963
  125. package/omd/display/omdToolbar.js +501 -501
  126. package/omd/nodes/omdBinaryExpressionNode.js +459 -459
  127. package/omd/nodes/omdConstantNode.js +141 -141
  128. package/omd/nodes/omdEquationNode.js +1327 -1327
  129. package/omd/nodes/omdFunctionNode.js +351 -351
  130. package/omd/nodes/omdGroupNode.js +67 -67
  131. package/omd/nodes/omdLeafNode.js +76 -76
  132. package/omd/nodes/omdNode.js +556 -556
  133. package/omd/nodes/omdOperationDisplayNode.js +321 -321
  134. package/omd/nodes/omdOperatorNode.js +108 -108
  135. package/omd/nodes/omdParenthesisNode.js +292 -292
  136. package/omd/nodes/omdPowerNode.js +235 -235
  137. package/omd/nodes/omdRationalNode.js +295 -295
  138. package/omd/nodes/omdSqrtNode.js +307 -307
  139. package/omd/nodes/omdUnaryExpressionNode.js +227 -227
  140. package/omd/nodes/omdVariableNode.js +122 -122
  141. package/omd/simplification/omdSimplification.js +140 -140
  142. package/omd/simplification/omdSimplificationEngine.js +887 -887
  143. package/omd/simplification/package.json +5 -5
  144. package/omd/simplification/rules/binaryRules.js +1037 -1037
  145. package/omd/simplification/rules/functionRules.js +111 -111
  146. package/omd/simplification/rules/index.js +48 -48
  147. package/omd/simplification/rules/parenthesisRules.js +19 -19
  148. package/omd/simplification/rules/powerRules.js +143 -143
  149. package/omd/simplification/rules/rationalRules.js +725 -725
  150. package/omd/simplification/rules/sqrtRules.js +48 -48
  151. package/omd/simplification/rules/unaryRules.js +37 -37
  152. package/omd/simplification/simplificationRules.js +31 -31
  153. package/omd/simplification/simplificationUtils.js +1055 -1055
  154. package/omd/step-visualizer/omdStepVisualizer.js +947 -947
  155. package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
  156. package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
  157. package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
  158. package/omd/utils/aiNextEquationStep.js +106 -106
  159. package/omd/utils/omdNodeOverlay.js +638 -638
  160. package/omd/utils/omdPopup.js +1203 -1203
  161. package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
  162. package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
  163. package/omd/utils/omdTranscriptionService.js +123 -123
  164. package/omd/utils/omdTreeDiff.js +733 -733
  165. package/package.json +59 -57
  166. package/readme.html +184 -120
  167. package/src/index.js +74 -74
  168. package/src/json-schemas.md +576 -576
  169. package/src/omd-json-samples.js +147 -147
  170. package/src/omdApp.js +391 -391
  171. package/src/omdAppCanvas.js +335 -335
  172. package/src/omdBalanceHanger.js +199 -199
  173. package/src/omdColor.js +13 -13
  174. package/src/omdCoordinatePlane.js +541 -541
  175. package/src/omdExpression.js +115 -115
  176. package/src/omdFactory.js +150 -150
  177. package/src/omdFunction.js +114 -114
  178. package/src/omdMetaExpression.js +290 -290
  179. package/src/omdNaturalExpression.js +563 -563
  180. package/src/omdNode.js +383 -383
  181. package/src/omdNumber.js +52 -52
  182. package/src/omdNumberLine.js +114 -112
  183. package/src/omdNumberTile.js +118 -118
  184. package/src/omdOperator.js +72 -72
  185. package/src/omdPowerExpression.js +91 -91
  186. package/src/omdProblem.js +259 -259
  187. package/src/omdRatioChart.js +251 -251
  188. package/src/omdRationalExpression.js +114 -114
  189. package/src/omdSampleData.js +215 -215
  190. package/src/omdShapes.js +512 -512
  191. package/src/omdSpinner.js +151 -151
  192. package/src/omdString.js +49 -49
  193. package/src/omdTable.js +498 -498
  194. package/src/omdTapeDiagram.js +244 -244
  195. package/src/omdTerm.js +91 -91
  196. package/src/omdTileEquation.js +349 -349
  197. package/src/omdUtils.js +84 -84
  198. package/src/omdVariable.js +51 -51
@@ -1,193 +1,193 @@
1
- # omdEquationStack
2
-
3
- A renderable component that bundles a sequence of mathematical equations with optional UI controls (toolbar). It extends `jsvgGroup` and acts as a node that can be rendered by an `omdDisplay`.
4
-
5
- ## Class Definition
6
-
7
- ```js
8
- import { omdEquationStack } from './omd/core/omdEquationStack.js';
9
- ```
10
-
11
- ## Constructor
12
-
13
- ### `new omdEquationStack(steps, options)`
14
-
15
- Creates a new `omdEquationStack` instance.
16
-
17
- - **`steps`** (`Array<omdNode>`, optional): An initial array of equation steps. Default: empty array.
18
- - **`options`** (`object`, optional): Configuration options:
19
- - **`toolbar`** (`boolean` | `object`): If `true`, creates a toolbar for equation operations. Can also be an object for more granular control:
20
- - `enabled` (`boolean`): Whether the toolbar is enabled. Default: `false`.
21
- - `position` (`string`): Where the toolbar should be positioned (`'bottom'`, `'overlay-bottom'`). Default: `'bottom'`.
22
- - `showUndoButton` (`boolean`): Whether to show an undo button. Default: `false`.
23
- - `onUndo` (`function`): Custom undo handler. If not provided, it attempts to call `window.onOMDToolbarUndo`.
24
- - `overlayPadding` (`number`): Padding from the bottom edge when `position` is `'overlay-bottom'`. Default: `34`.
25
- - **`stepVisualizer`** (`boolean`): If `true`, the underlying sequence will be an `omdStepVisualizer` instead of a plain `omdEquationSequenceNode`. Default: `false`.
26
- - **`styling`** (`object`): Styling options for the equation stack:
27
- - `equationBackground` (`object`): Default background style for equation steps (e.g., `{ backgroundColor: '#f0f0f0', cornerRadius: 8, pill: true }`).
28
-
29
- ## Public Properties
30
-
31
- - **`sequence`** (`omdEquationSequenceNode` | `omdStepVisualizer`): The underlying sequence component that manages the equation steps.
32
- - **`toolbar`** (`omdToolbar` | `undefined`): The toolbar component instance, if enabled.
33
- - **`layoutGroup`** (`jsvgLayoutGroup`): The internal layout container that arranges the sequence and toolbar vertically.
34
- - **`options`** (`object`): The merged configuration options passed to the constructor.
35
- - **`overlayPadding`** (`number`): The calculated padding for the toolbar when it's in an overlay position.
36
-
37
- ## Public Methods
38
-
39
- ### `updateLayout()`
40
-
41
- Updates the layout and positioning of internal components. This method ensures the sequence and toolbar are correctly arranged and that the toolbar is horizontally centered if it's in-flow.
42
-
43
- ### `getSequence()`
44
-
45
- Returns the underlying sequence instance (either `omdEquationSequenceNode` or `omdStepVisualizer`).
46
-
47
- - **Returns**: `omdEquationSequenceNode` | `omdStepVisualizer`.
48
-
49
- ### `getToolbar()`
50
-
51
- Returns the toolbar instance, if one was created during construction.
52
-
53
- - **Returns**: `omdToolbar` | `undefined`.
54
-
55
- ### `getOverlayPadding()`
56
-
57
- Returns the padding value used for positioning the toolbar when it's in an overlay mode.
58
-
59
- - **Returns**: `number`.
60
-
61
- ### `getToolbarVisualHeight()`
62
-
63
- Returns the unscaled visual height of the toolbar's background element, if the toolbar is present.
64
-
65
- - **Returns**: `number`.
66
-
67
- ### `isToolbarOverlay()`
68
-
69
- Checks if the toolbar is configured to be overlaid at the bottom of the container.
70
-
71
- - **Returns**: `boolean`.
72
-
73
- ### `positionToolbarOverlay(containerWidth, containerHeight, padding)`
74
-
75
- Positions the toolbar overlay at the bottom center of the container. This method is typically called by the `omdDisplay` to ensure the toolbar remains visible and correctly placed even when the main content scales.
76
-
77
- - **`containerWidth`** (`number`): The width of the parent container.
78
- - **`containerHeight`** (`number`): The height of the parent container.
79
- - **`padding`** (`number`, optional): Padding from the bottom edge. Default: `16`.
80
-
81
- ### `undoLastOperation()`
82
-
83
- Removes the last equation step and any preceding operation display node from the sequence. This method also triggers a re-layout and updates any associated step visualizer.
84
-
85
- - **Returns**: `boolean` - `true` if an operation was successfully undone, `false` otherwise.
86
-
87
- ## Usage
88
-
89
- The `omdEquationStack` component is a complete equation solving interface that combines an equation sequence with an optional toolbar. It automatically handles layout and positioning.
90
-
91
- ```javascript
92
- import { omdDisplay } from 'omd';
93
- import { omdEquationStack } from 'omd';
94
- import { omdEquationNode } from 'omd';
95
-
96
- // Create display
97
- const container = document.getElementById('math-display');
98
- const display = new omdDisplay(container);
99
-
100
- // Create equation steps
101
- const steps = [
102
- omdEquationNode.fromString('2x + 3 = 11'),
103
- omdEquationNode.fromString('2x = 8'),
104
- omdEquationNode.fromString('x = 4')
105
- ];
106
-
107
- // Basic equation stack with toolbar
108
- const stack = new omdEquationStack(steps, {
109
- toolbar: true
110
- });
111
-
112
- // Render the stack
113
- display.render(stack);
114
-
115
- // Alternative: Create with step visualizer and custom toolbar options
116
- const stackWithVisualizer = new omdEquationStack(steps, {
117
- toolbar: {
118
- enabled: true,
119
- showUndoButton: true,
120
- position: 'overlay-bottom'
121
- },
122
- stepVisualizer: true,
123
- styling: {
124
- equationBackground: {
125
- backgroundColor: '#e0f7fa',
126
- cornerRadius: 10,
127
- pill: true
128
- }
129
- }
130
- });
131
-
132
- display.render(stackWithVisualizer);
133
- ```
134
-
135
- ## Integration
136
-
137
- The equation stack integrates seamlessly with the step visualizer:
138
-
139
- ```javascript
140
- import { omdEquationStack } from 'omd';
141
- import { omdEquationNode } from 'omd';
142
- import { omdDisplay } from 'omd';
143
-
144
- // Create steps for a more complex equation
145
- const steps = [
146
- omdEquationNode.fromString('x/2 + 3 = 7'),
147
- omdEquationNode.fromString('x/2 = 4'),
148
- omdEquationNode.fromString('x = 8')
149
- ];
150
-
151
- // Enable step visualizer with highlighting
152
- const stack = new omdEquationStack(steps, {
153
- toolbar: true,
154
- stepVisualizer: true
155
- });
156
-
157
- // Render in display
158
- const container = document.getElementById('equation-display');
159
- const display = new omdDisplay(container);
160
- display.render(stack);
161
-
162
- // Access the visualizer for programmatic control
163
- const visualizer = stack.getSequence();
164
- // visualizer.nextStep(); // Progress through solution steps if interactive
165
- ```
166
-
167
- ## Layout Behavior
168
-
169
- The equation stack automatically manages its internal layout:
170
- - The sequence is positioned at the top
171
- - The toolbar (if present) is centered below the sequence
172
- - Layout updates automatically when content changes
173
-
174
- ```javascript
175
- // Create a stack and let it handle layout automatically
176
- const stack = new omdEquationStack(steps, { toolbar: true });
177
-
178
- // Manual layout update (rarely needed)
179
- stack.updateLayout();
180
-
181
- // Access components
182
- const sequence = stack.getSequence();
183
- const toolbar = stack.getToolbar();
184
- ```
185
-
186
- ---
187
-
188
- ### See Also
189
-
190
- - [`omdEquationSequenceNode`](./omdEquationSequenceNode.md)
191
- - [`omdStepVisualizer`](./omdStepVisualizer.md)
192
- - [`omdToolbar`](./omdToolbar.md)
1
+ # omdEquationStack
2
+
3
+ A renderable component that bundles a sequence of mathematical equations with optional UI controls (toolbar). It extends `jsvgGroup` and acts as a node that can be rendered by an `omdDisplay`.
4
+
5
+ ## Class Definition
6
+
7
+ ```js
8
+ import { omdEquationStack } from './omd/core/omdEquationStack.js';
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdEquationStack(steps, options)`
14
+
15
+ Creates a new `omdEquationStack` instance.
16
+
17
+ - **`steps`** (`Array<omdNode>`, optional): An initial array of equation steps. Default: empty array.
18
+ - **`options`** (`object`, optional): Configuration options:
19
+ - **`toolbar`** (`boolean` | `object`): If `true`, creates a toolbar for equation operations. Can also be an object for more granular control:
20
+ - `enabled` (`boolean`): Whether the toolbar is enabled. Default: `false`.
21
+ - `position` (`string`): Where the toolbar should be positioned (`'bottom'`, `'overlay-bottom'`). Default: `'bottom'`.
22
+ - `showUndoButton` (`boolean`): Whether to show an undo button. Default: `false`.
23
+ - `onUndo` (`function`): Custom undo handler. If not provided, it attempts to call `window.onOMDToolbarUndo`.
24
+ - `overlayPadding` (`number`): Padding from the bottom edge when `position` is `'overlay-bottom'`. Default: `34`.
25
+ - **`stepVisualizer`** (`boolean`): If `true`, the underlying sequence will be an `omdStepVisualizer` instead of a plain `omdEquationSequenceNode`. Default: `false`.
26
+ - **`styling`** (`object`): Styling options for the equation stack:
27
+ - `equationBackground` (`object`): Default background style for equation steps (e.g., `{ backgroundColor: '#f0f0f0', cornerRadius: 8, pill: true }`).
28
+
29
+ ## Public Properties
30
+
31
+ - **`sequence`** (`omdEquationSequenceNode` | `omdStepVisualizer`): The underlying sequence component that manages the equation steps.
32
+ - **`toolbar`** (`omdToolbar` | `undefined`): The toolbar component instance, if enabled.
33
+ - **`layoutGroup`** (`jsvgLayoutGroup`): The internal layout container that arranges the sequence and toolbar vertically.
34
+ - **`options`** (`object`): The merged configuration options passed to the constructor.
35
+ - **`overlayPadding`** (`number`): The calculated padding for the toolbar when it's in an overlay position.
36
+
37
+ ## Public Methods
38
+
39
+ ### `updateLayout()`
40
+
41
+ Updates the layout and positioning of internal components. This method ensures the sequence and toolbar are correctly arranged and that the toolbar is horizontally centered if it's in-flow.
42
+
43
+ ### `getSequence()`
44
+
45
+ Returns the underlying sequence instance (either `omdEquationSequenceNode` or `omdStepVisualizer`).
46
+
47
+ - **Returns**: `omdEquationSequenceNode` | `omdStepVisualizer`.
48
+
49
+ ### `getToolbar()`
50
+
51
+ Returns the toolbar instance, if one was created during construction.
52
+
53
+ - **Returns**: `omdToolbar` | `undefined`.
54
+
55
+ ### `getOverlayPadding()`
56
+
57
+ Returns the padding value used for positioning the toolbar when it's in an overlay mode.
58
+
59
+ - **Returns**: `number`.
60
+
61
+ ### `getToolbarVisualHeight()`
62
+
63
+ Returns the unscaled visual height of the toolbar's background element, if the toolbar is present.
64
+
65
+ - **Returns**: `number`.
66
+
67
+ ### `isToolbarOverlay()`
68
+
69
+ Checks if the toolbar is configured to be overlaid at the bottom of the container.
70
+
71
+ - **Returns**: `boolean`.
72
+
73
+ ### `positionToolbarOverlay(containerWidth, containerHeight, padding)`
74
+
75
+ Positions the toolbar overlay at the bottom center of the container. This method is typically called by the `omdDisplay` to ensure the toolbar remains visible and correctly placed even when the main content scales.
76
+
77
+ - **`containerWidth`** (`number`): The width of the parent container.
78
+ - **`containerHeight`** (`number`): The height of the parent container.
79
+ - **`padding`** (`number`, optional): Padding from the bottom edge. Default: `16`.
80
+
81
+ ### `undoLastOperation()`
82
+
83
+ Removes the last equation step and any preceding operation display node from the sequence. This method also triggers a re-layout and updates any associated step visualizer.
84
+
85
+ - **Returns**: `boolean` - `true` if an operation was successfully undone, `false` otherwise.
86
+
87
+ ## Usage
88
+
89
+ The `omdEquationStack` component is a complete equation solving interface that combines an equation sequence with an optional toolbar. It automatically handles layout and positioning.
90
+
91
+ ```javascript
92
+ import { omdDisplay } from 'omd';
93
+ import { omdEquationStack } from 'omd';
94
+ import { omdEquationNode } from 'omd';
95
+
96
+ // Create display
97
+ const container = document.getElementById('math-display');
98
+ const display = new omdDisplay(container);
99
+
100
+ // Create equation steps
101
+ const steps = [
102
+ omdEquationNode.fromString('2x + 3 = 11'),
103
+ omdEquationNode.fromString('2x = 8'),
104
+ omdEquationNode.fromString('x = 4')
105
+ ];
106
+
107
+ // Basic equation stack with toolbar
108
+ const stack = new omdEquationStack(steps, {
109
+ toolbar: true
110
+ });
111
+
112
+ // Render the stack
113
+ display.render(stack);
114
+
115
+ // Alternative: Create with step visualizer and custom toolbar options
116
+ const stackWithVisualizer = new omdEquationStack(steps, {
117
+ toolbar: {
118
+ enabled: true,
119
+ showUndoButton: true,
120
+ position: 'overlay-bottom'
121
+ },
122
+ stepVisualizer: true,
123
+ styling: {
124
+ equationBackground: {
125
+ backgroundColor: '#e0f7fa',
126
+ cornerRadius: 10,
127
+ pill: true
128
+ }
129
+ }
130
+ });
131
+
132
+ display.render(stackWithVisualizer);
133
+ ```
134
+
135
+ ## Integration
136
+
137
+ The equation stack integrates seamlessly with the step visualizer:
138
+
139
+ ```javascript
140
+ import { omdEquationStack } from 'omd';
141
+ import { omdEquationNode } from 'omd';
142
+ import { omdDisplay } from 'omd';
143
+
144
+ // Create steps for a more complex equation
145
+ const steps = [
146
+ omdEquationNode.fromString('x/2 + 3 = 7'),
147
+ omdEquationNode.fromString('x/2 = 4'),
148
+ omdEquationNode.fromString('x = 8')
149
+ ];
150
+
151
+ // Enable step visualizer with highlighting
152
+ const stack = new omdEquationStack(steps, {
153
+ toolbar: true,
154
+ stepVisualizer: true
155
+ });
156
+
157
+ // Render in display
158
+ const container = document.getElementById('equation-display');
159
+ const display = new omdDisplay(container);
160
+ display.render(stack);
161
+
162
+ // Access the visualizer for programmatic control
163
+ const visualizer = stack.getSequence();
164
+ // visualizer.nextStep(); // Progress through solution steps if interactive
165
+ ```
166
+
167
+ ## Layout Behavior
168
+
169
+ The equation stack automatically manages its internal layout:
170
+ - The sequence is positioned at the top
171
+ - The toolbar (if present) is centered below the sequence
172
+ - Layout updates automatically when content changes
173
+
174
+ ```javascript
175
+ // Create a stack and let it handle layout automatically
176
+ const stack = new omdEquationStack(steps, { toolbar: true });
177
+
178
+ // Manual layout update (rarely needed)
179
+ stack.updateLayout();
180
+
181
+ // Access components
182
+ const sequence = stack.getSequence();
183
+ const toolbar = stack.getToolbar();
184
+ ```
185
+
186
+ ---
187
+
188
+ ### See Also
189
+
190
+ - [`omdEquationSequenceNode`](./omdEquationSequenceNode.md)
191
+ - [`omdStepVisualizer`](./omdStepVisualizer.md)
192
+ - [`omdToolbar`](./omdToolbar.md)
193
193
  - [`jsvgGroup`](../../jsvg/jsvg.js)
@@ -1,83 +1,83 @@
1
- # omdFunctionNode
2
-
3
- Represents a mathematical function call, such as `sin(x)`, `sqrt(9)`, or `log(x, 10)`. This node handles the rendering of the function name, its arguments, and surrounding parentheses. It supports evaluation, simplification, and conversion to/from math.js AST.
4
-
5
- ## Class Definition
6
-
7
- ```javascript
8
- export class omdFunctionNode extends omdNode
9
- ```
10
-
11
- ## Constructor
12
-
13
- ### `new omdFunctionNode(astNodeData)`
14
-
15
- Creates a new `omdFunctionNode` instance.
16
-
17
- - **`astNodeData`** (`object`): The math.js AST node for the function. It should contain:
18
- - `fn.name` or `name`: The name of the function (e.g., `"sin"`, `"log"`).
19
- - `args`: An array of AST nodes for the function's arguments.
20
-
21
- ## Static Methods
22
-
23
- ### `fromString(functionString)`
24
-
25
- Creates an `omdFunctionNode` from a string representation of a function call. This method requires `window.math` (math.js library) to be available globally for parsing.
26
-
27
- - **`functionString`** (`string`): The function call as a string (e.g., `"sqrt(16)"`, `"log(100, 10)"`).
28
- - **Returns**: `omdFunctionNode` - A new instance of `omdFunctionNode`.
29
- - **Throws**: `Error` if `math.js` is not available, if the string cannot be parsed, or if it does not represent a valid function call.
30
-
31
- ## Public Properties
32
-
33
- - **`functionName`** (`string`): The name of the function (e.g., `"sin"`, `"log"`).
34
- - **`args`** (`Array<omdNode>`): An array of `omdNode` instances representing the arguments of the function.
35
-
36
- ## Public Methods
37
-
38
- ### `computeDimensions()`
39
-
40
- Calculates the bounding box of the function node, taking into account the dimensions of the function name, arguments, and parentheses. It also sets the font sizes for the function name and arguments (arguments are typically scaled down slightly).
41
-
42
- ### `updateLayout()`
43
-
44
- Positions the function name, arguments, and parentheses within the node's bounding box. It ensures proper spacing and vertical alignment of all elements.
45
-
46
- ### `highlightAll()`
47
-
48
- Applies a highlight to the function node itself (its background rectangle) and recursively highlights all of its argument nodes.
49
-
50
- ### `unhighlightAll()`
51
-
52
- Removes the highlight from the function node and recursively unhighlights all of its argument nodes.
53
-
54
- ### `clone()`
55
-
56
- Creates a deep, structural clone of the function node, including all its argument nodes and their associated SVG elements. The clone's provenance array is updated to include the original node's ID.
57
-
58
- - **Returns**: `omdFunctionNode` - A new, identical instance of the function node.
59
-
60
- ### `toMathJSNode()`
61
-
62
- Converts the `omdFunctionNode` back into its math.js AST representation. This includes converting its function name and all argument nodes.
63
-
64
- - **Returns**: `object` - A math.js-compatible `FunctionNode` AST object.
65
-
66
- ### `toString()`
67
-
68
- Converts the function node to its string representation (e.g., `"sqrt(x^2)"`, `"log(100, 10)"`).
69
-
70
- - **Returns**: `string` - The function as a string.
71
-
72
- ### `evaluate(variables)`
73
-
74
- Evaluates the function by first evaluating its arguments and then applying the function to the results. It primarily uses `window.math` (math.js) for evaluation. If `math.js` is not available, it falls back to standard JavaScript `Math` functions for common cases (e.g., `sin`, `cos`, `sqrt`).
75
-
76
- - **`variables`** (`object`, optional): A map of variable names to their numeric values (e.g., `{ x: 2 }`).
77
- - **Returns**: `number` - The result of the function evaluation.
78
- - **Throws**: `Error` if the function is unknown or cannot be evaluated.
79
-
80
- ## Internal Methods
81
-
82
- - **`createTextElements()`**: Creates `jsvgTextLine` elements for the function name and parentheses.
1
+ # omdFunctionNode
2
+
3
+ Represents a mathematical function call, such as `sin(x)`, `sqrt(9)`, or `log(x, 10)`. This node handles the rendering of the function name, its arguments, and surrounding parentheses. It supports evaluation, simplification, and conversion to/from math.js AST.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdFunctionNode extends omdNode
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdFunctionNode(astNodeData)`
14
+
15
+ Creates a new `omdFunctionNode` instance.
16
+
17
+ - **`astNodeData`** (`object`): The math.js AST node for the function. It should contain:
18
+ - `fn.name` or `name`: The name of the function (e.g., `"sin"`, `"log"`).
19
+ - `args`: An array of AST nodes for the function's arguments.
20
+
21
+ ## Static Methods
22
+
23
+ ### `fromString(functionString)`
24
+
25
+ Creates an `omdFunctionNode` from a string representation of a function call. This method requires `window.math` (math.js library) to be available globally for parsing.
26
+
27
+ - **`functionString`** (`string`): The function call as a string (e.g., `"sqrt(16)"`, `"log(100, 10)"`).
28
+ - **Returns**: `omdFunctionNode` - A new instance of `omdFunctionNode`.
29
+ - **Throws**: `Error` if `math.js` is not available, if the string cannot be parsed, or if it does not represent a valid function call.
30
+
31
+ ## Public Properties
32
+
33
+ - **`functionName`** (`string`): The name of the function (e.g., `"sin"`, `"log"`).
34
+ - **`args`** (`Array<omdNode>`): An array of `omdNode` instances representing the arguments of the function.
35
+
36
+ ## Public Methods
37
+
38
+ ### `computeDimensions()`
39
+
40
+ Calculates the bounding box of the function node, taking into account the dimensions of the function name, arguments, and parentheses. It also sets the font sizes for the function name and arguments (arguments are typically scaled down slightly).
41
+
42
+ ### `updateLayout()`
43
+
44
+ Positions the function name, arguments, and parentheses within the node's bounding box. It ensures proper spacing and vertical alignment of all elements.
45
+
46
+ ### `highlightAll()`
47
+
48
+ Applies a highlight to the function node itself (its background rectangle) and recursively highlights all of its argument nodes.
49
+
50
+ ### `unhighlightAll()`
51
+
52
+ Removes the highlight from the function node and recursively unhighlights all of its argument nodes.
53
+
54
+ ### `clone()`
55
+
56
+ Creates a deep, structural clone of the function node, including all its argument nodes and their associated SVG elements. The clone's provenance array is updated to include the original node's ID.
57
+
58
+ - **Returns**: `omdFunctionNode` - A new, identical instance of the function node.
59
+
60
+ ### `toMathJSNode()`
61
+
62
+ Converts the `omdFunctionNode` back into its math.js AST representation. This includes converting its function name and all argument nodes.
63
+
64
+ - **Returns**: `object` - A math.js-compatible `FunctionNode` AST object.
65
+
66
+ ### `toString()`
67
+
68
+ Converts the function node to its string representation (e.g., `"sqrt(x^2)"`, `"log(100, 10)"`).
69
+
70
+ - **Returns**: `string` - The function as a string.
71
+
72
+ ### `evaluate(variables)`
73
+
74
+ Evaluates the function by first evaluating its arguments and then applying the function to the results. It primarily uses `window.math` (math.js) for evaluation. If `math.js` is not available, it falls back to standard JavaScript `Math` functions for common cases (e.g., `sin`, `cos`, `sqrt`).
75
+
76
+ - **`variables`** (`object`, optional): A map of variable names to their numeric values (e.g., `{ x: 2 }`).
77
+ - **Returns**: `number` - The result of the function evaluation.
78
+ - **Throws**: `Error` if the function is unknown or cannot be evaluated.
79
+
80
+ ## Internal Methods
81
+
82
+ - **`createTextElements()`**: Creates `jsvgTextLine` elements for the function name and parentheses.
83
83
  - **`createArgumentNodes()`**: Iterates through the AST arguments, creates corresponding `omdNode` instances for each, and adds them as children.