@pie-players/pie-assessment-toolkit 0.3.61 → 0.3.63
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/dist/attempt/AssessmentSession.js +0 -1
- package/dist/attempt/TestSession.js +0 -1
- package/dist/attempt/adapters/activity-to-test-attempt-session.js +0 -1
- package/dist/components/ItemToolBar.custom-element.js +1 -10106
- package/dist/components/PieAssessmentToolkit.custom-element.js +48 -29930
- package/dist/components/SectionToolBar.custom-element.js +1 -14372
- package/dist/components/chunks/ItemToolBar-843902tp.js +51 -0
- package/dist/components/chunks/ItemToolBar-84nv78dy.js +22 -0
- package/dist/components/item-toolbar-element.js +0 -1
- package/dist/components/pie-assessment-toolkit-element.js +0 -1
- package/dist/components/section-toolbar-element.js +0 -1
- package/dist/context/assessment-toolkit-context.js +0 -1
- package/dist/context/runtime-context-consumer.js +0 -1
- package/dist/index.js +0 -1
- package/dist/item-loader.js +0 -1
- package/dist/policy/core/PolicySource.js +0 -1
- package/dist/policy/core/ToolPolicyEngine.js +0 -1
- package/dist/policy/core/compose-decision.js +0 -1
- package/dist/policy/core/decision-types.js +0 -1
- package/dist/policy/core/engine-context.js +0 -1
- package/dist/policy/core/pnp-policy-inputs.js +0 -1
- package/dist/policy/core/policy-source-tag.js +0 -1
- package/dist/policy/core/provenance.js +0 -1
- package/dist/policy/engine.js +0 -1
- package/dist/policy/internal.js +0 -1
- package/dist/policy/sources/PnpPolicySource.js +0 -1
- package/dist/runtime/RuntimeRegistry.js +0 -1
- package/dist/runtime/SectionRuntimeEngine.js +0 -1
- package/dist/runtime/adapter/SectionEngineAdapter.js +0 -1
- package/dist/runtime/adapter/coordinator-bridge.js +0 -1
- package/dist/runtime/adapter/dom-event-bridge.js +0 -1
- package/dist/runtime/adapter/framework-error-bridge.js +0 -1
- package/dist/runtime/adapter/instrumentation-bridge.js +0 -1
- package/dist/runtime/adapter/subscriber-fanout.js +0 -1
- package/dist/runtime/catalog-registration.js +0 -1
- package/dist/runtime/core/SectionEngineCore.js +0 -1
- package/dist/runtime/core/cohort.js +0 -1
- package/dist/runtime/core/engine-input.js +0 -1
- package/dist/runtime/core/engine-output.js +0 -1
- package/dist/runtime/core/engine-readiness.js +0 -1
- package/dist/runtime/core/engine-resolver.js +0 -1
- package/dist/runtime/core/engine-stage-derivation.js +0 -1
- package/dist/runtime/core/engine-state.js +0 -1
- package/dist/runtime/core/engine-transition.js +0 -1
- package/dist/runtime/engine-context.js +0 -1
- package/dist/runtime/engine.js +0 -1
- package/dist/runtime/internal.js +0 -1
- package/dist/runtime/registration-events.js +0 -1
- package/dist/runtime/runtime-id.js +0 -1
- package/dist/runtime/section-runtime-engine-host-context.js +0 -1
- package/dist/runtime/session-event-emitter-policy.js +0 -1
- package/dist/runtime/stage-emit-gate.js +0 -1
- package/dist/runtime/tool-host-contract.js +0 -1
- package/dist/services/AccessibilityCatalogResolver.js +0 -1
- package/dist/services/ContextVariableStore.js +0 -1
- package/dist/services/ElementToolStateStore.js +0 -1
- package/dist/services/HighlightCoordinator.js +35 -3
- package/dist/services/I18nService.js +0 -1
- package/dist/services/RangeSerializer.js +0 -1
- package/dist/services/SSMLExtractor.js +0 -1
- package/dist/services/TTSService.js +0 -1
- package/dist/services/ThemeProvider.js +0 -1
- package/dist/services/ToolConfigResolver.js +0 -1
- package/dist/services/ToolCoordinator.js +0 -1
- package/dist/services/ToolRegistry.js +0 -1
- package/dist/services/ToolkitCoordinator.js +0 -1
- package/dist/services/create-tools-config.js +0 -1
- package/dist/services/createDefaultToolRegistry.js +0 -1
- package/dist/services/defaultPersonalNeedsProfile.js +0 -1
- package/dist/services/framework-error-bus.js +0 -1
- package/dist/services/framework-error.js +0 -1
- package/dist/services/interfaces.js +0 -1
- package/dist/services/pnp-standard-features.js +0 -1
- package/dist/services/section-controller-types.js +0 -1
- package/dist/services/tool-config-defaults.js +0 -1
- package/dist/services/tool-config-validation.js +0 -1
- package/dist/services/tool-context.js +0 -1
- package/dist/services/tool-instance-id.js +0 -1
- package/dist/services/tool-providers/DesmosToolProvider.js +0 -1
- package/dist/services/tool-providers/TTSToolProvider.js +0 -1
- package/dist/services/tool-providers/ToolProviderApi.js +0 -1
- package/dist/services/tool-providers/ToolProviderRegistry.js +0 -1
- package/dist/services/tool-providers/index.js +0 -1
- package/dist/services/toolbar-items.js +0 -1
- package/dist/services/tools-config-normalizer.js +0 -1
- package/dist/services/tts/browser-provider.js +0 -1
- package/dist/services/tts/catalog-span-alignment.js +0 -1
- package/dist/services/tts/generated-speech/assemble-plan.js +0 -1
- package/dist/services/tts/generated-speech/dom/build-dom-plan.js +0 -1
- package/dist/services/tts/generated-speech/dom/to-chunk-inputs.js +0 -1
- package/dist/services/tts/generated-speech/dom/types.js +0 -1
- package/dist/services/tts/generated-speech/index.js +0 -1
- package/dist/services/tts/generated-speech/math-speech-cache.js +0 -1
- package/dist/services/tts/generated-speech/types.js +0 -1
- package/dist/services/tts/highlight-pipeline/boundary-normalizer.js +0 -1
- package/dist/services/tts/highlight-pipeline/create-highlight-plan.js +0 -1
- package/dist/services/tts/highlight-pipeline/highlight-policy.js +0 -1
- package/dist/services/tts/highlight-pipeline/index.js +0 -1
- package/dist/services/tts/highlight-pipeline/math-semantic-resolver.js +0 -1
- package/dist/services/tts/highlight-pipeline/normalize-speech-chunks.js +0 -1
- package/dist/services/tts/highlight-pipeline/prose-boundary-resolver.js +0 -1
- package/dist/services/tts/highlight-pipeline/readable-region.js +0 -1
- package/dist/services/tts/highlight-pipeline/rendered-math-target-resolver.js +0 -1
- package/dist/services/tts/highlight-pipeline/types.js +0 -1
- package/dist/services/tts/highlight-pipeline/visible-map-range.js +0 -1
- package/dist/services/tts/highlight-target-resolver.js +0 -1
- package/dist/services/tts/math-alignment/index.js +0 -1
- package/dist/services/tts/math-alignment/mathml-tokenizer.js +0 -1
- package/dist/services/tts/math-alignment/range-resolver.js +0 -1
- package/dist/services/tts/math-alignment/sequence-aligner.js +0 -1
- package/dist/services/tts/math-alignment/speech-tokenizer.js +0 -1
- package/dist/services/tts/math-alignment/types.js +0 -1
- package/dist/services/tts/math-aware-text-processing.js +0 -1
- package/dist/services/tts/math-speech.js +0 -1
- package/dist/services/tts/mathml-sanitization.js +0 -1
- package/dist/services/tts/ssml/spoken-text.js +0 -1
- package/dist/services/tts/text-processing.js +0 -1
- package/dist/services/tts/text-segmentation.js +0 -1
- package/dist/services/tts/visual-line-ranges.js +0 -1
- package/dist/services/tts-control-events.js +0 -1
- package/dist/services/tts-runtime-config.js +0 -1
- package/dist/tools/calculators/desmos-provider.js +0 -1
- package/dist/tools/client.js +0 -1
- package/dist/tools/index.js +0 -1
- package/dist/tools/library-loader.js +0 -1
- package/dist/tools/registrations/accessibility-tools.js +0 -1
- package/dist/tools/registrations/calculator.js +0 -1
- package/dist/tools/registrations/interaction-tools.js +0 -1
- package/dist/tools/registrations/measurement-tools.js +0 -1
- package/dist/tools/registrations/subject-specific-tools.js +0 -1
- package/dist/tools/registrations/toolbar-registration-helpers.js +0 -1
- package/dist/tools/registrations/tts.js +0 -1
- package/dist/tools/response-discovery.js +0 -1
- package/dist/tools/tool-tag-map.js +0 -1
- package/dist/tools/types.js +0 -1
- package/dist/tools/variant-resolver.js +0 -1
- package/dist/utils/logger.js +0 -1
- package/package.json +13 -11
- package/dist/attempt/AssessmentSession.js.map +0 -1
- package/dist/attempt/TestSession.js.map +0 -1
- package/dist/attempt/adapters/activity-to-test-attempt-session.js.map +0 -1
- package/dist/components/item-toolbar-element.js.map +0 -1
- package/dist/components/pie-assessment-toolkit-element.js.map +0 -1
- package/dist/components/section-toolbar-element.js.map +0 -1
- package/dist/context/assessment-toolkit-context.js.map +0 -1
- package/dist/context/runtime-context-consumer.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/item-loader.js.map +0 -1
- package/dist/policy/core/PolicySource.js.map +0 -1
- package/dist/policy/core/ToolPolicyEngine.js.map +0 -1
- package/dist/policy/core/compose-decision.js.map +0 -1
- package/dist/policy/core/decision-types.js.map +0 -1
- package/dist/policy/core/engine-context.js.map +0 -1
- package/dist/policy/core/pnp-policy-inputs.js.map +0 -1
- package/dist/policy/core/policy-source-tag.js.map +0 -1
- package/dist/policy/core/provenance.js.map +0 -1
- package/dist/policy/engine.js.map +0 -1
- package/dist/policy/internal.js.map +0 -1
- package/dist/policy/sources/PnpPolicySource.js.map +0 -1
- package/dist/runtime/RuntimeRegistry.js.map +0 -1
- package/dist/runtime/SectionRuntimeEngine.js.map +0 -1
- package/dist/runtime/adapter/SectionEngineAdapter.js.map +0 -1
- package/dist/runtime/adapter/coordinator-bridge.js.map +0 -1
- package/dist/runtime/adapter/dom-event-bridge.js.map +0 -1
- package/dist/runtime/adapter/framework-error-bridge.js.map +0 -1
- package/dist/runtime/adapter/instrumentation-bridge.js.map +0 -1
- package/dist/runtime/adapter/subscriber-fanout.js.map +0 -1
- package/dist/runtime/catalog-registration.js.map +0 -1
- package/dist/runtime/core/SectionEngineCore.js.map +0 -1
- package/dist/runtime/core/cohort.js.map +0 -1
- package/dist/runtime/core/engine-input.js.map +0 -1
- package/dist/runtime/core/engine-output.js.map +0 -1
- package/dist/runtime/core/engine-readiness.js.map +0 -1
- package/dist/runtime/core/engine-resolver.js.map +0 -1
- package/dist/runtime/core/engine-stage-derivation.js.map +0 -1
- package/dist/runtime/core/engine-state.js.map +0 -1
- package/dist/runtime/core/engine-transition.js.map +0 -1
- package/dist/runtime/engine-context.js.map +0 -1
- package/dist/runtime/engine.js.map +0 -1
- package/dist/runtime/internal.js.map +0 -1
- package/dist/runtime/registration-events.js.map +0 -1
- package/dist/runtime/runtime-id.js.map +0 -1
- package/dist/runtime/section-runtime-engine-host-context.js.map +0 -1
- package/dist/runtime/session-event-emitter-policy.js.map +0 -1
- package/dist/runtime/stage-emit-gate.js.map +0 -1
- package/dist/runtime/tool-host-contract.js.map +0 -1
- package/dist/services/AccessibilityCatalogResolver.js.map +0 -1
- package/dist/services/ContextVariableStore.js.map +0 -1
- package/dist/services/ElementToolStateStore.js.map +0 -1
- package/dist/services/HighlightCoordinator.js.map +0 -1
- package/dist/services/I18nService.js.map +0 -1
- package/dist/services/RangeSerializer.js.map +0 -1
- package/dist/services/SSMLExtractor.js.map +0 -1
- package/dist/services/TTSService.js.map +0 -1
- package/dist/services/ThemeProvider.js.map +0 -1
- package/dist/services/ToolConfigResolver.js.map +0 -1
- package/dist/services/ToolCoordinator.js.map +0 -1
- package/dist/services/ToolRegistry.js.map +0 -1
- package/dist/services/ToolkitCoordinator.js.map +0 -1
- package/dist/services/create-tools-config.js.map +0 -1
- package/dist/services/createDefaultToolRegistry.js.map +0 -1
- package/dist/services/defaultPersonalNeedsProfile.js.map +0 -1
- package/dist/services/framework-error-bus.js.map +0 -1
- package/dist/services/framework-error.js.map +0 -1
- package/dist/services/interfaces.js.map +0 -1
- package/dist/services/pnp-standard-features.js.map +0 -1
- package/dist/services/section-controller-types.js.map +0 -1
- package/dist/services/tool-config-defaults.js.map +0 -1
- package/dist/services/tool-config-validation.js.map +0 -1
- package/dist/services/tool-context.js.map +0 -1
- package/dist/services/tool-instance-id.js.map +0 -1
- package/dist/services/tool-providers/DesmosToolProvider.js.map +0 -1
- package/dist/services/tool-providers/TTSToolProvider.js.map +0 -1
- package/dist/services/tool-providers/ToolProviderApi.js.map +0 -1
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +0 -1
- package/dist/services/tool-providers/index.js.map +0 -1
- package/dist/services/toolbar-items.js.map +0 -1
- package/dist/services/tools-config-normalizer.js.map +0 -1
- package/dist/services/tts/browser-provider.js.map +0 -1
- package/dist/services/tts/catalog-span-alignment.js.map +0 -1
- package/dist/services/tts/generated-speech/assemble-plan.js.map +0 -1
- package/dist/services/tts/generated-speech/dom/build-dom-plan.js.map +0 -1
- package/dist/services/tts/generated-speech/dom/to-chunk-inputs.js.map +0 -1
- package/dist/services/tts/generated-speech/dom/types.js.map +0 -1
- package/dist/services/tts/generated-speech/index.js.map +0 -1
- package/dist/services/tts/generated-speech/math-speech-cache.js.map +0 -1
- package/dist/services/tts/generated-speech/types.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/boundary-normalizer.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/create-highlight-plan.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/highlight-policy.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/index.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/math-semantic-resolver.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/normalize-speech-chunks.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/prose-boundary-resolver.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/readable-region.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/rendered-math-target-resolver.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/types.js.map +0 -1
- package/dist/services/tts/highlight-pipeline/visible-map-range.js.map +0 -1
- package/dist/services/tts/highlight-target-resolver.js.map +0 -1
- package/dist/services/tts/math-alignment/index.js.map +0 -1
- package/dist/services/tts/math-alignment/mathml-tokenizer.js.map +0 -1
- package/dist/services/tts/math-alignment/range-resolver.js.map +0 -1
- package/dist/services/tts/math-alignment/sequence-aligner.js.map +0 -1
- package/dist/services/tts/math-alignment/speech-tokenizer.js.map +0 -1
- package/dist/services/tts/math-alignment/types.js.map +0 -1
- package/dist/services/tts/math-aware-text-processing.js.map +0 -1
- package/dist/services/tts/math-speech.js.map +0 -1
- package/dist/services/tts/mathml-sanitization.js.map +0 -1
- package/dist/services/tts/ssml/spoken-text.js.map +0 -1
- package/dist/services/tts/text-processing.js.map +0 -1
- package/dist/services/tts/text-segmentation.js.map +0 -1
- package/dist/services/tts/visual-line-ranges.js.map +0 -1
- package/dist/services/tts-control-events.js.map +0 -1
- package/dist/services/tts-runtime-config.js.map +0 -1
- package/dist/tools/calculators/desmos-provider.js.map +0 -1
- package/dist/tools/client.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/library-loader.js.map +0 -1
- package/dist/tools/registrations/accessibility-tools.js.map +0 -1
- package/dist/tools/registrations/calculator.js.map +0 -1
- package/dist/tools/registrations/interaction-tools.js.map +0 -1
- package/dist/tools/registrations/measurement-tools.js.map +0 -1
- package/dist/tools/registrations/subject-specific-tools.js.map +0 -1
- package/dist/tools/registrations/toolbar-registration-helpers.js.map +0 -1
- package/dist/tools/registrations/tts.js.map +0 -1
- package/dist/tools/response-discovery.js.map +0 -1
- package/dist/tools/tool-tag-map.js.map +0 -1
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/variant-resolver.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tts-runtime-config.js","sourceRoot":"","sources":["../../src/services/tts-runtime-config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TTSConfig } from \"./TTSService.js\";\nimport type { ToolProviderConfig } from \"./tools-config-normalizer.js\";\nimport {\n\tnormalizeSREMathSpeechOptions,\n\ttype SREMathSpeechOptions,\n} from \"./tts/math-speech.js\";\n\nexport type TTSLayoutMode =\n\t| \"reserved-row\"\n\t| \"expanding-row\"\n\t| \"floating-overlay\"\n\t| \"left-aligned\";\n\nconst VALID_TTS_LAYOUT_MODES = new Set<TTSLayoutMode>([\n\t\"reserved-row\",\n\t\"expanding-row\",\n\t\"floating-overlay\",\n\t\"left-aligned\",\n]);\n\nexport interface TTSHostToolbarLayout {\n\tmount: \"before-buttons\";\n\tcontrolsRow: {\n\t\treserveSpace: boolean;\n\t\texpandWhenToolActive: boolean;\n\t};\n\theaderOverlay: {\n\t\texpandWhenToolActive: boolean;\n\t};\n}\n\nexport interface TTSSpeedOptionConfig {\n\trate: number;\n\tlabel?: string;\n\tariaLabel?: string;\n\tdefault?: boolean;\n}\n\nexport type TTSSpeedOption = number | TTSSpeedOptionConfig;\n\nexport interface NormalizedTTSSpeedOption {\n\trate: number;\n\tlabel: string;\n\tariaLabel: string;\n\tisDefault: boolean;\n}\n\nexport interface TTSRuntimeSettings {\n\tbackend?: \"browser\" | \"polly\" | \"google\" | \"server\";\n\tserverProvider?: \"polly\" | \"google\" | \"custom\";\n\tprovider?: \"polly\" | \"google\" | \"custom\";\n\tengine?: \"standard\" | \"neural\";\n\tsampleRate?: number;\n\tformat?: \"mp3\" | \"ogg\" | \"pcm\";\n\tspeechMarksMode?: \"word\" | \"word+sentence\";\n\tdefaultVoice?: string;\n\trate?: number;\n\tpitch?: number;\n\tapiEndpoint?: string;\n\tlanguage?: string;\n\ttransportMode?: \"pie\" | \"custom\";\n\tendpointMode?: \"synthesizePath\" | \"rootPost\";\n\tendpointValidationMode?: \"voices\" | \"endpoint\" | \"none\";\n\tincludeAuthOnAssetFetch?: boolean;\n\tvalidateEndpoint?: boolean;\n\tcache?: boolean;\n\tspeedRate?: \"slow\" | \"medium\" | \"fast\";\n\tlang_id?: string;\n\t/**\n\t * Optional inline TTS speed buttons.\n\t * - Omitted/non-array: default speed buttons are shown.\n\t * - Empty array: hide speed buttons.\n\t * - Arrays that sanitize to no valid values: default speed buttons are shown.\n\t * - Object entries can customize button text while preserving numeric rates.\n\t */\n\tspeedOptions?: TTSSpeedOption[];\n\t/**\n\t * Show a rendered speed group even when there is only one visible option.\n\t * Defaults to false because a one-option radio group has no meaningful choice.\n\t */\n\tshowSingleSpeedOption?: boolean;\n\tlayoutMode?: TTSLayoutMode;\n\t/**\n\t * Per-token highlighting of math expressions.\n\t * - `true` / omitted (default): when the spoken math aligns confidently to the\n\t * rendered MathML, the formula is highlighted glyph by glyph; otherwise it\n\t * safely falls back to a whole-formula block.\n\t * - `false`: every formula is highlighted as a single block (the fallback),\n\t * never broken into per-token highlights. Prose word tracking is unaffected.\n\t */\n\tmathTokenHighlighting?: boolean;\n\t/**\n\t * Speech Rule Engine options for generated MathML speech. Hosts can use these\n\t * to tune SRE itself (for example ClearSpeak ImpliedTimes/Paren preferences)\n\t * instead of relying on toolkit-specific speech rewrites.\n\t */\n\tmathSpeech?: SREMathSpeechOptions;\n}\n\nconst toRecord = (value: unknown): Record<string, unknown> =>\n\tvalue && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n\nconst isServerBackend = (\n\tbackend: TTSRuntimeSettings[\"backend\"],\n): backend is \"polly\" | \"google\" | \"server\" =>\n\tbackend === \"polly\" || backend === \"google\" || backend === \"server\";\n\nconst withDefault = <T>(value: T | undefined, fallback: T): T =>\n\tvalue === undefined ? fallback : value;\n\nexport const normalizeTTSLayoutMode = (\n\tvalue: unknown,\n\tfallback: TTSLayoutMode = \"left-aligned\",\n): TTSLayoutMode =>\n\ttypeof value === \"string\" &&\n\tVALID_TTS_LAYOUT_MODES.has(value as TTSLayoutMode)\n\t\t? (value as TTSLayoutMode)\n\t\t: fallback;\n\n/** Legacy numeric helper defaults. Rendered controls add visible Normal separately. */\nexport const DEFAULT_TTS_SPEED_OPTIONS = Object.freeze([0.8, 1.25]);\n\nconst DEFAULT_TTS_SPEED_CONTROL_OPTIONS = Object.freeze([\n\t{ rate: 0.8, label: \"Slow\", ariaLabel: \"Slow speed\" },\n\t{ rate: 1, label: \"Normal\", ariaLabel: \"Normal speed\", default: true },\n\t{ rate: 1.25, label: \"Fast\", ariaLabel: \"Fast speed\" },\n] satisfies TTSSpeedOptionConfig[]);\n\nconst normalizeSpeedRate = (entry: unknown): number | undefined => {\n\tif (typeof entry !== \"number\" || !Number.isFinite(entry) || entry <= 0) {\n\t\treturn undefined;\n\t}\n\tconst rounded = Math.round(entry * 100) / 100;\n\treturn rounded === 1 ? undefined : rounded;\n};\n\nconst normalizeControlSpeedRate = (entry: unknown): number | undefined => {\n\tif (typeof entry !== \"number\" || !Number.isFinite(entry) || entry <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.round(entry * 100) / 100;\n};\n\nconst trimOptionalText = (value: unknown): string | undefined => {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length ? trimmed : undefined;\n};\n\nconst formatSpeedLabel = (rate: number): string => `${rate}x`;\n\nconst formatSpeedAriaLabel = (label: string, usedDefaultLabel: boolean): string =>\n\tlabel.toLowerCase() === \"normal\"\n\t\t? \"Normal speed\"\n\t\t: usedDefaultLabel\n\t\t\t? `Speed ${label}`\n\t\t\t: `${label} speed`;\n\nconst normalizeSpeedAriaLabel = (\n\tlabel: string,\n\tariaLabel: string | undefined,\n\tusedDefaultLabel: boolean,\n): string => {\n\tif (!ariaLabel) return formatSpeedAriaLabel(label, usedDefaultLabel);\n\tif (ariaLabel.toLowerCase().includes(label.toLowerCase())) return ariaLabel;\n\treturn `${label} ${ariaLabel}`;\n};\n\nconst normalizeTTSSpeedOptionConfig = (\n\tentry: unknown,\n): TTSSpeedOption | undefined => {\n\tif (typeof entry === \"number\") return normalizeSpeedRate(entry);\n\tif (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return undefined;\n\tconst record = entry as Record<string, unknown>;\n\tconst rate = normalizeSpeedRate(record.rate);\n\tif (rate === undefined) return undefined;\n\tconst label = trimOptionalText(record.label);\n\tconst ariaLabel = trimOptionalText(record.ariaLabel);\n\treturn {\n\t\trate,\n\t\t...(label ? { label } : {}),\n\t\t...(ariaLabel ? { ariaLabel } : {}),\n\t};\n};\n\nexport const normalizeTTSSpeedOptionConfigs = (\n\tvalue: unknown,\n): TTSSpeedOption[] => {\n\tif (!Array.isArray(value)) return [...DEFAULT_TTS_SPEED_OPTIONS];\n\tif (value.length === 0) return [];\n\tconst dedupedRates = new Set<number>();\n\tconst normalized: TTSSpeedOption[] = [];\n\tfor (const entry of value) {\n\t\tconst option = normalizeTTSSpeedOptionConfig(entry);\n\t\tif (option === undefined) continue;\n\t\tconst rate = typeof option === \"number\" ? option : option.rate;\n\t\tif (dedupedRates.has(rate)) continue;\n\t\tdedupedRates.add(rate);\n\t\tnormalized.push(option);\n\t}\n\treturn normalized.length ? normalized : [...DEFAULT_TTS_SPEED_OPTIONS];\n};\n\n/**\n * Resolves inline toolbar speed options from host config.\n * - Omitted/non-array: default speed buttons.\n * - Empty array: hide speed buttons.\n * - Arrays that sanitize to no valid values: default speed buttons.\n * - 1.0× is never shown as a discrete speed button.\n */\nexport const normalizeTTSSpeedOptions = (value: unknown): number[] => {\n\tif (!Array.isArray(value)) return [...DEFAULT_TTS_SPEED_OPTIONS];\n\tif (value.length === 0) return [];\n\treturn normalizeTTSSpeedOptionConfigs(value).map((option) =>\n\t\ttypeof option === \"number\" ? option : option.rate,\n\t);\n};\n\nexport const normalizeTTSSpeedControlOptions = (\n\tvalue: unknown,\n): NormalizedTTSSpeedOption[] => {\n\tconst input = Array.isArray(value)\n\t\t? value\n\t\t: [...DEFAULT_TTS_SPEED_CONTROL_OPTIONS];\n\tif (input.length === 0) return [];\n\n\tconst dedupedRates = new Set<number>();\n\tconst normalized: Array<NormalizedTTSSpeedOption & { requestedDefault: boolean }> =\n\t\t[];\n\n\tfor (const entry of input) {\n\t\tconst record = toRecord(entry);\n\t\tconst rate =\n\t\t\ttypeof entry === \"number\"\n\t\t\t\t? normalizeControlSpeedRate(entry)\n\t\t\t\t: normalizeControlSpeedRate(record.rate);\n\t\tif (rate === undefined || dedupedRates.has(rate)) continue;\n\t\tdedupedRates.add(rate);\n\n\t\tconst defaultLabel =\n\t\t\trate === 1 ? \"Normal\" : typeof entry === \"number\" ? formatSpeedLabel(rate) : formatSpeedLabel(rate);\n\t\tconst label =\n\t\t\ttypeof entry === \"number\"\n\t\t\t\t? defaultLabel\n\t\t\t\t: trimOptionalText(record.label) || defaultLabel;\n\t\tconst ariaLabel =\n\t\t\ttypeof entry === \"number\"\n\t\t\t\t? rate === 1\n\t\t\t\t\t? \"Normal speed\"\n\t\t\t\t\t: formatSpeedAriaLabel(label, true)\n\t\t\t\t: normalizeSpeedAriaLabel(\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttrimOptionalText(record.ariaLabel),\n\t\t\t\t\t\tlabel === defaultLabel,\n\t\t\t\t\t);\n\t\tnormalized.push({\n\t\t\trate,\n\t\t\tlabel,\n\t\t\tariaLabel,\n\t\t\tisDefault: false,\n\t\t\trequestedDefault:\n\t\t\t\trecord.default === true || (record as { isDefault?: unknown }).isDefault === true,\n\t\t});\n\t}\n\n\tif (!normalized.length) {\n\t\treturn normalizeTTSSpeedControlOptions(DEFAULT_TTS_SPEED_CONTROL_OPTIONS);\n\t}\n\n\tif (!dedupedRates.has(1)) {\n\t\tconst normalOption = {\n\t\t\trate: 1,\n\t\t\tlabel: \"Normal\",\n\t\t\tariaLabel: \"Normal speed\",\n\t\t\tisDefault: false,\n\t\t\trequestedDefault: false,\n\t\t};\n\t\tconst firstFasterIndex = normalized.findIndex((option) => option.rate > 1);\n\t\tif (firstFasterIndex >= 0) {\n\t\t\tnormalized.splice(firstFasterIndex, 0, normalOption);\n\t\t} else {\n\t\t\tnormalized.push(normalOption);\n\t\t}\n\t}\n\n\tconst requestedDefaultIndex = normalized.findIndex(\n\t\t(option) => option.requestedDefault,\n\t);\n\tconst defaultIndex =\n\t\trequestedDefaultIndex >= 0\n\t\t\t? requestedDefaultIndex\n\t\t\t: normalized.findIndex((option) => option.rate === 1);\n\n\treturn normalized.map(({ requestedDefault: _requestedDefault, ...option }, index) => ({\n\t\t...option,\n\t\tisDefault: index === defaultIndex,\n\t}));\n};\n\nexport const formatTTSSpeedOptionsAsText = (values: number[]): string =>\n\tvalues.join(\", \");\n\nconst DEFAULT_TTS_SPEED_CONTROL_RATES = Object.freeze([0.8, 1, 1.25]);\n\n/**\n * Parse comma/semicolon-separated multipliers from settings UI text.\n * - Empty or whitespace-only string → hide speed buttons (`[]`).\n * - Non-empty text with no parseable finite numbers → same as invalid-only array config: defaults.\n */\nexport const parseTTSSpeedOptionsFromText = (text: string): number[] => {\n\tconst trimmed = text.trim();\n\tif (!trimmed) return [];\n\tconst parts = trimmed\n\t\t.split(/[,;]+/)\n\t\t.map((p) => p.trim())\n\t\t.filter(Boolean);\n\tconst candidates = parts\n\t\t.map((p) => Number.parseFloat(p))\n\t\t.filter((n) => Number.isFinite(n));\n\tif (!candidates.length) return [...DEFAULT_TTS_SPEED_CONTROL_RATES];\n\tconst dedupedRates = new Set<number>();\n\tconst normalized: number[] = [];\n\tfor (const candidate of candidates) {\n\t\tconst rate = normalizeControlSpeedRate(candidate);\n\t\tif (rate === undefined || dedupedRates.has(rate)) continue;\n\t\tdedupedRates.add(rate);\n\t\tnormalized.push(rate);\n\t}\n\treturn normalized.length ? normalized : [...DEFAULT_TTS_SPEED_CONTROL_RATES];\n};\n\nconst applyRuntimeDefaults = (\n\tconfig: TTSRuntimeSettings,\n): TTSRuntimeSettings => {\n\tconst withLayoutDefaults: TTSRuntimeSettings = {\n\t\t...config,\n\t\tlayoutMode: normalizeTTSLayoutMode(config.layoutMode),\n\t};\n\tconst backend = config.backend || \"browser\";\n\tif (!isServerBackend(backend)) return withLayoutDefaults;\n\n\tconst withServerDefaults: TTSRuntimeSettings = {\n\t\t...withLayoutDefaults,\n\t\tapiEndpoint: withDefault(withLayoutDefaults.apiEndpoint, \"/api/tts\"),\n\t\ttransportMode: withDefault(withLayoutDefaults.transportMode, \"pie\"),\n\t\tendpointValidationMode: withDefault(\n\t\t\twithLayoutDefaults.endpointValidationMode,\n\t\t\t\"voices\",\n\t\t),\n\t\tvalidateEndpoint: withDefault(withLayoutDefaults.validateEndpoint, true),\n\t\tincludeAuthOnAssetFetch: withDefault(\n\t\t\twithLayoutDefaults.includeAuthOnAssetFetch,\n\t\t\tfalse,\n\t\t),\n\t\trate: withDefault(withLayoutDefaults.rate, 1.0),\n\t\tlanguage: withDefault(withLayoutDefaults.language, \"en-US\"),\n\t};\n\n\tif (backend === \"polly\") {\n\t\treturn {\n\t\t\t...withServerDefaults,\n\t\t\tdefaultVoice: withDefault(withServerDefaults.defaultVoice, \"Joanna\"),\n\t\t\tengine: withDefault(withServerDefaults.engine, \"neural\"),\n\t\t\tformat: withDefault(withServerDefaults.format, \"mp3\"),\n\t\t\tspeechMarksMode: withDefault(\n\t\t\t\twithServerDefaults.speechMarksMode,\n\t\t\t\t\"word+sentence\",\n\t\t\t),\n\t\t};\n\t}\n\n\tif (backend === \"google\") {\n\t\treturn {\n\t\t\t...withServerDefaults,\n\t\t\tdefaultVoice: withDefault(\n\t\t\t\twithServerDefaults.defaultVoice,\n\t\t\t\t\"en-US-Wavenet-A\",\n\t\t\t),\n\t\t};\n\t}\n\n\treturn withServerDefaults;\n};\n\nexport const resolveTTSRuntimeSettings = (\n\tconfig: ToolProviderConfig | TTSRuntimeSettings | undefined,\n): TTSRuntimeSettings => {\n\tconst configRecord = toRecord(config);\n\tconst settingsRecord = toRecord(configRecord.settings);\n\treturn applyRuntimeDefaults({\n\t\t...configRecord,\n\t\t...settingsRecord,\n\t} as TTSRuntimeSettings);\n};\n\nexport const resolveTTSBackend = (\n\tconfig: TTSRuntimeSettings,\n): NonNullable<TTSRuntimeSettings[\"backend\"]> => config.backend || \"browser\";\n\nexport const resolveRuntimeProvider = (\n\tconfig: TTSRuntimeSettings,\n\tbackend: NonNullable<TTSRuntimeSettings[\"backend\"]>,\n): TTSRuntimeSettings[\"serverProvider\"] => {\n\tif (backend === \"polly\" || backend === \"google\") return backend;\n\tif (backend === \"server\") {\n\t\treturn config.serverProvider || config.provider;\n\t}\n\treturn config.serverProvider || config.provider;\n};\n\nexport const resolveTransportMode = (\n\tconfig: TTSRuntimeSettings,\n\truntimeProvider: TTSRuntimeSettings[\"serverProvider\"],\n): NonNullable<TTSRuntimeSettings[\"transportMode\"]> =>\n\tconfig.transportMode || (runtimeProvider === \"custom\" ? \"custom\" : \"pie\");\n\nexport const buildRuntimeTTSConfig = (\n\tconfig: TTSRuntimeSettings,\n): Partial<TTSConfig> => {\n\tconst backend = resolveTTSBackend(config);\n\tconst runtimeProvider = resolveRuntimeProvider(config, backend);\n\tconst transportMode = resolveTransportMode(config, runtimeProvider);\n\tconst mathSpeech = normalizeSREMathSpeechOptions(config.mathSpeech);\n\treturn {\n\t\tvoice: config.defaultVoice,\n\t\trate: config.rate,\n\t\tpitch: config.pitch,\n\t\tproviderOptions: {\n\t\t\t...(config.language ? { locale: config.language } : {}),\n\t\t\t...(backend === \"polly\" && config.engine\n\t\t\t\t? { engine: config.engine }\n\t\t\t\t: {}),\n\t\t\t...(backend === \"polly\" && typeof config.sampleRate === \"number\"\n\t\t\t\t? { sampleRate: config.sampleRate }\n\t\t\t\t: {}),\n\t\t\t...(backend === \"polly\" && config.format\n\t\t\t\t? { format: config.format }\n\t\t\t\t: {}),\n\t\t\t...(backend === \"polly\"\n\t\t\t\t? {\n\t\t\t\t\t\tspeechMarkTypes:\n\t\t\t\t\t\t\tconfig.speechMarksMode === \"word+sentence\"\n\t\t\t\t\t\t\t\t? [\"word\", \"sentence\"]\n\t\t\t\t\t\t\t\t: [\"word\"],\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...(transportMode === \"custom\" && typeof config.cache === \"boolean\"\n\t\t\t\t? { cache: config.cache }\n\t\t\t\t: {}),\n\t\t\t...(transportMode === \"custom\" && config.speedRate\n\t\t\t\t? { speedRate: config.speedRate }\n\t\t\t\t: {}),\n\t\t\t...(transportMode === \"custom\" && config.lang_id\n\t\t\t\t? { lang_id: config.lang_id }\n\t\t\t\t: {}),\n\t\t\t...(mathSpeech ? { mathSpeech } : {}),\n\t\t},\n\t\tapiEndpoint: config.apiEndpoint,\n\t\tprovider: runtimeProvider,\n\t\tlanguage: config.language,\n\t\ttransportMode,\n\t\tendpointMode: config.endpointMode,\n\t\tendpointValidationMode: config.endpointValidationMode,\n\t\tincludeAuthOnAssetFetch: config.includeAuthOnAssetFetch,\n\t\tvalidateEndpoint: config.validateEndpoint,\n\t\t// Toolkit-level highlight setting carried through the config channel\n\t\t// (like apiEndpoint/transportMode); consumed by the highlight pipeline,\n\t\t// ignored by providers. Only forwarded when set so the pipeline default\n\t\t// (per-token enabled) applies otherwise.\n\t\t...(typeof config.mathTokenHighlighting === \"boolean\"\n\t\t\t? { mathTokenHighlighting: config.mathTokenHighlighting }\n\t\t\t: {}),\n\t} as Partial<TTSConfig>;\n};\n\nexport const resolveTTSLayoutMode = (\n\tconfig: TTSRuntimeSettings,\n): TTSLayoutMode => normalizeTTSLayoutMode(config.layoutMode);\n\nexport const resolveTTSHostToolbarLayout = (\n\tconfig: TTSRuntimeSettings,\n): TTSHostToolbarLayout => {\n\tconst layoutMode = resolveTTSLayoutMode(config);\n\tswitch (layoutMode) {\n\t\tcase \"reserved-row\":\n\t\t\treturn {\n\t\t\t\tmount: \"before-buttons\",\n\t\t\t\tcontrolsRow: {\n\t\t\t\t\treserveSpace: true,\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t\theaderOverlay: {\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"expanding-row\":\n\t\t\treturn {\n\t\t\t\tmount: \"before-buttons\",\n\t\t\t\tcontrolsRow: {\n\t\t\t\t\treserveSpace: false,\n\t\t\t\t\texpandWhenToolActive: true,\n\t\t\t\t},\n\t\t\t\theaderOverlay: {\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"floating-overlay\":\n\t\t\treturn {\n\t\t\t\tmount: \"before-buttons\",\n\t\t\t\tcontrolsRow: {\n\t\t\t\t\treserveSpace: false,\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t\theaderOverlay: {\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"left-aligned\":\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tmount: \"before-buttons\",\n\t\t\t\tcontrolsRow: {\n\t\t\t\t\treserveSpace: false,\n\t\t\t\t\texpandWhenToolActive: false,\n\t\t\t\t},\n\t\t\t\theaderOverlay: {\n\t\t\t\t\texpandWhenToolActive: true,\n\t\t\t\t},\n\t\t\t};\n\t}\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"desmos-provider.js","sourceRoot":"","sources":["../../../src/tools/calculators/desmos-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC3B,UAAU,GAAG,QAAQ,CAAC;IACtB,YAAY,GAAG,QAAQ,CAAC;IACxB,cAAc,GAAqB;QAC3C,OAAO;QACP,YAAY;QACZ,UAAU;KACV,CAAC;IACO,OAAO,GAAG,MAAM,CAAC;IAElB,WAAW,GAAG,KAAK,CAAC;IACpB,MAAM,CAAU;IAExB;;OAEG;IACH,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,MAA4B;QAC5C,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,+DAA+D;QAC/D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACd,2DAA2D,CAC3D,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,MAAM;YACV,MAAM,EAAE,MAAM;gBACd,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC;gBAC/D,CAAC,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,kBAAkB,CAAC,CAAC;QAEvE,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CACX,oFAAoF;gBACnF,+EAA+E,CAChF,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAExD,iCAAiC;QACjC,IAAI,CAAE,MAAc,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CACV,4CAA4C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,EAAE,CAC7F,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACrB,IAAoB,EACpB,SAAsB,EACtB,MAAiC;QAEjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAoB;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,OAAO;QACN,wCAAwC;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,eAAe;QACd,OAAO;YACN,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,IAAI;YACzB,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,EAAE,EAAE,8BAA8B;YAChD,YAAY,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;SAC5C,CAAC;IACH,CAAC;CACD;AAED;;GAEG;AACH,MAAM,gBAAgB;IACZ,QAAQ,CAAqB;IAC7B,IAAI,CAAiB;IAEtB,gBAAgB,CAAM;IACtB,SAAS,CAAc;IACvB,MAAM,CAA4B;IAE1C,YACC,QAA4B,EAC5B,IAAoB,EACpB,SAAsB,EACtB,MAAiC;QAEjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACK,qBAAqB;QAC5B,MAAM,MAAM,GAAI,MAAc,CAAC,MAAM,CAAC;QAEtC,6CAA6C;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QAE/C,sDAAsD;QACtD,MAAM,MAAM,GACX,YAAY,CAAC,MAAM;YAClB,IAAI,CAAC,QAAqC,CAAC,SAAS,EAAE,CAAC;QAEzD,4CAA4C;QAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAE7D,mFAAmF;QACnF,wEAAwE;QACxE,MAAM,OAAO,GAAG;YACf,GAAG,IAAI,CAAC,wBAAwB,EAAE;YAClC,GAAG,kBAAkB;YACrB,GAAG,YAAY;YACf,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;SACvC,CAAC;QAEF,2BAA2B;QAC3B,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;QAED,qCAAqC;QACrC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,OAAO;gBACX,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,sBAAsB,CACpD,IAAI,CAAC,SAAS,EACd,OAAO,CACP,CAAC;gBACF,MAAM;YACP,KAAK,YAAY;gBAChB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAClD,IAAI,CAAC,SAAS,EACd,OAAO,CACP,CAAC;gBACF,MAAM;YACP,KAAK,UAAU;gBACd,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAChD,IAAI,CAAC,SAAS,EACd,OAAO,CACP,CAAC;gBACF,MAAM;YACP;gBACC,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,GAAG,CACV,8BAA8B,IAAI,CAAC,IAAI,2BAA2B,EAClE,OAAO,CACP,CAAC;IACH,CAAC;IAED;;OAEG;IACK,wBAAwB;QAC/B,MAAM,QAAQ,GAAQ;YACrB,MAAM,EAAE,KAAK,EAAE,kEAAkE;SACjF,CAAC;QAEF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,OAAO;gBACX,2EAA2E;gBAC3E,kDAAkD;gBAClD,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;gBACxB,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC5B,MAAM;YACP,KAAK,YAAY;gBAChB,uEAAuE;gBACvE,MAAM;YACP,KAAK,UAAU;gBACd,2EAA2E;gBAC3E,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC5B,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC5B,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAClC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC7B,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;gBACtB,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;gBACxB,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,kDAAkD;gBAC3E,MAAM;QACR,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,0BAA0B;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACX,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAQ;YACvB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;SACvB,CAAC;QAEF,wCAAwC;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;gBACzB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK;gBACZ,mBAAmB,EAAE,IAAI;gBACzB,mCAAmC,EAAE,KAAK;gBAC1C,aAAa,EAAE,KAAK;gBACpB,gBAAgB,EAAE,KAAK;gBACvB,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,KAAK;gBACnB,WAAW,EAAE,KAAK;gBAClB,4BAA4B,EAAE,IAAI;gBAClC,aAAa,EAAE,IAAI;aACnB,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;gBACzB,kBAAkB,EAAE,KAAK;gBACzB,yBAAyB,EAAE,KAAK;aAChC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAiC;QAC3D,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,aAAa,GAAQ,EAAE,CAAC;QAE9B,uCAAuC;QACvC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC;QAED,2DAA2D;QAC3D,wEAAwE;QACxE,gDAAgD;QAEhD,OAAO,aAAa,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,QAAQ;QACP,+CAA+C;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,+CAA+C;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YACxE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;QACF,CAAC;aAAM,CAAC;YACP,+BAA+B;YAC/B,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU;QACT,0CAA0C;QAC1C,0CAA0C;QAC1C,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;OAEG;IACH,YAAY;QACX,sCAAsC;IACvC,CAAC;IAED;;;OAGG;IACH,MAAM;QACL,IACC,IAAI,CAAC,gBAAgB;YACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,UAAU,EACjD,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAChC,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,KAAK;QACJ,IAAI,CAAC;YACJ,IACC,IAAI,CAAC,IAAI,KAAK,UAAU;gBACxB,OAAO,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,KAAK,UAAU,EAChE,CAAC;gBACF,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;gBAC7C,OAAO;YACR,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAC1C,2GAA2G,CAC3G,CAAC;YACF,MAAM,EAAE,KAAK,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC;gBACJ,0CAA0C;gBAC1C,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAE3D,iDAAiD;gBACjD,4BAA4B;gBAC5B,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAE/C,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;YACtB,aAAa,EAAE,KAAK;SACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAsB;QACjC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,OAAO;QACN,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACJ,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,+DAA+D;QAC/D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,wCAAwC;YACxC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;YAEjD,8CAA8C;YAC9C,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAClC,CAAC;IACF,CAAC;CACD","sourcesContent":["/**\n * Desmos Calculator Provider\n * Implementation of CalculatorProvider for Desmos calculators\n *\n * Supports: Basic, Scientific, and Graphing calculators\n * Based on Desmos API v1.12+\n */\n\nimport type {\n\tCalculationHistoryEntry,\n\tCalculator,\n\tCalculatorProvider,\n\tCalculatorProviderCapabilities,\n\tCalculatorProviderConfig,\n\tCalculatorState,\n\tCalculatorType,\n\tDesmosCalculatorConfig,\n} from \"@pie-players/pie-calculator\";\nimport { COMMON_LIBRARIES, libraryLoader } from \"../library-loader.js\";\n\n/**\n * Desmos Calculator Provider Implementation\n */\nexport class DesmosCalculatorProvider implements CalculatorProvider {\n\treadonly providerId = \"desmos\";\n\treadonly providerName = \"Desmos\";\n\treadonly supportedTypes: CalculatorType[] = [\n\t\t\"basic\",\n\t\t\"scientific\",\n\t\t\"graphing\",\n\t];\n\treadonly version = \"1.12\";\n\n\tprivate initialized = false;\n\tprivate apiKey?: string;\n\n\t/**\n\t * Get the configured API key\n\t */\n\tgetApiKey(): string | undefined {\n\t\treturn this.apiKey;\n\t}\n\n\t/**\n\t * Initialize Desmos library\n\t * @param config Optional configuration including API key\n\t */\n\tasync initialize(config?: { apiKey?: string }): Promise<void> {\n\t\tif (this.initialized) return;\n\n\t\t// SSR guard: Desmos calculators should NEVER run on the server\n\t\tif (typeof window === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"Desmos calculators can only be initialized in the browser\",\n\t\t\t);\n\t\t}\n\n\t\t// Store API key from config, environment variable, or global\n\t\tthis.apiKey =\n\t\t\tconfig?.apiKey ||\n\t\t\t(typeof process !== \"undefined\" && process.env?.DESMOS_API_KEY) ||\n\t\t\t(typeof window !== \"undefined\" && (window as any).PIE_DESMOS_API_KEY);\n\n\t\t// Warn if no API key is provided (production usage requires it)\n\t\tif (!this.apiKey) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[DesmosProvider] No API key provided. Production usage requires a Desmos API key. \" +\n\t\t\t\t\t\"Obtain one from https://www.desmos.com/api or contact partnerships@desmos.com\",\n\t\t\t);\n\t\t}\n\n\t\t// Load Desmos library\n\t\tawait libraryLoader.loadScript(COMMON_LIBRARIES.desmos);\n\n\t\t// Verify Desmos API is available\n\t\tif (!(window as any).Desmos) {\n\t\t\tthrow new Error(\"Desmos API not loaded\");\n\t\t}\n\n\t\tthis.initialized = true;\n\t\tconsole.log(\n\t\t\t`[DesmosProvider] Initialized successfully${this.apiKey ? \" with API key\" : \" (no API key)\"}`,\n\t\t);\n\t}\n\n\t/**\n\t * Create a calculator instance\n\t */\n\tasync createCalculator(\n\t\ttype: CalculatorType,\n\t\tcontainer: HTMLElement,\n\t\tconfig?: CalculatorProviderConfig,\n\t): Promise<Calculator> {\n\t\tif (!this.initialized) {\n\t\t\tawait this.initialize();\n\t\t}\n\n\t\tif (!this.supportsType(type)) {\n\t\t\tthrow new Error(`Desmos does not support calculator type: ${type}`);\n\t\t}\n\n\t\treturn new DesmosCalculator(this, type, container, config);\n\t}\n\n\t/**\n\t * Check if type is supported\n\t */\n\tsupportsType(type: CalculatorType): boolean {\n\t\treturn this.supportedTypes.includes(type);\n\t}\n\n\t/**\n\t * Cleanup (no-op for Desmos)\n\t */\n\tdestroy(): void {\n\t\t// Desmos doesn't require global cleanup\n\t\tthis.initialized = false;\n\t}\n\n\t/**\n\t * Get provider capabilities\n\t */\n\tgetCapabilities(): CalculatorProviderCapabilities {\n\t\treturn {\n\t\t\tsupportsHistory: true,\n\t\t\tsupportsGraphing: true,\n\t\t\tsupportsExpressions: true,\n\t\t\tcanExport: true,\n\t\t\tmaxPrecision: 15, // JavaScript number precision\n\t\t\tinputMethods: [\"keyboard\", \"mouse\", \"touch\"],\n\t\t};\n\t}\n}\n\n/**\n * Desmos Calculator Instance\n */\nclass DesmosCalculator implements Calculator {\n\treadonly provider: CalculatorProvider;\n\treadonly type: CalculatorType;\n\n\tprivate desmosCalculator: any;\n\tprivate container: HTMLElement;\n\tprivate config?: CalculatorProviderConfig;\n\n\tconstructor(\n\t\tprovider: CalculatorProvider,\n\t\ttype: CalculatorType,\n\t\tcontainer: HTMLElement,\n\t\tconfig?: CalculatorProviderConfig,\n\t) {\n\t\tthis.provider = provider;\n\t\tthis.type = type;\n\t\tthis.container = container;\n\t\tthis.config = config;\n\n\t\tthis._initializeCalculator();\n\t}\n\n\t/**\n\t * Initialize Desmos calculator instance\n\t * Based on production implementation patterns\n\t */\n\tprivate _initializeCalculator(): void {\n\t\tconst Desmos = (window as any).Desmos;\n\n\t\t// Get Desmos-specific config or empty object\n\t\tconst desmosConfig = this.config?.desmos || {};\n\n\t\t// Determine API key (config overrides provider-level)\n\t\tconst apiKey =\n\t\t\tdesmosConfig.apiKey ||\n\t\t\t(this.provider as DesmosCalculatorProvider).getApiKey();\n\n\t\t// Apply restricted mode defaults if enabled\n\t\tconst restrictedDefaults = this._getRestrictedModeDefaults();\n\n\t\t// Merge order: type-specific defaults < restricted mode defaults < explicit config\n\t\t// This ensures explicit config can override restricted mode when needed\n\t\tconst options = {\n\t\t\t...this._getTypeSpecificDefaults(),\n\t\t\t...restrictedDefaults,\n\t\t\t...desmosConfig,\n\t\t\t...this._mapConfigToDesmos(this.config),\n\t\t};\n\n\t\t// Add API key if available\n\t\tif (apiKey) {\n\t\t\toptions.apiKey = apiKey;\n\t\t}\n\n\t\t// Create appropriate calculator type\n\t\tswitch (this.type) {\n\t\t\tcase \"basic\":\n\t\t\t\tthis.desmosCalculator = Desmos.FourFunctionCalculator(\n\t\t\t\t\tthis.container,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"scientific\":\n\t\t\t\tthis.desmosCalculator = Desmos.ScientificCalculator(\n\t\t\t\t\tthis.container,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"graphing\":\n\t\t\t\tthis.desmosCalculator = Desmos.GraphingCalculator(\n\t\t\t\t\tthis.container,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown Desmos calculator type: ${this.type}`);\n\t\t}\n\n\t\tconsole.log(\n\t\t\t`[DesmosCalculator] Created ${this.type} calculator with options:`,\n\t\t\toptions,\n\t\t);\n\t}\n\n\t/**\n\t * Get type-specific default options\n\t */\n\tprivate _getTypeSpecificDefaults(): any {\n\t\tconst defaults: any = {\n\t\t\tborder: false, // No border around calculator (production implementation pattern)\n\t\t};\n\n\t\tswitch (this.type) {\n\t\t\tcase \"basic\":\n\t\t\t\t// Basic calculator: no keypad, no graph paper (just the calculator itself)\n\t\t\t\t// Matches production FourFunctionCalculator setup\n\t\t\t\tdefaults.keypad = false;\n\t\t\t\tdefaults.graphpaper = false;\n\t\t\t\tbreak;\n\t\t\tcase \"scientific\":\n\t\t\t\t// Scientific calculator: minimal defaults, mostly controlled by config\n\t\t\t\tbreak;\n\t\t\tcase \"graphing\":\n\t\t\t\t// Graphing calculator: enable expressions, zoom buttons, topbar by default\n\t\t\t\tdefaults.expressions = true;\n\t\t\t\tdefaults.zoomButtons = true;\n\t\t\t\tdefaults.expressionsTopbar = true;\n\t\t\t\tdefaults.settingsMenu = true;\n\t\t\t\tdefaults.notes = true;\n\t\t\t\tdefaults.folders = true;\n\t\t\t\tdefaults.images = false; // Images disabled by default (production pattern)\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn defaults;\n\t}\n\n\t/**\n\t * Get restricted mode defaults (test mode options)\n\t * Based on production test mode configuration\n\t */\n\tprivate _getRestrictedModeDefaults(): any {\n\t\tif (!this.config?.restrictedMode) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Restricted mode defaults based on production test mode settings\n\t\tconst restricted: any = {\n\t\t\tborder: false,\n\t\t\tlinks: false,\n\t\t\tqwertyKeyboard: true,\n\t\t\tdegreeMode: true,\n\t\t\tdecimalToFraction: true,\n\t\t};\n\n\t\t// Type-specific restricted mode options\n\t\tif (this.type === \"graphing\") {\n\t\t\tObject.assign(restricted, {\n\t\t\t\timages: false,\n\t\t\t\tfolders: false,\n\t\t\t\tnotes: false,\n\t\t\t\trestrictedFunctions: true,\n\t\t\t\tplotSingleVariableImplicitEquations: false,\n\t\t\t\tplotImplicits: false,\n\t\t\t\tplotInequalities: false,\n\t\t\t\tsliders: false,\n\t\t\t\tsettingsMenu: false,\n\t\t\t\tzoomButtons: false,\n\t\t\t\tgeometryComputationFunctions: true,\n\t\t\t\tdistributions: true,\n\t\t\t});\n\t\t} else if (this.type === \"scientific\") {\n\t\t\tObject.assign(restricted, {\n\t\t\t\tfunctionDefinition: false,\n\t\t\t\tbrailleExpressionDownload: false,\n\t\t\t});\n\t\t}\n\n\t\treturn restricted;\n\t}\n\n\t/**\n\t * Map provider config to Desmos options\n\t */\n\tprivate _mapConfigToDesmos(config?: CalculatorProviderConfig): any {\n\t\tif (!config) return {};\n\n\t\tconst desmosOptions: any = {};\n\n\t\t// Map locale to Desmos language option\n\t\tif (config.locale) {\n\t\t\tdesmosOptions.language = config.locale;\n\t\t}\n\n\t\t// Theme mapping (Desmos may support this via CSS, not API)\n\t\t// Note: Desmos doesn't have a theme option in the API, but we keep this\n\t\t// for potential future use or CSS-based theming\n\n\t\treturn desmosOptions;\n\t}\n\n\t/**\n\t * Get current value/expression\n\t */\n\tgetValue(): string {\n\t\t// For graphing calculator, get all expressions\n\t\tif (this.type === \"graphing\") {\n\t\t\tconst state = this.desmosCalculator.getState();\n\t\t\treturn JSON.stringify(state.expressions.list);\n\t\t}\n\n\t\t// For basic/scientific, get current expression\n\t\tconst state = this.desmosCalculator.getState();\n\t\treturn state.expression || \"\";\n\t}\n\n\t/**\n\t * Set value/expression\n\t */\n\tsetValue(value: string): void {\n\t\tif (this.type === \"graphing\") {\n\t\t\ttry {\n\t\t\t\tconst expressions = JSON.parse(value);\n\t\t\t\tthis.desmosCalculator.setState({ expressions: { list: expressions } });\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[DesmosCalculator] Invalid expression format:\", error);\n\t\t\t}\n\t\t} else {\n\t\t\t// Basic/Scientific calculators\n\t\t\tthis.desmosCalculator.setExpression({ latex: value });\n\t\t}\n\t}\n\n\t/**\n\t * Clear calculator\n\t */\n\tclear(): void {\n\t\tif (this.type === \"graphing\") {\n\t\t\tthis.desmosCalculator.setBlank();\n\t\t} else {\n\t\t\tthis.setValue(\"\");\n\t\t}\n\t}\n\n\t/**\n\t * Get calculation history (not natively supported by Desmos)\n\t */\n\tgetHistory(): CalculationHistoryEntry[] {\n\t\t// Desmos doesn't provide history natively\n\t\t// Would need to implement custom tracking\n\t\treturn [];\n\t}\n\n\t/**\n\t * Clear history\n\t */\n\tclearHistory(): void {\n\t\t// No-op - Desmos doesn't have history\n\t}\n\n\t/**\n\t * Resize calculator when container dimensions change\n\t * Matches production pattern: calculatorInstance.resize()\n\t */\n\tresize(): void {\n\t\tif (\n\t\t\tthis.desmosCalculator &&\n\t\t\ttypeof this.desmosCalculator.resize === \"function\"\n\t\t) {\n\t\t\tthis.desmosCalculator.resize();\n\t\t}\n\t}\n\n\t/**\n\t * Move keyboard focus to the primary input/expression field so keyboard\n\t * users can begin typing immediately after the calculator opens.\n\t */\n\tfocus(): void {\n\t\ttry {\n\t\t\tif (\n\t\t\t\tthis.type === \"graphing\" &&\n\t\t\t\ttypeof this.desmosCalculator?.focusFirstExpression === \"function\"\n\t\t\t) {\n\t\t\t\tthis.desmosCalculator.focusFirstExpression();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = this.container.querySelector<HTMLElement>(\n\t\t\t\t'.dcg-mq-editable-field[tabindex=\"0\"], textarea, [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])',\n\t\t\t);\n\t\t\ttarget?.focus();\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[DesmosCalculator] focus() failed:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Evaluate expression (for graphing calculator)\n\t */\n\tasync evaluate(expression: string): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Set expression and wait for computation\n\t\t\t\tthis.desmosCalculator.setExpression({ latex: expression });\n\n\t\t\t\t// For basic math, Desmos evaluates automatically\n\t\t\t\t// Get the result from state\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst result = this.getValue();\n\t\t\t\t\tresolve(result);\n\t\t\t\t}, 100); // Small delay for Desmos to compute\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Export calculator state\n\t */\n\texportState(): CalculatorState {\n\t\tconst state = this.desmosCalculator.getState();\n\n\t\treturn {\n\t\t\ttype: this.type,\n\t\t\tprovider: \"desmos\",\n\t\t\tvalue: this.getValue(),\n\t\t\tproviderState: state,\n\t\t};\n\t}\n\n\t/**\n\t * Import calculator state\n\t */\n\timportState(state: CalculatorState): void {\n\t\tif (state.provider !== \"desmos\") {\n\t\t\tthrow new Error(`Cannot import state from provider: ${state.provider}`);\n\t\t}\n\n\t\tif (state.providerState) {\n\t\t\tthis.desmosCalculator.setState(state.providerState);\n\t\t} else if (state.value) {\n\t\t\tthis.setValue(state.value);\n\t\t}\n\t}\n\n\t/**\n\t * Destroy calculator\n\t */\n\tdestroy(): void {\n\t\tif (this.desmosCalculator) {\n\t\t\ttry {\n\t\t\t\tthis.desmosCalculator.destroy();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\"[DesmosCalculator] Error during destroy:\", error);\n\t\t\t}\n\t\t\tthis.desmosCalculator = null;\n\t\t}\n\n\t\t// Clear the container to ensure Desmos releases all references\n\t\tif (this.container) {\n\t\t\t// Remove any Desmos-specific attributes\n\t\t\tthis.container.removeAttribute(\"data-desmos-id\");\n\n\t\t\t// Use modern API - more efficient and cleaner\n\t\t\tthis.container.replaceChildren();\n\t\t}\n\t}\n}\n"]}
|
package/dist/tools/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,sDAAsD;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,+CAA+C;AAC/C,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACb,MAAM,qBAAqB,CAAC;AAC7B,iDAAiD;AACjD,OAAO,EACN,4BAA4B,EAC5B,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,2BAA2B;AAC3B,cAAc,YAAY,CAAC","sourcesContent":["/**\n * Client-only tool system exports\n *\n * This entry point exports only browser-safe code for use in custom elements.\n * It excludes server-side services like accommodationResolver, variantResolver, etc.\n *\n * Tools should import from '@pie-players/pie-assessment-toolkit/tools/client' instead of\n * '@pie-players/pie-assessment-toolkit' to ensure\n * they don't accidentally pull in server-side dependencies.\n */\n\n// Calculator providers (client-safe, have SSR guards)\nexport { DesmosCalculatorProvider } from \"./calculators/desmos-provider.js\";\n// Library loader (client-safe, has SSR guards)\nexport {\n\tCOMMON_LIBRARIES,\n\tLibraryLoaderImpl,\n\tlibraryLoader,\n} from \"./library-loader.js\";\n// Response discovery (client-safe, browser-only)\nexport {\n\tResponseDiscoveryServiceImpl,\n\tresponseDiscovery,\n} from \"./response-discovery.js\";\n// Core types (client-safe)\nexport * from \"./types.js\";\n"]}
|
package/dist/tools/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yDAAyD;AACzD,cAAc,aAAa,CAAC;AAC5B,mBAAmB;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC","sourcesContent":["/**\n * Tool system exports\n *\n * For custom elements and client-side code, use\n * '@pie-players/pie-assessment-toolkit/tools/client' instead.\n */\n\n// Re-export everything from client.ts (client-safe code)\nexport * from \"./client.js\";\n// Variant resolver\nexport { VariantResolverImpl } from \"./variant-resolver.js\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"library-loader.js","sourceRoot":"","sources":["../../src/tools/library-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Library Loader Service\n * Dynamically loads external JavaScript libraries with retry logic and fallback URLs\n *\n * Based on architectural enhancements from renaissance-tool-analyses.md\n * Supports both static and dynamic library loading\n */\n\nimport type { LibraryConfig, LibraryLoader, LoaderStats } from \"./types.js\";\n\n/**\n * Implementation of LibraryLoader service\n */\nexport class LibraryLoaderImpl implements LibraryLoader {\n\tprivate loadedLibraries = new Set<string>();\n\tprivate pendingLoads = new Map<string, Promise<void>>();\n\tprivate failedLibraries = new Map<string, Error>();\n\tprivate stats: LoaderStats = {\n\t\tloaded: [],\n\t\tfailed: [],\n\t\tpending: [],\n\t\tcacheHits: 0,\n\t\tcacheMisses: 0,\n\t\ttotalLoadTime: 0,\n\t};\n\n\t/**\n\t * Load a JavaScript library\n\t */\n\tasync loadScript(library: LibraryConfig): Promise<void> {\n\t\t// SSR guard: Library loading should NEVER run on the server\n\t\tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n\t\t\tthrow new Error(\"Library loader can only be used in the browser\");\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Check if already loaded\n\t\tif (this.isLoaded(library.id)) {\n\t\t\tthis.stats.cacheHits++;\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if already pending\n\t\tconst pending = this.pendingLoads.get(library.id);\n\t\tif (pending) {\n\t\t\treturn pending;\n\t\t}\n\n\t\tthis.stats.cacheMisses++;\n\n\t\t// Start loading\n\t\tconst loadPromise = this._loadScriptWithRetry(library);\n\t\tthis.pendingLoads.set(library.id, loadPromise);\n\t\tthis.stats.pending.push(library.id);\n\n\t\ttry {\n\t\t\tawait loadPromise;\n\t\t\tthis.loadedLibraries.add(library.id);\n\t\t\tthis.stats.loaded.push(library.id);\n\n\t\t\tconst loadTime = performance.now() - startTime;\n\t\t\tthis.stats.totalLoadTime += loadTime;\n\n\t\t\tconsole.log(\n\t\t\t\t`[LibraryLoader] Successfully loaded ${library.id} in ${loadTime.toFixed(2)}ms`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.failedLibraries.set(library.id, error as Error);\n\t\t\tthis.stats.failed.push(library.id);\n\t\t\tconsole.error(`[LibraryLoader] Failed to load ${library.id}:`, error);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.pendingLoads.delete(library.id);\n\t\t\tconst pendingIndex = this.stats.pending.indexOf(library.id);\n\t\t\tif (pendingIndex !== -1) {\n\t\t\t\tthis.stats.pending.splice(pendingIndex, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a stylesheet\n\t */\n\tasync loadStylesheet(\n\t\turl: string,\n\t\ttargetRoot?: Document | ShadowRoot,\n\t): Promise<void> {\n\t\t// SSR guard: Stylesheet loading should NEVER run on the server\n\t\tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n\t\t\tthrow new Error(\"Stylesheet loader can only be used in the browser\");\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst root = targetRoot ?? document;\n\n\t\t\t// Check if already loaded\n\t\t\tconst existing = root.querySelector(`link[href=\"${url}\"]`);\n\t\t\tif (existing) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst link = document.createElement(\"link\");\n\t\t\tlink.rel = \"stylesheet\";\n\t\t\tlink.href = url;\n\n\t\t\tlink.onload = () => resolve();\n\t\t\tlink.onerror = () =>\n\t\t\t\treject(new Error(`Failed to load stylesheet: ${url}`));\n\n\t\t\tif (root instanceof ShadowRoot) {\n\t\t\t\troot.appendChild(link);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdocument.head.appendChild(link);\n\t\t});\n\t}\n\n\t/**\n\t * Check if a library is already loaded\n\t */\n\tisLoaded(libraryId: string): boolean {\n\t\treturn this.loadedLibraries.has(libraryId);\n\t}\n\n\t/**\n\t * Preload multiple libraries in parallel\n\t */\n\tasync preload(libraries: LibraryConfig[]): Promise<void> {\n\t\tconst promises = libraries.map((lib) => this.loadScript(lib));\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Unload a library (remove script tag)\n\t */\n\tunload(libraryId: string): void {\n\t\tconst script = document.querySelector(\n\t\t\t`script[data-library-id=\"${libraryId}\"]`,\n\t\t);\n\t\tif (script) {\n\t\t\tscript.remove();\n\t\t\tthis.loadedLibraries.delete(libraryId);\n\n\t\t\t// Remove from stats\n\t\t\tconst loadedIndex = this.stats.loaded.indexOf(libraryId);\n\t\t\tif (loadedIndex !== -1) {\n\t\t\t\tthis.stats.loaded.splice(loadedIndex, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get loader statistics\n\t */\n\tgetStats(): LoaderStats {\n\t\treturn { ...this.stats };\n\t}\n\n\t/**\n\t * Load script with retry logic\n\t */\n\tprivate async _loadScriptWithRetry(library: LibraryConfig): Promise<void> {\n\t\tconst urls = [library.url, ...(library.fallbackUrls || [])];\n\t\tconst maxAttempts = library.retry?.maxAttempts || 3;\n\t\tconst delay = library.retry?.delay || 1000;\n\t\tconst backoffMultiplier = library.retry?.backoffMultiplier || 2;\n\n\t\tlet lastError: Error | null = null;\n\n\t\tfor (const url of urls) {\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this._loadScriptFromUrl(url, library);\n\n\t\t\t\t\t// Verify library loaded if globalVar specified\n\t\t\t\t\tif (library.globalVar) {\n\t\t\t\t\t\tif (!(library.globalVar in window)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Library ${library.id} loaded but global ${library.globalVar} not found`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn; // Success\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error as Error;\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[LibraryLoader] Attempt ${attempt}/${maxAttempts} failed for ${url}:`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Wait before retry (exponential backoff)\n\t\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\t\tconst waitTime = delay * Math.pow(backoffMultiplier, attempt - 1);\n\t\t\t\t\t\tawait this._sleep(waitTime);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`Failed to load library ${library.id} after trying all URLs: ${lastError?.message}`,\n\t\t);\n\t}\n\n\t/**\n\t * Load script from a specific URL\n\t */\n\tprivate _loadScriptFromUrl(\n\t\turl: string,\n\t\tlibrary: LibraryConfig,\n\t): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tscript.src = url;\n\t\t\tscript.dataset.libraryId = library.id;\n\n\t\t\tif (library.async) script.async = true;\n\t\t\tif (library.defer) script.defer = true;\n\t\t\tif (library.integrity) script.integrity = library.integrity;\n\t\t\tif (library.crossorigin) script.crossOrigin = library.crossorigin;\n\n\t\t\tlet timeoutId: number | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tscript.onload = null;\n\t\t\t\tscript.onerror = null;\n\t\t\t};\n\n\t\t\tscript.onload = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t};\n\n\t\t\tscript.onerror = (error) => {\n\t\t\t\tcleanup();\n\t\t\t\tscript.remove();\n\t\t\t\treject(new Error(`Script load error for ${url}: ${error}`));\n\t\t\t};\n\n\t\t\t// Timeout handling\n\t\t\tif (library.timeout) {\n\t\t\t\ttimeoutId = window.setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tscript.remove();\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Script load timeout for ${url} after ${library.timeout}ms`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}, library.timeout);\n\t\t\t}\n\n\t\t\tdocument.head.appendChild(script);\n\t\t});\n\t}\n\n\t/**\n\t * Sleep utility for retry delays\n\t */\n\tprivate _sleep(ms: number): Promise<void> {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n}\n\n/**\n * Singleton instance\n */\nexport const libraryLoader = new LibraryLoaderImpl();\n\n/**\n * Desmos library version (matches the version in calculator.js)\n * Update this when upgrading to a new version\n */\nconst DESMOS_VERSION = \"v1.12\";\n\n/**\n * Common library configurations\n * Based on industry best practices and platform analyses\n */\nexport const COMMON_LIBRARIES: Record<string, LibraryConfig> = {\n\tdesmos: {\n\t\tid: \"desmos\",\n\t\turl: `/lib/desmos/${DESMOS_VERSION}/calculator.js`, // Self-hosted (prioritized) - versioned for better cache control\n\t\tfallbackUrls: [\n\t\t\t\"https://www.desmos.com/api/v1.12/calculator.js\",\n\t\t\t\"https://cdn.jsdelivr.net/npm/desmos@1.12/dist/calculator.js\",\n\t\t],\n\t\tglobalVar: \"Desmos\",\n\t\ttimeout: 10000,\n\t\tretry: { maxAttempts: 3, delay: 1000, backoffMultiplier: 2 },\n\t},\n\n\tmathjax: {\n\t\tid: \"mathjax\",\n\t\turl: \"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js\",\n\t\tfallbackUrls: [\n\t\t\t\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js\",\n\t\t\t\"/static/lib/mathjax/tex-mml-chtml.js\",\n\t\t],\n\t\tglobalVar: \"MathJax\",\n\t\tasync: true,\n\t\tretry: { maxAttempts: 2, delay: 1500 },\n\t},\n\n\tkatex: {\n\t\tid: \"katex\",\n\t\turl: \"https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js\",\n\t\tfallbackUrls: [\n\t\t\t\"https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js\",\n\t\t\t\"/static/lib/katex/katex.min.js\",\n\t\t],\n\t\tglobalVar: \"katex\",\n\t\ttimeout: 5000,\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility-tools.js","sourceRoot":"","sources":["../../../src/tools/registrations/accessibility-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Accessibility Tools Registrations\n *\n * Registers tools for visual accessibility and reading support:\n * - Line Reader (reading guide)\n * - Color Scheme (theme/contrast)\n * - Annotation Toolbar (text highlighting)\n *\n * Maps to QTI 3.0 standard access features from:\n * - visual category: highContrastDisplay, colorContrast\n * - reading category: readingMask, readingGuide, highlighting\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport { hasReadableText } from \"../../services/tool-context.js\";\nimport {\n\tcreateToolElement,\n\ttype ToolComponentOverrides,\n} from \"../tool-tag-map.js\";\nimport {\n\tapplyOverlaySurface,\n\tcreateScopedVisibilityBinding,\n\tsyncButtonAndOverlayVisibility,\n} from \"./toolbar-registration-helpers.js\";\n\n/**\n * Line Reader tool registration\n *\n * Provides a reading guide overlay to help track reading position.\n * Useful for text-heavy passages and questions.\n */\nexport const lineReaderToolRegistration: ToolRegistration = {\n\ttoolId: \"lineReader\",\n\tname: \"Line Reader\",\n\tdescription: \"Reading guide overlay\",\n\ticon: \"bars-3\",\n\n\t// Line reader appears where there's text to read\n\tsupportedLevels: [\"section\", \"passage\", \"rubric\", \"item\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard features: readingMask, readingGuide, readingRuler\n\tpnpSupportIds: [\n\t\t\"readingMask\", // QTI 3.0 standard (reading.readingMask)\n\t\t\"readingGuide\", // QTI 3.0 standard (reading.readingGuide)\n\t\t\"readingRuler\", // QTI 3.0 standard (reading.readingRuler)\n\t\t\"lineReader\", // Common variant\n\t\t\"trackingGuide\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Line reader is relevant when readable text is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasReadableText(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Line reader - Reading guide\",\n\t\t\ttooltip: \"Line Reader\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\tapplyOverlaySurface(overlay, \"frameless\");\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n\n/**\n * Theme tool registration\n *\n * Provides accessible theme and contrast controls.\n * Global tool that affects entire assessment.\n */\nexport const themeToolRegistration: ToolRegistration = {\n\ttoolId: \"theme\",\n\tname: \"Theme\",\n\tdescription: \"Accessible themes and contrast\",\n\ticon: \"swatch\",\n\n\t// Color scheme is assessment-wide\n\tsupportedLevels: [\"assessment\", \"section\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard features: highContrastDisplay, colorContrast, invertColors\n\tpnpSupportIds: [\n\t\t\"highContrastDisplay\", // QTI 3.0 standard (visual.highContrastDisplay)\n\t\t\"colorContrast\", // QTI 3.0 standard (visual.colorContrast)\n\t\t\"invertColors\", // QTI 3.0 standard (visual.invertColors)\n\t\t\"theme\", // Canonical id\n\t\t\"highContrast\", // Common variant\n\t\t\"customColors\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Color scheme is always relevant when allowed\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn true; // Always show if allowed by orchestrator\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Theme - Change colors and contrast\",\n\t\t\ttooltip: \"Theme\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\telement: overlay,\n\t\t\t\t\tmount: \"after-buttons\",\n\t\t\t\t\tshell: {\n\t\t\t\t\t\ttitle: this.name,\n\t\t\t\t\t\tdraggable: true,\n\t\t\t\t\t\tresizable: false,\n\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\tinitialWidth: 520,\n\t\t\t\t\t\tinitialHeight: 380,\n\t\t\t\t\t\tminWidth: 420,\n\t\t\t\t\t\tminHeight: 300,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n\n/**\n * Annotation Toolbar registration\n *\n * Text highlighting with CSS Custom Highlight API.\n * Zero DOM mutation, optimal performance.\n */\nexport const annotationToolbarRegistration: ToolRegistration = {\n\ttoolId: \"annotationToolbar\",\n\tname: \"Highlighter\",\n\tdescription: \"Highlight and annotate text\",\n\ticon: \"highlighter\",\n\tactivation: \"selection-gateway\",\n\tsingletonScope: \"section\",\n\n\t// Annotation appears where there's text content\n\tsupportedLevels: [\"passage\", \"rubric\", \"item\", \"element\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard features: highlighting, annotations\n\tpnpSupportIds: [\n\t\t\"highlighting\", // QTI 3.0 standard (cognitive.highlighting / reading.wordHighlighting)\n\t\t\"annotations\", // QTI 3.0 standard (cognitive.annotations)\n\t\t\"highlighter\", // Common variant\n\t\t\"textHighlight\", // Common variant\n\t\t\"annotation\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Annotation is relevant when readable text is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasReadableText(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Annotation toolbar - Highlight text\",\n\t\t\ttooltip: \"Highlight\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculator.js","sourceRoot":"","sources":["../../../src/tools/registrations/calculator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Calculator Tool Registration\n *\n * Registers the calculator tool with support for multiple calculator types\n * (basic, scientific, graphing) via Desmos provider.\n *\n * Maps to QTI 3.0 standard access features:\n * - calculator (cognitive support)\n * - graphingCalculator (assessment tool)\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolCoordinatorApi } from \"../../services/interfaces.js\";\nimport type { ToolProviderConfig } from \"../../services/tools-config-normalizer.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport { hasMathContent } from \"../../services/tool-context.js\";\nimport { createScopedToolId } from \"../../services/tool-instance-id.js\";\nimport { DesmosToolProvider } from \"../../services/tool-providers/index.js\";\nimport { createToolElement } from \"../tool-tag-map.js\";\n\ntype CalculatorType = \"basic\" | \"scientific\";\n\n// The toolbar parent re-derives `renderedTools` whenever item state changes\n// (e.g. the learner answers a question and `effectiveItem`/`renderContext`\n// recompute). Calculator initialization is expensive (Desmos boot, container\n// mount), so we cache the overlay element by coordinator + scoped tool id.\n// Reusing the same element keeps `mountContent` a no-op and avoids tearing\n// down and re-initializing the calculator on every re-render.\nconst overlayElementCache = new WeakMap<\n\tToolCoordinatorApi,\n\tMap<string, HTMLElement>\n>();\n\nfunction getCachedOverlay(\n\tcoordinator: ToolCoordinatorApi | null,\n\tfullToolId: string,\n): HTMLElement | null {\n\tif (!coordinator) return null;\n\tconst scoped = overlayElementCache.get(coordinator);\n\tconst element = scoped?.get(fullToolId);\n\tif (!element) return null;\n\t// Svelte custom elements destroy their component when disconnected.\n\t// A detached cached element is a dead instance — drop it and recreate.\n\tif (!element.isConnected) {\n\t\tscoped?.delete(fullToolId);\n\t\treturn null;\n\t}\n\treturn element;\n}\n\nfunction setCachedOverlay(\n\tcoordinator: ToolCoordinatorApi | null,\n\tfullToolId: string,\n\telement: HTMLElement,\n): void {\n\tif (!coordinator) return;\n\tlet scoped = overlayElementCache.get(coordinator);\n\tif (!scoped) {\n\t\tscoped = new Map();\n\t\toverlayElementCache.set(coordinator, scoped);\n\t}\n\tscoped.set(fullToolId, element);\n}\n\nfunction normalizeCalculatorType(value: unknown): CalculatorType | null {\n\treturn value === \"basic\" || value === \"scientific\" ? value : null;\n}\n\nfunction getCalculatorRenderParams(toolbarContext: ToolbarContext): {\n\tcalculatorType: CalculatorType | null;\n\tavailableTypes: CalculatorType[] | null;\n\tdisplayName: string;\n} {\n\tconst params = toolbarContext.getToolRenderParams?.(\"calculator\") ?? {};\n\tconst calculatorType = normalizeCalculatorType(params.calculatorType);\n\tconst availableTypesRaw = params.availableTypes;\n\tconst availableTypes = Array.isArray(availableTypesRaw)\n\t\t? availableTypesRaw\n\t\t\t\t.map((value) => normalizeCalculatorType(value))\n\t\t\t\t.filter((value): value is CalculatorType => value !== null)\n\t\t: calculatorType\n\t\t\t? [calculatorType]\n\t\t\t: null;\n\n\treturn {\n\t\tcalculatorType,\n\t\tavailableTypes,\n\t\tdisplayName:\n\t\t\tcalculatorType === \"scientific\"\n\t\t\t\t? \"Scientific Calculator\"\n\t\t\t\t: calculatorType === \"basic\"\n\t\t\t\t\t? \"Basic Calculator\"\n\t\t\t\t\t: \"Calculator\",\n\t};\n}\n\nfunction applyCalculatorParamsToElement(\n\telement: HTMLElement,\n\tcalculatorType: CalculatorType | null,\n\tavailableTypes: CalculatorType[] | null,\n): void {\n\tconst calculatorElement = element as HTMLElement & {\n\t\tcalculatorType?: CalculatorType;\n\t\tavailableTypes?: CalculatorType[];\n\t};\n\n\tif (calculatorType) {\n\t\tcalculatorElement.calculatorType = calculatorType;\n\t\telement.setAttribute(\"calculator-type\", calculatorType);\n\t} else {\n\t\tdelete calculatorElement.calculatorType;\n\t\telement.removeAttribute(\"calculator-type\");\n\t}\n\n\tif (availableTypes && availableTypes.length > 0) {\n\t\tcalculatorElement.availableTypes = availableTypes;\n\t} else {\n\t\tdelete calculatorElement.availableTypes;\n\t}\n}\n\n/**\n * Calculator tool registration\n *\n * Supports:\n * - Basic, scientific, and graphing calculators via Desmos\n * - Context-aware visibility (shows only when math content is detected)\n * - Item level only\n */\nexport const calculatorToolRegistration: ToolRegistration = {\n\ttoolId: \"calculator\",\n\tname: \"Calculator\",\n\tdescription: \"Multi-type calculator (basic, scientific, graphing)\",\n\ticon: \"calculator\",\n\tprovider: {\n\t\tgetProviderId: (config: ToolProviderConfig | undefined) =>\n\t\t\ttypeof config?.provider?.id === \"string\" && config.provider.id.length > 0\n\t\t\t\t? config.provider.id\n\t\t\t\t: \"calculator-desmos\",\n\t\tcreateProvider: () => new DesmosToolProvider(),\n\t\tgetInitConfig: (config: ToolProviderConfig | undefined) =>\n\t\t\tconfig?.provider?.init ?? {},\n\t\tgetAuthFetcher: (config: ToolProviderConfig | undefined) => {\n\t\t\tconst runtimeAuthFetcher = config?.provider?.runtime?.authFetcher;\n\t\t\tif (typeof runtimeAuthFetcher === \"function\") return runtimeAuthFetcher;\n\t\t\treturn async () => {\n\t\t\t\tconst response = await fetch(\"/api/tools/desmos/auth\", {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tcredentials: \"same-origin\",\n\t\t\t\t});\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to fetch Desmos auth config (${response.status})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (await response.json()) as Record<string, unknown>;\n\t\t\t};\n\t\t},\n\t\tlazy: true,\n\t},\n\n\t// Calculator is item-level in this player architecture.\n\tsupportedLevels: [\"item\"],\n\n\t// PNP support IDs that enable this tool\n\t// Maps to QTI 3.0 standard features: calculator, graphingCalculator\n\tpnpSupportIds: [\n\t\t\"calculator\", // QTI 3.0 standard (cognitive.calculator)\n\t\t\"graphingCalculator\", // QTI 3.0 standard (assessment.graphingCalculator)\n\t\t\"basicCalculator\", // Common variant\n\t\t\"scientificCalculator\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Determine if calculator is relevant in this context\n\t *\n\t * Calculator is relevant when context contains mathematical content\n\t * (MathML, LaTeX, arithmetic markers).\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\t// Show only when math is present in item content.\n\t\treturn hasMathContent(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst { calculatorType, availableTypes, displayName } =\n\t\t\tgetCalculatorRenderParams(toolbarContext);\n\t\tconst fullToolId = createScopedToolId(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext.scope.level,\n\t\t\ttoolbarContext.scope.scopeId,\n\t\t);\n\t\tconst componentOverrides = toolbarContext.componentOverrides;\n\t\tconst cachedOverlay = getCachedOverlay(\n\t\t\ttoolbarContext.toolCoordinator,\n\t\t\tfullToolId,\n\t\t);\n\t\tconst overlay = (cachedOverlay ??\n\t\t\tcreateToolElement(\n\t\t\t\tthis.toolId,\n\t\t\t\tcontext,\n\t\t\t\ttoolbarContext,\n\t\t\t\tcomponentOverrides,\n\t\t\t)) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator?: unknown;\n\t\t};\n\t\tif (!cachedOverlay) {\n\t\t\tsetCachedOverlay(toolbarContext.toolCoordinator, fullToolId, overlay);\n\t\t}\n\t\toverlay.setAttribute(\"tool-id\", fullToolId);\n\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\tapplyCalculatorParamsToElement(overlay, calculatorType, availableTypes);\n\t\tconst openLabel =\n\t\t\tcalculatorType === null\n\t\t\t\t? \"Open scientific calculator\"\n\t\t\t\t: `Open ${displayName.toLowerCase()}`;\n\t\tconst closeLabel =\n\t\t\tcalculatorType === null\n\t\t\t\t? \"Close scientific calculator\"\n\t\t\t\t: `Close ${displayName.toLowerCase()}`;\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: displayName,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: openLabel,\n\t\t\ttooltip: displayName,\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: toolbarContext.isToolVisible(fullToolId),\n\t\t};\n\t\tlet lastVisibleState: boolean | undefined = button.active;\n\t\tif (overlay.visible !== button.active) {\n\t\t\toverlay.visible = button.active;\n\t\t}\n\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\telement: overlay,\n\t\t\t\t\tmount: \"after-buttons\",\n\t\t\t\t\tshell: {\n\t\t\t\t\t\ttitle: this.name,\n\t\t\t\t\t\tdraggable: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\tinitialWidth: 380,\n\t\t\t\t\t\tinitialHeight: 420,\n\t\t\t\t\t\tminWidth: 380,\n\t\t\t\t\t\tminHeight: 420,\n\t\t\t\t\t\tinitialAlign: \"bottom-right\",\n\t\t\t\t\t\tinitialMargin: 16,\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\toverflowY: \"auto\",\n\t\t\t\t\t\t\tpreserveMinHeight: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tbutton,\n\t\t\tsync: () => {\n\t\t\t\tconst active = toolbarContext.isToolVisible(fullToolId);\n\t\t\t\tbutton.active = active;\n\t\t\t\tbutton.label = displayName;\n\t\t\t\tbutton.ariaLabel = active ? closeLabel : openLabel;\n\t\t\t\tbutton.tooltip = active\n\t\t\t\t\t? `Close ${displayName.toLowerCase()}`\n\t\t\t\t\t: displayName;\n\t\t\t\tif (lastVisibleState !== active) {\n\t\t\t\t\toverlay.visible = active;\n\t\t\t\t\tlastVisibleState = active;\n\t\t\t\t}\n\t\t\t\tif (overlay.toolkitCoordinator !== toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t\tapplyCalculatorParamsToElement(overlay, calculatorType, availableTypes);\n\t\t\t},\n\t\t\tsubscribeActive: (callback: (active: boolean) => void) => {\n\t\t\t\tif (!toolbarContext.subscribeVisibility) return () => {};\n\t\t\t\treturn toolbarContext.subscribeVisibility(() => {\n\t\t\t\t\tcallback(toolbarContext.isToolVisible(fullToolId));\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interaction-tools.js","sourceRoot":"","sources":["../../../src/tools/registrations/interaction-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Interaction Tools Registrations\n *\n * Registers tools for interacting with question content:\n * - Answer Eliminator (strike through answer choices)\n * - Highlighter (highlight text passages)\n *\n * Maps to QTI 3.0 standard access features:\n * - answerMasking (assessment tool)\n * - strikethrough (visual transformation)\n * - highlighting (cognitive/reading support)\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport {\n\thasChoiceInteraction,\n\thasReadableText,\n} from \"../../services/tool-context.js\";\nimport {\n\tcreateToolElement,\n\ttype ToolComponentOverrides,\n} from \"../tool-tag-map.js\";\nimport {\n\tcreateScopedVisibilityBinding,\n\tsyncButtonAndOverlayVisibility,\n} from \"./toolbar-registration-helpers.js\";\n\n/**\n * Answer Eliminator tool registration\n *\n * Allows students to strike through incorrect answer choices.\n * Only appears on multiple-choice style questions.\n */\nexport const answerEliminatorToolRegistration: ToolRegistration = {\n\ttoolId: \"answerEliminator\",\n\tname: \"Answer Eliminator\",\n\tdescription: \"Strike through answer choices\",\n\ticon: \"strikethrough\",\n\n\t// Answer eliminator appears at item level only\n\tsupportedLevels: [\"item\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard feature: answerMasking\n\tpnpSupportIds: [\n\t\t\"answerMasking\", // QTI 3.0 standard (assessment.answerMasking)\n\t\t\"answerEliminator\", // QTI 3.0 standard (assessment.answerEliminator)\n\t\t\"strikethrough\", // Common variant\n\t\t\"choiceMasking\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Answer eliminator is relevant only for choice-based questions\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasChoiceInteraction(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\tcoordinator?: unknown;\n\t\t\telementToolStateStore?: unknown;\n\t\t\tglobalElementId?: string;\n\t\t\tscopeElement?: HTMLElement | null;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\toverlay.setAttribute(\"strategy\", \"strikethrough\");\n\t\toverlay.setAttribute(\"button-alignment\", \"inline\");\n\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M19,3H16.3H7.7H5A2,2 0 0,0 3,5V7.7V16.4V19A2,2 0 0,0 5,21H7.7H16.4H19A2,2 0 0,0 21,19V16.3V7.7V5A2,2 0 0,0 19,3M15.6,17L12,13.4L8.4,17L7,15.6L10.6,12L7,8.4L8.4,7L12,10.6L15.6,7L17,8.4L13.4,12L17,15.6L15.6,17Z\"/></svg>',\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Answer eliminator - Strike through choices\",\n\t\t\ttooltip: \"Strike Through\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolCoordinator) {\n\t\t\t\t\toverlay.coordinator = toolbarContext.toolCoordinator;\n\t\t\t\t}\n\t\t\t\toverlay.scopeElement = toolbarContext.getScopeElement?.() || null;\n\t\t\t\tif (toolbarContext.elementToolStateStore) {\n\t\t\t\t\toverlay.elementToolStateStore = toolbarContext.elementToolStateStore;\n\t\t\t\t}\n\t\t\t\tconst globalElementId = toolbarContext.getGlobalElementId?.();\n\t\t\t\tif (globalElementId) {\n\t\t\t\t\toverlay.globalElementId = globalElementId;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n\n/**\n * Highlighter tool registration\n *\n * Allows students to highlight text in passages and questions.\n * Appears on items with readable text content.\n */\nexport const highlighterToolRegistration: ToolRegistration = {\n\ttoolId: \"highlighter\",\n\tname: \"Highlighter\",\n\tdescription: \"Highlight text\",\n\ticon: \"highlighter\",\n\tactivation: \"toolbar-toggle\",\n\n\t// Highlighter appears at passage, rubric, item, and element levels\n\tsupportedLevels: [\"passage\", \"rubric\", \"item\", \"element\"],\n\n\t// PNP support IDs\n\tpnpSupportIds: [\"highlighter\", \"textHighlight\", \"annotation\"],\n\n\t/**\n\t * Pass 2: Highlighter is relevant when readable text is available\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasReadableText(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Highlighter - Highlight text\",\n\t\t\ttooltip: \"Highlight\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tenabled?: boolean;\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\thighlightCoordinator?: unknown;\n\t\t\tttsService?: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t\tonActiveChange: (active) => {\n\t\t\t\t\t\toverlay.enabled = active;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.ttsService) {\n\t\t\t\t\toverlay.ttsService = toolbarContext.ttsService;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"measurement-tools.js","sourceRoot":"","sources":["../../../src/tools/registrations/measurement-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Measurement Tools Registrations\n *\n * Registers ruler and protractor tools for on-screen measurements.\n *\n * Maps to QTI 3.0 standard access features:\n * - ruler (assessment tool)\n * - protractor (assessment tool)\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport { hasMathContent } from \"../../services/tool-context.js\";\nimport {\n\tcreateToolElement,\n\ttype ToolComponentOverrides,\n} from \"../tool-tag-map.js\";\nimport {\n\tapplyOverlaySurface,\n\tcreateScopedVisibilityBinding,\n\tsyncButtonAndOverlayVisibility,\n} from \"./toolbar-registration-helpers.js\";\n\n/**\n * Ruler tool registration\n *\n * Provides an on-screen ruler for measuring lengths.\n * Typically appears on geometry or measurement problems.\n */\nexport const rulerToolRegistration: ToolRegistration = {\n\ttoolId: \"ruler\",\n\tname: \"Ruler\",\n\tdescription: \"On-screen ruler for measurements\",\n\ticon: \"ruler\",\n\n\t// Ruler typically appears at section/item/element level\n\tsupportedLevels: [\"section\", \"item\", \"element\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard feature: ruler\n\tpnpSupportIds: [\n\t\t\"ruler\", // QTI 3.0 standard (assessment.ruler)\n\t\t\"measurement\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Ruler is relevant when math content is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasMathContent(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Open ruler tool\",\n\t\t\ttooltip: \"Ruler\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\tapplyOverlaySurface(overlay, \"frameless\");\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n\n/**\n * Protractor tool registration\n *\n * Provides an on-screen protractor for measuring angles.\n * Typically appears on geometry problems.\n */\nexport const protractorToolRegistration: ToolRegistration = {\n\ttoolId: \"protractor\",\n\tname: \"Protractor\",\n\tdescription: \"On-screen protractor for angle measurements\",\n\ticon: \"protractor\",\n\n\t// Protractor typically appears at section/item/element level\n\tsupportedLevels: [\"section\", \"item\", \"element\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard feature: protractor\n\tpnpSupportIds: [\n\t\t\"protractor\", // QTI 3.0 standard (assessment.protractor)\n\t\t\"angleMeasurement\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Protractor is relevant when math content is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasMathContent(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Open protractor tool\",\n\t\t\ttooltip: \"Protractor\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t\ttoolkitCoordinator: unknown;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\tapplyOverlaySurface(overlay, \"frameless\");\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [{ element: overlay, mount: \"after-buttons\" }],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t\tif (toolbarContext.toolkitCoordinator) {\n\t\t\t\t\toverlay.toolkitCoordinator = toolbarContext.toolkitCoordinator;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subject-specific-tools.js","sourceRoot":"","sources":["../../../src/tools/registrations/subject-specific-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Subject-Specific Tools Registrations\n *\n * Registers tools for specific subject areas:\n * - Graph (graphing calculator/coordinate plane)\n * - Periodic Table (chemistry reference)\n *\n * Maps to QTI 3.0 standard access features:\n * - graphingCalculator (assessment tool)\n * - graph (assessment tool)\n * - periodicTable (assessment tool)\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport {\n\thasMathContent,\n\thasScienceContent,\n} from \"../../services/tool-context.js\";\nimport {\n\tcreateToolElement,\n\ttype ToolComponentOverrides,\n} from \"../tool-tag-map.js\";\nimport {\n\tcreateScopedVisibilityBinding,\n\tsyncButtonAndOverlayVisibility,\n} from \"./toolbar-registration-helpers.js\";\n\n/**\n * Graph tool registration\n *\n * Provides graphing calculator and coordinate plane functionality.\n * Context-smart: appears automatically for math content or when explicitly enabled.\n */\nexport const graphToolRegistration: ToolRegistration = {\n\ttoolId: \"graph\",\n\tname: \"Graph\",\n\tdescription: \"Graphing calculator and coordinate plane\",\n\ticon: \"chart-bar\",\n\n\t// Graph is a section-level floating tool.\n\tsupportedLevels: [\"section\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard features: graph, graphingCalculator\n\tpnpSupportIds: [\n\t\t\"graph\", // QTI 3.0 standard (assessment.graph)\n\t\t\"graphingCalculator\", // QTI 3.0 standard (assessment.graphingCalculator)\n\t\t\"coordinatePlane\", // Common variant\n\t\t\"graphingTool\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Graph is relevant when math content is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasMathContent(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Graph - Graphing calculator\",\n\t\t\ttooltip: \"Graph\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\telement: overlay,\n\t\t\t\t\tmount: \"after-buttons\",\n\t\t\t\t\tshell: {\n\t\t\t\t\t\ttitle: this.name,\n\t\t\t\t\t\tdraggable: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\tinitialWidth: 920,\n\t\t\t\t\t\tinitialHeight: 680,\n\t\t\t\t\t\tminWidth: 640,\n\t\t\t\t\t\tminHeight: 500,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n\n/**\n * Periodic Table tool registration\n *\n * Provides chemistry periodic table reference.\n * Context-smart: appears automatically for science content or when explicitly enabled.\n */\nexport const periodicTableToolRegistration: ToolRegistration = {\n\ttoolId: \"periodicTable\",\n\tname: \"Periodic Table\",\n\tdescription: \"Chemistry periodic table reference\",\n\ticon: \"beaker\",\n\n\t// Periodic table is a section-level floating tool.\n\tsupportedLevels: [\"section\"],\n\n\t// PNP support IDs\n\t// Maps to QTI 3.0 standard feature: periodicTable\n\tpnpSupportIds: [\n\t\t\"periodicTable\", // QTI 3.0 standard (assessment.periodicTable)\n\t\t\"chemistryReference\", // Common variant\n\t\t\"elementReference\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Periodic table is relevant when science content is present\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasScienceContent(context);\n\t},\n\n\trenderToolbar(\n\t\tcontext: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst visibility = createScopedVisibilityBinding(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext,\n\t\t);\n\t\tconst button: ToolToolbarButtonDefinition = {\n\t\t\ttoolId: this.toolId,\n\t\t\tlabel: this.name,\n\t\t\ticon: typeof this.icon === \"function\" ? this.icon(context) : this.icon,\n\t\t\tdisabled: false,\n\t\t\tariaLabel: \"Periodic table - Chemistry reference\",\n\t\t\ttooltip: \"Periodic Table\",\n\t\t\tonClick: () => toolbarContext.toggleTool(this.toolId),\n\t\t\tactive: visibility.isActive(),\n\t\t};\n\t\tconst componentOverrides =\n\t\t\t(toolbarContext.componentOverrides as\n\t\t\t\t| ToolComponentOverrides\n\t\t\t\t| undefined) ?? {};\n\t\tconst overlay = createToolElement(\n\t\t\tthis.toolId,\n\t\t\tcontext,\n\t\t\ttoolbarContext,\n\t\t\tcomponentOverrides,\n\t\t) as HTMLElement & {\n\t\t\tvisible?: boolean;\n\t\t\ttoolId?: string;\n\t\t};\n\t\toverlay.setAttribute(\"tool-id\", visibility.fullToolId);\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton,\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\telement: overlay,\n\t\t\t\t\tmount: \"after-buttons\",\n\t\t\t\t\tshell: {\n\t\t\t\t\t\ttitle: this.name,\n\t\t\t\t\t\tdraggable: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\tinitialWidth: 1160,\n\t\t\t\t\t\tinitialHeight: 760,\n\t\t\t\t\t\tminWidth: 920,\n\t\t\t\t\t\tminHeight: 620,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsync: () => {\n\t\t\t\tsyncButtonAndOverlayVisibility({\n\t\t\t\t\tbutton,\n\t\t\t\t\toverlay,\n\t\t\t\t\tisActive: visibility.isActive,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsubscribeActive: visibility.subscribeActive,\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-registration-helpers.js","sourceRoot":"","sources":["../../../src/tools/registrations/toolbar-registration-helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAIxE,MAAM,UAAU,6BAA6B,CAC5C,MAAc,EACd,cAA8B;IAM9B,MAAM,UAAU,GAAG,kBAAkB,CACpC,MAAM,EACN,cAAc,CAAC,KAAK,CAAC,KAAK,EAC1B,cAAc,CAAC,KAAK,CAAC,OAAO,CAC5B,CAAC;IACF,OAAO;QACN,UAAU;QACV,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC;QACxD,eAAe,EAAE,CAAC,QAAmC,EAAE,EAAE;YACxD,IAAI,CAAC,cAAc,CAAC,mBAAmB;gBAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;YACzD,OAAO,cAAc,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9C,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAK9C;IACA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,OAAoB,EACpB,OAA2B;IAE3B,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import type {\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport { createScopedToolId } from \"../../services/tool-instance-id.js\";\n\nexport type ToolOverlaySurface = \"default\" | \"frameless\";\n\nexport function createScopedVisibilityBinding(\n\ttoolId: string,\n\ttoolbarContext: ToolbarContext,\n): {\n\tfullToolId: string;\n\tisActive: () => boolean;\n\tsubscribeActive: ToolToolbarRenderResult[\"subscribeActive\"];\n} {\n\tconst fullToolId = createScopedToolId(\n\t\ttoolId,\n\t\ttoolbarContext.scope.level,\n\t\ttoolbarContext.scope.scopeId,\n\t);\n\treturn {\n\t\tfullToolId,\n\t\tisActive: () => toolbarContext.isToolVisible(fullToolId),\n\t\tsubscribeActive: (callback: (active: boolean) => void) => {\n\t\t\tif (!toolbarContext.subscribeVisibility) return () => {};\n\t\t\treturn toolbarContext.subscribeVisibility(() => {\n\t\t\t\tcallback(toolbarContext.isToolVisible(fullToolId));\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function syncButtonAndOverlayVisibility(args: {\n\tbutton: ToolToolbarButtonDefinition;\n\toverlay: { visible?: boolean };\n\tisActive: () => boolean;\n\tonActiveChange?: (active: boolean) => void;\n}): void {\n\tconst active = args.isActive();\n\targs.button.active = active;\n\targs.overlay.visible = active;\n\targs.onActiveChange?.(active);\n}\n\nexport function applyOverlaySurface(\n\toverlay: HTMLElement,\n\tsurface: ToolOverlaySurface,\n): void {\n\toverlay.setAttribute(\"data-pie-tool-surface\", surface);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/tools/registrations/tts.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Text-to-Speech (TTS) Tool Registration\n *\n * Registers the TTS tool for reading content aloud.\n *\n * Maps to QTI 3.0 standard access features:\n * - textToSpeech (auditory support)\n * - readAloud (auditory support)\n */\n\nimport type {\n\tToolRegistration,\n\tToolToolbarRenderResult,\n\tToolbarContext,\n} from \"../../services/ToolRegistry.js\";\nimport type { ToolContext } from \"../../services/tool-context.js\";\nimport { hasReadableText } from \"../../services/tool-context.js\";\nimport { createScopedToolId } from \"../../services/tool-instance-id.js\";\nimport {\n\tbuildRuntimeTTSConfig,\n\tnormalizeTTSLayoutMode,\n\tnormalizeTTSSpeedControlOptions,\n\ttype NormalizedTTSSpeedOption,\n\tresolveTTSHostToolbarLayout,\n\tresolveTTSLayoutMode,\n\tresolveTTSBackend,\n\tresolveTTSRuntimeSettings,\n\tresolveRuntimeProvider,\n\tresolveTransportMode,\n} from \"../../services/tts-runtime-config.js\";\nimport { TTSToolProvider } from \"../../services/tool-providers/index.js\";\n\nconst inlineTTSControls = new Map<string, HTMLElement>();\nexport const TOOL_ELEMENT_UNMOUNT_CALLBACK_PROP = \"__pieToolElementUnmount\";\nexport const TOOL_ACTIVE_CHANGE_EVENT = \"pie-tool-active-change\";\n\n/**\n * Text-to-Speech tool registration\n *\n * Supports:\n * - Reading content aloud using browser TTS or external providers\n * - Context-aware visibility (shows when readable text is available)\n * - All levels except assessment and element\n */\nexport const ttsToolRegistration: ToolRegistration = {\n\ttoolId: \"textToSpeech\",\n\tname: \"Text to Speech\",\n\tdescription: \"Read content aloud\",\n\ticon: \"volume-up\",\n\tprovider: {\n\t\tgetProviderId: () => \"tts\",\n\t\tcreateProvider: (config) => {\n\t\t\tconst settings = resolveTTSRuntimeSettings(config);\n\t\t\treturn new TTSToolProvider(resolveTTSBackend(settings));\n\t\t},\n\t\tgetInitConfig: (config) => {\n\t\t\tconst settings = resolveTTSRuntimeSettings(config);\n\t\t\tconst backend = resolveTTSBackend(settings);\n\t\t\tconst serverProvider = resolveRuntimeProvider(settings, backend);\n\t\t\tconst transportMode = resolveTransportMode(settings, serverProvider);\n\t\t\treturn {\n\t\t\t\tbackend,\n\t\t\t\tserverProvider,\n\t\t\t\ttransportMode,\n\t\t\t\t...buildRuntimeTTSConfig(settings),\n\t\t\t};\n\t\t},\n\t\tgetAuthFetcher: (config) => {\n\t\t\tconst runtimeAuthFetcher = config?.provider?.runtime?.authFetcher;\n\t\t\treturn typeof runtimeAuthFetcher === \"function\"\n\t\t\t\t? runtimeAuthFetcher\n\t\t\t\t: undefined;\n\t\t},\n\t\tsanitizeConfig: (config) => {\n\t\t\tconst settings =\n\t\t\t\tconfig.settings && typeof config.settings === \"object\"\n\t\t\t\t\t? { ...(config.settings as Record<string, unknown>) }\n\t\t\t\t\t: undefined;\n\t\t\tif (settings && \"layoutMode\" in settings) {\n\t\t\t\tsettings.layoutMode = normalizeTTSLayoutMode(settings.layoutMode);\n\t\t\t}\n\t\t\tif (settings && \"speedOptions\" in settings) {\n\t\t\t\tsettings.speedOptions = normalizeTTSSpeedControlOptions(\n\t\t\t\t\tsettings.speedOptions,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst normalizedConfig: Record<string, unknown> = {\n\t\t\t\t...(config as Record<string, unknown>),\n\t\t\t};\n\t\t\tif (\"layoutMode\" in normalizedConfig) {\n\t\t\t\tnormalizedConfig.layoutMode = normalizeTTSLayoutMode(\n\t\t\t\t\tnormalizedConfig.layoutMode,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (\"speedOptions\" in normalizedConfig) {\n\t\t\t\tnormalizedConfig.speedOptions = normalizeTTSSpeedControlOptions(\n\t\t\t\t\tnormalizedConfig.speedOptions,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (settings) {\n\t\t\t\tnormalizedConfig.settings = settings;\n\t\t\t}\n\t\t\treturn normalizedConfig as typeof config;\n\t\t},\n\t\tlazy: true,\n\t},\n\n\t// TTS is inline-only and scoped to item/passage contexts.\n\tsupportedLevels: [\"item\", \"passage\"],\n\n\t// PNP support IDs that enable this tool\n\t// Maps to QTI 3.0 standard features: textToSpeech, readAloud\n\tpnpSupportIds: [\n\t\t\"textToSpeech\", // QTI 3.0 standard (auditory.textToSpeech)\n\t\t\"readAloud\", // QTI 3.0 standard (auditory.readAloud)\n\t\t\"tts\", // Common abbreviation\n\t\t\"speechOutput\", // Common variant\n\t],\n\n\t/**\n\t * Pass 2: Determine if TTS is relevant in this context\n\t *\n\t * TTS is relevant when:\n\t * - Context contains readable text (at least 10 characters)\n\t */\n\tisVisibleInContext(context: ToolContext): boolean {\n\t\treturn hasReadableText(context);\n\t},\n\n\trenderToolbar(\n\t\t_context: ToolContext,\n\t\ttoolbarContext: ToolbarContext,\n\t): ToolToolbarRenderResult {\n\t\tconst resolveRuntimeSettings = () =>\n\t\t\tresolveTTSRuntimeSettings(\n\t\t\t\ttoolbarContext.toolkitCoordinator?.getToolConfig(this.toolId) ||\n\t\t\t\t\tundefined,\n\t\t\t);\n\t\tconst resolveElementSpeedOptions = (): NormalizedTTSSpeedOption[] => {\n\t\t\tconst runtimeSettings = resolveRuntimeSettings();\n\t\t\treturn normalizeTTSSpeedControlOptions(runtimeSettings.speedOptions);\n\t\t};\n\t\tconst resolveLayoutMode = () =>\n\t\t\tresolveTTSLayoutMode(resolveRuntimeSettings());\n\t\tconst resolveHostLayout = () =>\n\t\t\tresolveTTSHostToolbarLayout(resolveRuntimeSettings());\n\t\tconst fullToolId = createScopedToolId(\n\t\t\tthis.toolId,\n\t\t\ttoolbarContext.scope.level,\n\t\t\ttoolbarContext.scope.scopeId,\n\t\t);\n\t\tconst resolveControlSize = (): \"sm\" | \"md\" | \"lg\" => {\n\t\t\tconst raw = toolbarContext.ui?.size;\n\t\t\treturn raw === \"sm\" || raw === \"lg\" ? raw : \"md\";\n\t\t};\n\t\tconst ensureElement = (): HTMLElement => {\n\t\t\tlet element = inlineTTSControls.get(fullToolId);\n\t\t\tif (\n\t\t\t\telement &&\n\t\t\t\ttypeof (element as { isConnected?: boolean }).isConnected ===\n\t\t\t\t\t\"boolean\" &&\n\t\t\t\t!(element as { isConnected?: boolean }).isConnected\n\t\t\t) {\n\t\t\t\tinlineTTSControls.delete(fullToolId);\n\t\t\t\telement = undefined;\n\t\t\t}\n\t\t\tif (!element) {\n\t\t\t\telement = document.createElement(\"pie-tool-tts-inline\");\n\t\t\t\t(\n\t\t\t\t\telement as HTMLElement & {\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t}\n\t\t\t\t)[TOOL_ELEMENT_UNMOUNT_CALLBACK_PROP] = () => {\n\t\t\t\t\tif (inlineTTSControls.get(fullToolId) === element) {\n\t\t\t\t\t\tinlineTTSControls.delete(fullToolId);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tinlineTTSControls.set(fullToolId, element);\n\t\t\t}\n\t\t\telement.setAttribute(\"tool-id\", fullToolId);\n\t\t\telement.setAttribute(\n\t\t\t\t\"catalog-id\",\n\t\t\t\ttoolbarContext.catalogId || toolbarContext.itemId,\n\t\t\t);\n\t\t\telement.setAttribute(\"language\", toolbarContext.language || \"en-US\");\n\t\t\telement.setAttribute(\"size\", resolveControlSize());\n\t\t\telement.setAttribute(\"layout-mode\", resolveLayoutMode());\n\t\t\t(\n\t\t\t\telement as HTMLElement & { speedOptions?: NormalizedTTSSpeedOption[] }\n\t\t\t).speedOptions = resolveElementSpeedOptions();\n\t\t\t(\n\t\t\t\telement as HTMLElement & { showSingleSpeedOption?: boolean }\n\t\t\t).showSingleSpeedOption =\n\t\t\t\tresolveRuntimeSettings().showSingleSpeedOption === true;\n\t\t\treturn element;\n\t\t};\n\t\tconst hostLayout = resolveHostLayout();\n\n\t\treturn {\n\t\t\ttoolId: this.toolId,\n\t\t\tbutton: null,\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\telement: ensureElement(),\n\t\t\t\t\tmount: hostLayout.mount,\n\t\t\t\t\tlayoutHints: {\n\t\t\t\t\t\tcontrolsRow: {\n\t\t\t\t\t\t\treserveSpace: hostLayout.controlsRow.reserveSpace,\n\t\t\t\t\t\t\tshowWhenToolActive: hostLayout.controlsRow.expandWhenToolActive,\n\t\t\t\t\t\t},\n\t\t\t\t\t\theaderOverlay: {\n\t\t\t\t\t\t\tshowWhenToolActive: hostLayout.headerOverlay.expandWhenToolActive,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsubscribeActive: (callback) => {\n\t\t\t\tconst element = ensureElement();\n\t\t\t\tconst handler = (event: Event) => {\n\t\t\t\t\tconst detail = (event as CustomEvent<{ active?: boolean }>).detail;\n\t\t\t\t\tcallback(detail?.active === true);\n\t\t\t\t};\n\t\t\t\telement.addEventListener(TOOL_ACTIVE_CHANGE_EVENT, handler);\n\t\t\t\treturn () => {\n\t\t\t\t\telement.removeEventListener(TOOL_ACTIVE_CHANGE_EVENT, handler);\n\t\t\t\t};\n\t\t\t},\n\t\t\tsync: () => {\n\t\t\t\tconst element = ensureElement();\n\t\t\t\telement.setAttribute(\"tool-id\", fullToolId);\n\t\t\t\telement.setAttribute(\n\t\t\t\t\t\"catalog-id\",\n\t\t\t\t\ttoolbarContext.catalogId || toolbarContext.itemId,\n\t\t\t\t);\n\t\t\t\telement.setAttribute(\"language\", toolbarContext.language || \"en-US\");\n\t\t\t\telement.setAttribute(\"size\", resolveControlSize());\n\t\t\t\telement.setAttribute(\"layout-mode\", resolveLayoutMode());\n\t\t\t\t(\n\t\t\t\t\telement as HTMLElement & { speedOptions?: NormalizedTTSSpeedOption[] }\n\t\t\t\t).speedOptions = resolveElementSpeedOptions();\n\t\t\t(\n\t\t\t\telement as HTMLElement & { showSingleSpeedOption?: boolean }\n\t\t\t).showSingleSpeedOption =\n\t\t\t\tresolveRuntimeSettings().showSingleSpeedOption === true;\n\t\t\t},\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-discovery.js","sourceRoot":"","sources":["../../src/tools/response-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Response Discovery Service\n * Finds and manages PIE response components for tool-to-response integration\n *\n * Enables tools (e.g., calculator) to insert content into response fields\n * Based on capability-based interface pattern (inspired by VS Code extension API)\n */\n\nimport type {\n\tContentFormat,\n\tPIEResponseComponent,\n\tResponseDiscoveryService,\n} from \"./types.js\";\n\nexport class ResponseDiscoveryServiceImpl implements ResponseDiscoveryService {\n\tprivate responses = new Map<string, PIEResponseComponent>();\n\tprivate activeResponseId: string | null = null;\n\tprivate activeResponseListeners: Array<\n\t\t(response: PIEResponseComponent | null) => void\n\t> = [];\n\n\t/**\n\t * Get currently active (focused) response component\n\t */\n\tgetActiveResponse(): PIEResponseComponent | null {\n\t\tif (!this.activeResponseId) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.responses.get(this.activeResponseId) || null;\n\t}\n\n\t/**\n\t * Get response by ID\n\t */\n\tgetResponse(responseId: string): PIEResponseComponent | null {\n\t\treturn this.responses.get(responseId) || null;\n\t}\n\n\t/**\n\t * Get all registered responses\n\t */\n\tgetAllResponses(): PIEResponseComponent[] {\n\t\treturn Array.from(this.responses.values());\n\t}\n\n\t/**\n\t * Get responses that accept a specific content format\n\t */\n\tgetResponsesAccepting(format: ContentFormat): PIEResponseComponent[] {\n\t\treturn this.getAllResponses().filter((response) => {\n\t\t\tconst capabilities = response.getCapabilities();\n\t\t\treturn capabilities.supportedFormats.includes(format);\n\t\t});\n\t}\n\n\t/**\n\t * Register a response component\n\t */\n\tregisterResponse(response: PIEResponseComponent): void {\n\t\tthis.responses.set(response.responseId, response);\n\t\tconsole.log(\n\t\t\t`[ResponseDiscovery] Registered response: ${response.responseId}`,\n\t\t);\n\n\t\t// If this is the first response and no active response, set it as active\n\t\tif (!this.activeResponseId && this.responses.size === 1) {\n\t\t\tthis.setActiveResponse(response.responseId);\n\t\t}\n\t}\n\n\t/**\n\t * Unregister a response component\n\t */\n\tunregisterResponse(responseId: string): void {\n\t\tthis.responses.delete(responseId);\n\t\tconsole.log(`[ResponseDiscovery] Unregistered response: ${responseId}`);\n\n\t\t// If active response was removed, clear it\n\t\tif (this.activeResponseId === responseId) {\n\t\t\tthis.setActiveResponse(null);\n\t\t}\n\t}\n\n\t/**\n\t * Explicitly signal that a registered response is active.\n\t */\n\tsignalActive(responseId: string): void {\n\t\tif (!this.responses.has(responseId)) {\n\t\t\tconsole.warn(\n\t\t\t\t`[ResponseDiscovery] Cannot mark active: unknown response ${responseId}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tthis.setActiveResponse(responseId);\n\t}\n\n\t/**\n\t * Explicitly signal that a response is no longer active.\n\t */\n\tsignalInactive(responseId: string): void {\n\t\tif (this.activeResponseId !== responseId) return;\n\t\tthis.setActiveResponse(null);\n\t}\n\n\t/**\n\t * Set active response (internal use)\n\t */\n\tprivate setActiveResponse(responseId: string | null): void {\n\t\tif (this.activeResponseId === responseId) return;\n\n\t\tthis.activeResponseId = responseId;\n\t\tconst response = responseId ? this.getResponse(responseId) : null;\n\n\t\t// Notify listeners\n\t\tfor (const listener of this.activeResponseListeners) {\n\t\t\tlistener(response);\n\t\t}\n\t}\n\n\t/**\n\t * Listen for active response changes\n\t */\n\tonActiveResponseChanged(\n\t\tlistener: (response: PIEResponseComponent | null) => void,\n\t): void {\n\t\tthis.activeResponseListeners.push(listener);\n\t}\n\n\t/**\n\t * Clear all responses (for cleanup)\n\t */\n\tclear(): void {\n\t\tthis.responses.clear();\n\t\tthis.activeResponseId = null;\n\t\tthis.activeResponseListeners = [];\n\t}\n}\n\n/**\n * Singleton instance\n */\nexport const responseDiscovery = new ResponseDiscoveryServiceImpl();\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-tag-map.js","sourceRoot":"","sources":["../../src/tools/tool-tag-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAqBzF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC/C,UAAU,EAAE,qBAAqB;IACjC,YAAY,EAAE,yBAAyB;IACvC,KAAK,EAAE,gBAAgB;IACvB,UAAU,EAAE,qBAAqB;IACjC,gBAAgB,EAAE,4BAA4B;IAC9C,WAAW,EAAE,6BAA6B;IAC1C,UAAU,EAAE,sBAAsB;IAClC,KAAK,EAAE,gBAAgB;IACvB,iBAAiB,EAAE,6BAA6B;IAChD,KAAK,EAAE,gBAAgB;IACvB,aAAa,EAAE,yBAAyB;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,MAAc,EACd,SAAkC,EACzB,EAAE;IACX,MAAM,MAAM,GACX,SAAS,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAC3E,OAAO,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,MAAM,GAAG,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,OAAe,EAAe,EAAE,CACjE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAChC,MAAc,EACd,OAAoB,EACpB,cAA8B,EAC9B,SAAkC,EACpB,EAAE;IAChB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,SAAS,EAAE,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,cAAc,IAAI,SAAS,EAAE,oBAAoB,CAAC;IAClE,OAAO,OAAO;QACb,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACvD,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,OAAe,EACf,SAAkC,EACb,EAAE;IACvB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,CAAC;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC","sourcesContent":["import { validateCustomElementTag } from \"@pie-players/pie-players-shared/pie/tag-names\";\nimport type { ToolContext } from \"../services/tool-context.js\";\nimport type { ToolbarContext } from \"../services/ToolRegistry.js\";\n\nexport type ToolTagMap = Record<string, string>;\n\nexport type ToolComponentFactory = (args: {\n\ttoolId: string;\n\ttagName: string;\n\tcontext: ToolContext;\n\ttoolbarContext: ToolbarContext;\n}) => HTMLElement;\n\nexport type ToolComponentFactoryMap = Record<string, ToolComponentFactory>;\n\nexport interface ToolComponentOverrides {\n\ttoolTagMap?: Partial<ToolTagMap>;\n\ttoolComponentFactory?: ToolComponentFactory;\n\ttoolComponentFactories?: Partial<ToolComponentFactoryMap>;\n}\n\n/**\n * Canonical default web component tag mapping for toolkit tools.\n * Integrators can override any entry via ToolComponentOverrides.\n */\nexport const DEFAULT_TOOL_TAG_MAP: ToolTagMap = {\n\tcalculator: \"pie-tool-calculator\",\n\ttextToSpeech: \"pie-tool-text-to-speech\",\n\truler: \"pie-tool-ruler\",\n\tprotractor: \"pie-tool-protractor\",\n\tanswerEliminator: \"pie-tool-answer-eliminator\",\n\thighlighter: \"pie-tool-annotation-toolbar\",\n\tlineReader: \"pie-tool-line-reader\",\n\ttheme: \"pie-tool-theme\",\n\tannotationToolbar: \"pie-tool-annotation-toolbar\",\n\tgraph: \"pie-tool-graph\",\n\tperiodicTable: \"pie-tool-periodic-table\",\n};\n\nexport const resolveToolTag = (\n\ttoolId: string,\n\toverrides?: ToolComponentOverrides,\n): string => {\n\tconst mapped =\n\t\toverrides?.toolTagMap?.[toolId] ?? DEFAULT_TOOL_TAG_MAP[toolId] ?? toolId;\n\treturn validateCustomElementTag(mapped, `tool component tag for \"${toolId}\"`);\n};\n\nconst createDefaultToolElement = (tagName: string): HTMLElement =>\n\tdocument.createElement(tagName);\n\nexport const createToolElement = (\n\ttoolId: string,\n\tcontext: ToolContext,\n\ttoolbarContext: ToolbarContext,\n\toverrides?: ToolComponentOverrides,\n): HTMLElement => {\n\tconst tagName = resolveToolTag(toolId, overrides);\n\tconst factoryForTool = overrides?.toolComponentFactories?.[toolId];\n\tconst factory = factoryForTool ?? overrides?.toolComponentFactory;\n\treturn factory\n\t\t? factory({ toolId, tagName, context, toolbarContext })\n\t\t: createDefaultToolElement(tagName);\n};\n\nexport const toToolIdFromTag = (\n\ttagName: string,\n\toverrides?: ToolComponentOverrides,\n): string | undefined => {\n\tconst validTag = validateCustomElementTag(tagName, \"tool component tag\");\n\tconst map = { ...DEFAULT_TOOL_TAG_MAP, ...overrides?.toolTagMap };\n\treturn Object.entries(map).find(([, tag]) => tag === validTag)?.[0];\n};\n"]}
|
package/dist/tools/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyPH;;GAEG;AACH,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACvB,yCAAyB,CAAA;IACzB,2DAA2C,CAAA;IAC3C,uDAAuC,CAAA;AACxC,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB","sourcesContent":["/**\n * Tool system type definitions\n */\n\n// Re-export calculator types from @pie-players/pie-calculator\nexport type {\n\tCalculationHistoryEntry,\n\tCalculator,\n\tCalculatorProvider,\n\tCalculatorProviderCapabilities,\n\tCalculatorProviderConfig,\n\tCalculatorState,\n\tCalculatorType,\n\tDesmosCalculatorConfig,\n} from \"@pie-players/pie-calculator\";\n\nexport type ToolId = string;\n\nexport interface ToolState {\n\tid: ToolId;\n\tname: string;\n\tisVisible: boolean;\n\tisActive: boolean;\n\tzIndex: number;\n\telement?: HTMLElement;\n}\n\nexport interface ToolPosition {\n\tx: number;\n\ty: number;\n}\n\nexport interface ToolSize {\n\twidth: number;\n\theight: number;\n}\n\nexport interface ToolConfig {\n\tid: ToolId;\n\tname: string;\n\ticon?: string;\n\tenabled: boolean;\n\talwaysAvailable?: boolean; // If true, available regardless of assessment config\n}\n\nexport interface AssessmentToolConfig {\n\tenabledTools: ToolId[];\n\ttoolSettings?: Record<ToolId, any>;\n}\n\n// ===== ARCHITECTURAL ENHANCEMENTS =====\n\n/**\n * Tool allowance: \"0\" = blocked, \"1\" = allowed\n * Based on existing platform patterns\n */\nexport type ToolAllowance = \"0\" | \"1\";\n\n/**\n * Roster/Test-level tool configuration\n * Defines default tool availability for an assessment\n */\nexport interface RosterToolConfiguration {\n\trosterId: string;\n\ttestId?: string;\n\ttoolAllowances: Record<string, ToolAllowance>;\n\tdefaultToolConfigs?: Record<string, ToolConfig>;\n}\n\n/**\n * Configuration source for tool resolution\n */\nexport type ConfigurationSource =\n\t| \"roster-block\"\n\t| \"item-restriction\"\n\t| \"item-requirement\"\n\t| \"student-accommodation\"\n\t| \"roster-default\"\n\t| \"system-default\";\n\n/**\n * Resolved tool configuration with source tracking\n */\nexport interface ResolvedToolConfig extends ToolConfig {\n\tresolvedFrom: ConfigurationSource;\n\trequired: boolean;\n\treason: string;\n}\n\n/**\n * Tool resolution result\n */\nexport interface ToolResolutionResult {\n\tallowed: boolean;\n\treason: string;\n\tsource: ConfigurationSource;\n\tconfig?: ToolConfig;\n}\n\n/**\n * Item-level tool configuration\n */\nexport interface ItemToolConfig {\n\titemId: string;\n\trequiredTools?: string[];\n\trestrictedTools?: string[];\n\ttoolParameters?: Record<string, ItemToolParameters>;\n\tvariantConfig?: ItemVariantConfig;\n}\n\n/**\n * Item tool parameters\n */\nexport interface ItemToolParameters {\n\tconfig?: Partial<ToolConfig>;\n\thint?: string;\n\tpreOpen?: boolean;\n\tvariants?: Record<string, ItemToolParametersVariant>;\n}\n\n/**\n * Item tool parameters variant\n */\nexport interface ItemToolParametersVariant {\n\tconfig?: Partial<ToolConfig>;\n\thint?: string;\n\tpreOpen?: boolean;\n}\n\n/**\n * Item variant configuration for A/B testing and scaffolding\n */\nexport interface ItemVariantConfig {\n\tvariantId?: string;\n\ttoolOverrides?: Record<string, ItemToolOverride>;\n\tadaptations?: ContentAdaptation[];\n\texperimental?: Record<string, any>;\n}\n\n/**\n * Tool override for item variants\n */\nexport interface ItemToolOverride {\n\tconfig?: Partial<ToolConfig>;\n\tuiVariant?: string;\n\tparameters?: Record<string, any>;\n\treplacementTool?: string;\n}\n\n/**\n * Content adaptation types\n */\nexport interface ContentAdaptation {\n\ttype: \"scaffolding\" | \"difficulty\" | \"language\" | \"modality\" | \"custom\";\n\tlevel: string | number;\n\taffectedTools?: string[];\n\tconfig?: Record<string, any>;\n}\n\n/**\n * Variant context for resolution\n */\nexport interface VariantContext {\n\tstudentId: string;\n\tsessionId: string;\n\tlanguage?: string;\n\tscaffoldingLevel?: number;\n\tdifficultyLevel?: string;\n\tcustom?: Record<string, any>;\n}\n\n/**\n * Resolved item configuration with variants applied\n */\nexport interface ResolvedItemConfig {\n\titemId: string;\n\trequiredTools: string[];\n\trestrictedTools: string[];\n\ttoolParameters: Record<string, ResolvedItemToolParameters>;\n\tappliedVariant?: string;\n\tappliedAdaptations?: ContentAdaptation[];\n}\n\n/**\n * Resolved item tool parameters\n */\nexport interface ResolvedItemToolParameters extends ItemToolParameters {\n\tfinalConfig: ToolConfig;\n}\n\n/**\n * Library configuration for external dependencies\n */\nexport interface LibraryConfig {\n\tid: string;\n\turl: string;\n\tfallbackUrls?: string[];\n\tglobalVar?: string;\n\tdependencies?: string[];\n\tintegrity?: string;\n\tcrossorigin?: \"anonymous\" | \"use-credentials\";\n\ttimeout?: number;\n\tasync?: boolean;\n\tdefer?: boolean;\n\tretry?: RetryConfig;\n}\n\n/**\n * Retry configuration for library loading\n */\nexport interface RetryConfig {\n\tmaxAttempts: number;\n\tdelay: number;\n\tbackoffMultiplier?: number;\n}\n\n/**\n * Library loader statistics\n */\nexport interface LoaderStats {\n\tloaded: string[];\n\tfailed: string[];\n\tpending: string[];\n\tcacheHits: number;\n\tcacheMisses: number;\n\ttotalLoadTime: number;\n}\n\n/**\n * Base interface that all tool components should implement\n */\nexport interface Tool {\n\t/** Unique identifier for this tool */\n\tid: ToolId;\n\n\t/** Display name */\n\tname: string;\n\n\t/** Show the tool */\n\tshow(): void;\n\n\t/** Hide the tool */\n\thide(): void;\n\n\t/** Toggle visibility */\n\ttoggle(): void;\n\n\t/** Cleanup when tool is destroyed */\n\tdestroy?(): void;\n}\n\n/**\n * Tool categories for organizational purposes\n */\nexport enum ToolCategory {\n\tSTANDALONE = \"standalone\",\n\tCONTENT_INTERACTIVE = \"content-interactive\",\n\tSERVICE_DEPENDENT = \"service-dependent\",\n}\n\n/**\n * Tool metadata\n */\nexport interface ToolMetadata {\n\tid: ToolId;\n\tname: string;\n\tdescription: string;\n\tcategory: ToolCategory;\n\ticon?: string;\n\tdependencies?: string[];\n}\n\n// ===== SERVICE INTERFACES (Architectural Enhancements) =====\n\n/**\n * Accommodation Resolver Service\n * Resolves final tool configuration by merging roster, student, and item configs\n * Precedence: Roster block > Item restriction > Item requirement > Student accommodation > Roster default\n */\nexport interface AccommodationResolver {\n\t/**\n\t * Resolve final tools for an item given all configuration sources\n\t */\n\tresolveToolsForItem(\n\t\tstudent: AccommodationProfile,\n\t\troster: RosterToolConfiguration,\n\t\titem: ItemToolConfig,\n\t): ResolvedToolConfig[];\n\n\t/**\n\t * Check if a specific tool is allowed\n\t */\n\tisToolAllowed(\n\t\ttoolType: string,\n\t\tstudent: AccommodationProfile,\n\t\troster: RosterToolConfiguration,\n\t\titem: ItemToolConfig,\n\t): ToolResolutionResult;\n\n\t/**\n\t * Get resolution trace for debugging\n\t */\n\tgetResolutionTrace(\n\t\ttoolType: string,\n\t\tstudent: AccommodationProfile,\n\t\troster: RosterToolConfiguration,\n\t\titem: ItemToolConfig,\n\t): ResolutionTrace;\n}\n\n/**\n * Accommodation profile (student-level tool permissions)\n */\nexport interface AccommodationProfile {\n\tstudentId: string;\n\ttestId?: string;\n\trosterId?: string;\n\taccommodations: Record<string, boolean>;\n}\n\n/**\n * Resolution trace for debugging\n */\nexport interface ResolutionTrace {\n\ttoolType: string;\n\tsteps: ResolutionStep[];\n\tfinalDecision: ToolResolutionResult;\n}\n\n/**\n * Resolution step in trace\n */\nexport interface ResolutionStep {\n\tsource: ConfigurationSource;\n\tdecision: \"allow\" | \"block\" | \"require\" | \"skip\";\n\treason: string;\n\tconfig?: Partial<ToolConfig>;\n}\n\n/**\n * Variant Resolver Service\n * Resolves item configuration considering variants\n */\nexport interface VariantResolver {\n\t/**\n\t * Resolve variant configuration for an item\n\t */\n\tresolveVariant(\n\t\titemConfig: ItemToolConfig,\n\t\tcontext: VariantContext,\n\t): ResolvedItemConfig;\n}\n\n/**\n * Library Loader Service\n * Dynamically loads external libraries with retry and fallback support\n */\nexport interface LibraryLoader {\n\t/**\n\t * Load a JavaScript library\n\t */\n\tloadScript(library: LibraryConfig): Promise<void>;\n\n\t/**\n\t * Load a stylesheet\n\t */\n\tloadStylesheet(\n\t\turl: string,\n\t\ttargetRoot?: Document | ShadowRoot,\n\t): Promise<void>;\n\n\t/**\n\t * Check if a library is already loaded\n\t */\n\tisLoaded(libraryId: string): boolean;\n\n\t/**\n\t * Preload multiple libraries in parallel\n\t */\n\tpreload(libraries: LibraryConfig[]): Promise<void>;\n\n\t/**\n\t * Unload a library (remove script tag)\n\t */\n\tunload(libraryId: string): void;\n\n\t/**\n\t * Get loader statistics\n\t */\n\tgetStats(): LoaderStats;\n}\n\n// Calculator types now exported from @pie-players/pie-calculator (see top of file)\n\n/**\n * PIE Response Component Interface\n * For tool-to-response integration (e.g., calculator inserting into text field)\n */\nexport interface PIEResponseComponent {\n\treadonly responseId: string;\n\treadonly responseType: PIEResponseType;\n\n\tgetCapabilities(): ResponseCapabilities;\n\tcanAccept(content: string, format: ContentFormat): boolean;\n\tinsertContent(\n\t\tcontent: string,\n\t\toptions: InsertionOptions,\n\t): Promise<InsertionResult>;\n\tgetContent(format?: ContentFormat): string;\n\tgetCursorPosition(): number | null;\n\tsetCursorPosition(position: number): void;\n\tfocus(): void;\n\tisFocused(): boolean;\n\tvalidate(content: string, format: ContentFormat): ValidationResult;\n}\n\n/**\n * PIE response types\n */\nexport type PIEResponseType =\n\t| \"text-entry\"\n\t| \"extended-text-entry\"\n\t| \"math-inline\"\n\t| \"math-block\"\n\t| \"numeric\"\n\t| \"multiple-choice\"\n\t| \"custom\";\n\n/**\n * Response capabilities\n */\nexport interface ResponseCapabilities {\n\tacceptsPlainText?: boolean;\n\tacceptsLatex?: boolean;\n\tacceptsNumeric?: boolean;\n\tacceptsHtml?: boolean;\n\tacceptsFormattedText?: boolean;\n\tsupportedFormats: ContentFormat[];\n\tsupportsReplacement?: boolean;\n\tsupportsInsertion?: boolean;\n\tsupportsAppend?: boolean;\n\tmaxLength?: number;\n\tallowedCharacters?: string;\n}\n\n/**\n * Content formats\n */\nexport type ContentFormat =\n\t| \"plain-text\"\n\t| \"latex\"\n\t| \"mathml\"\n\t| \"numeric\"\n\t| \"html\"\n\t| \"markdown\"\n\t| \"formatted-text\";\n\n/**\n * Insertion options for response content\n */\nexport interface InsertionOptions {\n\tmode: \"replace\" | \"insert\" | \"append\";\n\tformat: ContentFormat;\n\tposition?: number;\n\tselect?: boolean;\n\tfocus?: boolean;\n\tsource?: {\n\t\ttoolId: string;\n\t\ttoolType: string;\n\t\ttimestamp: number;\n\t};\n}\n\n/**\n * Insertion result\n */\nexport interface InsertionResult {\n\tsuccess: boolean;\n\terror?: string;\n\tinsertedLength?: number;\n\tfinalCursorPosition?: number;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n\tvalid: boolean;\n\terrors?: ValidationError[];\n\twarnings?: string[];\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n\tcode: string;\n\tmessage: string;\n\tposition?: number;\n}\n\n/**\n * Response Discovery Service\n * Finds and manages PIE response components for tool integration\n */\nexport interface ResponseDiscoveryService {\n\tgetActiveResponse(): PIEResponseComponent | null;\n\tgetResponse(responseId: string): PIEResponseComponent | null;\n\tgetAllResponses(): PIEResponseComponent[];\n\tgetResponsesAccepting(format: ContentFormat): PIEResponseComponent[];\n\tregisterResponse(response: PIEResponseComponent): void;\n\tunregisterResponse(responseId: string): void;\n\tsignalActive(responseId: string): void;\n\tsignalInactive(responseId: string): void;\n\tonActiveResponseChanged(\n\t\tlistener: (response: PIEResponseComponent | null) => void,\n\t): void;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"variant-resolver.js","sourceRoot":"","sources":["../../src/tools/variant-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Variant Resolver Service\n * Resolves item configuration considering variants for A/B testing, scaffolding, and adaptations\n *\n * Based on architectural enhancements for item-level variant configuration\n */\n\nimport type {\n\tItemToolConfig,\n\tItemToolParameters,\n\tResolvedItemConfig,\n\tResolvedItemToolParameters,\n\tToolConfig,\n\tVariantContext,\n\tVariantResolver,\n} from \"./types.js\";\n\nexport class VariantResolverImpl implements VariantResolver {\n\t/**\n\t * Resolve variant configuration for an item\n\t */\n\tresolveVariant(\n\t\titemConfig: ItemToolConfig,\n\t\tcontext: VariantContext,\n\t): ResolvedItemConfig {\n\t\t// If no variant config, return item as-is\n\t\tif (!itemConfig.variantConfig) {\n\t\t\treturn this._buildResolvedConfig(itemConfig, null, []);\n\t\t}\n\n\t\tconst { variantConfig } = itemConfig;\n\t\tconst { variantId, toolOverrides, adaptations } = variantConfig;\n\n\t\t// Apply tool overrides if variant specified\n\t\tconst resolvedToolParameters: Record<string, ResolvedItemToolParameters> =\n\t\t\t{};\n\n\t\tif (itemConfig.toolParameters) {\n\t\t\tfor (const [toolType, params] of Object.entries(\n\t\t\t\titemConfig.toolParameters,\n\t\t\t)) {\n\t\t\t\tresolvedToolParameters[toolType] = this._resolveToolParameters(\n\t\t\t\t\ttoolType,\n\t\t\t\t\tparams,\n\t\t\t\t\ttoolOverrides,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Apply tool overrides that aren't in original tool parameters\n\t\tif (toolOverrides) {\n\t\t\tfor (const [toolType, override] of Object.entries(toolOverrides)) {\n\t\t\t\tif (!resolvedToolParameters[toolType]) {\n\t\t\t\t\tresolvedToolParameters[toolType] =\n\t\t\t\t\t\tthis._createToolParametersFromOverride(toolType, override);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build final resolved config\n\t\treturn {\n\t\t\titemId: itemConfig.itemId,\n\t\t\trequiredTools: this._resolveRequiredTools(itemConfig, toolOverrides),\n\t\t\trestrictedTools: itemConfig.restrictedTools || [],\n\t\t\ttoolParameters: resolvedToolParameters,\n\t\t\tappliedVariant: variantId,\n\t\t\tappliedAdaptations: this._filterAdaptations(adaptations, context),\n\t\t};\n\t}\n\n\t/**\n\t * Resolve tool parameters considering variant and context\n\t */\n\tprivate _resolveToolParameters(\n\t\ttoolType: string,\n\t\tparams: ItemToolParameters,\n\t\ttoolOverrides: Record<string, any> | undefined,\n\t\tcontext: VariantContext,\n\t): ResolvedItemToolParameters {\n\t\t// Start with base parameters\n\t\tlet finalConfig: Partial<ToolConfig> = params.config || {};\n\t\tlet finalHint = params.hint;\n\t\tlet finalPreOpen = params.preOpen;\n\n\t\t// Apply variant-specific parameters if they exist\n\t\tif (params.variants) {\n\t\t\tconst variantParams = this._selectVariantParameters(\n\t\t\t\tparams.variants,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tif (variantParams) {\n\t\t\t\tfinalConfig = { ...finalConfig, ...variantParams.config };\n\t\t\t\tif (variantParams.hint !== undefined) finalHint = variantParams.hint;\n\t\t\t\tif (variantParams.preOpen !== undefined)\n\t\t\t\t\tfinalPreOpen = variantParams.preOpen;\n\t\t\t}\n\t\t}\n\n\t\t// Apply tool override from variant config\n\t\tif (toolOverrides && toolOverrides[toolType]) {\n\t\t\tconst override = toolOverrides[toolType];\n\t\t\tif (override.config) {\n\t\t\t\tfinalConfig = { ...finalConfig, ...override.config };\n\t\t\t}\n\t\t\tif (override.parameters) {\n\t\t\t\t// Merge additional parameters\n\t\t\t\tfinalConfig = { ...finalConfig, ...override.parameters };\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tconfig: params.config,\n\t\t\thint: finalHint,\n\t\t\tpreOpen: finalPreOpen,\n\t\t\tvariants: params.variants,\n\t\t\tfinalConfig: finalConfig as ToolConfig,\n\t\t};\n\t}\n\n\t/**\n\t * Select variant parameters based on context\n\t */\n\tprivate _selectVariantParameters(\n\t\tvariants: Record<string, any>,\n\t\tcontext: VariantContext,\n\t): any | null {\n\t\t// Strategy: Select based on context properties\n\n\t\t// 1. Check for scaffolding level match\n\t\tif (context.scaffoldingLevel !== undefined) {\n\t\t\tconst scaffoldKey = `scaffolding-${context.scaffoldingLevel}`;\n\t\t\tif (variants[scaffoldKey]) return variants[scaffoldKey];\n\t\t}\n\n\t\t// 2. Check for difficulty level match\n\t\tif (context.difficultyLevel) {\n\t\t\tconst difficultyKey = `difficulty-${context.difficultyLevel}`;\n\t\t\tif (variants[difficultyKey]) return variants[difficultyKey];\n\t\t}\n\n\t\t// 3. Check for language match\n\t\tif (context.language) {\n\t\t\tconst langKey = `lang-${context.language}`;\n\t\t\tif (variants[langKey]) return variants[langKey];\n\t\t}\n\n\t\t// 4. Check custom context keys\n\t\tif (context.custom) {\n\t\t\tfor (const [key, value] of Object.entries(context.custom)) {\n\t\t\t\tconst customKey = `${key}-${value}`;\n\t\t\t\tif (variants[customKey]) return variants[customKey];\n\t\t\t}\n\t\t}\n\n\t\t// 5. Check for default variant\n\t\tif (variants.default) return variants.default;\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Create tool parameters from override\n\t */\n\tprivate _createToolParametersFromOverride(\n\t\ttoolType: string,\n\t\toverride: any,\n\t): ResolvedItemToolParameters {\n\t\treturn {\n\t\t\tconfig: override.config,\n\t\t\thint: override.hint,\n\t\t\tpreOpen: override.preOpen,\n\t\t\tfinalConfig: {\n\t\t\t\tid: toolType,\n\t\t\t\tname: this._humanizeName(toolType),\n\t\t\t\tenabled: true,\n\t\t\t\t...override.config,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Resolve required tools considering overrides\n\t */\n\tprivate _resolveRequiredTools(\n\t\titemConfig: ItemToolConfig,\n\t\ttoolOverrides: Record<string, any> | undefined,\n\t): string[] {\n\t\tconst required = new Set<string>(itemConfig.requiredTools || []);\n\n\t\t// Add tools that have replacements via overrides\n\t\tif (toolOverrides) {\n\t\t\tfor (const [toolType, override] of Object.entries(toolOverrides)) {\n\t\t\t\tif (override.replacementTool) {\n\t\t\t\t\trequired.delete(toolType);\n\t\t\t\t\trequired.add(override.replacementTool);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(required);\n\t}\n\n\t/**\n\t * Filter adaptations based on context\n\t */\n\tprivate _filterAdaptations(\n\t\tadaptations: any[] | undefined,\n\t\tcontext: VariantContext,\n\t): any[] {\n\t\tif (!adaptations) return [];\n\n\t\treturn adaptations.filter((adaptation) => {\n\t\t\t// Check if adaptation matches context\n\t\t\tif (\n\t\t\t\tadaptation.type === \"scaffolding\" &&\n\t\t\t\tcontext.scaffoldingLevel !== undefined\n\t\t\t) {\n\t\t\t\treturn adaptation.level === context.scaffoldingLevel;\n\t\t\t}\n\n\t\t\tif (adaptation.type === \"difficulty\" && context.difficultyLevel) {\n\t\t\t\treturn adaptation.level === context.difficultyLevel;\n\t\t\t}\n\n\t\t\tif (adaptation.type === \"language\" && context.language) {\n\t\t\t\treturn adaptation.level === context.language;\n\t\t\t}\n\n\t\t\t// Include custom adaptations by default\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Build resolved config without variants\n\t */\n\tprivate _buildResolvedConfig(\n\t\titemConfig: ItemToolConfig,\n\t\tvariantId: string | null,\n\t\tadaptations: any[],\n\t): ResolvedItemConfig {\n\t\tconst resolvedToolParameters: Record<string, ResolvedItemToolParameters> =\n\t\t\t{};\n\n\t\tif (itemConfig.toolParameters) {\n\t\t\tfor (const [toolType, params] of Object.entries(\n\t\t\t\titemConfig.toolParameters,\n\t\t\t)) {\n\t\t\t\tresolvedToolParameters[toolType] = {\n\t\t\t\t\t...params,\n\t\t\t\t\tfinalConfig: {\n\t\t\t\t\t\tid: toolType,\n\t\t\t\t\t\tname: this._humanizeName(toolType),\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\t...params.config,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\titemId: itemConfig.itemId,\n\t\t\trequiredTools: itemConfig.requiredTools || [],\n\t\t\trestrictedTools: itemConfig.restrictedTools || [],\n\t\t\ttoolParameters: resolvedToolParameters,\n\t\t\tappliedVariant: variantId || undefined,\n\t\t\tappliedAdaptations: adaptations,\n\t\t};\n\t}\n\n\t/**\n\t * Convert tool type to human-readable name\n\t */\n\tprivate _humanizeName(toolType: string): string {\n\t\treturn toolType\n\t\t\t.replace(/[-_]/g, \" \")\n\t\t\t.replace(/\\b\\w/g, (char) => char.toUpperCase());\n\t}\n}\n"]}
|
package/dist/utils/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC7C,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QAClB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC;AACH,CAAC","sourcesContent":["export type Logger = (...args: unknown[]) => void;\n\n/**\n * Minimal logger helper (replacement for PIEOneer’s internal debug logger).\n * We intentionally keep this lightweight and browser-safe.\n */\nexport function createLogger(namespace: string): Logger {\n\treturn (...args) => {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.debug(`[${namespace}]`, ...args);\n\t};\n}\n"]}
|