@teachinglab/omd 0.5.7 → 0.6.0
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 +190 -77
- package/README.old.md +138 -0
- package/index.js +3 -0
- package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -0
- package/npm-docs/README.md +251 -0
- package/npm-docs/api/api-reference.md +85 -0
- package/npm-docs/api/configuration-options.md +198 -0
- package/npm-docs/api/eventManager.md +83 -0
- package/npm-docs/api/expression-nodes.md +561 -0
- package/npm-docs/api/focusFrameManager.md +145 -0
- package/npm-docs/api/index.md +106 -0
- package/npm-docs/api/main.md +63 -0
- package/npm-docs/api/omdBinaryExpressionNode.md +86 -0
- package/npm-docs/api/omdCanvas.md +84 -0
- package/npm-docs/api/omdConfigManager.md +113 -0
- package/npm-docs/api/omdConstantNode.md +53 -0
- package/npm-docs/api/omdDisplay.md +87 -0
- package/npm-docs/api/omdEquationNode.md +174 -0
- package/npm-docs/api/omdEquationSequenceNode.md +259 -0
- package/npm-docs/api/omdEquationStack.md +193 -0
- package/npm-docs/api/omdFunctionNode.md +83 -0
- package/npm-docs/api/omdGroupNode.md +79 -0
- package/npm-docs/api/omdHelpers.md +88 -0
- package/npm-docs/api/omdLeafNode.md +86 -0
- package/npm-docs/api/omdNode.md +202 -0
- package/npm-docs/api/omdOperationDisplayNode.md +118 -0
- package/npm-docs/api/omdOperatorNode.md +92 -0
- package/npm-docs/api/omdParenthesisNode.md +134 -0
- package/npm-docs/api/omdPopup.md +192 -0
- package/npm-docs/api/omdPowerNode.md +132 -0
- package/npm-docs/api/omdRationalNode.md +145 -0
- package/npm-docs/api/omdSequenceNode.md +128 -0
- package/npm-docs/api/omdSimplification.md +79 -0
- package/npm-docs/api/omdSqrtNode.md +144 -0
- package/npm-docs/api/omdStepVisualizer.md +147 -0
- package/npm-docs/api/omdStepVisualizerHighlighting.md +66 -0
- package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +109 -0
- package/npm-docs/api/omdStepVisualizerLayout.md +71 -0
- package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -0
- package/npm-docs/api/omdStepVisualizerTextBoxes.md +77 -0
- package/npm-docs/api/omdToolbar.md +131 -0
- package/npm-docs/api/omdTranscriptionService.md +96 -0
- package/npm-docs/api/omdTreeDiff.md +170 -0
- package/npm-docs/api/omdUnaryExpressionNode.md +137 -0
- package/npm-docs/api/omdUtilities.md +83 -0
- package/npm-docs/api/omdVariableNode.md +123 -0
- package/npm-docs/api/selectTool.md +74 -0
- package/npm-docs/api/simplificationEngine.md +98 -0
- package/npm-docs/api/simplificationRules.md +77 -0
- package/npm-docs/api/simplificationUtils.md +64 -0
- package/npm-docs/api/transcribe.md +43 -0
- package/npm-docs/guides/equations.md +854 -0
- package/npm-docs/guides/factory-functions.md +354 -0
- package/npm-docs/guides/getting-started.md +318 -0
- package/npm-docs/guides/quick-examples.md +525 -0
- package/npm-docs/guides/visualizations.md +682 -0
- package/npm-docs/json-schemas.md +826 -0
- package/omd/utils/omdTranscriptionService.js +1 -1
- package/package.json +4 -3
- package/src/index.js +2 -0
- package/src/omdFactory.js +150 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# Factory Functions
|
|
2
|
+
|
|
3
|
+
OMD provides factory functions to simplify creating objects from JSON data. This eliminates the need for large switch statements when working with dynamic data or AI-generated JSON.
|
|
4
|
+
|
|
5
|
+
## createFromJSON
|
|
6
|
+
|
|
7
|
+
The main factory function that creates OMD objects from JSON data.
|
|
8
|
+
|
|
9
|
+
### Usage
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
13
|
+
|
|
14
|
+
const jsonData = {
|
|
15
|
+
omdType: 'numberLine',
|
|
16
|
+
min: 0,
|
|
17
|
+
max: 10,
|
|
18
|
+
dotValues: [2, 5, 8]
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const omdObject = createFromJSON(jsonData);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Parameters
|
|
25
|
+
|
|
26
|
+
- **jsonData** (object): JSON object with an `omdType` field and component-specific properties
|
|
27
|
+
|
|
28
|
+
### Returns
|
|
29
|
+
|
|
30
|
+
- **object**: The created OMD object with data already loaded via `loadFromJSON()`
|
|
31
|
+
|
|
32
|
+
### Throws
|
|
33
|
+
|
|
34
|
+
- **Error**: If `omdType` is missing or unsupported
|
|
35
|
+
|
|
36
|
+
### Supported Types
|
|
37
|
+
|
|
38
|
+
The factory supports all OMD visualization and mathematical components:
|
|
39
|
+
|
|
40
|
+
**Visualizations:**
|
|
41
|
+
- `balanceHanger`
|
|
42
|
+
- `table`
|
|
43
|
+
- `tapeDiagram`
|
|
44
|
+
- `coordinatePlane`
|
|
45
|
+
- `numberLine`
|
|
46
|
+
- `numberTile`
|
|
47
|
+
- `ratioChart`
|
|
48
|
+
- `tileEquation`
|
|
49
|
+
- `spinner`
|
|
50
|
+
|
|
51
|
+
**Mathematical Components:**
|
|
52
|
+
- `equation`
|
|
53
|
+
- `expression`
|
|
54
|
+
- `term`
|
|
55
|
+
- `number`
|
|
56
|
+
- `variable`
|
|
57
|
+
- `powerExpression`
|
|
58
|
+
- `rationalExpression`
|
|
59
|
+
- `function`
|
|
60
|
+
|
|
61
|
+
**Geometric Shapes:**
|
|
62
|
+
- `rightTriangle`
|
|
63
|
+
- `isoscelesTriangle`
|
|
64
|
+
- `rectangle`
|
|
65
|
+
- `ellipse`
|
|
66
|
+
- `circle`
|
|
67
|
+
- `regularPolygon`
|
|
68
|
+
|
|
69
|
+
## Examples
|
|
70
|
+
|
|
71
|
+
### Creating a Number Line
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
75
|
+
|
|
76
|
+
const numberLine = createFromJSON({
|
|
77
|
+
omdType: 'numberLine',
|
|
78
|
+
min: 0,
|
|
79
|
+
max: 20,
|
|
80
|
+
dotValues: [5, 10, 15],
|
|
81
|
+
label: 'Skip Counting by 5'
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Add to SVG
|
|
85
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
86
|
+
svg.setAttribute("width", numberLine.width);
|
|
87
|
+
svg.setAttribute("height", numberLine.height);
|
|
88
|
+
svg.appendChild(numberLine.svgObject);
|
|
89
|
+
document.body.appendChild(svg);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Creating a Coordinate Plane
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
const plane = createFromJSON({
|
|
96
|
+
omdType: 'coordinatePlane',
|
|
97
|
+
xMin: -10,
|
|
98
|
+
xMax: 10,
|
|
99
|
+
yMin: -10,
|
|
100
|
+
yMax: 10,
|
|
101
|
+
graphEquations: [
|
|
102
|
+
{ equation: 'y = x^2 - 4', color: '#e11d48', strokeWidth: 2 }
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Creating an Equation
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
const equation = createFromJSON({
|
|
111
|
+
omdType: 'equation',
|
|
112
|
+
equation: '2x + 3 = 11'
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Working with AI-Generated JSON
|
|
117
|
+
|
|
118
|
+
The factory function is especially useful when working with AI-generated content:
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
122
|
+
|
|
123
|
+
async function generateVisualization(userRequest) {
|
|
124
|
+
// Call AI API
|
|
125
|
+
const response = await fetch(
|
|
126
|
+
`https://your-api.com/generate?topic=${encodeURIComponent(userRequest)}`
|
|
127
|
+
);
|
|
128
|
+
const jsonData = await response.json();
|
|
129
|
+
|
|
130
|
+
// Create OMD object - no switch statement needed!
|
|
131
|
+
const omdObject = createFromJSON(jsonData);
|
|
132
|
+
|
|
133
|
+
// Render to SVG
|
|
134
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
135
|
+
svg.setAttribute("width", omdObject.width || 400);
|
|
136
|
+
svg.setAttribute("height", omdObject.height || 500);
|
|
137
|
+
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
138
|
+
svg.appendChild(omdObject.svgObject);
|
|
139
|
+
|
|
140
|
+
return svg;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Usage
|
|
144
|
+
const svg = await generateVisualization("number line from 0 to 10");
|
|
145
|
+
document.getElementById('container').appendChild(svg);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Helper Functions
|
|
149
|
+
|
|
150
|
+
### getSupportedTypes
|
|
151
|
+
|
|
152
|
+
Returns an array of all supported OMD types.
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
import { getSupportedTypes } from '@teachinglab/omd';
|
|
156
|
+
|
|
157
|
+
const types = getSupportedTypes();
|
|
158
|
+
console.log(types);
|
|
159
|
+
// ['balanceHanger', 'table', 'coordinatePlane', 'numberLine', ...]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### isTypeSupported
|
|
163
|
+
|
|
164
|
+
Checks if a given type is supported.
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
import { isTypeSupported } from '@teachinglab/omd';
|
|
168
|
+
|
|
169
|
+
if (isTypeSupported('numberLine')) {
|
|
170
|
+
console.log('Number lines are supported!');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (!isTypeSupported('customType')) {
|
|
174
|
+
console.log('This type is not supported');
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Before and After
|
|
179
|
+
|
|
180
|
+
### Before (Without Factory)
|
|
181
|
+
|
|
182
|
+
```javascript
|
|
183
|
+
import {
|
|
184
|
+
omdBalanceHanger,
|
|
185
|
+
omdTable,
|
|
186
|
+
omdNumberLine,
|
|
187
|
+
// ... 20+ more imports
|
|
188
|
+
} from '@teachinglab/omd';
|
|
189
|
+
|
|
190
|
+
let omdObject;
|
|
191
|
+
|
|
192
|
+
switch (jsonData.omdType) {
|
|
193
|
+
case 'balanceHanger':
|
|
194
|
+
omdObject = new omdBalanceHanger();
|
|
195
|
+
break;
|
|
196
|
+
case 'table':
|
|
197
|
+
omdObject = new omdTable();
|
|
198
|
+
break;
|
|
199
|
+
case 'numberLine':
|
|
200
|
+
omdObject = new omdNumberLine();
|
|
201
|
+
break;
|
|
202
|
+
// ... 20+ more cases
|
|
203
|
+
default:
|
|
204
|
+
throw new Error(`Unsupported type: ${jsonData.omdType}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
omdObject.loadFromJSON(jsonData);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### After (With Factory)
|
|
211
|
+
|
|
212
|
+
```javascript
|
|
213
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
214
|
+
|
|
215
|
+
const omdObject = createFromJSON(jsonData);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Much cleaner!
|
|
219
|
+
|
|
220
|
+
## Error Handling
|
|
221
|
+
|
|
222
|
+
The factory function provides clear error messages:
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
// Missing omdType
|
|
229
|
+
const obj1 = createFromJSON({ min: 0, max: 10 });
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.error(error.message);
|
|
232
|
+
// "JSON data must include an 'omdType' field"
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
// Unsupported type
|
|
237
|
+
const obj2 = createFromJSON({ omdType: 'unknownType' });
|
|
238
|
+
} catch (error) {
|
|
239
|
+
console.error(error.message);
|
|
240
|
+
// "Unsupported omdType: 'unknownType'. Supported types: balanceHanger, table, ..."
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## TypeScript Support
|
|
245
|
+
|
|
246
|
+
If using TypeScript, you can type the return value:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
250
|
+
import type { omdNumberLine } from '@teachinglab/omd';
|
|
251
|
+
|
|
252
|
+
const jsonData = {
|
|
253
|
+
omdType: 'numberLine',
|
|
254
|
+
min: 0,
|
|
255
|
+
max: 10
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const numberLine = createFromJSON(jsonData) as omdNumberLine;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Best Practices
|
|
262
|
+
|
|
263
|
+
### 1. Always Include omdType
|
|
264
|
+
|
|
265
|
+
Ensure your JSON data includes the `omdType` field:
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
const jsonData = {
|
|
269
|
+
omdType: 'coordinatePlane', // Required!
|
|
270
|
+
xMin: -10,
|
|
271
|
+
xMax: 10
|
|
272
|
+
};
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 2. Validate Types Before Creation
|
|
276
|
+
|
|
277
|
+
For dynamic data, validate the type first:
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
import { isTypeSupported, createFromJSON } from '@teachinglab/omd';
|
|
281
|
+
|
|
282
|
+
if (isTypeSupported(jsonData.omdType)) {
|
|
283
|
+
const omdObject = createFromJSON(jsonData);
|
|
284
|
+
} else {
|
|
285
|
+
console.error(`Type ${jsonData.omdType} is not supported`);
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 3. Use with Display System
|
|
290
|
+
|
|
291
|
+
Combine with the display system for easy rendering:
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
import { createFromJSON, omdDisplay } from '@teachinglab/omd';
|
|
295
|
+
|
|
296
|
+
const display = new omdDisplay(document.getElementById('container'));
|
|
297
|
+
const omdObject = createFromJSON(jsonData);
|
|
298
|
+
display.render(omdObject);
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Complete Example
|
|
302
|
+
|
|
303
|
+
Here's a complete example integrating the factory with an AI API:
|
|
304
|
+
|
|
305
|
+
```html
|
|
306
|
+
<!DOCTYPE html>
|
|
307
|
+
<html lang="en">
|
|
308
|
+
<head>
|
|
309
|
+
<meta charset="UTF-8">
|
|
310
|
+
<title>OMD Factory Example</title>
|
|
311
|
+
</head>
|
|
312
|
+
<body>
|
|
313
|
+
<input type="text" id="input" placeholder="Describe what to visualize" />
|
|
314
|
+
<button id="generate">Generate</button>
|
|
315
|
+
<div id="container"></div>
|
|
316
|
+
|
|
317
|
+
<script type="module">
|
|
318
|
+
import { createFromJSON } from '@teachinglab/omd';
|
|
319
|
+
|
|
320
|
+
document.getElementById('generate').addEventListener('click', async () => {
|
|
321
|
+
const request = document.getElementById('input').value;
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
// Get JSON from AI API
|
|
325
|
+
const response = await fetch(`/api/generate?q=${encodeURIComponent(request)}`);
|
|
326
|
+
const jsonData = await response.json();
|
|
327
|
+
|
|
328
|
+
// Create OMD object
|
|
329
|
+
const omdObject = createFromJSON(jsonData);
|
|
330
|
+
|
|
331
|
+
// Render to SVG
|
|
332
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
333
|
+
svg.setAttribute("width", omdObject.width || 400);
|
|
334
|
+
svg.setAttribute("height", omdObject.height || 500);
|
|
335
|
+
svg.setAttribute("viewBox", omdObject.svgObject.getAttribute("viewBox"));
|
|
336
|
+
svg.appendChild(omdObject.svgObject);
|
|
337
|
+
|
|
338
|
+
// Add to page
|
|
339
|
+
document.getElementById('container').innerHTML = '';
|
|
340
|
+
document.getElementById('container').appendChild(svg);
|
|
341
|
+
} catch (error) {
|
|
342
|
+
console.error('Error:', error.message);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
</script>
|
|
346
|
+
</body>
|
|
347
|
+
</html>
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## See Also
|
|
351
|
+
|
|
352
|
+
- [JSON Schemas](../json-schemas.md) - Complete JSON reference for all components
|
|
353
|
+
- [Getting Started](./getting-started.md) - Basic setup and usage
|
|
354
|
+
- [API Reference](../api/api-reference.md) - Detailed API documentation
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Getting Started with OMD
|
|
2
|
+
|
|
3
|
+
This guide will help you install and start using OMD (Open Math Display) in your project.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### Using npm
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @teachinglab/omd
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Using yarn
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
yarn add @teachinglab/omd
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Basic Setup
|
|
20
|
+
|
|
21
|
+
### 1. Import OMD
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
import { omdDisplay } from '@teachinglab/omd';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. Create a Container
|
|
28
|
+
|
|
29
|
+
Add a container element to your HTML:
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<div id="math-container"></div>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. Initialize and Render
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
// Get the container element
|
|
39
|
+
const container = document.getElementById('math-container');
|
|
40
|
+
|
|
41
|
+
// Create a display instance
|
|
42
|
+
const display = new omdDisplay(container);
|
|
43
|
+
|
|
44
|
+
// Render an equation
|
|
45
|
+
display.render('2x + 3 = 11');
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Complete Example
|
|
49
|
+
|
|
50
|
+
Here's a complete HTML file with OMD:
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<!DOCTYPE html>
|
|
54
|
+
<html lang="en">
|
|
55
|
+
<head>
|
|
56
|
+
<meta charset="UTF-8">
|
|
57
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
58
|
+
<title>OMD Example</title>
|
|
59
|
+
<style>
|
|
60
|
+
body {
|
|
61
|
+
font-family: 'Albert Sans', sans-serif;
|
|
62
|
+
padding: 20px;
|
|
63
|
+
}
|
|
64
|
+
#math-container {
|
|
65
|
+
width: 100%;
|
|
66
|
+
height: 400px;
|
|
67
|
+
border: 1px solid #ccc;
|
|
68
|
+
border-radius: 8px;
|
|
69
|
+
}
|
|
70
|
+
</style>
|
|
71
|
+
</head>
|
|
72
|
+
<body>
|
|
73
|
+
<h1>My First OMD App</h1>
|
|
74
|
+
<div id="math-container"></div>
|
|
75
|
+
|
|
76
|
+
<script type="module">
|
|
77
|
+
import { omdDisplay, omdEquationNode } from '@teachinglab/omd';
|
|
78
|
+
|
|
79
|
+
const container = document.getElementById('math-container');
|
|
80
|
+
const display = new omdDisplay(container);
|
|
81
|
+
|
|
82
|
+
// Create and render an equation
|
|
83
|
+
const equation = omdEquationNode.fromString('2x + 3 = 11');
|
|
84
|
+
display.render(equation);
|
|
85
|
+
</script>
|
|
86
|
+
</body>
|
|
87
|
+
</html>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Common Use Cases
|
|
91
|
+
|
|
92
|
+
### Rendering Different Components
|
|
93
|
+
|
|
94
|
+
#### 1. Simple Equation
|
|
95
|
+
|
|
96
|
+
```javascript
|
|
97
|
+
import { omdDisplay } from '@teachinglab/omd';
|
|
98
|
+
|
|
99
|
+
const display = new omdDisplay(container);
|
|
100
|
+
display.render('x + 5 = 10');
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### 2. Expression
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
import { omdExpression } from '@teachinglab/omd';
|
|
107
|
+
|
|
108
|
+
const expr = new omdExpression();
|
|
109
|
+
expr.loadFromJSON("3x^2 + 5x - 2");
|
|
110
|
+
display.render(expr);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
#### 3. Number Line
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
import { omdNumberLine } from '@teachinglab/omd';
|
|
117
|
+
|
|
118
|
+
const numberLine = new omdNumberLine();
|
|
119
|
+
numberLine.loadFromJSON({
|
|
120
|
+
min: 0,
|
|
121
|
+
max: 10,
|
|
122
|
+
dotValues: [2, 5, 8],
|
|
123
|
+
label: "Number Line"
|
|
124
|
+
});
|
|
125
|
+
display.render(numberLine);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### 4. Coordinate Plane
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
import { omdCoordinatePlane } from '@teachinglab/omd';
|
|
132
|
+
|
|
133
|
+
const plane = new omdCoordinatePlane();
|
|
134
|
+
plane.loadFromJSON({
|
|
135
|
+
xMin: -10,
|
|
136
|
+
xMax: 10,
|
|
137
|
+
yMin: -10,
|
|
138
|
+
yMax: 10,
|
|
139
|
+
graphEquations: [
|
|
140
|
+
{ equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 }
|
|
141
|
+
]
|
|
142
|
+
});
|
|
143
|
+
display.render(plane);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### 5. Step-by-Step Solution
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
import { omdEquationStack, omdEquationNode } from '@teachinglab/omd';
|
|
150
|
+
|
|
151
|
+
const steps = [
|
|
152
|
+
omdEquationNode.fromString('2x + 3 = 11'),
|
|
153
|
+
omdEquationNode.fromString('2x = 8'),
|
|
154
|
+
omdEquationNode.fromString('x = 4')
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
const stack = new omdEquationStack(steps, {
|
|
158
|
+
toolbar: true,
|
|
159
|
+
stepVisualizer: true
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
display.render(stack);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Configuration
|
|
166
|
+
|
|
167
|
+
### Display Options
|
|
168
|
+
|
|
169
|
+
You can configure the display when creating it:
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
const display = new omdDisplay(container, {
|
|
173
|
+
fontSize: 36,
|
|
174
|
+
centerContent: true,
|
|
175
|
+
fontFamily: 'Albert Sans'
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Global Configuration
|
|
180
|
+
|
|
181
|
+
OMD uses a global configuration manager:
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
import { omdConfigManager } from '@teachinglab/omd';
|
|
185
|
+
|
|
186
|
+
// Update global settings
|
|
187
|
+
omdConfigManager.setConfig({
|
|
188
|
+
defaultFontSize: 32,
|
|
189
|
+
defaultColor: '#333333',
|
|
190
|
+
highlightColor: '#FFD700'
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Loading from JSON
|
|
195
|
+
|
|
196
|
+
Most OMD components can be loaded from JSON:
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
import { omdTable } from '@teachinglab/omd';
|
|
200
|
+
|
|
201
|
+
const table = new omdTable();
|
|
202
|
+
table.loadFromJSON({
|
|
203
|
+
equation: "y = x^2",
|
|
204
|
+
headers: ["x", "y"],
|
|
205
|
+
xMin: -5,
|
|
206
|
+
xMax: 5,
|
|
207
|
+
stepSize: 1,
|
|
208
|
+
title: "Quadratic Function"
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
display.render(table);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
See the [JSON Schemas documentation](../json-schemas.md) for complete JSON specifications.
|
|
215
|
+
|
|
216
|
+
## Using with Build Tools
|
|
217
|
+
|
|
218
|
+
### Vite
|
|
219
|
+
|
|
220
|
+
OMD works seamlessly with Vite:
|
|
221
|
+
|
|
222
|
+
```javascript
|
|
223
|
+
// main.js
|
|
224
|
+
import { omdDisplay } from '@teachinglab/omd';
|
|
225
|
+
|
|
226
|
+
const display = new omdDisplay(document.getElementById('app'));
|
|
227
|
+
display.render('2x + 3 = 11');
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Webpack
|
|
231
|
+
|
|
232
|
+
Configure Webpack to handle ES modules:
|
|
233
|
+
|
|
234
|
+
```javascript
|
|
235
|
+
// webpack.config.js
|
|
236
|
+
module.exports = {
|
|
237
|
+
// ... other config
|
|
238
|
+
resolve: {
|
|
239
|
+
extensions: ['.js']
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### React
|
|
245
|
+
|
|
246
|
+
OMD can be used with React using refs:
|
|
247
|
+
|
|
248
|
+
```jsx
|
|
249
|
+
import React, { useEffect, useRef } from 'react';
|
|
250
|
+
import { omdDisplay } from '@teachinglab/omd';
|
|
251
|
+
|
|
252
|
+
function MathComponent() {
|
|
253
|
+
const containerRef = useRef(null);
|
|
254
|
+
|
|
255
|
+
useEffect(() => {
|
|
256
|
+
if (containerRef.current) {
|
|
257
|
+
const display = new omdDisplay(containerRef.current);
|
|
258
|
+
display.render('2x + 3 = 11');
|
|
259
|
+
}
|
|
260
|
+
}, []);
|
|
261
|
+
|
|
262
|
+
return <div ref={containerRef} style={{ width: '100%', height: '400px' }} />;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export default MathComponent;
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Next Steps
|
|
269
|
+
|
|
270
|
+
Now that you have OMD installed and working, explore these resources:
|
|
271
|
+
|
|
272
|
+
1. **[Visualizations Guide](./visualizations.md)** - Learn about all visual components
|
|
273
|
+
2. **[Equations Guide](./equations.md)** - Master equations and expressions
|
|
274
|
+
3. **[JSON Schemas](../json-schemas.md)** - Complete component reference
|
|
275
|
+
4. **[API Reference](../api/api-reference.md)** - Detailed API documentation
|
|
276
|
+
5. **[Examples](./quick-examples.md)** - More code examples
|
|
277
|
+
|
|
278
|
+
## Troubleshooting
|
|
279
|
+
|
|
280
|
+
### Module not found
|
|
281
|
+
|
|
282
|
+
If you get "Module not found" errors, ensure:
|
|
283
|
+
- OMD is installed: `npm install @teachinglab/omd`
|
|
284
|
+
- Your bundler supports ES modules
|
|
285
|
+
- Import paths are correct
|
|
286
|
+
|
|
287
|
+
### Display not rendering
|
|
288
|
+
|
|
289
|
+
If the display doesn't appear:
|
|
290
|
+
- Check that the container element exists in the DOM
|
|
291
|
+
- Ensure the container has width and height
|
|
292
|
+
- Check browser console for errors
|
|
293
|
+
|
|
294
|
+
### Style issues
|
|
295
|
+
|
|
296
|
+
For best results:
|
|
297
|
+
- Use `Albert Sans` font family
|
|
298
|
+
- Ensure adequate container dimensions
|
|
299
|
+
- Check that SVG rendering is supported in your browser
|
|
300
|
+
|
|
301
|
+
## Browser Support
|
|
302
|
+
|
|
303
|
+
OMD requires:
|
|
304
|
+
- Modern browser with ES6 support
|
|
305
|
+
- SVG rendering capabilities
|
|
306
|
+
- Native ES modules or a bundler
|
|
307
|
+
|
|
308
|
+
Tested on:
|
|
309
|
+
- Chrome 90+
|
|
310
|
+
- Firefox 88+
|
|
311
|
+
- Safari 14+
|
|
312
|
+
- Edge 90+
|
|
313
|
+
|
|
314
|
+
## Getting Help
|
|
315
|
+
|
|
316
|
+
- **GitHub Issues**: Report bugs or request features
|
|
317
|
+
- **Documentation**: Browse the complete [API Reference](../api/api-reference.md)
|
|
318
|
+
- **Examples**: Check the repository's `/examples` directory
|