@teachinglab/omd 0.1.4 → 0.1.5

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 (42) 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/package.json +1 -1
@@ -1,121 +1,87 @@
1
- # omdDisplay
2
-
3
- A high-level component for displaying a single mathematical expression or a series of equation steps with automatic centering and layout management.
4
-
5
- ## Class: `omdDisplay`
6
-
7
- ```javascript
8
- import { omdDisplay } from 'omd-library';
9
- ```
10
-
11
- ### Constructor
12
-
13
- ```javascript
14
- new omdDisplay(container, options)
15
- ```
16
-
17
- **Parameters:**
18
- - `container` {HTMLElement} - The DOM element where the expression will be rendered.
19
- - `options` {Object} (optional) - Configuration options:
20
- - `fontSize` {number} - The base font size in pixels for the expression. Defaults to `32`.
21
- - `centerContent` {boolean} - If `true`, the content is automatically centered within the container. Defaults to `true`.
22
- - `topMargin` {number} - The top margin in pixels, used when centering content. Defaults to `40`.
23
-
24
- **Example:**
25
- ```javascript
26
- const displayContainer = document.getElementById('math-display');
27
- const display = new omdDisplay(displayContainer, {
28
- fontSize: 36,
29
- topMargin: 50
30
- });
31
- ```
32
-
33
- ### Methods
34
-
35
-
36
- #### `render(expression)`
37
- Renders a mathematical expression or equation. If a string is provided:
38
- - If the string contains semicolons (`;`), it is treated as a sequence of equations and rendered as steps.
39
- - If the string contains an equals sign (`=`), it is treated as a single equation and wrapped in an `omdStepVisualizer`.
40
- - Otherwise, it is parsed as a single expression.
41
-
42
- ```javascript
43
- display.render('x^2 + 2x + 1 = 0');
44
-
45
- // Renders a sequence of steps
46
- display.render('2x + 4 = 10; 2x = 6; x = 3');
47
- ```
48
- - **Parameters:**
49
- - `expression` {string | omdNode} - The mathematical expression string or a pre-existing `omdNode` instance.
50
- - **Returns:** `omdNode` The root node of the rendered content (often an `omdStepVisualizer`).
51
-
52
- ---
53
-
54
- #### `update(newNode)`
55
-
56
- Replaces the currently displayed node with a new one, applying the current font size and centering if enabled.
57
-
58
- ```javascript
59
- const newNode = omdEquationNode.fromString('y = mx + b');
60
- display.update(newNode);
61
- ```
62
- - **Parameters:**
63
- - `newNode` {omdNode} - The new node to display.
64
-
65
- ---
66
-
67
- #### `getCurrentNode()`
68
-
69
- Returns the node currently being displayed.
70
-
71
- ```javascript
72
- const currentNode = display.getCurrentNode();
73
- ```
74
- - **Returns:** {omdNode | null} The current root node, or `null` if nothing is displayed.
75
-
76
- ---
77
-
78
- #### `centerNode()`
79
-
80
- Manually triggers the centering logic for the current node. This is especially useful for `omdEquationSequenceNode` instances to align them by their equals signs.
81
-
82
- ```javascript
83
- display.centerNode();
84
- ```
85
-
86
- ---
87
-
88
- #### `setFontSize(size)`
89
-
90
- Updates the font size for the currently displayed node and for any future content rendered.
91
-
92
- ```javascript
93
- display.setFontSize(48);
94
- ```
95
- - **Parameters:**
96
- - `size` {number} - The new font size in pixels.
97
-
98
- ---
99
-
100
- #### `clear()`
101
-
102
- Removes the current expression from the display.
103
-
104
- ```javascript
105
- display.clear();
106
- ```
107
-
108
- ---
109
-
110
- #### `destroy()`
111
-
112
- Cleans up the component, removing all DOM elements and detaching the resize observer.
113
-
114
- ```javascript
115
- display.destroy();
116
- ```
117
-
118
-
119
- ### See Also
120
- - [`omdStepVisualizer`](./omdStepVisualizer.md) - The component used to display steps.
121
- - [`omdEquationNode`](./omdEquationNode.md) - The node for representing equations.
1
+ # omdDisplay
2
+
3
+ A high-level component for displaying mathematical expressions or a series of equation steps. It handles rendering, automatic centering, scaling, and layout management within a given HTML container.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdDisplay
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdDisplay(container, [options])`
14
+
15
+ Creates a new `omdDisplay` instance.
16
+
17
+ - **`container`** (`HTMLElement`): The DOM element where the expression will be rendered.
18
+ - **`options`** (`object`, optional): Configuration options:
19
+ - `fontSize` (`number`): The base font size in pixels for the expression. Default: `32`.
20
+ - `centerContent` (`boolean`): If `true`, the content is automatically centered within the container. Default: `true`.
21
+ - `topMargin` (`number`): The top margin in pixels, used when centering content. Default: `40`.
22
+ - `bottomMargin` (`number`): The bottom margin in pixels. Default: `16`.
23
+ - `fitToContent` (`boolean`): If `true`, the SVG container will resize to tightly fit the content. Default: `false`.
24
+ - `autoScale` (`boolean`): If `true`, content will automatically scale down to fit the container. Default: `true`.
25
+ - `maxScale` (`number`): Maximum scale factor for `autoScale`. Default: `1` (no upscaling).
26
+ - `edgePadding` (`number`): Horizontal padding from edges when `autoScale` is enabled. Default: `16`.
27
+
28
+ ## Public Methods
29
+
30
+ ### `render(expression)`
31
+
32
+ Renders a mathematical expression or equation within the display. It intelligently handles different input types:
33
+
34
+ - If `expression` is a string containing semicolons (`;`), it's treated as a sequence of equations and rendered as an `omdStepVisualizer`.
35
+ - If `expression` is a string containing an equals sign (`=`), it's treated as a single equation and wrapped in an `omdStepVisualizer`.
36
+ - Otherwise, if `expression` is a string, it's parsed as a single mathematical expression.
37
+ - If `expression` is already an `omdNode` instance, it's rendered directly.
38
+
39
+ - **`expression`** (`string` | `omdNode`): The mathematical expression string or a pre-existing `omdNode` instance.
40
+ - **Returns**: `omdNode` - The root node of the rendered content (often an `omdStepVisualizer`).
41
+
42
+ ### `update(newNode)`
43
+
44
+ Replaces the currently displayed node with a new one, applying the current font size and centering if enabled. The new node is initialized before being added to the display.
45
+
46
+ - **`newNode`** (`omdNode`): The new node to display.
47
+
48
+ ### `getCurrentNode()`
49
+
50
+ Returns the node currently being displayed.
51
+
52
+ - **Returns**: `omdNode` | `null` - The current root node, or `null` if nothing is displayed.
53
+
54
+ ### `centerNode()`
55
+
56
+ Manually triggers the centering and scaling logic for the current node. This is particularly useful for `omdEquationSequenceNode` instances to align them by their equals signs, and for ensuring content fits within the container based on `autoScale` and `maxScale` options.
57
+
58
+ ### `fitToContent()`
59
+
60
+ Adjusts the SVG container's dimensions to tightly fit the rendered content, adding a small padding. This is useful for generating images or when the display needs to precisely match the content size.
61
+
62
+ ### `setFontSize(size)`
63
+
64
+ Updates the base font size for the currently displayed node and for any future content rendered. This will trigger a re-layout and re-centering.
65
+
66
+ - **`size`** (`number`): The new font size in pixels.
67
+
68
+ ### `setFont(fontFamily, fontWeight)`
69
+
70
+ Applies a specific font family and weight to all text elements within the rendered SVG. This setting is also stored for future content.
71
+
72
+ - **`fontFamily`** (`string`): CSS `font-family` string (e.g., `'"Shantell Sans", cursive'`).
73
+ - **`fontWeight`** (`string`, optional): CSS `font-weight` (e.g., `'400'`, `'bold'`). Default: `'400'`.
74
+
75
+ ### `clear()`
76
+
77
+ Removes the current expression from the display.
78
+
79
+ ### `destroy()`
80
+
81
+ Cleans up the component, removing all DOM elements and detaching the resize observer.
82
+
83
+ ## Internal Methods
84
+
85
+ - **`_setupSVG()`**: Initializes the main SVG element, sets its viewBox, and attaches a `ResizeObserver` to the container.
86
+ - **`_handleResize()`**: Callback for the `ResizeObserver` that updates the SVG viewBox and re-centers the content on container resize.
87
+ - **`_repositionOverlayToolbar()`**: Positions any overlay toolbars associated with the current node (e.g., for interactive step visualizers).
@@ -1,161 +1,174 @@
1
- # omdEquationNode
2
-
3
- Represents a mathematical equation, which consists of a left side, a right side, and an equals sign. This class provides extensive functionality for manipulating the equation, such as applying operations to both sides, swapping sides, and simplification.
4
-
5
- ## Class: `omdEquationNode extends omdNode`
6
-
7
- ```javascript
8
- import { omdEquationNode } from './omd/nodes/omdEquationNode.js';
9
- ```
10
-
11
- ### Constructor
12
-
13
- ```javascript
14
- new omdEquationNode(ast)
15
- ```
16
-
17
-
18
- **Parameters:**
19
- - `ast` {Object} - The math.js Abstract Syntax Tree (AST) for the equation. Typically an `AssignmentNode` with `object` (left side) and `value` (right side) properties, but can also be an `OperatorNode` with two arguments.
20
-
21
- ### Static Methods
22
-
23
-
24
- #### `fromString(equationString)`
25
- Creates an `omdEquationNode` instance from a string representation of an equation.
26
-
27
- ```javascript
28
- const equation = omdEquationNode.fromString('2x + 4 = 10');
29
- ```
30
- - **Parameters:**
31
- - `equationString` {string} - The string to parse (e.g., "2x+4=10").
32
- - **Returns:** `omdEquationNode` A new instance of `omdEquationNode`.
33
- - **Throws:** Error if the string is not a valid equation (must contain exactly one '=' and both sides must be non-empty).
34
-
35
- ### Properties
36
-
37
- Inherits all properties from [`omdNode`](./omdNode.md), plus:
38
-
39
- #### `left`
40
- - **Type:** [`omdNode`](./omdNode.md)
41
- - **Description:** The node representing the left side of the equation.
42
-
43
- #### `right`
44
- - **Type:** [`omdNode`](./omdNode.md)
45
- - **Description:** The node representing the right side of the equation.
46
-
47
- #### `equalsSign`
48
- - **Type:** [`omdOperatorNode`](./omdOperatorNode.md)
49
- - **Description:** The node for the equals sign.
50
-
51
- ### Methods
52
-
53
- Inherits all methods from [`omdNode`](./omdNode.md), plus:
54
-
55
-
56
- #### `addToBothSides(value)`
57
- Returns a new equation with a value added to both sides.
58
- - `value` {number|Object} - The value or math.js AST to add.
59
- - **Returns:** `omdEquationNode` A new equation node with the operation applied.
60
-
61
- ---
62
-
63
-
64
- #### `subtractFromBothSides(value)`
65
- Returns a new equation with a value subtracted from both sides.
66
- - `value` {number|Object} - The value or math.js AST to subtract.
67
- - **Returns:** `omdEquationNode` A new equation node.
68
-
69
- ---
70
-
71
-
72
- #### `multiplyBothSides(value)`
73
- Returns a new equation with both sides multiplied by a value.
74
- - `value` {number|Object} - The value or math.js AST to multiply by.
75
- - **Returns:** `omdEquationNode` A new equation node.
76
-
77
- ---
78
-
79
-
80
- #### `divideBothSides(value)`
81
- Returns a new equation with both sides divided by a value.
82
- - `value` {number|Object} - The value or math.js AST to divide by.
83
- - **Returns:** `omdEquationNode` A new equation node.
84
-
85
- ---
86
-
87
-
88
- #### `applyFunction(functionName)`
89
- Applies a function (e.g., `sqrt`, `log`) to both sides of the equation.
90
- - `functionName` {string} - The name of the function to apply.
91
- - **Returns:** `omdEquationNode` A new equation with the function applied to both sides.
92
-
93
- ---
94
-
95
-
96
- #### `applyOperation(value, operation, side = 'both')`
97
- Applies an arithmetic operation to one or both sides of the equation.
98
- - `value` {number|omdNode} - The value to apply.
99
- - `operation` {string} - The operation to perform: 'add', 'subtract', 'multiply', or 'divide'.
100
- - `side` {string} - The side to apply the operation to: 'left', 'right', or 'both'. Defaults to 'both'.
101
- - **Returns:** `omdEquationNode` A new equation node with the operation applied.
102
-
103
- ---
104
-
105
-
106
- #### `swapSides()`
107
- Swaps the left and right sides of the equation.
108
- - **Returns:** `omdEquationNode` A new equation node with the sides swapped.
109
-
110
- ---
111
-
112
-
113
- #### `simplify()`
114
- Simplifies both sides of the equation using the simplification engine.
115
- - **Returns:** `Object` An object containing `{ success, newRoot, message }`.
116
-
117
- ---
118
-
119
-
120
- #### `clone()`
121
- Creates a deep clone of the equation node, preserving its structure and provenance.
122
- - **Returns:** `omdEquationNode` A new, identical instance of the equation node.
123
-
124
- ---
125
-
126
-
127
- #### `toString()`
128
- Converts the equation to its string representation.
129
- - **Returns:** `string` The equation as a string (e.g., "x + 1 = 5").
130
-
131
- ---
132
-
133
-
134
- #### `evaluate(variables)`
135
- Evaluates both sides of the equation with a given set of variables.
136
- - `variables` {Object} - A map of variable names to their numeric values (e.g., `{ x: 2 }`).
137
- - **Returns:** `Object` An object with the evaluated `left` and `right` side values.
138
-
139
- ### Example
140
-
141
- ```javascript
142
- // Create an equation from a string
143
- const equation = omdEquationNode.fromString('2 * (x + 1) = 10');
144
-
145
- // Perform a series of operations
146
- const step1 = equation.divideBothSides(2); // Result: x + 1 = 5
147
- const step2 = step1.subtractFromBothSides(1); // Result: x = 4
148
-
149
- // You can chain these operations
150
- const finalResult = omdEquationNode.fromString('2 * (x + 1) = 10')
151
- .divideBothSides(2)
152
- .subtractFromBothSides(1);
153
-
154
- console.log(finalResult.toString()); // Output: x = 4
155
- ```
156
-
157
- ### See Also
158
-
159
- - [`omdNode`](./omdNode.md) - The base class for all nodes.
160
- - [`omdBinaryExpressionNode`](./omdBinaryExpressionNode.md) - Often used for the sides of the equation.
161
- - [`omdStepVisualizer`](./omdStepVisualizer.md) - For displaying a sequence of equation transformations.
1
+ # omdEquationNode
2
+
3
+ Represents a mathematical equation, consisting of a left side, a right side, and an equals sign. This class provides extensive functionality for manipulating the equation, such as applying operations to both sides, swapping sides, simplification, and rendering to various visualization formats.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdEquationNode extends omdNode
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdEquationNode(ast)`
14
+
15
+ Creates a new `omdEquationNode` instance.
16
+
17
+ - **`ast`** (`object`): The math.js Abstract Syntax Tree (AST) for the equation. It typically expects an `AssignmentNode` (with `object` for the left side and `value` for the right side) or an `OperatorNode` (with `op: '='` and two arguments).
18
+
19
+ ## Static Methods
20
+
21
+ ### `fromString(equationString)`
22
+
23
+ Creates an `omdEquationNode` instance from a string representation of an equation.
24
+
25
+ - **`equationString`** (`string`): The string to parse (e.g., `"2x + 4 = 10"`).
26
+ - **Returns**: `omdEquationNode` - A new instance of `omdEquationNode`.
27
+ - **Throws**: `Error` if the string is not a valid equation (must contain exactly one `'='` and both sides must be non-empty).
28
+
29
+ ## Public Properties
30
+
31
+ - **`left`** ([`omdNode`](./omdNode.md)): The node representing the left side of the equation.
32
+ - **`right`** ([`omdNode`](./omdNode.md)): The node representing the right side of the equation.
33
+ - **`equalsSign`** ([`omdOperatorNode`](./omdOperatorNode.md)): The node for the equals sign.
34
+
35
+ ## Public Methods
36
+
37
+ ### `addToBothSides(value)`
38
+
39
+ Returns a new equation with a value added to both sides.
40
+
41
+ - **`value`** (`number` | `object`): The value (number or math.js AST) to add.
42
+ - **Returns**: `omdEquationNode` - A new equation node with the operation applied.
43
+
44
+ ### `subtractFromBothSides(value)`
45
+
46
+ Returns a new equation with a value subtracted from both sides.
47
+
48
+ - **`value`** (`number` | `object`): The value (number or math.js AST) to subtract.
49
+ - **Returns**: `omdEquationNode` - A new equation node.
50
+
51
+ ### `multiplyBothSides(value)`
52
+
53
+ Returns a new equation with both sides multiplied by a value.
54
+
55
+ - **`value`** (`number` | `object`): The value (number or math.js AST) to multiply by.
56
+ - **Returns**: `omdEquationNode` - A new equation node.
57
+
58
+ ### `divideBothSides(value)`
59
+
60
+ Returns a new equation with both sides divided by a value.
61
+
62
+ - **`value`** (`number` | `object`): The value (number or math.js AST) to divide by.
63
+ - **Returns**: `omdEquationNode` - A new equation node.
64
+
65
+ ### `applyFunction(functionName)`
66
+
67
+ Applies a function (e.g., `sqrt`, `log`) to both sides of the equation.
68
+
69
+ - **`functionName`** (`string`): The name of the function to apply.
70
+ - **Returns**: `omdEquationNode` - A new equation with the function applied to both sides.
71
+
72
+ ### `applyOperation(value, operation, side = 'both')`
73
+
74
+ Applies an arithmetic operation to one or both sides of the equation.
75
+
76
+ - **`value`** (`number` | `omdNode`): The value to apply.
77
+ - **`operation`** (`string`): The operation to perform: `'add'`, `'subtract'`, `'multiply'`, or `'divide'`.
78
+ - **`side`** (`string`): The side to apply the operation to: `'left'`, `'right'`, or `'both'`. Defaults to `'both'`.
79
+ - **Returns**: `omdEquationNode` - A new equation node with the operation applied.
80
+
81
+ ### `swapSides()`
82
+
83
+ Swaps the left and right sides of the equation.
84
+
85
+ - **Returns**: `omdEquationNode` - A new equation node with the sides swapped.
86
+
87
+ ### `simplify()`
88
+
89
+ Simplifies both sides of the equation using the simplification engine.
90
+
91
+ - **Returns**: `object` - An object containing `{ success, newRoot, message }`.
92
+
93
+ ### `clone()`
94
+
95
+ Creates a deep clone of the equation node, preserving its structure and provenance.
96
+
97
+ - **Returns**: `omdEquationNode` - A new, identical instance of the equation node.
98
+
99
+ ### `toString()`
100
+
101
+ Converts the equation to its string representation.
102
+
103
+ - **Returns**: `string` - The equation as a string (e.g., `"x + 1 = 5"`).
104
+
105
+ ### `evaluate(variables)`
106
+
107
+ Evaluates both sides of the equation with a given set of variables.
108
+
109
+ - **`variables`** (`object`): A map of variable names to their numeric values (e.g., `{ x: 2 }`).
110
+ - **Returns**: `object` - An object with the evaluated `left` and `right` side values.
111
+
112
+ ### `setBackgroundStyle(style)`
113
+
114
+ Configures the background styling for the equation node. This can include `backgroundColor`, `cornerRadius`, and `pill` (for a pill-shaped background).
115
+
116
+ - **`style`** (`object`): An object containing style properties.
117
+
118
+ ### `getEqualsAnchorX()`
119
+
120
+ Returns the horizontal X-coordinate of the center of the equals sign relative to this node's origin. Useful for aligning equations in a sequence.
121
+
122
+ - **Returns**: `number`.
123
+
124
+ ### `getBackgroundPaddingX()`
125
+
126
+ Returns the horizontal padding applied by the background style.
127
+
128
+ - **Returns**: `number`.
129
+
130
+ ### `getEffectiveBackgroundPaddingX()`
131
+
132
+ Returns the effective horizontal padding used in layout, accounting for factors like pill clamping.
133
+
134
+ - **Returns**: `number`.
135
+
136
+ ### `renderTo(visualizationType, options)`
137
+
138
+ Renders the equation to different visualization formats (e.g., graph, table, balance hanger, tile equation).
139
+
140
+ - **`visualizationType`** (`string`): The type of visualization (`"graph"`, `"table"`, `"hanger"`, `"tileequation"`).
141
+ - **`options`** (`object`, optional): Configuration options specific to the visualization type.
142
+ - **Returns**: `object` - A JSON object conforming to the schemas defined in `src/json-schemas.md`.
143
+
144
+ ### `getLeft()`
145
+
146
+ Returns the `omdNode` representing the left side of the equation.
147
+
148
+ - **Returns**: `omdNode`.
149
+
150
+ ### `getRight()`
151
+
152
+ Returns the `omdNode` representing the right side of the equation.
153
+
154
+ - **Returns**: `omdNode`.
155
+
156
+ ## Internal Methods
157
+
158
+ - **`_applyOperation(value, op, fn)`**: Internal helper for applying arithmetic operations to both sides.
159
+ - **`_needsParenthesesForOperation(node, operation)`**: Determines if a child node needs parentheses when an operation is applied, based on operator precedence.
160
+ - **`_createNodeFromValue(value)`**: Converts a number or math.js AST into an appropriate `omdNode`.
161
+ - **`_establishGranularProvenance(newNode, originalNode, operationValue, operation)`**: Manages provenance tracking for equation operations, linking new nodes to their origins.
162
+ - **`_isMultiplicationOperation(node)`**: Checks if a given node represents a multiplication operation.
163
+ - **`_copyProvenanceStructure(target, source)`**: Recursively copies provenance information from a source node to a target node.
164
+ - **`_createFunctionNode(functionName, argument)`**: Creates an `omdFunctionNode` wrapping a given argument.
165
+ - **`_createNewEquation(left, right)`**: Creates a new `omdEquationNode` from two `omdNode` instances.
166
+ - **`_getEffectivePadding(contentHeight)`**: Computes effective padding for background styling, considering pill radius clamping.
167
+ - **`_applyPillToDescendants()`**: Applies pill-shaped corner radius to all descendant nodes' backgrounds when the parent equation uses a pill style.
168
+ - **`_matchChildBackgrounds(color)`**: Hides child node backgrounds by setting their color to match the parent equation's background.
169
+ - **`_renderToGraph(options)`**: Generates JSON for a coordinate plane graph visualization.
170
+ - **`_renderToTable(options)`**: Generates JSON for a table visualization.
171
+ - **`_renderSingleSideTable(side, title, options)`**: Helper for generating tables for a single side of the equation.
172
+ - **`_renderToHanger()`**: Generates JSON for a balance hanger visualization.
173
+ - **`_normalizeExpressionString(expr)`**: Normalizes expression strings for evaluation/graphing (e.g., inserts `*` for implicit multiplication).
174
+ - **`_convertToHangerValues(node)`**: Converts an equation side into values suitable for a balance hanger visualization.