@teachinglab/omd 0.6.1 → 0.6.3

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 (198) hide show
  1. package/README.md +257 -251
  2. package/README.old.md +137 -137
  3. package/canvas/core/canvasConfig.js +202 -202
  4. package/canvas/drawing/segment.js +167 -167
  5. package/canvas/drawing/stroke.js +385 -385
  6. package/canvas/events/eventManager.js +444 -444
  7. package/canvas/events/pointerEventHandler.js +262 -262
  8. package/canvas/index.js +48 -48
  9. package/canvas/tools/PointerTool.js +71 -71
  10. package/canvas/tools/tool.js +222 -222
  11. package/canvas/utils/boundingBox.js +377 -377
  12. package/canvas/utils/mathUtils.js +258 -258
  13. package/docs/api/configuration-options.md +198 -198
  14. package/docs/api/eventManager.md +82 -82
  15. package/docs/api/focusFrameManager.md +144 -144
  16. package/docs/api/index.md +105 -105
  17. package/docs/api/main.md +62 -62
  18. package/docs/api/omdBinaryExpressionNode.md +86 -86
  19. package/docs/api/omdCanvas.md +83 -83
  20. package/docs/api/omdConfigManager.md +112 -112
  21. package/docs/api/omdConstantNode.md +52 -52
  22. package/docs/api/omdDisplay.md +87 -87
  23. package/docs/api/omdEquationNode.md +174 -174
  24. package/docs/api/omdEquationSequenceNode.md +258 -258
  25. package/docs/api/omdEquationStack.md +192 -192
  26. package/docs/api/omdFunctionNode.md +82 -82
  27. package/docs/api/omdGroupNode.md +78 -78
  28. package/docs/api/omdHelpers.md +87 -87
  29. package/docs/api/omdLeafNode.md +85 -85
  30. package/docs/api/omdNode.md +201 -201
  31. package/docs/api/omdOperationDisplayNode.md +117 -117
  32. package/docs/api/omdOperatorNode.md +91 -91
  33. package/docs/api/omdParenthesisNode.md +133 -133
  34. package/docs/api/omdPopup.md +191 -191
  35. package/docs/api/omdPowerNode.md +131 -131
  36. package/docs/api/omdRationalNode.md +144 -144
  37. package/docs/api/omdSequenceNode.md +128 -128
  38. package/docs/api/omdSimplification.md +78 -78
  39. package/docs/api/omdSqrtNode.md +144 -144
  40. package/docs/api/omdStepVisualizer.md +146 -146
  41. package/docs/api/omdStepVisualizerHighlighting.md +65 -65
  42. package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  43. package/docs/api/omdStepVisualizerLayout.md +70 -70
  44. package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
  45. package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
  46. package/docs/api/omdToolbar.md +130 -130
  47. package/docs/api/omdTranscriptionService.md +95 -95
  48. package/docs/api/omdTreeDiff.md +169 -169
  49. package/docs/api/omdUnaryExpressionNode.md +137 -137
  50. package/docs/api/omdUtilities.md +82 -82
  51. package/docs/api/omdVariableNode.md +123 -123
  52. package/docs/api/selectTool.md +74 -74
  53. package/docs/api/simplificationEngine.md +97 -97
  54. package/docs/api/simplificationRules.md +76 -76
  55. package/docs/api/simplificationUtils.md +64 -64
  56. package/docs/api/transcribe.md +43 -43
  57. package/docs/api-reference.md +85 -85
  58. package/docs/index.html +453 -453
  59. package/docs/index.md +38 -38
  60. package/docs/omd-objects.md +258 -258
  61. package/index.js +79 -79
  62. package/jsvg/index.js +3 -0
  63. package/jsvg/jsvg.js +898 -898
  64. package/jsvg/jsvgComponents.js +357 -358
  65. package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
  66. package/npm-docs/README.md +251 -251
  67. package/npm-docs/api/api-reference.md +85 -85
  68. package/npm-docs/api/configuration-options.md +198 -198
  69. package/npm-docs/api/eventManager.md +82 -82
  70. package/npm-docs/api/expression-nodes.md +561 -561
  71. package/npm-docs/api/focusFrameManager.md +144 -144
  72. package/npm-docs/api/index.md +105 -105
  73. package/npm-docs/api/main.md +62 -62
  74. package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
  75. package/npm-docs/api/omdCanvas.md +83 -83
  76. package/npm-docs/api/omdConfigManager.md +112 -112
  77. package/npm-docs/api/omdConstantNode.md +52 -52
  78. package/npm-docs/api/omdDisplay.md +87 -87
  79. package/npm-docs/api/omdEquationNode.md +174 -174
  80. package/npm-docs/api/omdEquationSequenceNode.md +258 -258
  81. package/npm-docs/api/omdEquationStack.md +192 -192
  82. package/npm-docs/api/omdFunctionNode.md +82 -82
  83. package/npm-docs/api/omdGroupNode.md +78 -78
  84. package/npm-docs/api/omdHelpers.md +87 -87
  85. package/npm-docs/api/omdLeafNode.md +85 -85
  86. package/npm-docs/api/omdNode.md +201 -201
  87. package/npm-docs/api/omdOperationDisplayNode.md +117 -117
  88. package/npm-docs/api/omdOperatorNode.md +91 -91
  89. package/npm-docs/api/omdParenthesisNode.md +133 -133
  90. package/npm-docs/api/omdPopup.md +191 -191
  91. package/npm-docs/api/omdPowerNode.md +131 -131
  92. package/npm-docs/api/omdRationalNode.md +144 -144
  93. package/npm-docs/api/omdSequenceNode.md +128 -128
  94. package/npm-docs/api/omdSimplification.md +78 -78
  95. package/npm-docs/api/omdSqrtNode.md +144 -144
  96. package/npm-docs/api/omdStepVisualizer.md +146 -146
  97. package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
  98. package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
  99. package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
  100. package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
  101. package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
  102. package/npm-docs/api/omdToolbar.md +130 -130
  103. package/npm-docs/api/omdTranscriptionService.md +95 -95
  104. package/npm-docs/api/omdTreeDiff.md +169 -169
  105. package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
  106. package/npm-docs/api/omdUtilities.md +82 -82
  107. package/npm-docs/api/omdVariableNode.md +123 -123
  108. package/npm-docs/api/selectTool.md +74 -74
  109. package/npm-docs/api/simplificationEngine.md +97 -97
  110. package/npm-docs/api/simplificationRules.md +76 -76
  111. package/npm-docs/api/simplificationUtils.md +64 -64
  112. package/npm-docs/api/transcribe.md +43 -43
  113. package/npm-docs/guides/equations.md +854 -854
  114. package/npm-docs/guides/factory-functions.md +354 -354
  115. package/npm-docs/guides/getting-started.md +318 -318
  116. package/npm-docs/guides/quick-examples.md +525 -525
  117. package/npm-docs/guides/visualizations.md +682 -682
  118. package/npm-docs/index.html +12 -0
  119. package/npm-docs/json-schemas.md +826 -826
  120. package/omd/config/omdConfigManager.js +279 -267
  121. package/omd/core/index.js +158 -158
  122. package/omd/core/omdEquationStack.js +606 -547
  123. package/omd/core/omdUtilities.js +113 -113
  124. package/omd/display/omdDisplay.js +1045 -963
  125. package/omd/display/omdToolbar.js +501 -501
  126. package/omd/nodes/omdBinaryExpressionNode.js +459 -459
  127. package/omd/nodes/omdConstantNode.js +141 -141
  128. package/omd/nodes/omdEquationNode.js +1327 -1327
  129. package/omd/nodes/omdFunctionNode.js +351 -351
  130. package/omd/nodes/omdGroupNode.js +67 -67
  131. package/omd/nodes/omdLeafNode.js +76 -76
  132. package/omd/nodes/omdNode.js +556 -556
  133. package/omd/nodes/omdOperationDisplayNode.js +321 -321
  134. package/omd/nodes/omdOperatorNode.js +108 -108
  135. package/omd/nodes/omdParenthesisNode.js +292 -292
  136. package/omd/nodes/omdPowerNode.js +235 -235
  137. package/omd/nodes/omdRationalNode.js +295 -295
  138. package/omd/nodes/omdSqrtNode.js +307 -307
  139. package/omd/nodes/omdUnaryExpressionNode.js +227 -227
  140. package/omd/nodes/omdVariableNode.js +122 -122
  141. package/omd/simplification/omdSimplification.js +140 -140
  142. package/omd/simplification/omdSimplificationEngine.js +887 -887
  143. package/omd/simplification/package.json +5 -5
  144. package/omd/simplification/rules/binaryRules.js +1037 -1037
  145. package/omd/simplification/rules/functionRules.js +111 -111
  146. package/omd/simplification/rules/index.js +48 -48
  147. package/omd/simplification/rules/parenthesisRules.js +19 -19
  148. package/omd/simplification/rules/powerRules.js +143 -143
  149. package/omd/simplification/rules/rationalRules.js +725 -725
  150. package/omd/simplification/rules/sqrtRules.js +48 -48
  151. package/omd/simplification/rules/unaryRules.js +37 -37
  152. package/omd/simplification/simplificationRules.js +31 -31
  153. package/omd/simplification/simplificationUtils.js +1055 -1055
  154. package/omd/step-visualizer/omdStepVisualizer.js +947 -947
  155. package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
  156. package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
  157. package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
  158. package/omd/utils/aiNextEquationStep.js +106 -106
  159. package/omd/utils/omdNodeOverlay.js +638 -638
  160. package/omd/utils/omdPopup.js +1203 -1203
  161. package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
  162. package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
  163. package/omd/utils/omdTranscriptionService.js +123 -123
  164. package/omd/utils/omdTreeDiff.js +733 -733
  165. package/package.json +59 -57
  166. package/readme.html +184 -120
  167. package/src/index.js +74 -74
  168. package/src/json-schemas.md +576 -576
  169. package/src/omd-json-samples.js +147 -147
  170. package/src/omdApp.js +391 -391
  171. package/src/omdAppCanvas.js +335 -335
  172. package/src/omdBalanceHanger.js +199 -199
  173. package/src/omdColor.js +13 -13
  174. package/src/omdCoordinatePlane.js +541 -541
  175. package/src/omdExpression.js +115 -115
  176. package/src/omdFactory.js +150 -150
  177. package/src/omdFunction.js +114 -114
  178. package/src/omdMetaExpression.js +290 -290
  179. package/src/omdNaturalExpression.js +563 -563
  180. package/src/omdNode.js +383 -383
  181. package/src/omdNumber.js +52 -52
  182. package/src/omdNumberLine.js +114 -112
  183. package/src/omdNumberTile.js +118 -118
  184. package/src/omdOperator.js +72 -72
  185. package/src/omdPowerExpression.js +91 -91
  186. package/src/omdProblem.js +259 -259
  187. package/src/omdRatioChart.js +251 -251
  188. package/src/omdRationalExpression.js +114 -114
  189. package/src/omdSampleData.js +215 -215
  190. package/src/omdShapes.js +512 -512
  191. package/src/omdSpinner.js +151 -151
  192. package/src/omdString.js +49 -49
  193. package/src/omdTable.js +498 -498
  194. package/src/omdTapeDiagram.js +244 -244
  195. package/src/omdTerm.js +91 -91
  196. package/src/omdTileEquation.js +349 -349
  197. package/src/omdUtils.js +84 -84
  198. package/src/omdVariable.js +51 -51
