@pie-players/pie-assessment-toolkit 0.2.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.
Files changed (194) hide show
  1. package/README.md +520 -0
  2. package/dist/attempt/TestSession.d.ts +90 -0
  3. package/dist/attempt/TestSession.d.ts.map +1 -0
  4. package/dist/attempt/TestSession.js +174 -0
  5. package/dist/attempt/TestSession.js.map +1 -0
  6. package/dist/core/TypedEventBus.d.ts +48 -0
  7. package/dist/core/TypedEventBus.d.ts.map +1 -0
  8. package/dist/core/TypedEventBus.js +63 -0
  9. package/dist/core/TypedEventBus.js.map +1 -0
  10. package/dist/index.d.ts +37 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +44 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/item-loader.d.ts +45 -0
  15. package/dist/item-loader.d.ts.map +1 -0
  16. package/dist/item-loader.js +62 -0
  17. package/dist/item-loader.js.map +1 -0
  18. package/dist/player/AssessmentPlayer.d.ts +388 -0
  19. package/dist/player/AssessmentPlayer.d.ts.map +1 -0
  20. package/dist/player/AssessmentPlayer.js +965 -0
  21. package/dist/player/AssessmentPlayer.js.map +1 -0
  22. package/dist/player/index.d.ts +17 -0
  23. package/dist/player/index.d.ts.map +1 -0
  24. package/dist/player/index.js +15 -0
  25. package/dist/player/index.js.map +1 -0
  26. package/dist/player/navigation-types.d.ts +63 -0
  27. package/dist/player/navigation-types.d.ts.map +1 -0
  28. package/dist/player/navigation-types.js +7 -0
  29. package/dist/player/navigation-types.js.map +1 -0
  30. package/dist/player/qti-navigation.d.ts +29 -0
  31. package/dist/player/qti-navigation.d.ts.map +1 -0
  32. package/dist/player/qti-navigation.js +160 -0
  33. package/dist/player/qti-navigation.js.map +1 -0
  34. package/dist/reference-layout/index.d.ts +19 -0
  35. package/dist/reference-layout/index.d.ts.map +1 -0
  36. package/dist/reference-layout/index.js +20 -0
  37. package/dist/reference-layout/index.js.map +1 -0
  38. package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
  39. package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
  40. package/dist/services/AccessibilityCatalogResolver.js +249 -0
  41. package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
  42. package/dist/services/AssessmentAuthoringService.d.ts +60 -0
  43. package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
  44. package/dist/services/AssessmentAuthoringService.js +183 -0
  45. package/dist/services/AssessmentAuthoringService.js.map +1 -0
  46. package/dist/services/ContextVariableStore.d.ts +114 -0
  47. package/dist/services/ContextVariableStore.d.ts.map +1 -0
  48. package/dist/services/ContextVariableStore.js +207 -0
  49. package/dist/services/ContextVariableStore.js.map +1 -0
  50. package/dist/services/ElementToolStateStore.d.ts +125 -0
  51. package/dist/services/ElementToolStateStore.d.ts.map +1 -0
  52. package/dist/services/ElementToolStateStore.js +200 -0
  53. package/dist/services/ElementToolStateStore.js.map +1 -0
  54. package/dist/services/HighlightCoordinator.d.ts +179 -0
  55. package/dist/services/HighlightCoordinator.d.ts.map +1 -0
  56. package/dist/services/HighlightCoordinator.js +446 -0
  57. package/dist/services/HighlightCoordinator.js.map +1 -0
  58. package/dist/services/I18nService.d.ts +121 -0
  59. package/dist/services/I18nService.d.ts.map +1 -0
  60. package/dist/services/I18nService.js +276 -0
  61. package/dist/services/I18nService.js.map +1 -0
  62. package/dist/services/PNPMapper.d.ts +71 -0
  63. package/dist/services/PNPMapper.d.ts.map +1 -0
  64. package/dist/services/PNPMapper.js +98 -0
  65. package/dist/services/PNPMapper.js.map +1 -0
  66. package/dist/services/PNPToolResolver.d.ts +127 -0
  67. package/dist/services/PNPToolResolver.d.ts.map +1 -0
  68. package/dist/services/PNPToolResolver.js +222 -0
  69. package/dist/services/PNPToolResolver.js.map +1 -0
  70. package/dist/services/SSMLExtractor.d.ts +61 -0
  71. package/dist/services/SSMLExtractor.d.ts.map +1 -0
  72. package/dist/services/SSMLExtractor.js +181 -0
  73. package/dist/services/SSMLExtractor.js.map +1 -0
  74. package/dist/services/TTSService.d.ts +162 -0
  75. package/dist/services/TTSService.d.ts.map +1 -0
  76. package/dist/services/TTSService.js +465 -0
  77. package/dist/services/TTSService.js.map +1 -0
  78. package/dist/services/ThemeProvider.d.ts +95 -0
  79. package/dist/services/ThemeProvider.d.ts.map +1 -0
  80. package/dist/services/ThemeProvider.js +299 -0
  81. package/dist/services/ThemeProvider.js.map +1 -0
  82. package/dist/services/ToolConfigResolver.d.ts +162 -0
  83. package/dist/services/ToolConfigResolver.d.ts.map +1 -0
  84. package/dist/services/ToolConfigResolver.js +230 -0
  85. package/dist/services/ToolConfigResolver.js.map +1 -0
  86. package/dist/services/ToolCoordinator.d.ts +137 -0
  87. package/dist/services/ToolCoordinator.d.ts.map +1 -0
  88. package/dist/services/ToolCoordinator.js +318 -0
  89. package/dist/services/ToolCoordinator.js.map +1 -0
  90. package/dist/services/ToolkitCoordinator.d.ts +188 -0
  91. package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
  92. package/dist/services/ToolkitCoordinator.js +252 -0
  93. package/dist/services/ToolkitCoordinator.js.map +1 -0
  94. package/dist/services/interfaces.d.ts +391 -0
  95. package/dist/services/interfaces.d.ts.map +1 -0
  96. package/dist/services/interfaces.js +12 -0
  97. package/dist/services/interfaces.js.map +1 -0
  98. package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
  99. package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
  100. package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
  101. package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
  102. package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
  103. package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
  104. package/dist/services/tool-providers/IToolProvider.js +13 -0
  105. package/dist/services/tool-providers/IToolProvider.js.map +1 -0
  106. package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
  107. package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
  108. package/dist/services/tool-providers/TIToolProvider.js +123 -0
  109. package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
  110. package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
  111. package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
  112. package/dist/services/tool-providers/TTSToolProvider.js +168 -0
  113. package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
  114. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
  115. package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
  116. package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
  117. package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
  118. package/dist/services/tool-providers/index.d.ts +18 -0
  119. package/dist/services/tool-providers/index.d.ts.map +1 -0
  120. package/dist/services/tool-providers/index.js +15 -0
  121. package/dist/services/tool-providers/index.js.map +1 -0
  122. package/dist/services/tts/browser-provider.d.ts +24 -0
  123. package/dist/services/tts/browser-provider.d.ts.map +1 -0
  124. package/dist/services/tts/browser-provider.js +177 -0
  125. package/dist/services/tts/browser-provider.js.map +1 -0
  126. package/dist/services/tts/provider-interface.d.ts +131 -0
  127. package/dist/services/tts/provider-interface.d.ts.map +1 -0
  128. package/dist/services/tts/provider-interface.js +10 -0
  129. package/dist/services/tts/provider-interface.js.map +1 -0
  130. package/dist/tools/calculators/desmos-provider.d.ts +54 -0
  131. package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
  132. package/dist/tools/calculators/desmos-provider.js +384 -0
  133. package/dist/tools/calculators/desmos-provider.js.map +1 -0
  134. package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
  135. package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
  136. package/dist/tools/calculators/mathjs-provider.js +660 -0
  137. package/dist/tools/calculators/mathjs-provider.js.map +1 -0
  138. package/dist/tools/calculators/ti-provider.d.ts +122 -0
  139. package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
  140. package/dist/tools/calculators/ti-provider.js +587 -0
  141. package/dist/tools/calculators/ti-provider.js.map +1 -0
  142. package/dist/tools/client.d.ts +17 -0
  143. package/dist/tools/client.d.ts.map +1 -0
  144. package/dist/tools/client.js +26 -0
  145. package/dist/tools/client.js.map +1 -0
  146. package/dist/tools/index.d.ts +8 -0
  147. package/dist/tools/index.d.ts.map +1 -0
  148. package/dist/tools/index.js +10 -0
  149. package/dist/tools/index.js.map +1 -0
  150. package/dist/tools/library-loader.d.ts +63 -0
  151. package/dist/tools/library-loader.d.ts.map +1 -0
  152. package/dist/tools/library-loader.js +292 -0
  153. package/dist/tools/library-loader.js.map +1 -0
  154. package/dist/tools/response-discovery.d.ts +72 -0
  155. package/dist/tools/response-discovery.d.ts.map +1 -0
  156. package/dist/tools/response-discovery.js +183 -0
  157. package/dist/tools/response-discovery.js.map +1 -0
  158. package/dist/tools/tool-coordinator.d.ts +76 -0
  159. package/dist/tools/tool-coordinator.d.ts.map +1 -0
  160. package/dist/tools/tool-coordinator.js +197 -0
  161. package/dist/tools/tool-coordinator.js.map +1 -0
  162. package/dist/tools/types.d.ts +427 -0
  163. package/dist/tools/types.d.ts.map +1 -0
  164. package/dist/tools/types.js +13 -0
  165. package/dist/tools/types.js.map +1 -0
  166. package/dist/tools/variant-resolver.d.ts +48 -0
  167. package/dist/tools/variant-resolver.d.ts.map +1 -0
  168. package/dist/tools/variant-resolver.js +214 -0
  169. package/dist/tools/variant-resolver.js.map +1 -0
  170. package/dist/types/events.d.ts +157 -0
  171. package/dist/types/events.d.ts.map +1 -0
  172. package/dist/types/events.js +11 -0
  173. package/dist/types/events.js.map +1 -0
  174. package/dist/utils/logger.d.ts +7 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +11 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +71 -0
  179. package/src/README.md +626 -0
  180. package/src/components/QuestionToolBar.svelte +406 -0
  181. package/src/player/AssessmentLayout.svelte +68 -0
  182. package/src/player/README.md +154 -0
  183. package/src/reference-layout/README.md +135 -0
  184. package/src/reference-layout/ReferenceLayout.svelte +209 -0
  185. package/src/reference-layout/components/AssessmentContent.svelte +259 -0
  186. package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
  187. package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
  188. package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
  189. package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
  190. package/src/reference-layout/components/ItemPanel.svelte +200 -0
  191. package/src/reference-layout/components/NotesPanel.svelte +179 -0
  192. package/src/reference-layout/components/PassagePanel.svelte +76 -0
  193. package/src/tools/README.md +616 -0
  194. package/src/tools/calculators/README.md +395 -0
