@teachinglab/omd 0.6.0 → 0.6.2
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.
- package/README.md +257 -251
- package/README.old.md +137 -137
- package/canvas/core/canvasConfig.js +202 -202
- package/canvas/drawing/segment.js +167 -167
- package/canvas/drawing/stroke.js +385 -385
- package/canvas/events/eventManager.js +444 -444
- package/canvas/events/pointerEventHandler.js +262 -262
- package/canvas/index.js +48 -48
- package/canvas/tools/PointerTool.js +71 -71
- package/canvas/tools/tool.js +222 -222
- package/canvas/utils/boundingBox.js +377 -377
- package/canvas/utils/mathUtils.js +258 -258
- package/docs/api/configuration-options.md +198 -198
- package/docs/api/eventManager.md +82 -82
- package/docs/api/focusFrameManager.md +144 -144
- package/docs/api/index.md +105 -105
- package/docs/api/main.md +62 -62
- package/docs/api/omdBinaryExpressionNode.md +86 -86
- package/docs/api/omdCanvas.md +83 -83
- package/docs/api/omdConfigManager.md +112 -112
- package/docs/api/omdConstantNode.md +52 -52
- package/docs/api/omdDisplay.md +87 -87
- package/docs/api/omdEquationNode.md +174 -174
- package/docs/api/omdEquationSequenceNode.md +258 -258
- package/docs/api/omdEquationStack.md +192 -192
- package/docs/api/omdFunctionNode.md +82 -82
- package/docs/api/omdGroupNode.md +78 -78
- package/docs/api/omdHelpers.md +87 -87
- package/docs/api/omdLeafNode.md +85 -85
- package/docs/api/omdNode.md +201 -201
- package/docs/api/omdOperationDisplayNode.md +117 -117
- package/docs/api/omdOperatorNode.md +91 -91
- package/docs/api/omdParenthesisNode.md +133 -133
- package/docs/api/omdPopup.md +191 -191
- package/docs/api/omdPowerNode.md +131 -131
- package/docs/api/omdRationalNode.md +144 -144
- package/docs/api/omdSequenceNode.md +128 -128
- package/docs/api/omdSimplification.md +78 -78
- package/docs/api/omdSqrtNode.md +144 -144
- package/docs/api/omdStepVisualizer.md +146 -146
- package/docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/docs/api/omdStepVisualizerLayout.md +70 -70
- package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/docs/api/omdToolbar.md +130 -130
- package/docs/api/omdTranscriptionService.md +95 -95
- package/docs/api/omdTreeDiff.md +169 -169
- package/docs/api/omdUnaryExpressionNode.md +137 -137
- package/docs/api/omdUtilities.md +82 -82
- package/docs/api/omdVariableNode.md +123 -123
- package/docs/api/selectTool.md +74 -74
- package/docs/api/simplificationEngine.md +97 -97
- package/docs/api/simplificationRules.md +76 -76
- package/docs/api/simplificationUtils.md +64 -64
- package/docs/api/transcribe.md +43 -43
- package/docs/api-reference.md +85 -85
- package/docs/index.html +453 -453
- package/docs/index.md +38 -38
- package/docs/omd-objects.md +258 -258
- package/index.js +79 -79
- package/jsvg/index.js +3 -0
- package/jsvg/jsvg.js +898 -898
- package/jsvg/jsvgComponents.js +357 -358
- package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
- package/npm-docs/README.md +251 -251
- package/npm-docs/api/api-reference.md +85 -85
- package/npm-docs/api/configuration-options.md +198 -198
- package/npm-docs/api/eventManager.md +82 -82
- package/npm-docs/api/expression-nodes.md +561 -561
- package/npm-docs/api/focusFrameManager.md +144 -144
- package/npm-docs/api/index.md +105 -105
- package/npm-docs/api/main.md +62 -62
- package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
- package/npm-docs/api/omdCanvas.md +83 -83
- package/npm-docs/api/omdConfigManager.md +112 -112
- package/npm-docs/api/omdConstantNode.md +52 -52
- package/npm-docs/api/omdDisplay.md +87 -87
- package/npm-docs/api/omdEquationNode.md +174 -174
- package/npm-docs/api/omdEquationSequenceNode.md +258 -258
- package/npm-docs/api/omdEquationStack.md +192 -192
- package/npm-docs/api/omdFunctionNode.md +82 -82
- package/npm-docs/api/omdGroupNode.md +78 -78
- package/npm-docs/api/omdHelpers.md +87 -87
- package/npm-docs/api/omdLeafNode.md +85 -85
- package/npm-docs/api/omdNode.md +201 -201
- package/npm-docs/api/omdOperationDisplayNode.md +117 -117
- package/npm-docs/api/omdOperatorNode.md +91 -91
- package/npm-docs/api/omdParenthesisNode.md +133 -133
- package/npm-docs/api/omdPopup.md +191 -191
- package/npm-docs/api/omdPowerNode.md +131 -131
- package/npm-docs/api/omdRationalNode.md +144 -144
- package/npm-docs/api/omdSequenceNode.md +128 -128
- package/npm-docs/api/omdSimplification.md +78 -78
- package/npm-docs/api/omdSqrtNode.md +144 -144
- package/npm-docs/api/omdStepVisualizer.md +146 -146
- package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
- package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/npm-docs/api/omdToolbar.md +130 -130
- package/npm-docs/api/omdTranscriptionService.md +95 -95
- package/npm-docs/api/omdTreeDiff.md +169 -169
- package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
- package/npm-docs/api/omdUtilities.md +82 -82
- package/npm-docs/api/omdVariableNode.md +123 -123
- package/npm-docs/api/selectTool.md +74 -74
- package/npm-docs/api/simplificationEngine.md +97 -97
- package/npm-docs/api/simplificationRules.md +76 -76
- package/npm-docs/api/simplificationUtils.md +64 -64
- package/npm-docs/api/transcribe.md +43 -43
- package/npm-docs/guides/equations.md +854 -854
- package/npm-docs/guides/factory-functions.md +354 -354
- package/npm-docs/guides/getting-started.md +318 -318
- package/npm-docs/guides/quick-examples.md +525 -525
- package/npm-docs/guides/visualizations.md +682 -682
- package/npm-docs/index.html +12 -0
- package/npm-docs/json-schemas.md +826 -826
- package/omd/config/omdConfigManager.js +279 -267
- package/omd/core/index.js +158 -158
- package/omd/core/omdEquationStack.js +546 -546
- package/omd/core/omdUtilities.js +113 -113
- package/omd/display/omdDisplay.js +969 -962
- package/omd/display/omdToolbar.js +501 -501
- package/omd/nodes/omdBinaryExpressionNode.js +459 -459
- package/omd/nodes/omdConstantNode.js +141 -141
- package/omd/nodes/omdEquationNode.js +1327 -1327
- package/omd/nodes/omdFunctionNode.js +351 -351
- package/omd/nodes/omdGroupNode.js +67 -67
- package/omd/nodes/omdLeafNode.js +76 -76
- package/omd/nodes/omdNode.js +556 -556
- package/omd/nodes/omdOperationDisplayNode.js +321 -321
- package/omd/nodes/omdOperatorNode.js +108 -108
- package/omd/nodes/omdParenthesisNode.js +292 -292
- package/omd/nodes/omdPowerNode.js +235 -235
- package/omd/nodes/omdRationalNode.js +295 -295
- package/omd/nodes/omdSqrtNode.js +307 -307
- package/omd/nodes/omdUnaryExpressionNode.js +227 -227
- package/omd/nodes/omdVariableNode.js +122 -122
- package/omd/simplification/omdSimplification.js +140 -140
- package/omd/simplification/omdSimplificationEngine.js +887 -887
- package/omd/simplification/package.json +5 -5
- package/omd/simplification/rules/binaryRules.js +1037 -1037
- package/omd/simplification/rules/functionRules.js +111 -111
- package/omd/simplification/rules/index.js +48 -48
- package/omd/simplification/rules/parenthesisRules.js +19 -19
- package/omd/simplification/rules/powerRules.js +143 -143
- package/omd/simplification/rules/rationalRules.js +725 -725
- package/omd/simplification/rules/sqrtRules.js +48 -48
- package/omd/simplification/rules/unaryRules.js +37 -37
- package/omd/simplification/simplificationRules.js +31 -31
- package/omd/simplification/simplificationUtils.js +1055 -1055
- package/omd/step-visualizer/omdStepVisualizer.js +947 -947
- package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
- package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
- package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
- package/omd/utils/aiNextEquationStep.js +106 -106
- package/omd/utils/omdNodeOverlay.js +638 -638
- package/omd/utils/omdPopup.js +1203 -1203
- package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
- package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
- package/omd/utils/omdTranscriptionService.js +123 -123
- package/omd/utils/omdTreeDiff.js +733 -733
- package/package.json +59 -56
- package/readme.html +184 -120
- package/src/index.js +74 -74
- package/src/json-schemas.md +576 -576
- package/src/omd-json-samples.js +147 -147
- package/src/omdApp.js +391 -391
- package/src/omdAppCanvas.js +335 -335
- package/src/omdBalanceHanger.js +199 -199
- package/src/omdColor.js +13 -13
- package/src/omdCoordinatePlane.js +541 -541
- package/src/omdExpression.js +115 -115
- package/src/omdFactory.js +150 -150
- package/src/omdFunction.js +114 -114
- package/src/omdMetaExpression.js +290 -290
- package/src/omdNaturalExpression.js +563 -563
- package/src/omdNode.js +383 -383
- package/src/omdNumber.js +52 -52
- package/src/omdNumberLine.js +114 -112
- package/src/omdNumberTile.js +118 -118
- package/src/omdOperator.js +72 -72
- package/src/omdPowerExpression.js +91 -91
- package/src/omdProblem.js +259 -259
- package/src/omdRatioChart.js +251 -251
- package/src/omdRationalExpression.js +114 -114
- package/src/omdSampleData.js +215 -215
- package/src/omdShapes.js +512 -512
- package/src/omdSpinner.js +151 -151
- package/src/omdString.js +49 -49
- package/src/omdTable.js +498 -498
- package/src/omdTapeDiagram.js +244 -244
- package/src/omdTerm.js +91 -91
- package/src/omdTileEquation.js +349 -349
- package/src/omdUtils.js +84 -84
- 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.
|