@@ -1,682 +1,682 @@
1
- # Visualizations Guide
2
-
3
- OMD provides a comprehensive set of visualization components for teaching and learning mathematics. This guide covers all visualization components organized by category.
4
-
5
- ## Table of Contents
6
-
7
- 1. [Number & Ratio Visualizations](#number--ratio-visualizations)
8
- 2. [Graphing & Geometry](#graphing--geometry)
9
- 3. [Data Display](#data-display)
10
-
11
- ---
12
-
13
- ## Number & Ratio Visualizations
14
-
15
- ### Number Line
16
-
17
- `omdNumberLine` creates interactive number lines with labeled ticks and optional dots to mark values.
18
-
19
- #### Basic Usage
20
-
21
- ```javascript
22
- import { omdNumberLine } from '@teachinglab/omd';
23
-
24
- const numberLine = new omdNumberLine();
25
- numberLine.loadFromJSON({
26
- min: 0,
27
- max: 10,
28
- dotValues: [2, 5, 8],
29
- label: "Number Line"
30
- });
31
- ```
32
-
33
- #### Properties
34
-
35
- | Property | Type | Default | Description |
36
- |----------|------|---------|-------------|
37
- | `min` | number | 0 | Minimum value on the line |
38
- | `max` | number | 10 | Maximum value on the line |
39
- | `dotValues` | number[] | [] | Array of values to mark with dots |
40
- | `label` | string | "" | Optional label for the number line |
41
-
42
- #### Examples
43
-
44
- **Simple number line (0-20):**
45
- ```javascript
46
- numberLine.loadFromJSON({
47
- min: 0,
48
- max: 20
49
- });
50
- ```
51
-
52
- **Marking fractions:**
53
- ```javascript
54
- numberLine.loadFromJSON({
55
- min: 0,
56
- max: 1,
57
- dotValues: [0.25, 0.5, 0.75],
58
- label: "Fractions"
59
- });
60
- ```
61
-
62
- **Negative numbers:**
63
- ```javascript
64
- numberLine.loadFromJSON({
65
- min: -10,
66
- max: 10,
67
- dotValues: [-5, 0, 5]
68
- });
69
- ```
70
-
71
- ---
72
-
73
- ### Number Tiles
74
-
75
- `omdNumberTile` creates visual tiles with dots for counting and grouping activities.
76
-
77
- #### Basic Usage
78
-
79
- ```javascript
80
- import { omdNumberTile } from '@teachinglab/omd';
81
-
82
- const tile = new omdNumberTile();
83
- tile.loadFromJSON({
84
- value: 10,
85
- size: "medium",
86
- dotsPerColumn: 5
87
- });
88
- ```
89
-
90
- #### Properties
91
-
92
- | Property | Type | Default | Description |
93
- |----------|------|---------|-------------|
94
- | `value` | number | required | Number of dots to display |
95
- | `size` | "small" \| "medium" \| "large" | "medium" | Size of the tile |
96
- | `dotsPerColumn` | number | 5 | How many dots per column |
97
- | `backgroundColor` | string | "#FFFFFF" | Background color of tile |
98
- | `dotColor` | string | "#000000" | Color of the dots |
99
-
100
- #### Examples
101
-
102
- **Small tile:**
103
- ```javascript
104
- tile.loadFromJSON({
105
- value: 5,
106
- size: "small",
107
- backgroundColor: "#E8F4FD",
108
- dotColor: "#1976D2"
109
- });
110
- ```
111
-
112
- **Custom arrangement:**
113
- ```javascript
114
- tile.loadFromJSON({
115
- value: 15,
116
- dotsPerColumn: 3, // 5 columns x 3 rows
117
- size: "large"
118
- });
119
- ```
120
-
121
- ---
122
-
123
- ### Tape Diagrams
124
-
125
- `omdTapeDiagram` creates part-whole relationship diagrams with labeled sections.
126
-
127
- #### Basic Usage
128
-
129
- ```javascript
130
- import { omdTapeDiagram } from '@teachinglab/omd';
131
-
132
- const tape = new omdTapeDiagram();
133
- tape.loadFromJSON({
134
- values: [3, 5, 2],
135
- colors: ["#FF6B6B", "#4ECDC4", "#45B7D1"],
136
- labelSet: [
137
- {
138
- startIndex: 0,
139
- endIndex: 2,
140
- label: "Total: 10",
141
- showBelow: true
142
- }
143
- ]
144
- });
145
- ```
146
-
147
- #### Properties
148
-
149
- | Property | Type | Default | Description |
150
- |----------|------|---------|-------------|
151
- | `values` | number[] | required | Array of segment values |
152
- | `showValues` | boolean | true | Show values in each segment |
153
- | `colors` | string[] | auto | Colors for each segment |
154
- | `labelSet` | TapeLabel[] | [] | Labels spanning segments |
155
- | `unitWidth` | number | 30 | Width per unit value |
156
-
157
- #### Label Structure
158
-
159
- ```typescript
160
- {
161
- startIndex: number, // First segment index
162
- endIndex: number, // Last segment index
163
- label: string, // Label text
164
- showBelow?: boolean // Show below the tape
165
- }
166
- ```
167
-
168
- #### Examples
169
-
170
- **Simple ratio:**
171
- ```javascript
172
- tape.loadFromJSON({
173
- values: [2, 3],
174
- colors: ["#FF6B6B", "#4ECDC4"],
175
- labelSet: [
176
- { startIndex: 0, endIndex: 1, label: "2:3", showBelow: true }
177
- ]
178
- });
179
- ```
180
-
181
- **Multi-part problem:**
182
- ```javascript
183
- tape.loadFromJSON({
184
- values: [4, 4, 4, 6],
185
- showValues: true,
186
- labelSet: [
187
- { startIndex: 0, endIndex: 2, label: "3 equal parts" },
188
- { startIndex: 3, endIndex: 3, label: "remainder" }
189
- ],
190
- unitWidth: 25
191
- });
192
- ```
193
-
194
- ---
195
-
196
- ### Ratio Charts
197
-
198
- `omdRatioChart` creates pie and bar chart visualizations for ratios.
199
-
200
- #### Basic Usage
201
-
202
- ```javascript
203
- import { omdRatioChart } from '@teachinglab/omd';
204
-
205
- const chart = new omdRatioChart();
206
- chart.loadFromJSON({
207
- valueA: 3,
208
- valueB: 2,
209
- renderType: "pie",
210
- size: "medium"
211
- });
212
- ```
213
-
214
- #### Properties
215
-
216
- | Property | Type | Default | Description |
217
- |----------|------|---------|-------------|
218
- | `valueA` | number | required | First ratio value |
219
- | `valueB` | number | required | Second ratio value |
220
- | `renderType` | "pie" \| "bar" | "pie" | Chart type |
221
- | `size` | "small" \| "medium" \| "large" | "medium" | Chart size |
222
-
223
- #### Examples
224
-
225
- **Pie chart:**
226
- ```javascript
227
- chart.loadFromJSON({
228
- valueA: 3,
229
- valueB: 5,
230
- renderType: "pie"
231
- });
232
- ```
233
-
234
- **Bar chart:**
235
- ```javascript
236
- chart.loadFromJSON({
237
- valueA: 7,
238
- valueB: 3,
239
- renderType: "bar",
240
- size: "large"
241
- });
242
- ```
243
-
244
- ---
245
-
246
- ### Balance Hanger
247
-
248
- `omdBalanceHanger` creates balance scale visualizations for equations and equality.
249
-
250
- #### Basic Usage
251
-
252
- ```javascript
253
- import { omdBalanceHanger } from '@teachinglab/omd';
254
-
255
- const balance = new omdBalanceHanger();
256
- balance.loadFromJSON({
257
- leftValues: [5, 3],
258
- rightValues: [4, 4],
259
- tilt: "balanced"
260
- });
261
- ```
262
-
263
- #### Properties
264
-
265
- | Property | Type | Default | Description |
266
- |----------|------|---------|-------------|
267
- | `leftValues` | number[] | required | Values on left side |
268
- | `rightValues` | number[] | required | Values on right side |
269
- | `tilt` | "left" \| "right" \| "balanced" | auto | Balance state |
270
-
271
- #### Examples
272
-
273
- **Balanced equation:**
274
- ```javascript
275
- balance.loadFromJSON({
276
- leftValues: [10],
277
- rightValues: [7, 3],
278
- tilt: "balanced"
279
- });
280
- ```
281
-
282
- **Unbalanced:**
283
- ```javascript
284
- balance.loadFromJSON({
285
- leftValues: [8, 3],
286
- rightValues: [5, 2],
287
- tilt: "left"
288
- });
289
- ```
290
-
291
- ---
292
-
293
- ## Graphing & Geometry
294
-
295
- ### Coordinate Plane
296
-
297
- `omdCoordinatePlane` creates a 2D coordinate system with full graphing capabilities.
298
-
299
- #### Basic Usage
300
-
301
- ```javascript
302
- import { omdCoordinatePlane } from '@teachinglab/omd';
303
-
304
- const plane = new omdCoordinatePlane();
305
- plane.loadFromJSON({
306
- xMin: -10,
307
- xMax: 10,
308
- yMin: -10,
309
- yMax: 10,
310
- graphEquations: [
311
- { equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 }
312
- ]
313
- });
314
- ```
315
-
316
- #### Properties
317
-
318
- | Property | Type | Default | Description |
319
- |----------|------|---------|-------------|
320
- | `xMin` | number | -5 | Minimum x value |
321
- | `xMax` | number | 5 | Maximum x value |
322
- | `yMin` | number | -5 | Minimum y value |
323
- | `yMax` | number | 5 | Maximum y value |
324
- | `xLabel` | string | "" | X-axis label |
325
- | `yLabel` | string | "" | Y-axis label |
326
- | `tickInterval` | number | 1 | Spacing between ticks |
327
- | `graphEquations` | Equation[] | [] | Functions to graph |
328
- | `lineSegments` | LineSegment[] | [] | Line segments to draw |
329
- | `dotValues` | Dot[] | [] | Points to plot |
330
- | `shapeSet` | Shape[] | [] | Shapes to display |
331
- | `showTickLabels` | boolean | true | Show numeric labels |
332
- | `backgroundColor` | string | lightGray | Background color |
333
- | `showBackground` | boolean | true | Show background |
334
-
335
- #### Equation Structure
336
-
337
- ```typescript
338
- {
339
- equation: string, // e.g., "y = 2x + 1"
340
- color?: string, // Line color
341
- strokeWidth?: number, // Line width
342
- domain?: { // Optional domain restriction
343
- min: number,
344
- max: number
345
- }
346
- }
347
- ```
348
-
349
- #### Examples
350
-
351
- **Linear function:**
352
- ```javascript
353
- plane.loadFromJSON({
354
- xMin: -5,
355
- xMax: 5,
356
- yMin: -5,
357
- yMax: 5,
358
- graphEquations: [
359
- { equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 }
360
- ],
361
- xLabel: "x",
362
- yLabel: "y"
363
- });
364
- ```
365
-
366
- **Multiple functions:**
367
- ```javascript
368
- plane.loadFromJSON({
369
- xMin: -10,
370
- xMax: 10,
371
- yMin: -10,
372
- yMax: 10,
373
- graphEquations: [
374
- { equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 },
375
- { equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 },
376
- { equation: 'y = -x^2 + 5', color: '#10B981', strokeWidth: 2 }
377
- ]
378
- });
379
- ```
380
-
381
- **With points and shapes:**
382
- ```javascript
383
- plane.loadFromJSON({
384
- xMin: -5,
385
- xMax: 5,
386
- yMin: -5,
387
- yMax: 5,
388
- graphEquations: [
389
- { equation: 'y = x^2 - 4', color: '#e11d48' }
390
- ],
391
- dotValues: [
392
- [-2, 0, "blue"], // [x, y, color]
393
- [2, 0, "blue"],
394
- [0, -4, "red"]
395
- ],
396
- lineSegments: [
397
- {
398
- point1: [-2, 0],
399
- point2: [2, 0],
400
- color: "green",
401
- strokeWidth: 1
402
- }
403
- ]
404
- });
405
- ```
406
-
407
- ---
408
-
409
- ### Shapes
410
-
411
- OMD provides several geometric shapes that can be used standalone or within a coordinate plane.
412
-
413
- #### Circle
414
-
415
- ```javascript
416
- import { omdCircle } from '@teachinglab/omd';
417
-
418
- const circle = new omdCircle();
419
- circle.loadFromJSON({
420
- radius: 10,
421
- color: "#FF0000"
422
- });
423
- ```
424
-
425
- #### Rectangle
426
-
427
- ```javascript
428
- import { omdRectangle } from '@teachinglab/omd';
429
-
430
- const rect = new omdRectangle();
431
- rect.loadFromJSON({
432
- width: 20,
433
- height: 10,
434
- color: "#00FF00"
435
- });
436
- ```
437
-
438
- #### Regular Polygon
439
-
440
- ```javascript
441
- import { omdRegularPolygon } from '@teachinglab/omd';
442
-
443
- const polygon = new omdRegularPolygon();
444
- polygon.loadFromJSON({
445
- sides: 6, // Hexagon
446
- radius: 15,
447
- color: "#0000FF"
448
- });
449
- ```
450
-
451
- #### Ellipse
452
-
453
- ```javascript
454
- import { omdEllipse } from '@teachinglab/omd';
455
-
456
- const ellipse = new omdEllipse();
457
- ellipse.loadFromJSON({
458
- radiusX: 20,
459
- radiusY: 10,
460
- color: "#FFFF00"
461
- });
462
- ```
463
-
464
- #### Right Triangle
465
-
466
- ```javascript
467
- import { omdRightTriangle } from '@teachinglab/omd';
468
-
469
- const triangle = new omdRightTriangle();
470
- triangle.loadFromJSON({
471
- base: 10,
472
- height: 15,
473
- color: "#FF00FF"
474
- });
475
- ```
476
-
477
- #### Isosceles Triangle
478
-
479
- ```javascript
480
- import { omdIsoscelesTriangle } from '@teachinglab/omd';
481
-
482
- const triangle = new omdIsoscelesTriangle();
483
- triangle.loadFromJSON({
484
- base: 10,
485
- height: 15,
486
- color: "#00FFFF"
487
- });
488
- ```
489
-
490
- #### Using Shapes in Coordinate Plane
491
-
492
- ```javascript
493
- plane.loadFromJSON({
494
- xMin: -5,
495
- xMax: 5,
496
- yMin: -5,
497
- yMax: 5,
498
- shapeSet: [
499
- { omdType: 'circle', radius: 2, color: '#FF6B6B' },
500
- { omdType: 'rectangle', width: 3, height: 2, color: '#4ECDC4' },
501
- { omdType: 'regularPolygon', sides: 6, radius: 1.5, color: '#45B7D1' }
502
- ]
503
- });
504
- ```
505
-
506
- ---
507
-
508
- ### Spinner
509
-
510
- `omdSpinner` creates circular spinners for probability and division activities.
511
-
512
- #### Basic Usage
513
-
514
- ```javascript
515
- import { omdSpinner } from '@teachinglab/omd';
516
-
517
- const spinner = new omdSpinner();
518
- spinner.loadFromJSON({
519
- divisions: 8,
520
- arrowPosition: 3,
521
- size: "medium"
522
- });
523
- ```
524
-
525
- #### Properties
526
-
527
- | Property | Type | Default | Description |
528
- |----------|------|---------|-------------|
529
- | `divisions` | number | required | Number of spinner divisions |
530
- | `arrowPosition` | number | 0 | Initial arrow position |
531
- | `size` | "small" \| "medium" \| "large" | "medium" | Spinner size |
532
-
533
- #### Examples
534
-
535
- **Four equal parts:**
536
- ```javascript
537
- spinner.loadFromJSON({
538
- divisions: 4,
539
- arrowPosition: 0
540
- });
541
- ```
542
-
543
- **Probability spinner:**
544
- ```javascript
545
- spinner.loadFromJSON({
546
- divisions: 10,
547
- arrowPosition: 5,
548
- size: "large"
549
- });
550
- ```
551
-
552
- ---
553
-
554
- ## Data Display
555
-
556
- ### Tables
557
-
558
- `omdTable` creates data tables with customizable styling.
559
-
560
- #### Basic Usage
561
-
562
- ```javascript
563
- import { omdTable } from '@teachinglab/omd';
564
-
565
- const table = new omdTable();
566
- table.loadFromJSON({
567
- equation: "y = x^2",
568
- headers: ["x", "y"],
569
- xMin: -5,
570
- xMax: 5,
571
- stepSize: 1,
572
- title: "Quadratic Function"
573
- });
574
- ```
575
-
576
- #### Properties
577
-
578
- | Property | Type | Default | Description |
579
- |----------|------|---------|-------------|
580
- | `equation` | string | "" | Equation to generate data |
581
- | `data` | [number, number][] | [] | Manual data input |
582
- | `headers` | string[] | ['x', 'y'] | Column headers |
583
- | `xMin` | number | -5 | Minimum x value |
584
- | `xMax` | number | 5 | Maximum x value |
585
- | `stepSize` | number | 1 | Increment between x values |
586
- | `title` | string | "" | Table title |
587
- | `fontSize` | number | 14 | Cell font size |
588
- | `headerFontSize` | number | 16 | Header font size |
589
- | `fontFamily` | string | "Albert Sans" | Font family |
590
- | `cellHeight` | number | 35 | Cell height in pixels |
591
- | `backgroundColor` | string | lightGray | Background color |
592
- | `alternatingRowColors` | string[] | null | Alternating row colors |
593
-
594
- #### Examples
595
-
596
- **From equation:**
597
- ```javascript
598
- table.loadFromJSON({
599
- equation: "y = 2x + 1",
600
- headers: ["x", "y"],
601
- xMin: -3,
602
- xMax: 3,
603
- stepSize: 1,
604
- title: "Linear Function",
605
- alternatingRowColors: ["#F0F0F0", "#FFFFFF"]
606
- });
607
- ```
608
-
609
- **Manual data:**
610
- ```javascript
611
- table.loadFromJSON({
612
- data: [
613
- [0, 0],
614
- [1, 1],
615
- [2, 4],
616
- [3, 9]
617
- ],
618
- headers: ["x", "x²"],
619
- title: "Squares",
620
- fontSize: 16,
621
- cellHeight: 40
622
- });
623
- ```
624
-
625
- **Styled table:**
626
- ```javascript
627
- table.loadFromJSON({
628
- equation: "y = x^3",
629
- xMin: -2,
630
- xMax: 2,
631
- stepSize: 0.5,
632
- title: "Cubic Function",
633
- fontFamily: "Georgia",
634
- fontSize: 14,
635
- headerFontSize: 18,
636
- backgroundColor: "#E3F2FD",
637
- alternatingRowColors: ["#BBDEFB", "#E3F2FD"]
638
- });
639
- ```
640
-
641
- ---
642
-
643
- ## Best Practices
644
-
645
- ### Sizing
646
-
647
- Most visualization components support size options:
648
- - `"small"` - Compact display
649
- - `"medium"` - Standard size (default)
650
- - `"large"` - Expanded display
651
-
652
- ### Colors
653
-
654
- OMD uses a consistent color system:
655
- - Use hex colors for consistency: `#FF6B6B`
656
- - Access built-in colors: `omdColor.lightGray`
657
- - Ensure sufficient contrast for accessibility
658
-
659
- ### Performance
660
-
661
- For coordinate planes with many equations:
662
- - Limit the number of simultaneous graphs
663
- - Use domain restrictions when possible
664
- - Consider the viewport size (xMin/xMax, yMin/yMax)
665
-
666
- ### Responsive Design
667
-
668
- Set appropriate container dimensions:
669
- ```css
670
- #math-container {
671
- width: 100%;
672
- max-width: 800px;
673
- height: 400px;
674
- }
675
- ```
676
-
677
- ## Next Steps
678
-
679
- - **[Equations Guide](./equations.md)** - Learn about equation components
680
- - **[JSON Schemas](../json-schemas.md)** - Complete reference
681
- - **[API Reference](../api/api-reference.md)** - Detailed documentation
682
- - **[Examples](./quick-examples.md)** - More code samples
1
+ # Visualizations Guide
2
+
3
+ OMD provides a comprehensive set of visualization components for teaching and learning mathematics. This guide covers all visualization components organized by category.
4
+
5
+ ## Table of Contents
6
+
7
+ 1. [Number & Ratio Visualizations](#number--ratio-visualizations)
8
+ 2. [Graphing & Geometry](#graphing--geometry)
9
+ 3. [Data Display](#data-display)
10
+
11
+ ---
12
+
13
+ ## Number & Ratio Visualizations
14
+
15
+ ### Number Line
16
+
17
+ `omdNumberLine` creates interactive number lines with labeled ticks and optional dots to mark values.
18
+
19
+ #### Basic Usage
20
+
21
+ ```javascript
22
+ import { omdNumberLine } from '@teachinglab/omd';
23
+
24
+ const numberLine = new omdNumberLine();
25
+ numberLine.loadFromJSON({
26
+ min: 0,
27
+ max: 10,
28
+ dotValues: [2, 5, 8],
29
+ label: "Number Line"
30
+ });
31
+ ```
32
+
33
+ #### Properties
34
+
35
+ | Property | Type | Default | Description |
36
+ |----------|------|---------|-------------|
37
+ | `min` | number | 0 | Minimum value on the line |
38
+ | `max` | number | 10 | Maximum value on the line |
39
+ | `dotValues` | number[] | [] | Array of values to mark with dots |
40
+ | `label` | string | "" | Optional label for the number line |
41
+
42
+ #### Examples
43
+
44
+ **Simple number line (0-20):**
45
+ ```javascript
46
+ numberLine.loadFromJSON({
47
+ min: 0,
48
+ max: 20
49
+ });
50
+ ```
51
+
52
+ **Marking fractions:**
53
+ ```javascript
54
+ numberLine.loadFromJSON({
55
+ min: 0,
56
+ max: 1,
57
+ dotValues: [0.25, 0.5, 0.75],
58
+ label: "Fractions"
59
+ });
60
+ ```
61
+
62
+ **Negative numbers:**
63
+ ```javascript
64
+ numberLine.loadFromJSON({
65
+ min: -10,
66
+ max: 10,
67
+ dotValues: [-5, 0, 5]
68
+ });
69
+ ```
70
+
71
+ ---
72
+
73
+ ### Number Tiles
74
+
75
+ `omdNumberTile` creates visual tiles with dots for counting and grouping activities.
76
+
77
+ #### Basic Usage
78
+
79
+ ```javascript
80
+ import { omdNumberTile } from '@teachinglab/omd';
81
+
82
+ const tile = new omdNumberTile();
83
+ tile.loadFromJSON({
84
+ value: 10,
85
+ size: "medium",
86
+ dotsPerColumn: 5
87
+ });
88
+ ```
89
+
90
+ #### Properties
91
+
92
+ | Property | Type | Default | Description |
93
+ |----------|------|---------|-------------|
94
+ | `value` | number | required | Number of dots to display |
95
+ | `size` | "small" \| "medium" \| "large" | "medium" | Size of the tile |
96
+ | `dotsPerColumn` | number | 5 | How many dots per column |
97
+ | `backgroundColor` | string | "#FFFFFF" | Background color of tile |
98
+ | `dotColor` | string | "#000000" | Color of the dots |
99
+
100
+ #### Examples
101
+
102
+ **Small tile:**
103
+ ```javascript
104
+ tile.loadFromJSON({
105
+ value: 5,
106
+ size: "small",
107
+ backgroundColor: "#E8F4FD",
108
+ dotColor: "#1976D2"
109
+ });
110
+ ```
111
+
112
+ **Custom arrangement:**
113
+ ```javascript
114
+ tile.loadFromJSON({
115
+ value: 15,
116
+ dotsPerColumn: 3, // 5 columns x 3 rows
117
+ size: "large"
118
+ });
119
+ ```
120
+
121
+ ---
122
+
123
+ ### Tape Diagrams
124
+
125
+ `omdTapeDiagram` creates part-whole relationship diagrams with labeled sections.
126
+
127
+ #### Basic Usage
128
+
129
+ ```javascript
130
+ import { omdTapeDiagram } from '@teachinglab/omd';
131
+
132
+ const tape = new omdTapeDiagram();
133
+ tape.loadFromJSON({
134
+ values: [3, 5, 2],
135
+ colors: ["#FF6B6B", "#4ECDC4", "#45B7D1"],
136
+ labelSet: [
137
+ {
138
+ startIndex: 0,
139
+ endIndex: 2,
140
+ label: "Total: 10",
141
+ showBelow: true
142
+ }
143
+ ]
144
+ });
145
+ ```
146
+
147
+ #### Properties
148
+
149
+ | Property | Type | Default | Description |
150
+ |----------|------|---------|-------------|
151
+ | `values` | number[] | required | Array of segment values |
152
+ | `showValues` | boolean | true | Show values in each segment |
153
+ | `colors` | string[] | auto | Colors for each segment |
154
+ | `labelSet` | TapeLabel[] | [] | Labels spanning segments |
155
+ | `unitWidth` | number | 30 | Width per unit value |
156
+
157
+ #### Label Structure
158
+
159
+ ```typescript
160
+ {
161
+ startIndex: number, // First segment index
162
+ endIndex: number, // Last segment index
163
+ label: string, // Label text
164
+ showBelow?: boolean // Show below the tape
165
+ }
166
+ ```
167
+
168
+ #### Examples
169
+
170
+ **Simple ratio:**
171
+ ```javascript
172
+ tape.loadFromJSON({
173
+ values: [2, 3],
174
+ colors: ["#FF6B6B", "#4ECDC4"],
175
+ labelSet: [
176
+ { startIndex: 0, endIndex: 1, label: "2:3", showBelow: true }
177
+ ]
178
+ });
179
+ ```
180
+
181
+ **Multi-part problem:**
182
+ ```javascript
183
+ tape.loadFromJSON({
184
+ values: [4, 4, 4, 6],
185
+ showValues: true,
186
+ labelSet: [
187
+ { startIndex: 0, endIndex: 2, label: "3 equal parts" },
188
+ { startIndex: 3, endIndex: 3, label: "remainder" }
189
+ ],
190
+ unitWidth: 25
191
+ });
192
+ ```
193
+
194
+ ---
195
+
196
+ ### Ratio Charts
197
+
198
+ `omdRatioChart` creates pie and bar chart visualizations for ratios.
199
+
200
+ #### Basic Usage
201
+
202
+ ```javascript
203
+ import { omdRatioChart } from '@teachinglab/omd';
204
+
205
+ const chart = new omdRatioChart();
206
+ chart.loadFromJSON({
207
+ valueA: 3,
208
+ valueB: 2,
209
+ renderType: "pie",
210
+ size: "medium"
211
+ });
212
+ ```
213
+
214
+ #### Properties
215
+
216
+ | Property | Type | Default | Description |
217
+ |----------|------|---------|-------------|
218
+ | `valueA` | number | required | First ratio value |
219
+ | `valueB` | number | required | Second ratio value |
220
+ | `renderType` | "pie" \| "bar" | "pie" | Chart type |
221
+ | `size` | "small" \| "medium" \| "large" | "medium" | Chart size |
222
+
223
+ #### Examples
224
+
225
+ **Pie chart:**
226
+ ```javascript
227
+ chart.loadFromJSON({
228
+ valueA: 3,
229
+ valueB: 5,
230
+ renderType: "pie"
231
+ });
232
+ ```
233
+
234
+ **Bar chart:**
235
+ ```javascript
236
+ chart.loadFromJSON({
237
+ valueA: 7,
238
+ valueB: 3,
239
+ renderType: "bar",
240
+ size: "large"
241
+ });
242
+ ```
243
+
244
+ ---
245
+
246
+ ### Balance Hanger
247
+
248
+ `omdBalanceHanger` creates balance scale visualizations for equations and equality.
249
+
250
+ #### Basic Usage
251
+
252
+ ```javascript
253
+ import { omdBalanceHanger } from '@teachinglab/omd';
254
+
255
+ const balance = new omdBalanceHanger();
256
+ balance.loadFromJSON({
257
+ leftValues: [5, 3],
258
+ rightValues: [4, 4],
259
+ tilt: "balanced"
260
+ });
261
+ ```
262
+
263
+ #### Properties
264
+
265
+ | Property | Type | Default | Description |
266
+ |----------|------|---------|-------------|
267
+ | `leftValues` | number[] | required | Values on left side |
268
+ | `rightValues` | number[] | required | Values on right side |
269
+ | `tilt` | "left" \| "right" \| "balanced" | auto | Balance state |
270
+
271
+ #### Examples
272
+
273
+ **Balanced equation:**
274
+ ```javascript
275
+ balance.loadFromJSON({
276
+ leftValues: [10],
277
+ rightValues: [7, 3],
278
+ tilt: "balanced"
279
+ });
280
+ ```
281
+
282
+ **Unbalanced:**
283
+ ```javascript
284
+ balance.loadFromJSON({
285
+ leftValues: [8, 3],
286
+ rightValues: [5, 2],
287
+ tilt: "left"
288
+ });
289
+ ```
290
+
291
+ ---
292
+
293
+ ## Graphing & Geometry
294
+
295
+ ### Coordinate Plane
296
+
297
+ `omdCoordinatePlane` creates a 2D coordinate system with full graphing capabilities.
298
+
299
+ #### Basic Usage
300
+
301
+ ```javascript
302
+ import { omdCoordinatePlane } from '@teachinglab/omd';
303
+
304
+ const plane = new omdCoordinatePlane();
305
+ plane.loadFromJSON({
306
+ xMin: -10,
307
+ xMax: 10,
308
+ yMin: -10,
309
+ yMax: 10,
310
+ graphEquations: [
311
+ { equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 }
312
+ ]
313
+ });
314
+ ```
315
+
316
+ #### Properties
317
+
318
+ | Property | Type | Default | Description |
319
+ |----------|------|---------|-------------|
320
+ | `xMin` | number | -5 | Minimum x value |
321
+ | `xMax` | number | 5 | Maximum x value |
322
+ | `yMin` | number | -5 | Minimum y value |
323
+ | `yMax` | number | 5 | Maximum y value |
324
+ | `xLabel` | string | "" | X-axis label |
325
+ | `yLabel` | string | "" | Y-axis label |
326
+ | `tickInterval` | number | 1 | Spacing between ticks |
327
+ | `graphEquations` | Equation[] | [] | Functions to graph |
328
+ | `lineSegments` | LineSegment[] | [] | Line segments to draw |
329
+ | `dotValues` | Dot[] | [] | Points to plot |
330
+ | `shapeSet` | Shape[] | [] | Shapes to display |
331
+ | `showTickLabels` | boolean | true | Show numeric labels |
332
+ | `backgroundColor` | string | lightGray | Background color |
333
+ | `showBackground` | boolean | true | Show background |
334
+
335
+ #### Equation Structure
336
+
337
+ ```typescript
338
+ {
339
+ equation: string, // e.g., "y = 2x + 1"
340
+ color?: string, // Line color
341
+ strokeWidth?: number, // Line width
342
+ domain?: { // Optional domain restriction
343
+ min: number,
344
+ max: number
345
+ }
346
+ }
347
+ ```
348
+
349
+ #### Examples
350
+
351
+ **Linear function:**
352
+ ```javascript
353
+ plane.loadFromJSON({
354
+ xMin: -5,
355
+ xMax: 5,
356
+ yMin: -5,
357
+ yMax: 5,
358
+ graphEquations: [
359
+ { equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 }
360
+ ],
361
+ xLabel: "x",
362
+ yLabel: "y"
363
+ });
364
+ ```
365
+
366
+ **Multiple functions:**
367
+ ```javascript
368
+ plane.loadFromJSON({
369
+ xMin: -10,
370
+ xMax: 10,
371
+ yMin: -10,
372
+ yMax: 10,
373
+ graphEquations: [
374
+ { equation: 'y = x^2', color: '#e11d48', strokeWidth: 2 },
375
+ { equation: 'y = 2x + 1', color: '#3B82F6', strokeWidth: 2 },
376
+ { equation: 'y = -x^2 + 5', color: '#10B981', strokeWidth: 2 }
377
+ ]
378
+ });
379
+ ```
380
+
381
+ **With points and shapes:**
382
+ ```javascript
383
+ plane.loadFromJSON({
384
+ xMin: -5,
385
+ xMax: 5,
386
+ yMin: -5,
387
+ yMax: 5,
388
+ graphEquations: [
389
+ { equation: 'y = x^2 - 4', color: '#e11d48' }
390
+ ],
391
+ dotValues: [
392
+ [-2, 0, "blue"], // [x, y, color]
393
+ [2, 0, "blue"],
394
+ [0, -4, "red"]
395
+ ],
396
+ lineSegments: [
397
+ {
398
+ point1: [-2, 0],
399
+ point2: [2, 0],
400
+ color: "green",
401
+ strokeWidth: 1
402
+ }
403
+ ]
404
+ });
405
+ ```
406
+
407
+ ---
408
+
409
+ ### Shapes
410
+
411
+ OMD provides several geometric shapes that can be used standalone or within a coordinate plane.
412
+
413
+ #### Circle
414
+
415
+ ```javascript
416
+ import { omdCircle } from '@teachinglab/omd';
417
+
418
+ const circle = new omdCircle();
419
+ circle.loadFromJSON({
420
+ radius: 10,
421
+ color: "#FF0000"
422
+ });
423
+ ```
424
+
425
+ #### Rectangle
426
+
427
+ ```javascript
428
+ import { omdRectangle } from '@teachinglab/omd';
429
+
430
+ const rect = new omdRectangle();
431
+ rect.loadFromJSON({
432
+ width: 20,
433
+ height: 10,
434
+ color: "#00FF00"
435
+ });
436
+ ```
437
+
438
+ #### Regular Polygon
439
+
440
+ ```javascript
441
+ import { omdRegularPolygon } from '@teachinglab/omd';
442
+
443
+ const polygon = new omdRegularPolygon();
444
+ polygon.loadFromJSON({
445
+ sides: 6, // Hexagon
446
+ radius: 15,
447
+ color: "#0000FF"
448
+ });
449
+ ```
450
+
451
+ #### Ellipse
452
+
453
+ ```javascript
454
+ import { omdEllipse } from '@teachinglab/omd';
455
+
456
+ const ellipse = new omdEllipse();
457
+ ellipse.loadFromJSON({
458
+ radiusX: 20,
459
+ radiusY: 10,
460
+ color: "#FFFF00"
461
+ });
462
+ ```
463
+
464
+ #### Right Triangle
465
+
466
+ ```javascript
467
+ import { omdRightTriangle } from '@teachinglab/omd';
468
+
469
+ const triangle = new omdRightTriangle();
470
+ triangle.loadFromJSON({
471
+ base: 10,
472
+ height: 15,
473
+ color: "#FF00FF"
474
+ });
475
+ ```
476
+
477
+ #### Isosceles Triangle
478
+
479
+ ```javascript
480
+ import { omdIsoscelesTriangle } from '@teachinglab/omd';
481
+
482
+ const triangle = new omdIsoscelesTriangle();
483
+ triangle.loadFromJSON({
484
+ base: 10,
485
+ height: 15,
486
+ color: "#00FFFF"
487
+ });
488
+ ```
489
+
490
+ #### Using Shapes in Coordinate Plane
491
+
492
+ ```javascript
493
+ plane.loadFromJSON({
494
+ xMin: -5,
495
+ xMax: 5,
496
+ yMin: -5,
497
+ yMax: 5,
498
+ shapeSet: [
499
+ { omdType: 'circle', radius: 2, color: '#FF6B6B' },
500
+ { omdType: 'rectangle', width: 3, height: 2, color: '#4ECDC4' },
501
+ { omdType: 'regularPolygon', sides: 6, radius: 1.5, color: '#45B7D1' }
502
+ ]
503
+ });
504
+ ```
505
+
506
+ ---
507
+
508
+ ### Spinner
509
+
510
+ `omdSpinner` creates circular spinners for probability and division activities.
511
+
512
+ #### Basic Usage
513
+
514
+ ```javascript
515
+ import { omdSpinner } from '@teachinglab/omd';
516
+
517
+ const spinner = new omdSpinner();
518
+ spinner.loadFromJSON({
519
+ divisions: 8,
520
+ arrowPosition: 3,
521
+ size: "medium"
522
+ });
523
+ ```
524
+
525
+ #### Properties
526
+
527
+ | Property | Type | Default | Description |
528
+ |----------|------|---------|-------------|
529
+ | `divisions` | number | required | Number of spinner divisions |
530
+ | `arrowPosition` | number | 0 | Initial arrow position |
531
+ | `size` | "small" \| "medium" \| "large" | "medium" | Spinner size |
532
+
533
+ #### Examples
534
+
535
+ **Four equal parts:**
536
+ ```javascript
537
+ spinner.loadFromJSON({
538
+ divisions: 4,
539
+ arrowPosition: 0
540
+ });
541
+ ```
542
+
543
+ **Probability spinner:**
544
+ ```javascript
545
+ spinner.loadFromJSON({
546
+ divisions: 10,
547
+ arrowPosition: 5,
548
+ size: "large"
549
+ });
550
+ ```
551
+
552
+ ---
553
+
554
+ ## Data Display
555
+
556
+ ### Tables
557
+
558
+ `omdTable` creates data tables with customizable styling.
559
+
560
+ #### Basic Usage
561
+
562
+ ```javascript
563
+ import { omdTable } from '@teachinglab/omd';
564
+
565
+ const table = new omdTable();
566
+ table.loadFromJSON({
567
+ equation: "y = x^2",
568
+ headers: ["x", "y"],
569
+ xMin: -5,
570
+ xMax: 5,
571
+ stepSize: 1,
572
+ title: "Quadratic Function"
573
+ });
574
+ ```
575
+
576
+ #### Properties
577
+
578
+ | Property | Type | Default | Description |
579
+ |----------|------|---------|-------------|
580
+ | `equation` | string | "" | Equation to generate data |
581
+ | `data` | [number, number][] | [] | Manual data input |
582
+ | `headers` | string[] | ['x', 'y'] | Column headers |
583
+ | `xMin` | number | -5 | Minimum x value |
584
+ | `xMax` | number | 5 | Maximum x value |
585
+ | `stepSize` | number | 1 | Increment between x values |
586
+ | `title` | string | "" | Table title |
587
+ | `fontSize` | number | 14 | Cell font size |
588
+ | `headerFontSize` | number | 16 | Header font size |
589
+ | `fontFamily` | string | "Albert Sans" | Font family |
590
+ | `cellHeight` | number | 35 | Cell height in pixels |
591
+ | `backgroundColor` | string | lightGray | Background color |
592
+ | `alternatingRowColors` | string[] | null | Alternating row colors |
593
+
594
+ #### Examples
595
+
596
+ **From equation:**
597
+ ```javascript
598
+ table.loadFromJSON({
599
+ equation: "y = 2x + 1",
600
+ headers: ["x", "y"],
601
+ xMin: -3,
602
+ xMax: 3,
603
+ stepSize: 1,
604
+ title: "Linear Function",
605
+ alternatingRowColors: ["#F0F0F0", "#FFFFFF"]
606
+ });
607
+ ```
608
+
609
+ **Manual data:**
610
+ ```javascript
611
+ table.loadFromJSON({
612
+ data: [
613
+ [0, 0],
614
+ [1, 1],
615
+ [2, 4],
616
+ [3, 9]
617
+ ],
618
+ headers: ["x", "x²"],
619
+ title: "Squares",
620
+ fontSize: 16,
621
+ cellHeight: 40
622
+ });
623
+ ```
624
+
625
+ **Styled table:**
626
+ ```javascript
627
+ table.loadFromJSON({
628
+ equation: "y = x^3",
629
+ xMin: -2,
630
+ xMax: 2,
631
+ stepSize: 0.5,
632
+ title: "Cubic Function",
633
+ fontFamily: "Georgia",
634
+ fontSize: 14,
635
+ headerFontSize: 18,
636
+ backgroundColor: "#E3F2FD",
637
+ alternatingRowColors: ["#BBDEFB", "#E3F2FD"]
638
+ });
639
+ ```
640
+
641
+ ---
642
+
643
+ ## Best Practices
644
+
645
+ ### Sizing
646
+
647
+ Most visualization components support size options:
648
+ - `"small"` - Compact display
649
+ - `"medium"` - Standard size (default)
650
+ - `"large"` - Expanded display
651
+
652
+ ### Colors
653
+
654
+ OMD uses a consistent color system:
655
+ - Use hex colors for consistency: `#FF6B6B`
656
+ - Access built-in colors: `omdColor.lightGray`
657
+ - Ensure sufficient contrast for accessibility
658
+
659
+ ### Performance
660
+
661
+ For coordinate planes with many equations:
662
+ - Limit the number of simultaneous graphs
663
+ - Use domain restrictions when possible
664
+ - Consider the viewport size (xMin/xMax, yMin/yMax)
665
+
666
+ ### Responsive Design
667
+
668
+ Set appropriate container dimensions:
669
+ ```css
670
+ #math-container {
671
+ width: 100%;
672
+ max-width: 800px;
673
+ height: 400px;
674
+ }
675
+ ```
676
+
677
+ ## Next Steps
678
+
679
+ - **[Equations Guide](./equations.md)** - Learn about equation components
680
+ - **[JSON Schemas](../json-schemas.md)** - Complete reference
681
+ - **[API Reference](../api/api-reference.md)** - Detailed documentation
682
+ - **[Examples](./quick-examples.md)** - More code samples