omdStepVisualizer
omdStepVisualizer
Visualizes a sequence of mathematical steps (typically equations) and provides interactive explanations for how one step transforms into the next. It extends omdEquationSequenceNode by adding a visual track of dots and lines to the right of the steps, which can be clicked to reveal details about the simplification or operation applied.
Class Hierarchy
omdNode
└─ omdEquationSequenceNode
└─ omdStepVisualizer
See: omdEquationSequenceNode for base sequence functionality.
Constructor
new omdStepVisualizer(steps)
Creates a new omdStepVisualizer instance.
steps(Array<omdNode>): An array of nodes (usuallyomdEquationNode) representing the initial steps in the sequence.
During construction, it initializes internal arrays for stepDots and stepLines, creates a visualContainer for these elements, and sets up managers for highlighting, textBoxes, and layout. It also populates nodeToStepMap for efficient lookup.
Public Properties
stepDots(Array<jsvgEllipse>): An array ofjsvgEllipseobjects representing the clickable dots for each equation step.stepLines(Array<jsvgLine>): An array ofjsvgLineobjects connecting the step dots.visualContainer(jsvgLayoutGroup): ThejsvgLayoutGroupthat holds thestepDotsandstepLines.dotRadius(number): The radius of the step dots, determined byomdConfigManager.lineWidth(number): The stroke width of the connecting lines.visualSpacing(number): The horizontal spacing between the equation sequence and the visual tracker.activeDotIndex(number): The 0-based index of the currently active (clicked) dot.-1if none.dotsClickable(boolean): Controls whether the step dots can be clicked to show explanations. Default:true.nodeToStepMap(Map<string, number>): A map fromomdNodeIDs to their corresponding step index in the sequence.stepVisualizerHighlights(Set<string>): A set of node IDs that are currently highlighted by the visualizer.highlighting(omdStepVisualizerHighlighting): The manager responsible for all highlighting logic.textBoxManager(omdStepVisualizerTextBoxes): The manager responsible for creating, positioning, and removing the explanation text boxes.layoutManager(omdStepVisualizerLayout): The manager responsible for layout and z-ordering of all visual elements.
Public Methods
rebuildVisualizer()
Forces a complete rebuild of the visual elements (dots and lines) from scratch. This is useful after significant changes to the underlying steps array.
addStep(step, options)
Adds a new step to the sequence. This method overrides the base omdEquationSequenceNode.addStep to also create and manage the corresponding visual dot and connecting line for the new step.
step(omdNode|string): The node object or expression string for the step.options(object): Options for the step, such asdescriptionandstepMark(importance level).
getNodeStepNumber(nodeId)
Retrieves the step number (index) associated with a given omdNode ID within the sequence.
nodeId(string): The ID of the node to look up.- Returns:
number|undefined- The 0-based step index, orundefinedif the node is not found within a step.
computeDimensions()
Calculates the overall dimensions of the visualizer, accounting for the width and height of the equation sequence and the additional space required for the visual tracker (dots and lines).
- Overrides:
omdEquationSequenceNode.computeDimensions().
updateLayout()
Updates the layout of the visualizer, positioning both the equation sequence and the visual tracker elements. It delegates to the layoutManager for precise positioning of dots and lines.
- Overrides:
omdEquationSequenceNode.updateLayout().
undoLastOperation()
Removes the most recent operation and its resulting equation from the sequence. This method overrides the base omdEquationSequenceNode.undoLastOperation to also trigger a rebuildVisualizer() to ensure visual elements are synchronized.
- Returns:
boolean-trueif an operation was undone,falseotherwise.
setDotColor(dotIndex, color)
Sets the fill and stroke color of a specific step dot.
dotIndex(number): The index of the dot to color.color(string): The new color.
setLineAboveColor(dotIndex, color)
Sets the stroke color of the line segment directly above a specific step dot.
dotIndex(number): The index of the dot whose preceding line should be colored.color(string): The new color.
setDotsClickable(enabled)
Enables or disables the ability for users to click on the step dots to reveal explanations.
enabled(boolean):trueto enable clicking,falseto disable.
getStepTextBoxes()
Retrieves the array of currently visible explanation text box components managed by the textBoxManager.
- Returns:
Array<omdStepVisualizerTextBox>- The active text box instances.
Internal Methods
_initializeVisualElements(): Creates and initializes the visual dots and lines for all existing equation steps, and populates thenodeToStepMap._createStepDot(equation, index): Creates a singlejsvgEllipserepresenting a step dot, associates it with an equation, and adds it to thevisualContainer._createStepLine(fromIndex, toIndex): Creates ajsvgLineconnecting two step dots and adds it to thevisualContainer._clearVisualElements(): Removes all existing dots, lines, and text boxes from the display and resets internal arrays._handleDotClick(dot, dotIndex): Event handler for when a step dot is clicked. It manages the active dot state, triggers highlighting, and creates/removes explanation text boxes.setActiveDot(dotIndex): Sets a specific dot as the visually active one, changing its color and triggering the display of its explanation text box._clearActiveDot(): Clears the currently active dot, resetting its color, removing its text box, and clearing highlights._getSimplificationDataForDot(dotIndex): Gathers and formats the simplification and operation data relevant to a specific step dot, used to populate the explanation text box._createDefaultSimplificationData(message): Helper to create a default data object for step explanations._findPreviousVisibleEquationIndex(currentIndex): Finds the index of the last visible equation step before the givencurrentIndex._getRelevantSimplifications(simplificationHistory, startIndex, endIndex): Filters the full simplification history to find entries relevant to a specific range of steps._createMultipleSimplificationsData(simplifications): Formats data for displaying multiple simplification events in a single text box._checkForOperationStep(equationIndex): Checks if a step at a given index is anomdOperationDisplayNodeand extracts its data._checkForSingleSimplification(simplificationHistory, equationIndex): Checks for a single simplification entry relevant to a specific step._getFallbackSimplificationData(equationIndex): Provides a default explanation if no specific simplification or operation data is found for a step.
Example
import { omdStepVisualizer } from '@teachinglab/omd';
import { omdEquationNode } from '@teachinglab/omd';
import { omdDisplay } from '@teachinglab/omd';
// 1. Define the steps of a solution (must be omdEquationNode for dots to appear)
const steps = [
omdEquationNode.fromString('2x + 4 = 10'),
omdEquationNode.fromString('2x = 6'),
omdEquationNode.fromString('x = 3')
];
// 2. Create the visualizer
const visualizer = new omdStepVisualizer(steps);
// 3. Add it to a display container
const display = new omdDisplay(document.getElementById('container'));
display.render(visualizer);
// Now the steps will be displayed with interactive dots on the right.
// Only omdEquationNode steps are visualized with dots/lines.
// Clicking the dot next to "2x = 6" will explain that 4 was subtracted from both sides.