@teachinglab/omd 0.1.4 → 0.1.6

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 (47) hide show
  1. package/canvas/tools/EraserTool.js +1 -1
  2. package/canvas/tools/PencilTool.js +1 -1
  3. package/canvas/tools/SelectTool.js +1 -1
  4. package/docs/api/configuration-options.md +198 -104
  5. package/docs/api/eventManager.md +83 -68
  6. package/docs/api/focusFrameManager.md +145 -150
  7. package/docs/api/index.md +106 -91
  8. package/docs/api/main.md +63 -58
  9. package/docs/api/omdBinaryExpressionNode.md +86 -227
  10. package/docs/api/omdCanvas.md +84 -142
  11. package/docs/api/omdConfigManager.md +113 -192
  12. package/docs/api/omdConstantNode.md +53 -117
  13. package/docs/api/omdDisplay.md +87 -121
  14. package/docs/api/omdEquationNode.md +174 -161
  15. package/docs/api/omdEquationSequenceNode.md +259 -301
  16. package/docs/api/omdEquationStack.md +157 -103
  17. package/docs/api/omdFunctionNode.md +83 -141
  18. package/docs/api/omdGroupNode.md +79 -182
  19. package/docs/api/omdHelpers.md +88 -96
  20. package/docs/api/omdLeafNode.md +86 -163
  21. package/docs/api/omdNode.md +202 -101
  22. package/docs/api/omdOperationDisplayNode.md +118 -139
  23. package/docs/api/omdOperatorNode.md +92 -127
  24. package/docs/api/omdParenthesisNode.md +134 -122
  25. package/docs/api/omdPopup.md +192 -117
  26. package/docs/api/omdPowerNode.md +132 -127
  27. package/docs/api/omdRationalNode.md +145 -128
  28. package/docs/api/omdSimplification.md +79 -110
  29. package/docs/api/omdSqrtNode.md +144 -79
  30. package/docs/api/omdStepVisualizer.md +147 -115
  31. package/docs/api/omdStepVisualizerHighlighting.md +66 -61
  32. package/docs/api/omdStepVisualizerInteractiveSteps.md +109 -129
  33. package/docs/api/omdStepVisualizerLayout.md +71 -60
  34. package/docs/api/omdStepVisualizerTextBoxes.md +77 -68
  35. package/docs/api/omdToolbar.md +131 -102
  36. package/docs/api/omdTranscriptionService.md +96 -76
  37. package/docs/api/omdTreeDiff.md +170 -134
  38. package/docs/api/omdUnaryExpressionNode.md +137 -174
  39. package/docs/api/omdUtilities.md +83 -70
  40. package/docs/api/omdVariableNode.md +123 -148
  41. package/index.js +2 -2
  42. package/omd/core/index.js +9 -0
  43. package/omd/nodes/omdEquationSequenceNode.js +15 -0
  44. package/omd/utils/aiNextEquationStep.js +106 -0
  45. package/package.json +1 -1
  46. package/src/omdBalanceHanger.js +1 -1
  47. package/src/omdCoordinatePlane.js +1 -1
