@teachinglab/omd 0.6.1 → 0.6.2

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 +546 -546
  123. package/omd/core/omdUtilities.js +113 -113
  124. package/omd/display/omdDisplay.js +969 -962
  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,131 +1,131 @@
1
- # omdToolbar
2
-
3
- Provides a visual toolbar UI for applying mathematical operations and functions to an `omdEquationSequenceNode` in the OMD system. The toolbar is rendered as an SVG group and supports operations like add, subtract, multiply, divide, and function application (e.g., sqrt, cos, etc.). It features dynamic popups for selecting operations and inputting values.
4
-
5
- ## Class Definition
6
-
7
- ```javascript
8
- export class omdToolbar
9
- ```
10
-
11
- ## Constructor
12
-
13
- ### `new omdToolbar(parentContainer, sequence, [options])`
14
-
15
- Creates an instance of the `omdToolbar`.
16
-
17
- - **`parentContainer`** (`jsvgGroup`): The parent SVG group where the toolbar will be rendered.
18
- - **`sequence`** (`omdEquationSequenceNode`): The sequence node to which operations will be applied.
19
- - **`options`** (`object`, optional): Toolbar configuration options:
20
- - `height` (`number`): Toolbar height. Default: `60`.
21
- - `padding` (`number`): Padding around elements. Default: `6`.
22
- - `spacing` (`number`): Spacing between elements. Default: `8`.
23
- - `borderRadius` (`number`): Corner radius for background. Default: `30`.
24
- - `fontFamily` (`string`): Font family. Default: `'Albert Sans', sans-serif`.
25
- - `fontWeight` (`string`): Font weight. Default: `'500'`.
26
- - `colors` (`object`): Color scheme:
27
- - `background` (`string`): Toolbar background. Default: `omdColor.mediumGray`.
28
- - `button` (`string`): Button background. Default: `'white'`.
29
- - `popup` (`string`): Popup menu background. Default: `omdColor.lightGray`.
30
- - `undo` (`string`): Undo button background. Default: `#87D143`.
31
- - `buttonSize` (`number`): Button size. Default: `48`.
32
- - `checkMarkSize` (`number`): Checkmark SVG size. Default: `24`.
33
- - `mainFontSize` (`number`): Main button font size. Default: `32`.
34
- - `inputFontSize` (`number`): Input text font size. Default: `28`.
35
- - `menuFontSize` (`number`): Menu item font size. Default: `24`.
36
- - `inputWidth` (`number`): Input button width. Default: `120`.
37
- - `popupDirection` (`string`): Direction for popups (`'below'` or `'above'`). Default: `'below'`.
38
- - `showUndoButton` (`boolean`): Whether to display an undo button. Default: `false`.
39
- - `undoIconUrl` (`string`): Data URL for the undo button icon. Default: a base64 encoded SVG.
40
- - `onUndo` (`function`): Custom callback function for the undo action. If not provided, it attempts to call `window.onOMDToolbarUndo`.
41
- - `x`, `y` (`number`): Optional position of the toolbar in the parent container.
42
- - `styles` (`object`): An object to provide structured styling options (e.g., `backgroundColor`, `buttonColor`, `popupBackgroundColor`, `borderRadius`, `buttonSize`, `mainFontSize`, `inputFontSize`, `menuFontSize`, `inputWidth`, `padding`, `spacing`). These override individual options.
43
-
44
- ## Public Properties
45
-
46
- - **`parentContainer`** (`jsvgGroup`): The SVG group where the toolbar is rendered.
47
- - **`sequence`** (`omdEquationSequenceNode`): The sequence node the toolbar interacts with.
48
- - **`config`** (`object`): The merged configuration options for the toolbar, including defaults and overrides.
49
- - **`state`** (`object`): Internal state of the toolbar, including:
50
- - `activePopup` (`object` | `null`): Tracks the currently active popup (`type`, `group`).
51
- - `selectedOperation` (`string`): The currently selected operation (e.g., `'+'`, `'f'`).
52
- - `inputValue` (`string`): The current value in the input field.
53
- - **`elements`** (`object`): An object containing references to the various `jsvg` elements that make up the toolbar UI:
54
- - `toolbarGroup` (`jsvgGroup`): The main SVG group for the entire toolbar.
55
- - `background` (`jsvgRect`): The background rectangle of the toolbar.
56
- - `leftButton` (`jsvgButton`): The button for selecting operations.
57
- - `middleInputButton` (`jsvgButton`): The button for displaying and inputting values.
58
- - `rightButton` (`jsvgButton`): The button for applying the operation.
59
- - `undoButton` (`jsvgButton`): The optional undo button.
60
-
61
- ## Public Methods
62
-
63
- ### `setInputText(text)`
64
-
65
- Sets the text displayed in the middle input button and updates the internal `inputValue` state. It also adjusts the font size of the button's text element for better centering.
66
-
67
- - **`text`** (`string`): The text to display.
68
-
69
- ### `destroy()`
70
-
71
- Cleans up the toolbar component by removing its SVG elements from the DOM and clearing internal references.
72
-
73
- ## Internal Methods
74
-
75
- - **`_render()`**: Renders the initial toolbar UI components, including the background, operation button, input button, apply button, and optional undo button. It also sets up their initial positions and styling.
76
- - **`_bringToFront(node)`**: Moves a `jsvgObject` to the top of its parent's stacking order to ensure it's visible.
77
- - **`_togglePopup(popupType)`**: Toggles the visibility of a popup menu (either `'operations'` or `'input'`). It ensures only one popup is visible at a time and handles attaching/detaching the popup's SVG group to the toolbar's group.
78
- - **`_renderPopup(contentFactory, anchorButton)`**: A generic method to create and position a popup group. It takes a `contentFactory` function (which generates the popup's content) and an `anchorButton` to position the popup relative to.
79
- - **`_renderOperationsMenu()`**: Renders the operations menu popup, containing buttons for `'f'` (function), `'÷'`, `'×'`, `'–'`, and `'+'`.
80
- - **`_renderFunctionMenu()`**: Renders the function selection menu popup, containing buttons for common functions like `'sqrt'`, `'cos'`, `'sin'`, `'tan'`, and `'ln'`.
81
- - **`_renderDigitGrid()`**: Renders the digit grid (number pad) popup, including digits `0-9`, a backspace (`'←'`), and a variable (`'x'`).
82
- - **`_handleFunctionClick(func)`**: Handles clicks on the function menu buttons, setting the input text to the selected function name.
83
- - **`_handleDigitClick(digit)`**: Handles clicks on the digit grid buttons, updating the input value (appending digits or performing backspace).
84
- - **`_selectOperation(operation)`**: Handles the selection of a new operation from the menu, updating the left button's text and potentially clearing the input text if switching to/from function mode.
85
- - **`_applyOperation()`**: Applies the selected operation and value to the `sequence`. It parses the input value (as a number or math.js expression) and calls the appropriate method on the `sequence` (e.g., `applyEquationFunction`, `applyEquationOperation`). It also clears the input and notifies the host application to refresh the display.
86
- - **`_createButton(config)`**: A factory method for creating `jsvgButton` instances with common styling and behavior. It supports text labels, SVG icons, and custom sizes.
87
- - **`_updateApplyButtonState()`**: Updates the enabled/disabled state of the apply button based on whether there is an `inputValue`.
88
- - **`_updateToolbarLayout()`**: Updates the positions of all toolbar elements (buttons, background) to ensure correct spacing and alignment.
89
- - **`_handleUndo()`**: Handles the undo action, either by calling a custom `onUndo` callback or a global `window.onOMDToolbarUndo` hook.
90
-
91
- ## Example
92
-
93
- ```javascript
94
- import { omdToolbar } from '@teachinglab/omd';
95
- import { omdEquationSequenceNode } from '@teachinglab/omd';
96
- import { omdEquationNode } from '@teachinglab/omd';
97
-
98
- // Create an SVG container (e.g., from jsvgContainer)
99
- // const svgContainer = new jsvgContainer();
100
- // document.body.appendChild(svgContainer.svgObject);
101
-
102
- // Create an initial sequence
103
- const initialEquation = omdEquationNode.fromString('2x + 5 = 15');
104
- const sequence = new omdEquationSequenceNode([initialEquation]);
105
-
106
- // Create the toolbar and add it to the SVG container
107
- const toolbar = new omdToolbar(svgContainer, sequence, {
108
- x: 50, // Position the toolbar
109
- y: 50,
110
- showUndoButton: true, // Enable the undo button
111
- styles: { // Example of structured styling
112
- backgroundColor: '#34495e',
113
- buttonColor: '#ecf0f1',
114
- popupBackgroundColor: '#bdc3c7',
115
- borderRadius: 10
116
- }
117
- });
118
-
119
- // Interact with the toolbar to apply operations to the sequence.
120
- // For example, click the '-' button and enter '5' to subtract 5 from both sides.
121
- ```
122
-
123
- ## Notes
124
-
125
- - The toolbar can be styled via CSS for custom appearance.
126
- - Supports dynamic updates (e.g., adding/removing tools or buttons at runtime).
127
-
128
- ## See Also
129
-
130
- - [`omdEquationSequenceNode`](./omdEquationSequenceNode.md) - The sequence node the toolbar operates on.
1
+ # omdToolbar
2
+
3
+ Provides a visual toolbar UI for applying mathematical operations and functions to an `omdEquationSequenceNode` in the OMD system. The toolbar is rendered as an SVG group and supports operations like add, subtract, multiply, divide, and function application (e.g., sqrt, cos, etc.). It features dynamic popups for selecting operations and inputting values.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdToolbar
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdToolbar(parentContainer, sequence, [options])`
14
+
15
+ Creates an instance of the `omdToolbar`.
16
+
17
+ - **`parentContainer`** (`jsvgGroup`): The parent SVG group where the toolbar will be rendered.
18
+ - **`sequence`** (`omdEquationSequenceNode`): The sequence node to which operations will be applied.
19
+ - **`options`** (`object`, optional): Toolbar configuration options:
20
+ - `height` (`number`): Toolbar height. Default: `60`.
21
+ - `padding` (`number`): Padding around elements. Default: `6`.
22
+ - `spacing` (`number`): Spacing between elements. Default: `8`.
23
+ - `borderRadius` (`number`): Corner radius for background. Default: `30`.
24
+ - `fontFamily` (`string`): Font family. Default: `'Albert Sans', sans-serif`.
25
+ - `fontWeight` (`string`): Font weight. Default: `'500'`.
26
+ - `colors` (`object`): Color scheme:
27
+ - `background` (`string`): Toolbar background. Default: `omdColor.mediumGray`.
28
+ - `button` (`string`): Button background. Default: `'white'`.
29
+ - `popup` (`string`): Popup menu background. Default: `omdColor.lightGray`.
30
+ - `undo` (`string`): Undo button background. Default: `#87D143`.
31
+ - `buttonSize` (`number`): Button size. Default: `48`.
32
+ - `checkMarkSize` (`number`): Checkmark SVG size. Default: `24`.
33
+ - `mainFontSize` (`number`): Main button font size. Default: `32`.
34
+ - `inputFontSize` (`number`): Input text font size. Default: `28`.
35
+ - `menuFontSize` (`number`): Menu item font size. Default: `24`.
36
+ - `inputWidth` (`number`): Input button width. Default: `120`.
37
+ - `popupDirection` (`string`): Direction for popups (`'below'` or `'above'`). Default: `'below'`.
38
+ - `showUndoButton` (`boolean`): Whether to display an undo button. Default: `false`.
39
+ - `undoIconUrl` (`string`): Data URL for the undo button icon. Default: a base64 encoded SVG.
40
+ - `onUndo` (`function`): Custom callback function for the undo action. If not provided, it attempts to call `window.onOMDToolbarUndo`.
41
+ - `x`, `y` (`number`): Optional position of the toolbar in the parent container.
42
+ - `styles` (`object`): An object to provide structured styling options (e.g., `backgroundColor`, `buttonColor`, `popupBackgroundColor`, `borderRadius`, `buttonSize`, `mainFontSize`, `inputFontSize`, `menuFontSize`, `inputWidth`, `padding`, `spacing`). These override individual options.
43
+
44
+ ## Public Properties
45
+
46
+ - **`parentContainer`** (`jsvgGroup`): The SVG group where the toolbar is rendered.
47
+ - **`sequence`** (`omdEquationSequenceNode`): The sequence node the toolbar interacts with.
48
+ - **`config`** (`object`): The merged configuration options for the toolbar, including defaults and overrides.
49
+ - **`state`** (`object`): Internal state of the toolbar, including:
50
+ - `activePopup` (`object` | `null`): Tracks the currently active popup (`type`, `group`).
51
+ - `selectedOperation` (`string`): The currently selected operation (e.g., `'+'`, `'f'`).
52
+ - `inputValue` (`string`): The current value in the input field.
53
+ - **`elements`** (`object`): An object containing references to the various `jsvg` elements that make up the toolbar UI:
54
+ - `toolbarGroup` (`jsvgGroup`): The main SVG group for the entire toolbar.
55
+ - `background` (`jsvgRect`): The background rectangle of the toolbar.
56
+ - `leftButton` (`jsvgButton`): The button for selecting operations.
57
+ - `middleInputButton` (`jsvgButton`): The button for displaying and inputting values.
58
+ - `rightButton` (`jsvgButton`): The button for applying the operation.
59
+ - `undoButton` (`jsvgButton`): The optional undo button.
60
+
61
+ ## Public Methods
62
+
63
+ ### `setInputText(text)`
64
+
65
+ Sets the text displayed in the middle input button and updates the internal `inputValue` state. It also adjusts the font size of the button's text element for better centering.
66
+
67
+ - **`text`** (`string`): The text to display.
68
+
69
+ ### `destroy()`
70
+
71
+ Cleans up the toolbar component by removing its SVG elements from the DOM and clearing internal references.
72
+
73
+ ## Internal Methods
74
+
75
+ - **`_render()`**: Renders the initial toolbar UI components, including the background, operation button, input button, apply button, and optional undo button. It also sets up their initial positions and styling.
76
+ - **`_bringToFront(node)`**: Moves a `jsvgObject` to the top of its parent's stacking order to ensure it's visible.
77
+ - **`_togglePopup(popupType)`**: Toggles the visibility of a popup menu (either `'operations'` or `'input'`). It ensures only one popup is visible at a time and handles attaching/detaching the popup's SVG group to the toolbar's group.
78
+ - **`_renderPopup(contentFactory, anchorButton)`**: A generic method to create and position a popup group. It takes a `contentFactory` function (which generates the popup's content) and an `anchorButton` to position the popup relative to.
79
+ - **`_renderOperationsMenu()`**: Renders the operations menu popup, containing buttons for `'f'` (function), `'÷'`, `'×'`, `'–'`, and `'+'`.
80
+ - **`_renderFunctionMenu()`**: Renders the function selection menu popup, containing buttons for common functions like `'sqrt'`, `'cos'`, `'sin'`, `'tan'`, and `'ln'`.
81
+ - **`_renderDigitGrid()`**: Renders the digit grid (number pad) popup, including digits `0-9`, a backspace (`'←'`), and a variable (`'x'`).
82
+ - **`_handleFunctionClick(func)`**: Handles clicks on the function menu buttons, setting the input text to the selected function name.
83
+ - **`_handleDigitClick(digit)`**: Handles clicks on the digit grid buttons, updating the input value (appending digits or performing backspace).
84
+ - **`_selectOperation(operation)`**: Handles the selection of a new operation from the menu, updating the left button's text and potentially clearing the input text if switching to/from function mode.
85
+ - **`_applyOperation()`**: Applies the selected operation and value to the `sequence`. It parses the input value (as a number or math.js expression) and calls the appropriate method on the `sequence` (e.g., `applyEquationFunction`, `applyEquationOperation`). It also clears the input and notifies the host application to refresh the display.
86
+ - **`_createButton(config)`**: A factory method for creating `jsvgButton` instances with common styling and behavior. It supports text labels, SVG icons, and custom sizes.
87
+ - **`_updateApplyButtonState()`**: Updates the enabled/disabled state of the apply button based on whether there is an `inputValue`.
88
+ - **`_updateToolbarLayout()`**: Updates the positions of all toolbar elements (buttons, background) to ensure correct spacing and alignment.
89
+ - **`_handleUndo()`**: Handles the undo action, either by calling a custom `onUndo` callback or a global `window.onOMDToolbarUndo` hook.
90
+
91
+ ## Example
92
+
93
+ ```javascript
94
+ import { omdToolbar } from '@teachinglab/omd';
95
+ import { omdEquationSequenceNode } from '@teachinglab/omd';
96
+ import { omdEquationNode } from '@teachinglab/omd';
97
+
98
+ // Create an SVG container (e.g., from jsvgContainer)
99
+ // const svgContainer = new jsvgContainer();
100
+ // document.body.appendChild(svgContainer.svgObject);
101
+
102
+ // Create an initial sequence
103
+ const initialEquation = omdEquationNode.fromString('2x + 5 = 15');
104
+ const sequence = new omdEquationSequenceNode([initialEquation]);
105
+
106
+ // Create the toolbar and add it to the SVG container
107
+ const toolbar = new omdToolbar(svgContainer, sequence, {
108
+ x: 50, // Position the toolbar
109
+ y: 50,
110
+ showUndoButton: true, // Enable the undo button
111
+ styles: { // Example of structured styling
112
+ backgroundColor: '#34495e',
113
+ buttonColor: '#ecf0f1',
114
+ popupBackgroundColor: '#bdc3c7',
115
+ borderRadius: 10
116
+ }
117
+ });
118
+
119
+ // Interact with the toolbar to apply operations to the sequence.
120
+ // For example, click the '-' button and enter '5' to subtract 5 from both sides.
121
+ ```
122
+
123
+ ## Notes
124
+
125
+ - The toolbar can be styled via CSS for custom appearance.
126
+ - Supports dynamic updates (e.g., adding/removing tools or buttons at runtime).
127
+
128
+ ## See Also
129
+
130
+ - [`omdEquationSequenceNode`](./omdEquationSequenceNode.md) - The sequence node the toolbar operates on.
131
131
  - [`omdEquationNode`](./omdEquationNode.md) - The type of nodes typically found in the sequence.
@@ -1,96 +1,96 @@
1
- # omdTranscriptionService
2
-
3
- The `omdTranscriptionService` class provides an interface to an AI-powered transcription service for handwritten content. It sends image data to a server-side endpoint for processing, abstracting away the complexities of AI model interaction and API key management.
4
-
5
- ## Class Definition
6
-
7
- ```javascript
8
- export class omdTranscriptionService
9
- ```
10
-
11
- ## Constructor
12
-
13
- ### `new omdTranscriptionService([options])`
14
-
15
- Creates a new `omdTranscriptionService` instance.
16
-
17
- - **`options`** (`object`, optional): Configuration options for the service:
18
- - `endpoint` (`string`): The server endpoint for the transcription service. Defaults to `'/.netlify/functions/transcribe'`.
19
- - `defaultProvider` (`string`): The default transcription provider to use. Defaults to `'gemini'`.
20
-
21
- ## Public Properties
22
-
23
- - **`options`** (`object`): The configuration options for the service, including `endpoint` and `defaultProvider`.
24
-
25
- ## Public Methods
26
-
27
- ### `async transcribe(imageBlob, [options])`
28
-
29
- Transcribes an image containing handwritten content by sending it to the configured server endpoint. The image is converted to base64 before transmission.
30
-
31
- - **`imageBlob`** (`Blob`): The image blob to transcribe.
32
- - **`options`** (`object`, optional): Transcription options:
33
- - `prompt` (`string`): A custom prompt for the transcription service. If not provided, a default mathematical transcription prompt is used.
34
- - **Returns**: `Promise<object>` - A promise that resolves with the transcription result, containing the `text`, `provider`, and `confidence`.
35
- - **Throws**: `Error` if the API call fails.
36
-
37
- ### `async transcribeWithFallback(imageBlob, [options])`
38
-
39
- Transcribes an image with a fallback mechanism. Currently, this method simply calls `transcribe()`, but it is designed to allow for future implementations of fallback transcription providers or strategies.
40
-
41
- - **`imageBlob`** (`Blob`): The image blob to transcribe.
42
- - **`options`** (`object`, optional): Transcription options.
43
- - **Returns**: `Promise<object>` - A promise that resolves with the transcription result.
44
-
45
- ### `isAvailable()`
46
-
47
- Checks if the transcription service is available. In the current implementation, this always returns `true` as it relies on a serverless function endpoint.
48
-
49
- - **Returns**: `boolean` - `true` if the service is available, `false` otherwise.
50
-
51
- ### `getAvailableProviders()`
52
-
53
- Gets the list of available transcription providers. In the current implementation, this always returns `['gemini']` as the server handles the actual provider selection.
54
-
55
- - **Returns**: `Array<string>` - An array of available provider names.
56
-
57
- ### `isProviderAvailable(provider)`
58
-
59
- Checks if a specific transcription provider is available. In the current implementation, this only returns `true` for the `'gemini'` provider.
60
-
61
- - **`provider`** (`string`): The name of the provider to check.
62
- - **Returns**: `boolean` - `true` if the provider is available, `false` otherwise.
63
-
64
- ## Internal Methods
65
-
66
- - **`_getDefaultEndpoint()`**: Returns the default server endpoint URL for the transcription service (`'/.netlify/functions/transcribe'`).
67
- - **`_blobToBase64(blob)`**: Converts an `imageBlob` into a base64 encoded string, suitable for sending in a JSON payload.
68
-
69
- ## Example Usage
70
-
71
- ```javascript
72
- import { omdTranscriptionService } from '@teachinglab/omd';
73
-
74
- // Create a transcription service instance
75
- const transcriptionService = new omdTranscriptionService();
76
-
77
- // Assume getMyImageBlob() is a function that returns an image Blob
78
- async function getMyImageBlob() {
79
- // Example: Create a dummy canvas and get its blob
80
- const canvas = document.createElement('canvas');
81
- canvas.width = 100; canvas.height = 50;
82
- const ctx = canvas.getContext('2d');
83
- ctx.fillText('2x + 3', 10, 30);
84
- return new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
85
- }
86
-
87
- // Get an image blob from a canvas or file input
88
- const imageBlob = await getMyImageBlob();
89
-
90
- // Transcribe the image
91
- const result = await transcriptionService.transcribe(imageBlob, {
92
- prompt: 'Transcribe the handwritten math equation. Return only the mathematical expression.'
93
- });
94
-
95
- console.log(result.text); // The transcribed text (e.g., "2x + 3")
1
+ # omdTranscriptionService
2
+
3
+ The `omdTranscriptionService` class provides an interface to an AI-powered transcription service for handwritten content. It sends image data to a server-side endpoint for processing, abstracting away the complexities of AI model interaction and API key management.
4
+
5
+ ## Class Definition
6
+
7
+ ```javascript
8
+ export class omdTranscriptionService
9
+ ```
10
+
11
+ ## Constructor
12
+
13
+ ### `new omdTranscriptionService([options])`
14
+
15
+ Creates a new `omdTranscriptionService` instance.
16
+
17
+ - **`options`** (`object`, optional): Configuration options for the service:
18
+ - `endpoint` (`string`): The server endpoint for the transcription service. Defaults to `'/.netlify/functions/transcribe'`.
19
+ - `defaultProvider` (`string`): The default transcription provider to use. Defaults to `'gemini'`.
20
+
21
+ ## Public Properties
22
+
23
+ - **`options`** (`object`): The configuration options for the service, including `endpoint` and `defaultProvider`.
24
+
25
+ ## Public Methods
26
+
27
+ ### `async transcribe(imageBlob, [options])`
28
+
29
+ Transcribes an image containing handwritten content by sending it to the configured server endpoint. The image is converted to base64 before transmission.
30
+
31
+ - **`imageBlob`** (`Blob`): The image blob to transcribe.
32
+ - **`options`** (`object`, optional): Transcription options:
33
+ - `prompt` (`string`): A custom prompt for the transcription service. If not provided, a default mathematical transcription prompt is used.
34
+ - **Returns**: `Promise<object>` - A promise that resolves with the transcription result, containing the `text`, `provider`, and `confidence`.
35
+ - **Throws**: `Error` if the API call fails.
36
+
37
+ ### `async transcribeWithFallback(imageBlob, [options])`
38
+
39
+ Transcribes an image with a fallback mechanism. Currently, this method simply calls `transcribe()`, but it is designed to allow for future implementations of fallback transcription providers or strategies.
40
+
41
+ - **`imageBlob`** (`Blob`): The image blob to transcribe.
42
+ - **`options`** (`object`, optional): Transcription options.
43
+ - **Returns**: `Promise<object>` - A promise that resolves with the transcription result.
44
+
45
+ ### `isAvailable()`
46
+
47
+ Checks if the transcription service is available. In the current implementation, this always returns `true` as it relies on a serverless function endpoint.
48
+
49
+ - **Returns**: `boolean` - `true` if the service is available, `false` otherwise.
50
+
51
+ ### `getAvailableProviders()`
52
+
53
+ Gets the list of available transcription providers. In the current implementation, this always returns `['gemini']` as the server handles the actual provider selection.
54
+
55
+ - **Returns**: `Array<string>` - An array of available provider names.
56
+
57
+ ### `isProviderAvailable(provider)`
58
+
59
+ Checks if a specific transcription provider is available. In the current implementation, this only returns `true` for the `'gemini'` provider.
60
+
61
+ - **`provider`** (`string`): The name of the provider to check.
62
+ - **Returns**: `boolean` - `true` if the provider is available, `false` otherwise.
63
+
64
+ ## Internal Methods
65
+
66
+ - **`_getDefaultEndpoint()`**: Returns the default server endpoint URL for the transcription service (`'/.netlify/functions/transcribe'`).
67
+ - **`_blobToBase64(blob)`**: Converts an `imageBlob` into a base64 encoded string, suitable for sending in a JSON payload.
68
+
69
+ ## Example Usage
70
+
71
+ ```javascript
72
+ import { omdTranscriptionService } from '@teachinglab/omd';
73
+
74
+ // Create a transcription service instance
75
+ const transcriptionService = new omdTranscriptionService();
76
+
77
+ // Assume getMyImageBlob() is a function that returns an image Blob
78
+ async function getMyImageBlob() {
79
+ // Example: Create a dummy canvas and get its blob
80
+ const canvas = document.createElement('canvas');
81
+ canvas.width = 100; canvas.height = 50;
82
+ const ctx = canvas.getContext('2d');
83
+ ctx.fillText('2x + 3', 10, 30);
84
+ return new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
85
+ }
86
+
87
+ // Get an image blob from a canvas or file input
88
+ const imageBlob = await getMyImageBlob();
89
+
90
+ // Transcribe the image
91
+ const result = await transcriptionService.transcribe(imageBlob, {
92
+ prompt: 'Transcribe the handwritten math equation. Return only the mathematical expression.'
93
+ });
94
+
95
+ console.log(result.text); // The transcribed text (e.g., "2x + 3")
96
96
  ```