@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.
- package/README.md +520 -0
- package/dist/attempt/TestSession.d.ts +90 -0
- package/dist/attempt/TestSession.d.ts.map +1 -0
- package/dist/attempt/TestSession.js +174 -0
- package/dist/attempt/TestSession.js.map +1 -0
- package/dist/core/TypedEventBus.d.ts +48 -0
- package/dist/core/TypedEventBus.d.ts.map +1 -0
- package/dist/core/TypedEventBus.js +63 -0
- package/dist/core/TypedEventBus.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/item-loader.d.ts +45 -0
- package/dist/item-loader.d.ts.map +1 -0
- package/dist/item-loader.js +62 -0
- package/dist/item-loader.js.map +1 -0
- package/dist/player/AssessmentPlayer.d.ts +388 -0
- package/dist/player/AssessmentPlayer.d.ts.map +1 -0
- package/dist/player/AssessmentPlayer.js +965 -0
- package/dist/player/AssessmentPlayer.js.map +1 -0
- package/dist/player/index.d.ts +17 -0
- package/dist/player/index.d.ts.map +1 -0
- package/dist/player/index.js +15 -0
- package/dist/player/index.js.map +1 -0
- package/dist/player/navigation-types.d.ts +63 -0
- package/dist/player/navigation-types.d.ts.map +1 -0
- package/dist/player/navigation-types.js +7 -0
- package/dist/player/navigation-types.js.map +1 -0
- package/dist/player/qti-navigation.d.ts +29 -0
- package/dist/player/qti-navigation.d.ts.map +1 -0
- package/dist/player/qti-navigation.js +160 -0
- package/dist/player/qti-navigation.js.map +1 -0
- package/dist/reference-layout/index.d.ts +19 -0
- package/dist/reference-layout/index.d.ts.map +1 -0
- package/dist/reference-layout/index.js +20 -0
- package/dist/reference-layout/index.js.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.js +249 -0
- package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
- package/dist/services/AssessmentAuthoringService.d.ts +60 -0
- package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
- package/dist/services/AssessmentAuthoringService.js +183 -0
- package/dist/services/AssessmentAuthoringService.js.map +1 -0
- package/dist/services/ContextVariableStore.d.ts +114 -0
- package/dist/services/ContextVariableStore.d.ts.map +1 -0
- package/dist/services/ContextVariableStore.js +207 -0
- package/dist/services/ContextVariableStore.js.map +1 -0
- package/dist/services/ElementToolStateStore.d.ts +125 -0
- package/dist/services/ElementToolStateStore.d.ts.map +1 -0
- package/dist/services/ElementToolStateStore.js +200 -0
- package/dist/services/ElementToolStateStore.js.map +1 -0
- package/dist/services/HighlightCoordinator.d.ts +179 -0
- package/dist/services/HighlightCoordinator.d.ts.map +1 -0
- package/dist/services/HighlightCoordinator.js +446 -0
- package/dist/services/HighlightCoordinator.js.map +1 -0
- package/dist/services/I18nService.d.ts +121 -0
- package/dist/services/I18nService.d.ts.map +1 -0
- package/dist/services/I18nService.js +276 -0
- package/dist/services/I18nService.js.map +1 -0
- package/dist/services/PNPMapper.d.ts +71 -0
- package/dist/services/PNPMapper.d.ts.map +1 -0
- package/dist/services/PNPMapper.js +98 -0
- package/dist/services/PNPMapper.js.map +1 -0
- package/dist/services/PNPToolResolver.d.ts +127 -0
- package/dist/services/PNPToolResolver.d.ts.map +1 -0
- package/dist/services/PNPToolResolver.js +222 -0
- package/dist/services/PNPToolResolver.js.map +1 -0
- package/dist/services/SSMLExtractor.d.ts +61 -0
- package/dist/services/SSMLExtractor.d.ts.map +1 -0
- package/dist/services/SSMLExtractor.js +181 -0
- package/dist/services/SSMLExtractor.js.map +1 -0
- package/dist/services/TTSService.d.ts +162 -0
- package/dist/services/TTSService.d.ts.map +1 -0
- package/dist/services/TTSService.js +465 -0
- package/dist/services/TTSService.js.map +1 -0
- package/dist/services/ThemeProvider.d.ts +95 -0
- package/dist/services/ThemeProvider.d.ts.map +1 -0
- package/dist/services/ThemeProvider.js +299 -0
- package/dist/services/ThemeProvider.js.map +1 -0
- package/dist/services/ToolConfigResolver.d.ts +162 -0
- package/dist/services/ToolConfigResolver.d.ts.map +1 -0
- package/dist/services/ToolConfigResolver.js +230 -0
- package/dist/services/ToolConfigResolver.js.map +1 -0
- package/dist/services/ToolCoordinator.d.ts +137 -0
- package/dist/services/ToolCoordinator.d.ts.map +1 -0
- package/dist/services/ToolCoordinator.js +318 -0
- package/dist/services/ToolCoordinator.js.map +1 -0
- package/dist/services/ToolkitCoordinator.d.ts +188 -0
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
- package/dist/services/ToolkitCoordinator.js +252 -0
- package/dist/services/ToolkitCoordinator.js.map +1 -0
- package/dist/services/interfaces.d.ts +391 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +12 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
- package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
- package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
- package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/IToolProvider.js +13 -0
- package/dist/services/tool-providers/IToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.js +123 -0
- package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.js +168 -0
- package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
- package/dist/services/tool-providers/index.d.ts +18 -0
- package/dist/services/tool-providers/index.d.ts.map +1 -0
- package/dist/services/tool-providers/index.js +15 -0
- package/dist/services/tool-providers/index.js.map +1 -0
- package/dist/services/tts/browser-provider.d.ts +24 -0
- package/dist/services/tts/browser-provider.d.ts.map +1 -0
- package/dist/services/tts/browser-provider.js +177 -0
- package/dist/services/tts/browser-provider.js.map +1 -0
- package/dist/services/tts/provider-interface.d.ts +131 -0
- package/dist/services/tts/provider-interface.d.ts.map +1 -0
- package/dist/services/tts/provider-interface.js +10 -0
- package/dist/services/tts/provider-interface.js.map +1 -0
- package/dist/tools/calculators/desmos-provider.d.ts +54 -0
- package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
- package/dist/tools/calculators/desmos-provider.js +384 -0
- package/dist/tools/calculators/desmos-provider.js.map +1 -0
- package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
- package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
- package/dist/tools/calculators/mathjs-provider.js +660 -0
- package/dist/tools/calculators/mathjs-provider.js.map +1 -0
- package/dist/tools/calculators/ti-provider.d.ts +122 -0
- package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
- package/dist/tools/calculators/ti-provider.js +587 -0
- package/dist/tools/calculators/ti-provider.js.map +1 -0
- package/dist/tools/client.d.ts +17 -0
- package/dist/tools/client.d.ts.map +1 -0
- package/dist/tools/client.js +26 -0
- package/dist/tools/client.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/library-loader.d.ts +63 -0
- package/dist/tools/library-loader.d.ts.map +1 -0
- package/dist/tools/library-loader.js +292 -0
- package/dist/tools/library-loader.js.map +1 -0
- package/dist/tools/response-discovery.d.ts +72 -0
- package/dist/tools/response-discovery.d.ts.map +1 -0
- package/dist/tools/response-discovery.js +183 -0
- package/dist/tools/response-discovery.js.map +1 -0
- package/dist/tools/tool-coordinator.d.ts +76 -0
- package/dist/tools/tool-coordinator.d.ts.map +1 -0
- package/dist/tools/tool-coordinator.js +197 -0
- package/dist/tools/tool-coordinator.js.map +1 -0
- package/dist/tools/types.d.ts +427 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/variant-resolver.d.ts +48 -0
- package/dist/tools/variant-resolver.d.ts.map +1 -0
- package/dist/tools/variant-resolver.js +214 -0
- package/dist/tools/variant-resolver.js.map +1 -0
- package/dist/types/events.d.ts +157 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +11 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/src/README.md +626 -0
- package/src/components/QuestionToolBar.svelte +406 -0
- package/src/player/AssessmentLayout.svelte +68 -0
- package/src/player/README.md +154 -0
- package/src/reference-layout/README.md +135 -0
- package/src/reference-layout/ReferenceLayout.svelte +209 -0
- package/src/reference-layout/components/AssessmentContent.svelte +259 -0
- package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
- package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
- package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
- package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
- package/src/reference-layout/components/ItemPanel.svelte +200 -0
- package/src/reference-layout/components/NotesPanel.svelte +179 -0
- package/src/reference-layout/components/PassagePanel.svelte +76 -0
- package/src/tools/README.md +616 -0
- 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.
|