@@ -1,139 +1,118 @@
1
- # omdOperationDisplayNode
2
-
3
- Represents a visual node for displaying an operation applied to both sides of an equation. Example: -3 -3
4
-
5
- ## Class: `omdOperationDisplayNode extends omdNode`
6
-
7
- ```javascript
8
- import { omdOperationDisplayNode } from './omd/nodes/omdOperationDisplayNode.js';
9
- ```
10
-
11
- ### Constructor
12
-
13
- ```javascript
14
- new omdOperationDisplayNode(operation, value)
15
- ```
16
-
17
- **Parameters:**
18
- - `operation` {string} - The type of operation (e.g., 'add', 'subtract', 'multiply', 'divide')
19
- - `value` {number|string|omdNode} - The value being applied. Can be a number, variable name, or an omdNode
20
-
21
- **Description:**
22
- Creates a node that visually represents an operation on both sides of an equation. The node has no visible background and disables mouse interactions.
23
-
24
- ### Properties
25
-
26
- Inherits all properties from [omdNode](./omdNode.md), plus:
27
-
28
- #### `operation`
29
- - **Type:** string
30
- - **Description:** The operation type (e.g., 'add', 'subtract')
31
-
32
- #### `value`
33
- - **Type:** number|string|omdNode
34
- - **Description:** The value used in the operation
35
-
36
- #### `type`
37
- - **Type:** string
38
- - **Description:** Always "omdOperationDisplayNode"
39
-
40
- #### `operatorLeft`, `operatorRight`
41
- - **Type:** omdOperator
42
- - **Description:** The operator symbols for each side
43
-
44
- #### `valueLeft`, `valueRight`
45
- - **Type:** omdNode
46
- - **Description:** The value nodes for each side
47
-
48
- ### Methods
49
-
50
- Inherits all methods from [omdNode](./omdNode.md), plus:
51
-
52
- #### `_getOperatorSymbol(operation)`
53
- Internal method to get display symbol.
54
- - `operation` {string} - Operation type
55
- - **Returns:** string - Symbol for operation:
56
- - 'add' → '+'
57
- - 'subtract' → '-'
58
- - 'multiply' → '×'
59
- - 'divide' '÷'
60
-
61
- ---
62
-
63
- #### `_createValueElement(value)`
64
- Internal method to create value node.
65
- - `value` {number|string|omdNode} - Value to convert
66
- - **Returns:** omdNode - Appropriate node type:
67
- - omdNode → cloned
68
- - AST → parsed
69
- - number omdNumber
70
- - single letter → omdVariable
71
- - string omdTerm
72
- - other → omdExpression
73
-
74
- ---
75
-
76
- #### `_disableElement(element)`
77
- Internal method to disable interactions.
78
- - `element` {omdNode} - Element to disable
79
- - Hides background
80
- - Removes mouse events
81
- - Disables recursively
82
-
83
- ---
84
-
85
- #### `computeDimensions()`
86
- Calculates node dimensions.
87
- - Adds padding between operator and value
88
- - Adds gap between sides
89
- - Sets width and height based on children
90
-
91
- ---
92
-
93
- #### `updateLayout()`
94
- Updates positions of all elements.
95
- - Updates child layouts
96
- - Positions left side elements
97
- - Adds gap
98
- - Positions right side elements
99
- - Centers vertically
100
-
101
- ---
102
-
103
- #### `clone()`
104
- Creates deep clone of node.
105
- - **Returns:** omdOperationDisplayNode - New instance with:
106
- - Same operation and value
107
- - Original node's ID in provenance
108
-
109
- ### Examples
110
-
111
- ```javascript
112
- // Create operation display
113
- const node = new omdOperationDisplayNode('subtract', 3);
114
-
115
- // With variable
116
- const varNode = new omdOperationDisplayNode('multiply', 'x');
117
-
118
- // With complex value
119
- const complexNode = new omdOperationDisplayNode('divide', {
120
- type: 'OperatorNode',
121
- op: '+',
122
- args: [
123
- { type: 'ConstantNode', value: 1 },
124
- { type: 'SymbolNode', name: 'x' }
125
- ]
126
- });
127
-
128
- // Render with proper spacing
129
- node.setFontSize(24);
130
- node.computeDimensions();
131
- node.updateLayout();
132
- ```
133
-
134
- ### See Also
135
-
136
- - [omdNode](./omdNode.md) - Parent class
137
- - [omdOperator](./omdOperator.md) - For operator symbols
138
- - [omdEquationNode](./omdEquationNode.md) - For equations
139
- - [omdEquationSequenceNode](./omdEquationSequenceNode.md) - For step sequences
1
+ # omdOperationDisplayNode
2
+
3
+ Represents a visual node for displaying an operation applied to both sides of an equation. This node is designed to show the operation (e.g., `+5` or `×2`) on both the left and right sides of an equation, typically used in step-by-step solution visualizers. It is non-interactive and non-highlightable by design.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdOperationDisplayNode extends omdNode
9
+ ```
10
+
11
+ ## Static Properties
12
+
13
+ ### `OPERATOR_SYMBOLS`
14
+
15
+ A static map that defines the display symbols for various operations.
16
+
17
+ ```javascript
18
+ static OPERATOR_SYMBOLS = {
19
+ 'add': '+',
20
+ 'subtract': '-',
21
+ 'multiply': '×',
22
+ 'divide': '÷'
23
+ };
24
+ ```
25
+
26
+ ## Constructor
27
+
28
+ ### `new omdOperationDisplayNode(operation, value)`
29
+
30
+ Creates a new `omdOperationDisplayNode` instance.
31
+
32
+ - **`operation`** (`string`): The type of operation (e.g., `'add'`, `'subtract'`, `'multiply'`, `'divide'`).
33
+ - **`value`** (`number` | `string` | `omdNode`): The value being applied in the operation. Can be a number, a variable name string, or an `omdNode` instance.
34
+
35
+ During construction, the node initializes its display, creates the visual elements for the operation, disables all user interactions and highlighting, and adds the elements as children.
36
+
37
+ ## Public Properties
38
+
39
+ - **`operation`** (`string`): The type of operation (e.g., `'add'`, `'subtract'`).
40
+ - **`value`** (`number` | `string` | `omdNode`): The value used in the operation.
41
+ - **`type`** (`string`): Always `"omdOperationDisplayNode"`.
42
+ - **`leftToken`** (`omdVariableNode`): The `omdVariableNode` representing the operation and value on the left side.
43
+ - **`rightToken`** (`omdVariableNode`): The `omdVariableNode` representing the operation and value on the right side.
44
+ - **`gap`** (`number`): The horizontal spacing between the left and right operation tokens.
45
+ - **`leftClusterWidth`** (`number`): The calculated width of the left operation token, used for alignment in equation sequences.
46
+
47
+ ## Public Methods
48
+
49
+ ### `computeDimensions()`
50
+
51
+ Calculates the dimensions (width and height) of the operation display node. It determines the total width by summing the widths of the left and right tokens and the `gap` between them. The height is based on the tallest token with some vertical padding.
52
+
53
+ ### `updateLayout()`
54
+
55
+ Updates the layout of the operation display node. It positions the `leftToken` at the beginning and the `rightToken` after the calculated `gap`, ensuring they are vertically centered within the node's height.
56
+
57
+ ### `getLeftWidthForAlignment()`
58
+
59
+ Returns the effective width of the left operation cluster. This is used by `omdEquationSequenceNode` to align the equals signs of equations with the center of the gap in the operation display.
60
+
61
+ - **Returns**: `number`.
62
+
63
+ ### `showLeftOnly()`
64
+
65
+ Hides the right operation token and recalculates the dimensions and layout to display only the left operation. This is useful for scenarios where only one side of the operation needs to be shown.
66
+
67
+ ### `clone()`
68
+
69
+ Creates a deep clone of the `omdOperationDisplayNode`. The cloned node will have the same operation and value, and its provenance will link back to the original node. The cloned node is also made non-highlightable.
70
+
71
+ - **Returns**: `omdOperationDisplayNode` - A new, identical instance.
72
+
73
+ ## Internal Methods
74
+
75
+ - **`_initializeDisplay()`**: Sets up the initial display properties, making the background transparent and ensuring the node is non-highlightable.
76
+ - **`_createOperationElements()`**: Creates the `leftToken` and `rightToken` `omdVariableNode` instances based on the operation and value, and immediately disables their highlighting.
77
+ - **`_disableAllInteractions()`**: Calls helper methods to disable mouse interactions and highlighting for both operation tokens.
78
+ - **`_addChildElements()`**: Adds the `leftToken` and `rightToken` as children of this node.
79
+ - **`_getOperatorSymbol(operation)`**: Converts the operation name (e.g., `'add'`) to its corresponding display symbol (e.g., `'+'`).
80
+ - **`_valueToString(value)`**: Converts the input `value` (number, string, or `omdNode`) into a string representation for display.
81
+ - **`_disableElement(element)`**: Recursively disables background, mouse interactions, and highlighting for a given `omdNode` and its children.
82
+ - **`_hideElementBackground(element)`**: Sets the background of an element to transparent.
83
+ - **`_disableMouseInteractions(element)`**: Removes mouse event listeners and sets the cursor to `'default'`.
84
+ - **`_disableHighlighting(element)`**: Overrides highlighting methods (`setHighlight`, `lowlight`, `setFillColor`) on an element to prevent it from being highlighted.
85
+ - **`_makeNodeNonHighlightable()`**: Applies the `_disableHighlighting` logic to the `omdOperationDisplayNode` itself.
86
+ - **`_disableChildElements(element)`**: Recursively calls `_disableElement` on all children of a given element.
87
+
88
+ ## Example
89
+
90
+ ```javascript
91
+ // Create operation display for subtracting 3
92
+ const subtractNode = new omdOperationDisplayNode('subtract', 3);
93
+
94
+ // Create operation display for multiplying by 'x'
95
+ const multiplyNode = new omdOperationDisplayNode('multiply', 'x');
96
+
97
+ // Create operation display for dividing by a complex expression
98
+ const complexDivideNode = new omdOperationDisplayNode('divide', {
99
+ type: 'OperatorNode',
100
+ op: '+',
101
+ args: [
102
+ { type: 'ConstantNode', value: 1 },
103
+ { type: 'SymbolNode', name: 'x' }
104
+ ]
105
+ });
106
+
107
+ // To render these, you would typically add them to an omdEquationSequenceNode
108
+ // or an omdDisplay.
109
+ // For example:
110
+ // const display = new omdDisplay(document.getElementById('container'));
111
+ // display.render(subtractNode);
112
+ ```
113
+
114
+ ## See Also
115
+
116
+ - [`omdNode`](./omdNode.md) - The base class for all OMD nodes.
117
+ - [`omdEquationNode`](./omdEquationNode.md) - For representing mathematical equations.
118
+ - [`omdEquationSequenceNode`](./omdEquationSequenceNode.md) - For managing sequences of equation steps.
@@ -1,127 +1,92 @@
1
- # omdOperatorNode
2
-
3
- Represents an operator symbol (e.g., `+`, `-`, `*`, `÷`) as a leaf node in the expression tree.
4
-
5
- ## Class: `omdOperatorNode extends omdLeafNode`
6
-
7
- ```javascript
8
- import { omdOperatorNode } from './omd/nodes/omdOperatorNode.js';
9
- ```
10
-
11
- ### Constructor
12
-
13
- ```javascript
14
- new omdOperatorNode(nodeData)
15
- ```
16
-
17
- **Parameters:**
18
- - `nodeData` {Object|string} - The AST node data or the operator symbol as a string.
19
-
20
- **Description:**
21
- Creates a leaf node that represents an operator. It handles mapping from operation names (e.g., 'multiply') to symbols (e.g., `×`).
22
-
23
- ### Properties
24
-
25
- Inherits all properties from [`omdLeafNode`](./omdLeafNode.md), plus:
26
-
27
- #### `opName`
28
- - **Type:** string
29
- - **Description:** The name of the operator (e.g., `*`, `+`)
30
-
31
- #### `type`
32
- - **Type:** string
33
- - **Description:** Always "operator"
34
-
35
- #### `textElement`
36
- - **Type:** SVGElement
37
- - **Description:** The SVG text element displaying the operator symbol
38
-
39
- ### Methods
40
-
41
- Inherits all methods from [`omdLeafNode`](./omdLeafNode.md), plus:
42
-
43
- #### `parseOpName(nodeData)`
44
- Internal method to extract operator name from AST data.
45
- - **Returns:** string
46
- - **Supported Operators:**
47
- - multiply: `×` (configurable)
48
- - divide: `÷`
49
- - add: `+`
50
- - subtract: `−`
51
- - pow: `^`
52
- - unaryMinus: `-`
53
- - unaryPlus: `+`
54
-
55
- ---
56
-
57
- #### `parseType()`
58
- Internal method to set node type.
59
- - **Returns:** "operator"
60
-
61
- ---
62
-
63
- #### `computeDimensions()`
64
- Calculates dimensions with padding around the operator.
65
- Overrides base class method.
66
-
67
- ---
68
-
69
- #### `updateLayout()`
70
- Updates the layout of the node.
71
- Overrides base class method.
72
-
73
- ---
74
-
75
- #### `toMathJSNode()`
76
- Converts to math.js AST format.
77
- - **Returns:** Object - A math.js-compatible AST node with:
78
- - `type`: "OperatorNode"
79
- - `op`: Operator name
80
- - `fn`: Function name (same as op)
81
- - `args`: Empty array
82
-
83
- ---
84
-
85
- #### `toString()`
86
- Convert to string representation.
87
- - **Returns:** string - The operator symbol
88
-
89
- ---
90
-
91
- #### `highlight(color)`
92
- Highlights the node and sets operator label color to white.
93
- - `color` {omdColor} - The highlight color
94
-
95
- ---
96
-
97
- #### `clearProvenanceHighlights()`
98
- Clears highlights and resets operator label color.
99
-
100
- ### Examples
101
-
102
- ```javascript
103
- // From string
104
- const plus = new omdOperatorNode('+');
105
- const times = new omdOperatorNode('*'); // Displays as × (configurable)
106
-
107
- // From AST data
108
- const minus = new omdOperatorNode({
109
- type: 'OperatorNode',
110
- op: 'subtract'
111
- }); // Displays as −
112
-
113
- // Rendering
114
- const node = new omdOperatorNode('+');
115
- node.setFontSize(24);
116
- node.computeDimensions(); // Calculate size with padding
117
- node.updateLayout(); // Position the text element
118
- ```
119
-
120
- ### See Also
121
-
122
- - [omdLeafNode](./omdLeafNode.md) - Parent class
123
- - [omdNode](./omdNode.md) - Base class
124
- - [omdBinaryExpressionNode](./omdBinaryExpressionNode.md) - Uses operator nodes
125
- - [omdUnaryExpressionNode](./omdUnaryExpressionNode.md) - Uses operator nodes
126
-
127
- ```
1
+ # omdOperatorNode
2
+
3
+ Represents an operator symbol (e.g., `+`, `-`, `*`, `÷`) as a leaf node in the expression tree. This node handles the visual representation of operators, including mapping common operation names to their appropriate symbols and applying styling.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdOperatorNode extends omdLeafNode
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdOperatorNode(nodeData)`
14
+
15
+ Creates a new `omdOperatorNode` instance.
16
+
17
+ - **`nodeData`** (`object` | `string`): The AST node data (from math.js) or the operator symbol as a string (e.g., `"+"`, `"*"`). The constructor maps common operation names (like `"multiply"`) to their display symbols (like `"×"`), respecting the configured multiplication symbol.
18
+
19
+ ## Public Properties
20
+
21
+ - **`opName`** (`string`): The internal name of the operator (e.g., `"*"`, `"+"`). This might differ from the displayed symbol for multiplication.
22
+ - **`type`** (`string`): Always `"omdOperatorNode"`.
23
+ - **`textElement`** (`jsvgTextLine`): The internal `jsvgTextLine` instance that displays the operator symbol.
24
+
25
+ ## Public Methods
26
+
27
+ ### `computeDimensions()`
28
+
29
+ Calculates the dimensions of the node based on its text content, adding a small amount of padding around the operator symbol to improve visual spacing.
30
+
31
+ - **Overrides**: `omdLeafNode.computeDimensions()`.
32
+
33
+ ### `updateLayout()`
34
+
35
+ Updates the layout of the node. This method primarily calls the superclass's `updateLayout`.
36
+
37
+ - **Overrides**: `omdLeafNode.updateLayout()`.
38
+
39
+ ### `toMathJSNode()`
40
+
41
+ Converts the `omdOperatorNode` to a math.js-compatible AST format. It creates a minimal `OperatorNode` AST object.
42
+
43
+ - **Returns**: `object` - A math.js-compatible AST node with `type: "OperatorNode"`, `op` (operator symbol), `fn` (function name, typically same as `op`), and an empty `args` array. The returned object also includes a `clone` method for compatibility.
44
+
45
+ ### `toString()`
46
+
47
+ Converts the operator node to its string representation, which is simply its `opName`.
48
+
49
+ - **Returns**: `string` - The operator symbol (e.g., `"+"`, `"*"`).
50
+
51
+ ### `highlight(color)`
52
+
53
+ Applies a highlight to the node's background and sets the operator's text color to white for better contrast. This method respects the `isExplainHighlighted` lock.
54
+
55
+ - **`color`** (`string`): The color of the highlight.
56
+
57
+ ### `clearProvenanceHighlights()`
58
+
59
+ Clears any provenance-related highlights from the node and resets the operator's text color to its default (black).
60
+
61
+ ## Internal Methods
62
+
63
+ - **`parseOpName(nodeData)`**: Extracts the operator's internal name from the constructor's `nodeData`. It handles mapping from math.js function names (e.g., `"multiply"`) to display symbols (e.g., `"×"`), using the configured multiplication symbol.
64
+ - **`parseType()`**: Sets the node's type. Always returns `"operator"`.
65
+
66
+ ## Example
67
+
68
+ ```javascript
69
+ import { omdOperatorNode } from '@teachinglab/omd';
70
+
71
+ // Create operator nodes from strings
72
+ const plus = new omdOperatorNode('+');
73
+ const times = new omdOperatorNode('*'); // Displays as × (configurable via omdConfigManager)
74
+
75
+ // Create operator node from AST data (e.g., from math.js parse result)
76
+ const minus = new omdOperatorNode({
77
+ type: 'OperatorNode',
78
+ op: '-',
79
+ fn: 'subtract'
80
+ }); // Displays as
81
+
82
+ // To render, typically add to a parent node or an omdDisplay
83
+ // node.setFontSize(24);
84
+ // node.initialize(); // Computes dimensions and layout
85
+ ```
86
+
87
+ ## See Also
88
+
89
+ - [`omdLeafNode`](./omdLeafNode.md) - The parent class for all leaf nodes.
90
+ - [`omdNode`](./omdNode.md) - The base class for all OMD nodes.
91
+ - [`omdBinaryExpressionNode`](./omdBinaryExpressionNode.md) - A common consumer of operator nodes.
92
+ - [`omdUnaryExpressionNode`](./omdUnaryExpressionNode.md) - Another consumer of operator nodes (e.g., for unary minus).