@@ -0,0 +1,395 @@
1
+ # Calculator Providers
2
+
3
+ Multi-provider calculator implementations for PIE assessment player.
4
+
5
+ ## Available Providers
6
+
7
+ ### 1. Math.js Provider (Open Source - Apache 2.0)
8
+
9
+ **Perfect for:** Testing, basic/scientific calculators, cost-effective solution
10
+ **License:** Apache 2.0 - No licensing fees
11
+ **Status:** ✅ Production Ready
12
+
13
+ ```typescript
14
+ import { mathjsProvider } from '$lib/assessment-toolkit/tools';
15
+
16
+ // Initialize
17
+ await mathjsProvider.initialize();
18
+
19
+ // Create basic calculator
20
+ const container = document.getElementById('calculator-container');
21
+ const calculator = await mathjsProvider.createCalculator('basic', container);
22
+
23
+ // Create scientific calculator with theme
24
+ const scientificCalc = await mathjsProvider.createCalculator('scientific', container, {
25
+ theme: 'light' // or 'dark' or 'auto'
26
+ });
27
+ ```
28
+
29
+ **Features:**
30
+ - ✅ Full calculator UI with buttons
31
+ - ✅ Basic arithmetic (4 functions)
32
+ - ✅ Scientific functions (sin, cos, tan, log, ln, sqrt, powers)
33
+ - ✅ Constants (π, e)
34
+ - ✅ Angle modes (degrees/radians)
35
+ - ✅ Calculation history
36
+ - ✅ Keyboard support
37
+ - ✅ Theme support (light/dark/auto)
38
+ - ✅ State persistence
39
+
40
+ **Supported Types:**
41
+ - `'basic'` - Basic 4-function calculator
42
+ - `'scientific'` - Scientific calculator with trigonometry, logarithms, etc.
43
+
44
+ ---
45
+
46
+ ### 2. Desmos Provider (Requires License)
47
+
48
+ **Perfect for:** Professional graphing, advanced visualization
49
+ **License:** Proprietary - Requires license from Desmos
50
+ **Status:** ✅ Production Ready
51
+
52
+ **API Key Required:** Production usage requires a Desmos API key. Contact Desmos at partnerships@desmos.com or visit https://www.desmos.com/api
53
+
54
+ ```typescript
55
+ import { desmosProvider } from '$lib/assessment-toolkit/tools';
56
+
57
+ // Option 1: Initialize with API key (recommended)
58
+ await desmosProvider.initialize({
59
+ apiKey: 'your_desmos_api_key_here'
60
+ });
61
+
62
+ // Option 2: Pass API key in calculator config
63
+ await desmosProvider.initialize();
64
+ const calculator = await desmosProvider.createCalculator('graphing', container, {
65
+ theme: 'light',
66
+ restrictedMode: false,
67
+ desmos: {
68
+ apiKey: 'your_desmos_api_key_here'
69
+ }
70
+ });
71
+
72
+ // Option 3: Set globally (before initialization)
73
+ window.PIE_DESMOS_API_KEY = 'your_desmos_api_key_here';
74
+ await desmosProvider.initialize();
75
+
76
+ // Use Desmos API
77
+ calculator.setValue('y = x^2');
78
+ ```
79
+
80
+ **Development/Testing:** The provider works without an API key for development and testing purposes, but production deployments require a valid Desmos license and API key.
81
+
82
+ **Features:**
83
+ - ✅ Professional graphing
84
+ - ✅ 3D graphing capability
85
+ - ✅ Interactive equation editor
86
+ - ✅ Regression analysis
87
+ - ✅ Sliders and parameters
88
+ - ✅ Widely used in education
89
+
90
+ **Supported Types:**
91
+ - `'basic'` - Basic calculator
92
+ - `'scientific'` - Scientific calculator
93
+ - `'graphing'` - Graphing calculator
94
+
95
+ ---
96
+
97
+ ### 3. TI Provider (Stub - Requires License)
98
+
99
+ **Perfect for:** Future TI calculator emulation
100
+ **License:** Proprietary - Requires license from Texas Instruments
101
+ **Status:** ⚠️ Stub Implementation Only
102
+
103
+ ```typescript
104
+ import { tiProvider } from '$lib/assessment-toolkit/tools';
105
+
106
+ // This is a placeholder implementation
107
+ // Actual TI emulator integration requires:
108
+ // 1. Licensed TI emulator libraries
109
+ // 2. Appropriate licensing agreements
110
+ // 3. Integration with TI emulator APIs
111
+ ```
112
+
113
+ **Supported Types (when available):**
114
+ - `'ti-84'` - TI-84 Plus CE emulator
115
+ - `'ti-108'` - TI-108 Elementary calculator
116
+ - `'ti-34-mv'` - TI-34 MultiView calculator
117
+
118
+ ---
119
+
120
+ ## Usage Examples
121
+
122
+ ### Basic Calculator
123
+
124
+ ```typescript
125
+ import { mathjsProvider } from '$lib/assessment-toolkit/tools';
126
+
127
+ async function createBasicCalculator() {
128
+ // Initialize provider
129
+ await mathjsProvider.initialize();
130
+
131
+ // Create calculator
132
+ const container = document.getElementById('basic-calc');
133
+ const calculator = await mathjsProvider.createCalculator('basic', container);
134
+
135
+ // Calculator is ready to use!
136
+ // Users can click buttons or use keyboard
137
+ }
138
+ ```
139
+
140
+ ### Scientific Calculator with Response Integration
141
+
142
+ ```typescript
143
+ import { mathjsProvider, responseDiscovery } from '$lib/assessment-toolkit/tools';
144
+
145
+ async function createScientificCalculator() {
146
+ await mathjsProvider.initialize();
147
+
148
+ const container = document.getElementById('scientific-calc');
149
+ const calculator = await mathjsProvider.createCalculator('scientific', container, {
150
+ theme: 'dark'
151
+ });
152
+
153
+ // Setup response discovery
154
+ responseDiscovery.setupFocusTracking();
155
+
156
+ // Add "Insert" button to calculator
157
+ const insertBtn = document.createElement('button');
158
+ insertBtn.textContent = 'Insert into Answer';
159
+ insertBtn.onclick = async () => {
160
+ const activeResponse = responseDiscovery.getActiveResponse();
161
+ if (activeResponse) {
162
+ const value = calculator.getValue();
163
+ await activeResponse.insertContent(value, {
164
+ mode: 'insert',
165
+ format: 'numeric',
166
+ source: {
167
+ toolId: 'scientific-calculator',
168
+ toolType: 'mathjs-scientific',
169
+ timestamp: Date.now(),
170
+ },
171
+ });
172
+ }
173
+ };
174
+
175
+ container.appendChild(insertBtn);
176
+ }
177
+ ```
178
+
179
+ ### State Persistence
180
+
181
+ ```typescript
182
+ // Export calculator state
183
+ const state = calculator.exportState();
184
+ localStorage.setItem('calculator-state', JSON.stringify(state));
185
+
186
+ // Restore calculator state
187
+ const savedState = JSON.parse(localStorage.getItem('calculator-state'));
188
+ if (savedState) {
189
+ calculator.importState(savedState);
190
+ }
191
+ ```
192
+
193
+ ### History Access
194
+
195
+ ```typescript
196
+ // Get calculation history
197
+ const history = calculator.getHistory();
198
+ history.forEach(entry => {
199
+ console.log(`${entry.expression} = ${entry.result}`);
200
+ console.log(`Timestamp: ${new Date(entry.timestamp)}`);
201
+ });
202
+
203
+ // Clear history
204
+ calculator.clearHistory();
205
+ ```
206
+
207
+ ---
208
+
209
+ ## Provider Comparison
210
+
211
+ | Feature | Math.js | Desmos | TI |
212
+ |---------|---------|--------|-----|
213
+ | **Cost** | FREE | Requires License | Requires License |
214
+ | **Basic Calculator** | ✅ | ✅ | ❌ |
215
+ | **Scientific** | ✅ | ✅ | ❌ |
216
+ | **Graphing** | ❌ | ✅ | ✅ (TI-84) |
217
+ | **Button UI** | ✅ | ✅ | ⚠️ Stub |
218
+ | **Keyboard Support** | ✅ | ✅ | ⚠️ Stub |
219
+ | **State Persistence** | ✅ | ✅ | ⚠️ Stub |
220
+ | **Themes** | ✅ | ✅ | ⚠️ Stub |
221
+ | **Best For** | Testing & Basic | Graphing | Future TI Emulation |
222
+
223
+ ---
224
+
225
+ ## Implementation Guide
226
+
227
+ ### Creating a Calculator Tool Component
228
+
229
+ ```svelte
230
+ <!-- tool-calculator.svelte -->
231
+ <script lang="ts">
232
+ import { onMount, onDestroy } from 'svelte';
233
+ import { toolCoordinator, mathjsProvider } from '$lib/assessment-toolkit/tools';
234
+ import type { Calculator } from '$lib/assessment-toolkit/tools';
235
+
236
+ export let visible: boolean = false;
237
+ export let toolId: string = 'calculator';
238
+ export let calculatorType: 'basic' | 'scientific' = 'basic';
239
+
240
+ let containerEl: HTMLDivElement;
241
+ let calculatorInstance: Calculator | null = null;
242
+
243
+ async function initCalculator() {
244
+ if (calculatorInstance) return;
245
+
246
+ await mathjsProvider.initialize();
247
+ calculatorInstance = await mathjsProvider.createCalculator(
248
+ calculatorType,
249
+ containerEl,
250
+ { theme: 'auto' }
251
+ );
252
+ }
253
+
254
+ function handleClose() {
255
+ toolCoordinator.hideTool(toolId);
256
+ }
257
+
258
+ onMount(async () => {
259
+ toolCoordinator.registerTool(toolId, 'Calculator', containerEl);
260
+ if (visible) {
261
+ await initCalculator();
262
+ }
263
+ });
264
+
265
+ onDestroy(() => {
266
+ if (calculatorInstance) {
267
+ calculatorInstance.destroy();
268
+ }
269
+ toolCoordinator.unregisterTool(toolId);
270
+ });
271
+
272
+ $: if (visible && containerEl && !calculatorInstance) {
273
+ initCalculator();
274
+ }
275
+ </script>
276
+
277
+ {#if visible}
278
+ <div
279
+ bind:this={containerEl}
280
+ class="calculator-tool"
281
+ on:mousedown={() => toolCoordinator.bringToFront(toolId)}
282
+ >
283
+ <div class="tool-header">
284
+ <span>Calculator</span>
285
+ <button on:click={handleClose}>×</button>
286
+ </div>
287
+
288
+ <!-- Calculator will be rendered here by provider -->
289
+ </div>
290
+ {/if}
291
+
292
+ <style>
293
+ .calculator-tool {
294
+ position: fixed;
295
+ top: 100px;
296
+ right: 50px;
297
+ z-index: 1000;
298
+ }
299
+
300
+ .tool-header {
301
+ padding: 10px;
302
+ background: #34495e;
303
+ color: white;
304
+ display: flex;
305
+ justify-content: space-between;
306
+ align-items: center;
307
+ border-radius: 8px 8px 0 0;
308
+ }
309
+ </style>
310
+ ```
311
+
312
+ ---
313
+
314
+ ## Math.js Calculator Keyboard Shortcuts
315
+
316
+ The Math.js calculator supports full keyboard navigation:
317
+
318
+ - **Numbers:** `0-9`
319
+ - **Operators:** `+`, `-`, `*`, `/`
320
+ - **Decimal:** `.`
321
+ - **Parentheses:** `(`, `)`
322
+ - **Enter:** Calculate result
323
+ - **Escape:** Clear calculator
324
+ - **Backspace:** Delete last character
325
+
326
+ ---
327
+
328
+ ## Architecture
329
+
330
+ All calculator providers implement the same `CalculatorProvider` interface, allowing seamless provider switching:
331
+
332
+ ```typescript
333
+ interface CalculatorProvider {
334
+ readonly providerId: string;
335
+ readonly providerName: string;
336
+ readonly supportedTypes: CalculatorType[];
337
+ readonly version: string;
338
+
339
+ initialize(): Promise<void>;
340
+ createCalculator(type: CalculatorType, container: HTMLElement, config?: CalculatorProviderConfig): Promise<Calculator>;
341
+ supportsType(type: CalculatorType): boolean;
342
+ destroy(): void;
343
+ getCapabilities(): CalculatorProviderCapabilities;
344
+ }
345
+ ```
346
+
347
+ This abstraction means you can easily switch between providers without changing your code:
348
+
349
+ ```typescript
350
+ // Use Math.js for testing
351
+ const calculator = await mathjsProvider.createCalculator('scientific', container);
352
+
353
+ // Switch to Desmos for graphing (requires license)
354
+ const graphCalc = await desmosProvider.createCalculator('graphing', container);
355
+ ```
356
+
357
+ ---
358
+
359
+ ## Testing
360
+
361
+ The Math.js provider is perfect for testing calculator functionality without external dependencies or licensing:
362
+
363
+ ```typescript
364
+ import { mathjsProvider } from '$lib/assessment-toolkit/tools';
365
+
366
+ describe('Calculator Tests', () => {
367
+ it('should create basic calculator', async () => {
368
+ await mathjsProvider.initialize();
369
+ const container = document.createElement('div');
370
+ const calculator = await mathjsProvider.createCalculator('basic', container);
371
+
372
+ expect(calculator).toBeDefined();
373
+ expect(calculator.getValue()).toBe('0');
374
+ });
375
+
376
+ it('should perform calculations', async () => {
377
+ await mathjsProvider.initialize();
378
+ const container = document.createElement('div');
379
+ const calculator = await mathjsProvider.createCalculator('scientific', container);
380
+
381
+ const result = await calculator.evaluate('2 + 2');
382
+ expect(result).toBe('4');
383
+ });
384
+ });
385
+ ```
386
+
387
+ ---
388
+
389
+ ## License Information
390
+
391
+ - **Math.js:** Apache 2.0 - Free for commercial use
392
+ - **Desmos:** Proprietary - Contact Desmos for licensing
393
+ - **TI Emulators:** Proprietary - Contact Texas Instruments for licensing
394
+
395
+ See [open-source-calculator-comparison.md](../../../docs/tools-and-accomodations/open-source-calculator-comparison.md) for detailed comparison.