@pie-players/pie-assessment-toolkit 0.3.51 → 0.3.53

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.
@@ -21066,27 +21066,27 @@ class HighlightCoordinator {
21066
21066
 
21067
21067
  /* Annotation highlights - persistent */
21068
21068
  ::highlight(annotation-yellow) {
21069
- background-color: color-mix(in srgb, var(--pie-missing, #ffff00) 35%, transparent);
21069
+ background-color: var(--pie-annotation-yellow-highlight, rgba(253, 233, 149, 0.5));
21070
21070
  color: inherit;
21071
21071
  }
21072
21072
 
21073
21073
  ::highlight(annotation-green) {
21074
- background-color: color-mix(in srgb, var(--pie-correct, #90ee90) 35%, transparent);
21074
+ background-color: var(--pie-annotation-green-highlight, rgba(166, 225, 197, 0.5));
21075
21075
  color: inherit;
21076
21076
  }
21077
21077
 
21078
21078
  ::highlight(annotation-blue) {
21079
- background-color: color-mix(in srgb, var(--pie-tertiary, #add8e6) 35%, transparent);
21079
+ background-color: var(--pie-annotation-blue-highlight, rgba(167, 224, 246, 0.5));
21080
21080
  color: inherit;
21081
21081
  }
21082
21082
 
21083
21083
  ::highlight(annotation-pink) {
21084
- background-color: color-mix(in srgb, var(--pie-secondary-light, #ffb6c1) 35%, transparent);
21084
+ background-color: var(--pie-annotation-pink-highlight, rgba(255, 159, 174, 0.5));
21085
21085
  color: inherit;
21086
21086
  }
21087
21087
 
21088
21088
  ::highlight(annotation-orange) {
21089
- background-color: color-mix(in srgb, var(--pie-incorrect, #ffa500) 35%, transparent);
21089
+ background-color: var(--pie-annotation-orange-highlight, rgba(255, 165, 0, 0.5));
21090
21090
  color: inherit;
21091
21091
  }
21092
21092
 
@@ -21129,6 +21129,16 @@ class HighlightCoordinator {
21129
21129
  }
21130
21130
  this.highlightTTSElementFallbacks(ranges);
21131
21131
  }
21132
+ highlightTTSSentenceElements(elements) {
21133
+ if (!this.ttsSentenceHighlight)
21134
+ return;
21135
+ this.applyAdaptiveTTSStyle(elements[0] || null);
21136
+ this.clearTTSSentence();
21137
+ for (const element2 of elements) {
21138
+ element2.setAttribute("data-pie-tts-sentence-element", "true");
21139
+ this.ttsSentenceElementHighlights.add(element2);
21140
+ }
21141
+ }
21132
21142
  static SENTENCE_FALLBACK_SELECTOR = "math, mjx-container, svg, img, canvas, [role='img']";
21133
21143
  static WORD_FALLBACK_SELECTOR = "svg, img, canvas, [role='img']";
21134
21144
  highlightTTSElementFallbacks(ranges) {
@@ -23888,6 +23898,7 @@ class TTSService {
23888
23898
  currentProvider = null;
23889
23899
  provider = null;
23890
23900
  highlightCoordinator = null;
23901
+ highlightTargetResolverProvider = null;
23891
23902
  catalogResolver = null;
23892
23903
  state = PlaybackState.IDLE;
23893
23904
  ttsConfig = {};
@@ -23900,6 +23911,7 @@ class TTSService {
23900
23911
  currentBoundaryOffset = 0;
23901
23912
  activeWordBoundaryOffset = 0;
23902
23913
  seekSegments = [];
23914
+ playbackChunks = [];
23903
23915
  sentenceHighlightSegments = [];
23904
23916
  currentSeekSegmentIndex = 0;
23905
23917
  activeSentenceStartOffset = null;
@@ -23978,9 +23990,137 @@ class TTSService {
23978
23990
  setHighlightCoordinator(coordinator) {
23979
23991
  this.highlightCoordinator = coordinator;
23980
23992
  }
23993
+ setHighlightTargetResolverProvider(provider) {
23994
+ this.highlightTargetResolverProvider = provider;
23995
+ return () => {
23996
+ if (this.highlightTargetResolverProvider === provider) {
23997
+ this.highlightTargetResolverProvider = null;
23998
+ }
23999
+ };
24000
+ }
23981
24001
  setCatalogResolver(resolver) {
23982
24002
  this.catalogResolver = resolver;
23983
24003
  }
24004
+ getHighlightResolverRuntime() {
24005
+ let provided = null;
24006
+ try {
24007
+ provided = this.highlightTargetResolverProvider?.() ?? null;
24008
+ } catch {
24009
+ provided = null;
24010
+ }
24011
+ const providedContext = provided?.context ?? {};
24012
+ const fallbackScope = typeof HTMLElement !== "undefined" && this.currentContentElement instanceof HTMLElement ? this.currentContentElement : null;
24013
+ return {
24014
+ context: {
24015
+ ...providedContext,
24016
+ scopeElement: providedContext.scopeElement ?? fallbackScope
24017
+ },
24018
+ resolver: provided?.resolver ?? null
24019
+ };
24020
+ }
24021
+ getNodeElement(node) {
24022
+ if (!node)
24023
+ return null;
24024
+ return node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
24025
+ }
24026
+ isElementWithinScope(element2, scope) {
24027
+ if (!scope)
24028
+ return true;
24029
+ return element2 === scope || scope.contains(element2);
24030
+ }
24031
+ isRangeWithinScope(range, scope) {
24032
+ const startElement = this.getNodeElement(range.startContainer);
24033
+ const endElement = this.getNodeElement(range.endContainer);
24034
+ if (!startElement || !endElement)
24035
+ return false;
24036
+ return this.isElementWithinScope(startElement, scope) && this.isElementWithinScope(endElement, scope);
24037
+ }
24038
+ resolveWordHighlightRange(nativeRange) {
24039
+ const { context, resolver } = this.getHighlightResolverRuntime();
24040
+ const scope = context.scopeElement ?? this.currentContentElement;
24041
+ try {
24042
+ const resolved = resolver?.resolveWordRange?.(nativeRange, context);
24043
+ if (resolved && this.isRangeWithinScope(resolved, scope)) {
24044
+ return { range: resolved, remapped: !sameRange(nativeRange, resolved) };
24045
+ }
24046
+ } catch {}
24047
+ return { range: nativeRange, remapped: false };
24048
+ }
24049
+ resolveSentenceHighlightTargets(nativeRanges) {
24050
+ const { context, resolver } = this.getHighlightResolverRuntime();
24051
+ const scope = context.scopeElement ?? this.currentContentElement;
24052
+ try {
24053
+ const resolved = resolver?.resolveSentenceRanges?.(nativeRanges, context);
24054
+ if (!resolved)
24055
+ return { ranges: nativeRanges, elements: [] };
24056
+ const ranges = [];
24057
+ const elements = [];
24058
+ for (const target of resolved) {
24059
+ if (typeof Range !== "undefined" && target instanceof Range) {
24060
+ if (!this.isRangeWithinScope(target, scope)) {
24061
+ return { ranges: nativeRanges, elements: [] };
24062
+ }
24063
+ ranges.push(target);
24064
+ continue;
24065
+ }
24066
+ if (typeof Element !== "undefined" && target instanceof Element) {
24067
+ if (!this.isElementWithinScope(target, scope)) {
24068
+ return { ranges: nativeRanges, elements: [] };
24069
+ }
24070
+ elements.push(target);
24071
+ continue;
24072
+ }
24073
+ return { ranges: nativeRanges, elements: [] };
24074
+ }
24075
+ return { ranges, elements };
24076
+ } catch {
24077
+ return { ranges: nativeRanges, elements: [] };
24078
+ }
24079
+ }
24080
+ createTextRange(node, startOffset, endOffset) {
24081
+ if (typeof document === "undefined")
24082
+ return null;
24083
+ if (typeof document.createRange !== "function")
24084
+ return null;
24085
+ try {
24086
+ const range = document.createRange();
24087
+ range.setStart(node, startOffset);
24088
+ range.setEnd(node, endOffset);
24089
+ if (range.startContainer !== node || range.endContainer !== node) {
24090
+ return null;
24091
+ }
24092
+ return range;
24093
+ } catch {
24094
+ return null;
24095
+ }
24096
+ }
24097
+ paintTTSWordRange(range) {
24098
+ if (!this.highlightCoordinator)
24099
+ return;
24100
+ try {
24101
+ if (range.startContainer === range.endContainer && range.startContainer.nodeType === Node.TEXT_NODE) {
24102
+ this.highlightCoordinator.highlightTTSWord(range.startContainer, range.startOffset, range.endOffset);
24103
+ return;
24104
+ }
24105
+ } catch {}
24106
+ this.highlightCoordinator.highlightRange(range, HighlightType.TTS_WORD, HighlightColor.YELLOW);
24107
+ }
24108
+ paintTTSSentenceRanges(nativeRanges) {
24109
+ if (!this.highlightCoordinator)
24110
+ return;
24111
+ const { ranges, elements } = this.resolveSentenceHighlightTargets(nativeRanges);
24112
+ if (elements.length > 0 && ranges.length === 0 && this.highlightCoordinator.highlightTTSSentenceElements) {
24113
+ this.highlightCoordinator.highlightTTSSentenceElements(elements);
24114
+ return;
24115
+ }
24116
+ const paintedRanges = [...ranges];
24117
+ for (const element2 of elements) {
24118
+ const elementRange = document.createRange();
24119
+ elementRange.selectNodeContents(element2);
24120
+ paintedRanges.push(elementRange);
24121
+ }
24122
+ this.highlightCoordinator.highlightTTSSentence(paintedRanges);
24123
+ }
23984
24124
  getCapabilities() {
23985
24125
  return this.currentProvider?.getCapabilities() || null;
23986
24126
  }
@@ -24270,6 +24410,20 @@ class TTSService {
24270
24410
  const structuralBoundaries = args.playbackSegments.map((segment) => segment.startOffset).filter((offset) => offset > 0);
24271
24411
  return this.splitSegmentsAtBoundaries(grammaticalSegments, structuralBoundaries, args.contentToSpeak);
24272
24412
  }
24413
+ createSeekSegmentsFromSpeechChunks(chunks) {
24414
+ let offset = 0;
24415
+ return chunks.map((chunk) => {
24416
+ const speechText = chunk.plainFallback?.speechText || (this.hasExplicitBreakSemantics(chunk.speechText) ? chunk.visibleText : chunk.speechText) || chunk.visibleText;
24417
+ const text2 = normalizeTextForSpeech(speechText) || chunk.visibleText || "";
24418
+ const segment = {
24419
+ text: text2,
24420
+ startOffset: offset,
24421
+ pauseMsAfter: 0
24422
+ };
24423
+ offset += Math.max(1, text2.length + 1);
24424
+ return segment;
24425
+ });
24426
+ }
24273
24427
  getCurrentSeekSegmentIndex() {
24274
24428
  if (this.seekSegments.length === 0)
24275
24429
  return 0;
@@ -24342,7 +24496,7 @@ class TTSService {
24342
24496
  const range = document.createRange();
24343
24497
  range.setStart(start.node, start.offset);
24344
24498
  range.setEnd(end.node, end.offset + 1);
24345
- this.highlightCoordinator.highlightTTSSentence([range]);
24499
+ this.paintTTSSentenceRanges([range]);
24346
24500
  this.activeSentenceStartOffset = startOffset;
24347
24501
  }
24348
24502
  getSegmentIndexForOffset(segments, offset) {
@@ -24433,7 +24587,8 @@ class TTSService {
24433
24587
  this.activeWordBoundaryOffset = options?.wordBoundaryOffset || 0;
24434
24588
  const hasExplicitBreaks = this.hasExplicitBreakSemantics(contentToSpeak);
24435
24589
  const shouldUsePlan = !!this.currentContentElement && !usedCatalogSpoken && !hasExplicitBreaks && speechMatchesVisibleText;
24436
- this.seekSegments = hasExplicitBreaks || !speechMatchesVisibleText ? [] : shouldUsePlan && this.currentContentElement ? this.createSpeechPlan(this.currentContentElement, normalizedText) : this.createSeekSegmentsFromText(highlightText);
24590
+ this.playbackChunks = speechChunks?.length ? speechChunks : [];
24591
+ this.seekSegments = this.playbackChunks.length ? this.createSeekSegmentsFromSpeechChunks(this.playbackChunks) : hasExplicitBreaks || !speechMatchesVisibleText ? [] : shouldUsePlan && this.currentContentElement ? this.createSpeechPlan(this.currentContentElement, normalizedText) : this.createSeekSegmentsFromText(highlightText);
24437
24592
  this.sentenceHighlightSegments = hasExplicitBreaks ? [] : this.createSentenceHighlightSegments({
24438
24593
  contentToSpeak: highlightText,
24439
24594
  shouldUsePlan,
@@ -24790,6 +24945,7 @@ class TTSService {
24790
24945
  this.currentContentElement = options?.contentElement || null;
24791
24946
  this.lastError = null;
24792
24947
  this.currentBoundaryOffset = 0;
24948
+ this.playbackChunks = [];
24793
24949
  this.currentSeekSegmentIndex = 0;
24794
24950
  this.activeSentenceStartOffset = null;
24795
24951
  }
@@ -24808,7 +24964,7 @@ class TTSService {
24808
24964
  try {
24809
24965
  const range = document.createRange();
24810
24966
  range.selectNodeContents(this.currentContentElement);
24811
- this.highlightCoordinator.highlightTTSSentence([range]);
24967
+ this.paintTTSSentenceRanges([range]);
24812
24968
  } catch {}
24813
24969
  }
24814
24970
  }
@@ -24824,7 +24980,12 @@ class TTSService {
24824
24980
  if (highlightRange && this.highlightCoordinator) {
24825
24981
  const highlightText = highlightRange.node.textContent?.substring(highlightRange.start, highlightRange.end) || "";
24826
24982
  this.debugLog(`[TTSService] Highlighting "${highlightText}" (word: "${word}") at position ${globalIndex}`);
24827
- this.highlightCoordinator.highlightTTSWord(highlightRange.node, highlightRange.start, highlightRange.end);
24983
+ const nativeRange = this.createTextRange(highlightRange.node, highlightRange.start, highlightRange.end);
24984
+ if (nativeRange) {
24985
+ this.paintTTSWordRange(this.resolveWordHighlightRange(nativeRange).range);
24986
+ } else {
24987
+ this.highlightCoordinator.highlightTTSWord(highlightRange.node, highlightRange.start, highlightRange.end);
24988
+ }
24828
24989
  } else {
24829
24990
  console.warn(`[TTSService] Could not find highlight range for position ${globalIndex}, length ${wordLength}`);
24830
24991
  }
@@ -24843,7 +25004,7 @@ class TTSService {
24843
25004
  this.lastRenderedRegionTarget = null;
24844
25005
  if (chunk.regionRange) {
24845
25006
  this.highlightCoordinator.clearHighlights?.(HighlightType.TTS_WORD);
24846
- this.highlightCoordinator.highlightTTSSentence([chunk.regionRange]);
25007
+ this.paintTTSSentenceRanges([chunk.regionRange]);
24847
25008
  return;
24848
25009
  }
24849
25010
  if (!element2)
@@ -24851,23 +25012,19 @@ class TTSService {
24851
25012
  const range = document.createRange();
24852
25013
  range.selectNodeContents(element2);
24853
25014
  this.highlightCoordinator.clearHighlights?.(HighlightType.TTS_WORD);
24854
- this.highlightCoordinator.highlightTTSSentence([range]);
25015
+ this.paintTTSSentenceRanges([range]);
24855
25016
  } catch {}
24856
25017
  }
24857
25018
  highlightCatalogActiveRange(range) {
24858
25019
  if (!this.highlightCoordinator)
24859
25020
  return;
24860
- if (range.startContainer === range.endContainer && range.startContainer.nodeType === Node.TEXT_NODE) {
24861
- this.highlightCoordinator.highlightTTSWord(range.startContainer, range.startOffset, range.endOffset);
24862
- return;
24863
- }
24864
- this.highlightCoordinator.highlightRange(range, HighlightType.TTS_WORD, HighlightColor.YELLOW);
25021
+ this.paintTTSWordRange(this.resolveWordHighlightRange(range).range);
24865
25022
  }
24866
25023
  highlightRenderableRegionTarget(target) {
24867
25024
  if (!this.highlightCoordinator || !target || typeof document === "undefined") {
24868
25025
  return;
24869
25026
  }
24870
- if (sameRenderableHighlightTarget(this.lastRenderedRegionTarget, target)) {
25027
+ if (!this.highlightTargetResolverProvider && sameRenderableHighlightTarget(this.lastRenderedRegionTarget, target)) {
24871
25028
  return;
24872
25029
  }
24873
25030
  try {
@@ -24875,14 +25032,14 @@ class TTSService {
24875
25032
  if (target.type === "element") {
24876
25033
  range.selectNodeContents(target.element);
24877
25034
  } else if (target.type === "range") {
24878
- this.highlightCoordinator.highlightTTSSentence([target.range]);
25035
+ this.paintTTSSentenceRanges([target.range]);
24879
25036
  this.lastRenderedRegionTarget = target;
24880
25037
  return;
24881
25038
  } else {
24882
25039
  range.setStart(target.node, target.startOffset);
24883
25040
  range.setEnd(target.node, target.endOffset);
24884
25041
  }
24885
- this.highlightCoordinator.highlightTTSSentence([range]);
25042
+ this.paintTTSSentenceRanges([range]);
24886
25043
  this.lastRenderedRegionTarget = target;
24887
25044
  } catch {}
24888
25045
  }
@@ -24895,13 +25052,25 @@ class TTSService {
24895
25052
  return;
24896
25053
  }
24897
25054
  if (target.type === "text-range") {
24898
- this.highlightCoordinator.highlightTTSWord(target.node, target.startOffset, target.endOffset);
25055
+ const nativeRange = this.createTextRange(target.node, target.startOffset, target.endOffset);
25056
+ if (nativeRange) {
25057
+ this.paintTTSWordRange(this.resolveWordHighlightRange(nativeRange).range);
25058
+ } else {
25059
+ this.highlightCoordinator.highlightTTSWord(target.node, target.startOffset, target.endOffset);
25060
+ }
24899
25061
  return;
24900
25062
  }
24901
25063
  if (target.type === "range") {
24902
25064
  this.highlightCatalogActiveRange(target.range);
24903
25065
  return;
24904
25066
  }
25067
+ const elementNativeRange = document.createRange();
25068
+ elementNativeRange.selectNodeContents(target.element);
25069
+ const resolvedElementRange = this.resolveWordHighlightRange(elementNativeRange);
25070
+ if (resolvedElementRange.remapped) {
25071
+ this.paintTTSWordRange(resolvedElementRange.range);
25072
+ return;
25073
+ }
24905
25074
  const onlyChild = target.element.childNodes.length === 1 ? target.element.firstChild : null;
24906
25075
  if (target.quality === "semantic-token" && onlyChild?.nodeType === Node.TEXT_NODE) {
24907
25076
  this.highlightCoordinator.highlightTTSWord(onlyChild, 0, onlyChild.textContent?.length || 0);
@@ -24986,9 +25155,15 @@ class TTSService {
24986
25155
  }
24987
25156
  async executeSpeakPlayback(args) {
24988
25157
  if (args.speechChunks?.length && this.provider) {
24989
- for (const chunk of args.speechChunks) {
25158
+ for (let index2 = 0;index2 < args.speechChunks.length; index2++) {
24990
25159
  if (args.runId !== this.speakRunId)
24991
25160
  return;
25161
+ this.currentSeekSegmentIndex = index2;
25162
+ const segment = this.seekSegments[index2];
25163
+ if (segment) {
25164
+ this.currentBoundaryOffset = segment.startOffset;
25165
+ }
25166
+ const chunk = args.speechChunks[index2];
24992
25167
  await this.speakCatalogChunk(chunk, args.runId);
24993
25168
  }
24994
25169
  return;
@@ -25018,6 +25193,7 @@ class TTSService {
25018
25193
  this.currentBoundaryOffset = 0;
25019
25194
  this.activeWordBoundaryOffset = 0;
25020
25195
  this.seekSegments = [];
25196
+ this.playbackChunks = [];
25021
25197
  this.sentenceHighlightSegments = [];
25022
25198
  this.currentSeekSegmentIndex = 0;
25023
25199
  this.activeSentenceStartOffset = null;
@@ -25080,6 +25256,7 @@ class TTSService {
25080
25256
  if (!this.provider || this.seekSegments.length === 0)
25081
25257
  return;
25082
25258
  const safeTargetIndex = Math.max(0, Math.min(this.seekSegments.length - 1, targetIndex));
25259
+ const restartChunks = this.playbackChunks.length ? this.playbackChunks.slice(safeTargetIndex) : null;
25083
25260
  this.speakRunId += 1;
25084
25261
  this.provider.onWordBoundary = undefined;
25085
25262
  this.provider.stop();
@@ -25092,19 +25269,35 @@ class TTSService {
25092
25269
  highlightMode: this.activeHighlightMode,
25093
25270
  wordBoundaryOffset: this.activeWordBoundaryOffset
25094
25271
  });
25095
- await this.speakWithPlan(restartSegments, runId, {
25096
- highlightMode: this.activeHighlightMode
25097
- });
25272
+ if (restartChunks) {
25273
+ for (let index2 = 0;index2 < restartChunks.length; index2++) {
25274
+ if (runId !== this.speakRunId)
25275
+ return;
25276
+ const absoluteIndex = safeTargetIndex + index2;
25277
+ this.currentSeekSegmentIndex = absoluteIndex;
25278
+ const segment = this.seekSegments[absoluteIndex];
25279
+ if (segment) {
25280
+ this.currentBoundaryOffset = segment.startOffset;
25281
+ }
25282
+ await this.speakCatalogChunk(restartChunks[index2], runId);
25283
+ }
25284
+ } else {
25285
+ await this.speakWithPlan(restartSegments, runId, {
25286
+ highlightMode: this.activeHighlightMode
25287
+ });
25288
+ }
25098
25289
  if (runId !== this.speakRunId)
25099
25290
  return;
25100
25291
  this.setState(PlaybackState.IDLE);
25101
25292
  this.clearHighlightsAndTracking();
25293
+ this.highlightTargetResolverProvider = null;
25102
25294
  } catch (error) {
25103
25295
  if (runId !== this.speakRunId)
25104
25296
  return;
25105
25297
  this.lastError = error instanceof Error ? error.message : String(error);
25106
25298
  this.setState(PlaybackState.ERROR);
25107
25299
  this.clearHighlightsAndTracking();
25300
+ this.highlightTargetResolverProvider = null;
25108
25301
  throw error;
25109
25302
  }
25110
25303
  }
@@ -25149,6 +25342,7 @@ class TTSService {
25149
25342
  this.speakRunId += 1;
25150
25343
  this.provider.onWordBoundary = undefined;
25151
25344
  this.provider.stop();
25345
+ this.highlightTargetResolverProvider = null;
25152
25346
  this.setState(PlaybackState.IDLE);
25153
25347
  this.currentText = null;
25154
25348
  if (this.highlightCoordinator) {
@@ -25160,6 +25354,7 @@ class TTSService {
25160
25354
  this.currentBoundaryOffset = 0;
25161
25355
  this.activeWordBoundaryOffset = 0;
25162
25356
  this.seekSegments = [];
25357
+ this.playbackChunks = [];
25163
25358
  this.sentenceHighlightSegments = [];
25164
25359
  this.currentSeekSegmentIndex = 0;
25165
25360
  this.activeSentenceStartOffset = null;
@@ -1,5 +1,6 @@
1
1
  import type { LoaderConfig } from "@pie-players/pie-players-shared/loader-config";
2
2
  import type { AccessibilityCatalogResolverApi, ElementToolStateStoreApi, HighlightCoordinatorApi, ToolCoordinatorApi, ToolkitCoordinatorApi, TtsServiceApi } from "../services/interfaces.js";
3
+ import type { TTSHighlightTargetResolver } from "../services/tts/highlight-target-resolver.js";
3
4
  export type ItemPlayerType = "iife" | "esm" | "preloaded" | "custom";
4
5
  export interface ItemPlayerConfig {
5
6
  type: ItemPlayerType;
@@ -48,6 +49,7 @@ export declare const assessmentToolkitShellContext: {
48
49
  };
49
50
  export interface AssessmentToolkitRegionScopeContext {
50
51
  scopeElement: HTMLElement | null;
52
+ ttsHighlightTargetResolver?: TTSHighlightTargetResolver | null;
51
53
  }
52
54
  export declare const assessmentToolkitRegionScopeContext: {
53
55
  __context__: AssessmentToolkitRegionScopeContext;
@@ -1 +1 @@
1
- {"version":3,"file":"assessment-toolkit-context.js","sourceRoot":"","sources":["../../src/context/assessment-toolkit-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoCzD,MAAM,CAAC,MAAM,+BAA+B,GAC3C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAClD,CAAC;AAOH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC;AAeH,MAAM,CAAC,MAAM,6BAA6B,GACzC,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;AAMH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC","sourcesContent":["import { createContext } from \"@pie-players/pie-context\";\nimport type { LoaderConfig } from \"@pie-players/pie-players-shared/loader-config\";\nimport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n} from \"../services/interfaces.js\";\n\nexport type ItemPlayerType = \"iife\" | \"esm\" | \"preloaded\" | \"custom\";\n\nexport interface ItemPlayerConfig {\n\ttype: ItemPlayerType;\n\ttagName: string;\n\tversion?: string;\n\tsource?: string;\n\tloaderConfig?: LoaderConfig;\n\tloaderOptions?: Record<string, unknown>;\n\tisDefault: boolean;\n}\n\nexport interface AssessmentToolkitRuntimeContext {\n\ttoolkitCoordinator: ToolkitCoordinatorApi;\n\ttoolCoordinator: ToolCoordinatorApi;\n\tttsService: TtsServiceApi;\n\thighlightCoordinator: HighlightCoordinatorApi;\n\tcatalogResolver: AccessibilityCatalogResolverApi;\n\telementToolStateStore: ElementToolStateStoreApi;\n\tassessmentId: string;\n\tsectionId: string;\n\titemPlayer: ItemPlayerConfig;\n\treportSessionChanged?: (itemId: string, detail: unknown) => void;\n}\n\nexport const assessmentToolkitRuntimeContext =\n\tcreateContext<AssessmentToolkitRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.runtimeContext\"),\n\t);\n\nexport interface AssessmentToolkitHostRuntimeContext {\n\truntimeId: string;\n\tcoordinator: ToolkitCoordinatorApi;\n}\n\nexport const assessmentToolkitHostRuntimeContext =\n\tcreateContext<AssessmentToolkitHostRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.hostRuntimeContext\"),\n\t);\n\nexport type ShellContextKind = \"item\" | \"passage\";\n\nexport interface AssessmentToolkitShellContext {\n\tkind: ShellContextKind;\n\titemId: string;\n\tcanonicalItemId: string;\n\tcontentKind: string;\n\tregionPolicy: string;\n\tscopeElement: HTMLElement | null;\n\titem: unknown;\n\tcontextVersion: number;\n}\n\nexport const assessmentToolkitShellContext =\n\tcreateContext<AssessmentToolkitShellContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.shellContext\"),\n\t);\n\nexport interface AssessmentToolkitRegionScopeContext {\n\tscopeElement: HTMLElement | null;\n}\n\nexport const assessmentToolkitRegionScopeContext =\n\tcreateContext<AssessmentToolkitRegionScopeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.regionScopeContext\"),\n\t);\n"]}
1
+ {"version":3,"file":"assessment-toolkit-context.js","sourceRoot":"","sources":["../../src/context/assessment-toolkit-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqCzD,MAAM,CAAC,MAAM,+BAA+B,GAC3C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAClD,CAAC;AAOH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC;AAeH,MAAM,CAAC,MAAM,6BAA6B,GACzC,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;AAOH,MAAM,CAAC,MAAM,mCAAmC,GAC/C,aAAa,CACZ,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC","sourcesContent":["import { createContext } from \"@pie-players/pie-context\";\nimport type { LoaderConfig } from \"@pie-players/pie-players-shared/loader-config\";\nimport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n} from \"../services/interfaces.js\";\nimport type { TTSHighlightTargetResolver } from \"../services/tts/highlight-target-resolver.js\";\n\nexport type ItemPlayerType = \"iife\" | \"esm\" | \"preloaded\" | \"custom\";\n\nexport interface ItemPlayerConfig {\n\ttype: ItemPlayerType;\n\ttagName: string;\n\tversion?: string;\n\tsource?: string;\n\tloaderConfig?: LoaderConfig;\n\tloaderOptions?: Record<string, unknown>;\n\tisDefault: boolean;\n}\n\nexport interface AssessmentToolkitRuntimeContext {\n\ttoolkitCoordinator: ToolkitCoordinatorApi;\n\ttoolCoordinator: ToolCoordinatorApi;\n\tttsService: TtsServiceApi;\n\thighlightCoordinator: HighlightCoordinatorApi;\n\tcatalogResolver: AccessibilityCatalogResolverApi;\n\telementToolStateStore: ElementToolStateStoreApi;\n\tassessmentId: string;\n\tsectionId: string;\n\titemPlayer: ItemPlayerConfig;\n\treportSessionChanged?: (itemId: string, detail: unknown) => void;\n}\n\nexport const assessmentToolkitRuntimeContext =\n\tcreateContext<AssessmentToolkitRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.runtimeContext\"),\n\t);\n\nexport interface AssessmentToolkitHostRuntimeContext {\n\truntimeId: string;\n\tcoordinator: ToolkitCoordinatorApi;\n}\n\nexport const assessmentToolkitHostRuntimeContext =\n\tcreateContext<AssessmentToolkitHostRuntimeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.hostRuntimeContext\"),\n\t);\n\nexport type ShellContextKind = \"item\" | \"passage\";\n\nexport interface AssessmentToolkitShellContext {\n\tkind: ShellContextKind;\n\titemId: string;\n\tcanonicalItemId: string;\n\tcontentKind: string;\n\tregionPolicy: string;\n\tscopeElement: HTMLElement | null;\n\titem: unknown;\n\tcontextVersion: number;\n}\n\nexport const assessmentToolkitShellContext =\n\tcreateContext<AssessmentToolkitShellContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.shellContext\"),\n\t);\n\nexport interface AssessmentToolkitRegionScopeContext {\n\tscopeElement: HTMLElement | null;\n\tttsHighlightTargetResolver?: TTSHighlightTargetResolver | null;\n}\n\nexport const assessmentToolkitRegionScopeContext =\n\tcreateContext<AssessmentToolkitRegionScopeContext>(\n\t\tSymbol.for(\"pie.assessmentToolkit.regionScopeContext\"),\n\t);\n"]}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  * @packageDocumentation
8
8
  */
9
9
  export type { AssessmentToolkitHostRuntimeContext, AssessmentToolkitRegionScopeContext, AssessmentToolkitRuntimeContext, AssessmentToolkitShellContext, ItemPlayerConfig, ItemPlayerType, ShellContextKind, } from "./context/assessment-toolkit-context.js";
10
+ export type { TTSHighlightContext, TTSHighlightTargetResolver, TTSHighlightTargetResolverProvider, TTSHighlightTargetResolverRuntime, } from "./services/tts/highlight-target-resolver.js";
10
11
  export { assessmentToolkitHostRuntimeContext, assessmentToolkitRegionScopeContext, assessmentToolkitRuntimeContext, assessmentToolkitShellContext, } from "./context/assessment-toolkit-context.js";
11
12
  export { connectAssessmentToolkitHostRuntimeContext, connectAssessmentToolkitRegionScopeContext, connectAssessmentToolkitRuntimeContext, connectAssessmentToolkitShellContext, } from "./context/runtime-context-consumer.js";
12
13
  export { PIE_INTERNAL_CONTENT_LOADED_EVENT, PIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT, PIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT, PIE_ITEM_SESSION_CHANGED_EVENT, PIE_REGISTER_EVENT, PIE_UNREGISTER_EVENT, type InternalContentLoadedDetail, type InternalItemSessionChangedDetail, type InternalItemPlayerErrorDetail, type ItemSessionChangedDetail, type RuntimeRegistrationDetail, type RuntimeRegistrationKind, } from "./runtime/registration-events.js";
@@ -26,7 +27,7 @@ export type { ResolvedToolContext, ToolbarContext, ToolContextResolver, ToolCont
26
27
  export { ToolRegistry } from "./services/ToolRegistry.js";
27
28
  export type { AssessmentToolContext, BaseToolContext, ElementToolContext, ItemToolContext, PassageToolContext, RubricToolContext, SectionToolContext, ToolContext, ToolLevel, } from "./services/tool-context.js";
28
29
  export { extractTextContent, hasChoiceInteraction, hasMathContent, hasReadableText, isAssessmentContext, isElementContext, isItemContext, isPassageContext, isRubricContext, isSectionContext, } from "./services/tool-context.js";
29
- export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, } from "./services/createDefaultToolRegistry.js";
30
+ export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT, } from "./services/createDefaultToolRegistry.js";
30
31
  export type { CreateToolsConfigArgs } from "./services/create-tools-config.js";
31
32
  export { createToolsConfig } from "./services/create-tools-config.js";
32
33
  export { DEFAULT_PERSONAL_NEEDS_PROFILE, createDefaultPersonalNeedsProfile, } from "./services/defaultPersonalNeedsProfile.js";
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ export { RangeSerializer } from "./services/RangeSerializer.js";
20
20
  export { I18nService } from "./services/I18nService.js";
21
21
  export { ToolRegistry } from "./services/ToolRegistry.js";
22
22
  export { extractTextContent, hasChoiceInteraction, hasMathContent, hasReadableText, isAssessmentContext, isElementContext, isItemContext, isPassageContext, isRubricContext, isSectionContext, } from "./services/tool-context.js";
23
- export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, } from "./services/createDefaultToolRegistry.js";
23
+ export { DEFAULT_TOOL_PLACEMENT, DEFAULT_TOOL_ORDER, createPackagedToolRegistry, PACKAGED_TOOL_PLACEMENT, registerPackagedTools, SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT, } from "./services/createDefaultToolRegistry.js";
24
24
  export { createToolsConfig } from "./services/create-tools-config.js";
25
25
  export { DEFAULT_PERSONAL_NEEDS_PROFILE, createDefaultPersonalNeedsProfile, } from "./services/defaultPersonalNeedsProfile.js";
26
26
  export { createToolElement, DEFAULT_TOOL_TAG_MAP, resolveToolTag, toToolIdFromTag, } from "./tools/tool-tag-map.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Assessment Toolkit\n *\n * Independent, composable services for coordinating tools, accommodations,\n * and item players in assessment applications.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Infrastructure\n// ============================================================================\n\nexport type {\n\tAssessmentToolkitHostRuntimeContext,\n\tAssessmentToolkitRegionScopeContext,\n\tAssessmentToolkitRuntimeContext,\n\tAssessmentToolkitShellContext,\n\tItemPlayerConfig,\n\tItemPlayerType,\n\tShellContextKind,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tassessmentToolkitHostRuntimeContext,\n\tassessmentToolkitRegionScopeContext,\n\tassessmentToolkitRuntimeContext,\n\tassessmentToolkitShellContext,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tconnectAssessmentToolkitHostRuntimeContext,\n\tconnectAssessmentToolkitRegionScopeContext,\n\tconnectAssessmentToolkitRuntimeContext,\n\tconnectAssessmentToolkitShellContext,\n} from \"./context/runtime-context-consumer.js\";\nexport {\n\tPIE_INTERNAL_CONTENT_LOADED_EVENT,\n\tPIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT,\n\tPIE_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_REGISTER_EVENT,\n\tPIE_UNREGISTER_EVENT,\n\ttype InternalContentLoadedDetail,\n\ttype InternalItemSessionChangedDetail,\n\ttype InternalItemPlayerErrorDetail,\n\ttype ItemSessionChangedDetail,\n\ttype RuntimeRegistrationDetail,\n\ttype RuntimeRegistrationKind,\n} from \"./runtime/registration-events.js\";\nexport {\n\tconnectToolRegionScopeContext,\n\tconnectToolRuntimeContext,\n\tconnectToolShellContext,\n\tcreateCrossBoundaryEvent,\n\tdispatchCrossBoundaryEvent,\n\tisContextValueDefined,\n} from \"./runtime/tool-host-contract.js\";\n\n// ============================================================================\n// Service Interfaces\n// ============================================================================\n\nexport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tI18nServiceApi,\n\tThemeProviderApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n\tToolState,\n} from \"./services/interfaces.js\";\n\n// ============================================================================\n// Toolkit Services\n// ============================================================================\n\n// Accessibility Catalog Resolver (QTI 3.0 Accessibility Catalogs)\nexport type {\n\tCatalogLookupContext,\n\tCatalogLookupOptions,\n\tCatalogOwnerContext,\n\tCatalogOwnerKind,\n\tCatalogStatistics,\n\tCatalogType,\n\tResolvedCatalog,\n} from \"./services/AccessibilityCatalogResolver.js\";\nexport { AccessibilityCatalogResolver } from \"./services/AccessibilityCatalogResolver.js\";\n// Context Variable Store (QTI 3.0 Context Declarations)\nexport { ContextVariableStore } from \"./services/ContextVariableStore.js\";\n// Element Tool State Store (Element-level ephemeral tool state)\nexport { ElementToolStateStore } from \"./services/ElementToolStateStore.js\";\n// Highlight Coordinator\nexport type { Annotation } from \"./services/HighlightCoordinator.js\";\nexport {\n\tHighlightColor,\n\tHighlightCoordinator,\n\tHighlightType,\n} from \"./services/HighlightCoordinator.js\";\n// Range Serializer (for annotation persistence)\nexport type { SerializedRange } from \"./services/RangeSerializer.js\";\nexport { RangeSerializer } from \"./services/RangeSerializer.js\";\n// I18n Service\nexport type {\n\tI18nConfig,\n\tPluralTranslation,\n\tTranslationBundle,\n} from \"./services/I18nService.js\";\nexport { I18nService } from \"./services/I18nService.js\";\n// Tool Registry (Registry-based tool system)\nexport type {\n\tResolvedToolContext,\n\tToolbarContext,\n\tToolContextResolver,\n\tToolContextResolverContext,\n\tToolContextResolverMap,\n\tToolContextResolverResult,\n\tToolModuleLoader,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolRegistration,\n} from \"./services/ToolRegistry.js\";\nexport { ToolRegistry } from \"./services/ToolRegistry.js\";\nexport type {\n\tAssessmentToolContext,\n\tBaseToolContext,\n\tElementToolContext,\n\tItemToolContext,\n\tPassageToolContext,\n\tRubricToolContext,\n\tSectionToolContext,\n\tToolContext,\n\tToolLevel,\n} from \"./services/tool-context.js\";\nexport {\n\textractTextContent,\n\thasChoiceInteraction,\n\thasMathContent,\n\thasReadableText,\n\tisAssessmentContext,\n\tisElementContext,\n\tisItemContext,\n\tisPassageContext,\n\tisRubricContext,\n\tisSectionContext,\n} from \"./services/tool-context.js\";\nexport {\n\tDEFAULT_TOOL_PLACEMENT,\n\tDEFAULT_TOOL_ORDER,\n\tcreatePackagedToolRegistry,\n\tPACKAGED_TOOL_PLACEMENT,\n\tregisterPackagedTools,\n} from \"./services/createDefaultToolRegistry.js\";\nexport type { CreateToolsConfigArgs } from \"./services/create-tools-config.js\";\nexport { createToolsConfig } from \"./services/create-tools-config.js\";\nexport {\n\tDEFAULT_PERSONAL_NEEDS_PROFILE,\n\tcreateDefaultPersonalNeedsProfile,\n} from \"./services/defaultPersonalNeedsProfile.js\";\nexport type {\n\tToolComponentFactory,\n\tToolComponentFactoryMap,\n\tToolComponentOverrides,\n\tToolTagMap,\n} from \"./tools/tool-tag-map.js\";\nexport {\n\tcreateToolElement,\n\tDEFAULT_TOOL_TAG_MAP,\n\tresolveToolTag,\n\ttoToolIdFromTag,\n} from \"./tools/tool-tag-map.js\";\n// QTI 3.0 Standard Access Features\nexport {\n\tALL_STANDARD_ACCESS_FEATURES,\n\tEXAMPLE_PNP_CONFIGURATIONS,\n\tgetFeatureCategory,\n\tgetFeaturesInCategory,\n\tisStandardAccessFeature,\n\tQTI_STANDARD_ACCESS_FEATURES,\n} from \"./services/pnp-standard-features.js\";\n// SSML Extractor (Auto-generates catalogs from embedded SSML)\nexport type { ExtractionResult } from \"./services/SSMLExtractor.js\";\nexport { SSMLExtractor } from \"./services/SSMLExtractor.js\";\n// Theme Provider\nexport type { FontSize, ThemeConfig } from \"./services/ThemeProvider.js\";\nexport { ThemeProvider } from \"./services/ThemeProvider.js\";\n// Tool Coordinator\nexport { ToolCoordinator, ZIndexLayer } from \"./services/ToolCoordinator.js\";\n// Toolkit Coordinator (Centralized service management)\nexport type {\n\tAnswerEliminatorToolConfig,\n\tProviderLifecycleContext,\n\tSectionControllerContext,\n\tSectionControllerEvent,\n\tSectionControllerEventType,\n\tSectionItemEvent,\n\tSectionItemEventType,\n\tSectionControllerFactoryDefaults,\n\tSectionControllerHandle,\n\tSectionControllerKey,\n\tSectionScopedEvent,\n\tSectionScopedEventType,\n\tSectionSessionPersistenceConfig,\n\tSectionItemEventSubscriptionArgs,\n\tSectionScopedEventSubscriptionArgs,\n\tSectionEventSubscriptionArgs,\n\tSectionSessionPersistenceStrategy,\n\tSectionControllerLoadedRenderable,\n\tSectionControllerRuntimeState,\n\tSectionControllerSessionState,\n\tSectionPersistenceFactoryDefaults,\n\tToolConfig,\n\tToolkitCoordinatorConfig,\n\tToolkitCoordinatorHooks,\n\tToolkitErrorContext,\n\tToolkitInitStatus,\n\tToolkitServiceBundle,\n\tToolkitToolsConfig,\n\tTTSToolConfig,\n} from \"./services/ToolkitCoordinator.js\";\nexport { ToolkitCoordinator } from \"./services/ToolkitCoordinator.js\";\nexport type {\n\tCanonicalToolsConfig,\n\tToolPlacementConfig,\n\tToolPlacementLevel,\n\tToolPolicyConfig,\n\tToolProvidersConfig,\n} from \"./services/tools-config-normalizer.js\";\nexport type {\n\tFrameworkErrorKind,\n\tFrameworkErrorModel,\n\tFrameworkErrorSeverity,\n} from \"./services/framework-error.js\";\nexport {\n\tformatFrameworkErrorForConsole,\n\tframeworkErrorFromToolConfigDiagnostics,\n\tframeworkErrorFromUnknown,\n\ttoFrameworkErrorModel,\n} from \"./services/framework-error.js\";\nexport type { FrameworkErrorListener } from \"./services/framework-error-bus.js\";\nexport type {\n\tToolConfigDiagnostic,\n\tToolConfigDiagnosticSeverity,\n\tToolConfigStrictness,\n\tToolConfigValidationOptions,\n\tToolConfigValidationResult,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tToolbarButtonItem,\n\tToolbarItem,\n\tToolbarItemBase,\n\tToolbarLinkItem,\n} from \"./services/toolbar-items.js\";\nexport {\n\tisExternalIconUrl,\n\tisInlineSvgIcon,\n\tisToolbarLinkItem,\n\tisValidToolbarItemShape,\n} from \"./services/toolbar-items.js\";\nexport {\n\tnormalizeToolsConfig,\n\tnormalizeToolAlias,\n\tnormalizeToolList,\n\tparseToolList,\n} from \"./services/tools-config-normalizer.js\";\nexport {\n\tframeworkErrorFromToolConfigValidation,\n\tnormalizeAndValidateToolsConfig,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tParsedToolInstanceId,\n\tToolScopeLevel,\n} from \"./services/tool-instance-id.js\";\nexport {\n\tcreateScopedToolId,\n\tparseScopedToolId,\n\ttoOverlayToolId,\n} from \"./services/tool-instance-id.js\";\n// Text-to-Speech Service\nexport type { TTSConfig } from \"./services/TTSService.js\";\nexport { PlaybackState, TTSService } from \"./services/TTSService.js\";\nexport {\n\tPIE_TTS_CONTROL_HANDOFF_EVENT,\n\ttype TTSControlHandoffDetail,\n} from \"./services/tts-control-events.js\";\nexport { BrowserTTSProvider } from \"./services/tts/browser-provider.js\";\nexport type { SREMathSpeechOptions } from \"./services/tts/math-speech.js\";\nexport type {\n\tNormalizedTTSSpeedOption,\n\tTTSHostToolbarLayout,\n\tTTSLayoutMode,\n\tTTSRuntimeSettings,\n\tTTSSpeedOption,\n\tTTSSpeedOptionConfig,\n} from \"./services/tts-runtime-config.js\";\nexport {\n\tDEFAULT_TTS_SPEED_OPTIONS,\n\tformatTTSSpeedOptionsAsText,\n\tnormalizeTTSLayoutMode,\n\tnormalizeTTSSpeedControlOptions,\n\tnormalizeTTSSpeedOptionConfigs,\n\tnormalizeTTSSpeedOptions,\n\tparseTTSSpeedOptionsFromText,\n\tresolveTTSHostToolbarLayout,\n\tresolveTTSLayoutMode,\n\tresolveTTSRuntimeSettings,\n} from \"./services/tts-runtime-config.js\";\n// TTS Provider System\nexport type {\n\tITTSProvider,\n\tITTSProviderImplementation,\n\tTTSSpeechSegment,\n\tTTSFeature,\n\tTTSProviderCapabilities,\n} from \"@pie-players/pie-tts\";\n\n// ============================================================================\n// Item loading (client-resolvable default; optional backend hook)\n// ============================================================================\n\nexport type {\n\tCreateLoadItemOptions,\n\tLoadItem,\n\tLoadItemOptions,\n} from \"./item-loader.js\";\nexport {\n\tcreateFetchItemLoader,\n\tcreateLoadItem,\n\tItemLoadError,\n} from \"./item-loader.js\";\n\n// ============================================================================\n// Attempt Session\n// ============================================================================\n\nexport type {\n\tStorageLike,\n\tTestAttemptItemSession,\n\tTestAttemptSession,\n\tTestAttemptSessionNavigationState,\n\tTestAttemptSessionRealization,\n} from \"./attempt/TestSession.js\";\nexport {\n\tcreateMemoryStorage,\n\tcreateTestAttemptSessionIdentifier,\n\tcreateNewTestAttemptSession,\n\tgetBrowserLocalStorage,\n\tgetOrCreateAnonymousDeviceId,\n\tgetTestAttemptSessionStorageKey,\n\tloadTestAttemptSession,\n\tsaveTestAttemptSession,\n\tsetCurrentPosition,\n\tupsertItemSessionFromPieSessionChange,\n\tupsertVisitedItem,\n} from \"./attempt/TestSession.js\";\nexport type {\n\tAssessmentSession,\n\tAssessmentSectionSessionState,\n\tAssessmentSessionNavigationState,\n\tAssessmentSessionRealization,\n} from \"./attempt/AssessmentSession.js\";\nexport {\n\tcreateNewAssessmentSession,\n\tgetAssessmentSessionStorageKey,\n\tloadAssessmentSession,\n\tsaveAssessmentSession,\n\tsetCurrentSectionPosition,\n\tupsertSectionSession,\n} from \"./attempt/AssessmentSession.js\";\nexport type {\n\tActivitySessionPatchPayload,\n\tMapActivityToTestAttemptSessionArgs,\n\tPieBackendActivityDefinition,\n\tPieBackendActivityItemRef,\n\tPieBackendActivitySession,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\nexport {\n\tbuildActivitySessionItemUpdate,\n\tbuildActivitySessionPatchFromTestAttemptSession,\n\tmapActivityToTestAttemptSession,\n\ttoItemSessionsRecord,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\n\n// Section Player - Use @pie-players/pie-section-player web component\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\n// ItemToolBar custom element registration helper is exported via package.json exports field\n// Import using: import '@pie-players/pie-assessment-toolkit/components/item-toolbar-element';\n// PieAssessmentToolkit custom element registration helper is exported via package.json exports field\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Assessment Toolkit\n *\n * Independent, composable services for coordinating tools, accommodations,\n * and item players in assessment applications.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Infrastructure\n// ============================================================================\n\nexport type {\n\tAssessmentToolkitHostRuntimeContext,\n\tAssessmentToolkitRegionScopeContext,\n\tAssessmentToolkitRuntimeContext,\n\tAssessmentToolkitShellContext,\n\tItemPlayerConfig,\n\tItemPlayerType,\n\tShellContextKind,\n} from \"./context/assessment-toolkit-context.js\";\nexport type {\n\tTTSHighlightContext,\n\tTTSHighlightTargetResolver,\n\tTTSHighlightTargetResolverProvider,\n\tTTSHighlightTargetResolverRuntime,\n} from \"./services/tts/highlight-target-resolver.js\";\nexport {\n\tassessmentToolkitHostRuntimeContext,\n\tassessmentToolkitRegionScopeContext,\n\tassessmentToolkitRuntimeContext,\n\tassessmentToolkitShellContext,\n} from \"./context/assessment-toolkit-context.js\";\nexport {\n\tconnectAssessmentToolkitHostRuntimeContext,\n\tconnectAssessmentToolkitRegionScopeContext,\n\tconnectAssessmentToolkitRuntimeContext,\n\tconnectAssessmentToolkitShellContext,\n} from \"./context/runtime-context-consumer.js\";\nexport {\n\tPIE_INTERNAL_CONTENT_LOADED_EVENT,\n\tPIE_INTERNAL_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_INTERNAL_ITEM_PLAYER_ERROR_EVENT,\n\tPIE_ITEM_SESSION_CHANGED_EVENT,\n\tPIE_REGISTER_EVENT,\n\tPIE_UNREGISTER_EVENT,\n\ttype InternalContentLoadedDetail,\n\ttype InternalItemSessionChangedDetail,\n\ttype InternalItemPlayerErrorDetail,\n\ttype ItemSessionChangedDetail,\n\ttype RuntimeRegistrationDetail,\n\ttype RuntimeRegistrationKind,\n} from \"./runtime/registration-events.js\";\nexport {\n\tconnectToolRegionScopeContext,\n\tconnectToolRuntimeContext,\n\tconnectToolShellContext,\n\tcreateCrossBoundaryEvent,\n\tdispatchCrossBoundaryEvent,\n\tisContextValueDefined,\n} from \"./runtime/tool-host-contract.js\";\n\n// ============================================================================\n// Service Interfaces\n// ============================================================================\n\nexport type {\n\tAccessibilityCatalogResolverApi,\n\tElementToolStateStoreApi,\n\tHighlightCoordinatorApi,\n\tI18nServiceApi,\n\tThemeProviderApi,\n\tToolCoordinatorApi,\n\tToolkitCoordinatorApi,\n\tTtsServiceApi,\n\tToolState,\n} from \"./services/interfaces.js\";\n\n// ============================================================================\n// Toolkit Services\n// ============================================================================\n\n// Accessibility Catalog Resolver (QTI 3.0 Accessibility Catalogs)\nexport type {\n\tCatalogLookupContext,\n\tCatalogLookupOptions,\n\tCatalogOwnerContext,\n\tCatalogOwnerKind,\n\tCatalogStatistics,\n\tCatalogType,\n\tResolvedCatalog,\n} from \"./services/AccessibilityCatalogResolver.js\";\nexport { AccessibilityCatalogResolver } from \"./services/AccessibilityCatalogResolver.js\";\n// Context Variable Store (QTI 3.0 Context Declarations)\nexport { ContextVariableStore } from \"./services/ContextVariableStore.js\";\n// Element Tool State Store (Element-level ephemeral tool state)\nexport { ElementToolStateStore } from \"./services/ElementToolStateStore.js\";\n// Highlight Coordinator\nexport type { Annotation } from \"./services/HighlightCoordinator.js\";\nexport {\n\tHighlightColor,\n\tHighlightCoordinator,\n\tHighlightType,\n} from \"./services/HighlightCoordinator.js\";\n// Range Serializer (for annotation persistence)\nexport type { SerializedRange } from \"./services/RangeSerializer.js\";\nexport { RangeSerializer } from \"./services/RangeSerializer.js\";\n// I18n Service\nexport type {\n\tI18nConfig,\n\tPluralTranslation,\n\tTranslationBundle,\n} from \"./services/I18nService.js\";\nexport { I18nService } from \"./services/I18nService.js\";\n// Tool Registry (Registry-based tool system)\nexport type {\n\tResolvedToolContext,\n\tToolbarContext,\n\tToolContextResolver,\n\tToolContextResolverContext,\n\tToolContextResolverMap,\n\tToolContextResolverResult,\n\tToolModuleLoader,\n\tToolToolbarButtonDefinition,\n\tToolToolbarRenderResult,\n\tToolRegistration,\n} from \"./services/ToolRegistry.js\";\nexport { ToolRegistry } from \"./services/ToolRegistry.js\";\nexport type {\n\tAssessmentToolContext,\n\tBaseToolContext,\n\tElementToolContext,\n\tItemToolContext,\n\tPassageToolContext,\n\tRubricToolContext,\n\tSectionToolContext,\n\tToolContext,\n\tToolLevel,\n} from \"./services/tool-context.js\";\nexport {\n\textractTextContent,\n\thasChoiceInteraction,\n\thasMathContent,\n\thasReadableText,\n\tisAssessmentContext,\n\tisElementContext,\n\tisItemContext,\n\tisPassageContext,\n\tisRubricContext,\n\tisSectionContext,\n} from \"./services/tool-context.js\";\nexport {\n\tDEFAULT_TOOL_PLACEMENT,\n\tDEFAULT_TOOL_ORDER,\n\tcreatePackagedToolRegistry,\n\tPACKAGED_TOOL_PLACEMENT,\n\tregisterPackagedTools,\n\tSECTION_PLAYER_PREFERRED_TOOL_PLACEMENT,\n} from \"./services/createDefaultToolRegistry.js\";\nexport type { CreateToolsConfigArgs } from \"./services/create-tools-config.js\";\nexport { createToolsConfig } from \"./services/create-tools-config.js\";\nexport {\n\tDEFAULT_PERSONAL_NEEDS_PROFILE,\n\tcreateDefaultPersonalNeedsProfile,\n} from \"./services/defaultPersonalNeedsProfile.js\";\nexport type {\n\tToolComponentFactory,\n\tToolComponentFactoryMap,\n\tToolComponentOverrides,\n\tToolTagMap,\n} from \"./tools/tool-tag-map.js\";\nexport {\n\tcreateToolElement,\n\tDEFAULT_TOOL_TAG_MAP,\n\tresolveToolTag,\n\ttoToolIdFromTag,\n} from \"./tools/tool-tag-map.js\";\n// QTI 3.0 Standard Access Features\nexport {\n\tALL_STANDARD_ACCESS_FEATURES,\n\tEXAMPLE_PNP_CONFIGURATIONS,\n\tgetFeatureCategory,\n\tgetFeaturesInCategory,\n\tisStandardAccessFeature,\n\tQTI_STANDARD_ACCESS_FEATURES,\n} from \"./services/pnp-standard-features.js\";\n// SSML Extractor (Auto-generates catalogs from embedded SSML)\nexport type { ExtractionResult } from \"./services/SSMLExtractor.js\";\nexport { SSMLExtractor } from \"./services/SSMLExtractor.js\";\n// Theme Provider\nexport type { FontSize, ThemeConfig } from \"./services/ThemeProvider.js\";\nexport { ThemeProvider } from \"./services/ThemeProvider.js\";\n// Tool Coordinator\nexport { ToolCoordinator, ZIndexLayer } from \"./services/ToolCoordinator.js\";\n// Toolkit Coordinator (Centralized service management)\nexport type {\n\tAnswerEliminatorToolConfig,\n\tProviderLifecycleContext,\n\tSectionControllerContext,\n\tSectionControllerEvent,\n\tSectionControllerEventType,\n\tSectionItemEvent,\n\tSectionItemEventType,\n\tSectionControllerFactoryDefaults,\n\tSectionControllerHandle,\n\tSectionControllerKey,\n\tSectionScopedEvent,\n\tSectionScopedEventType,\n\tSectionSessionPersistenceConfig,\n\tSectionItemEventSubscriptionArgs,\n\tSectionScopedEventSubscriptionArgs,\n\tSectionEventSubscriptionArgs,\n\tSectionSessionPersistenceStrategy,\n\tSectionControllerLoadedRenderable,\n\tSectionControllerRuntimeState,\n\tSectionControllerSessionState,\n\tSectionPersistenceFactoryDefaults,\n\tToolConfig,\n\tToolkitCoordinatorConfig,\n\tToolkitCoordinatorHooks,\n\tToolkitErrorContext,\n\tToolkitInitStatus,\n\tToolkitServiceBundle,\n\tToolkitToolsConfig,\n\tTTSToolConfig,\n} from \"./services/ToolkitCoordinator.js\";\nexport { ToolkitCoordinator } from \"./services/ToolkitCoordinator.js\";\nexport type {\n\tCanonicalToolsConfig,\n\tToolPlacementConfig,\n\tToolPlacementLevel,\n\tToolPolicyConfig,\n\tToolProvidersConfig,\n} from \"./services/tools-config-normalizer.js\";\nexport type {\n\tFrameworkErrorKind,\n\tFrameworkErrorModel,\n\tFrameworkErrorSeverity,\n} from \"./services/framework-error.js\";\nexport {\n\tformatFrameworkErrorForConsole,\n\tframeworkErrorFromToolConfigDiagnostics,\n\tframeworkErrorFromUnknown,\n\ttoFrameworkErrorModel,\n} from \"./services/framework-error.js\";\nexport type { FrameworkErrorListener } from \"./services/framework-error-bus.js\";\nexport type {\n\tToolConfigDiagnostic,\n\tToolConfigDiagnosticSeverity,\n\tToolConfigStrictness,\n\tToolConfigValidationOptions,\n\tToolConfigValidationResult,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tToolbarButtonItem,\n\tToolbarItem,\n\tToolbarItemBase,\n\tToolbarLinkItem,\n} from \"./services/toolbar-items.js\";\nexport {\n\tisExternalIconUrl,\n\tisInlineSvgIcon,\n\tisToolbarLinkItem,\n\tisValidToolbarItemShape,\n} from \"./services/toolbar-items.js\";\nexport {\n\tnormalizeToolsConfig,\n\tnormalizeToolAlias,\n\tnormalizeToolList,\n\tparseToolList,\n} from \"./services/tools-config-normalizer.js\";\nexport {\n\tframeworkErrorFromToolConfigValidation,\n\tnormalizeAndValidateToolsConfig,\n} from \"./services/tool-config-validation.js\";\nexport type {\n\tParsedToolInstanceId,\n\tToolScopeLevel,\n} from \"./services/tool-instance-id.js\";\nexport {\n\tcreateScopedToolId,\n\tparseScopedToolId,\n\ttoOverlayToolId,\n} from \"./services/tool-instance-id.js\";\n// Text-to-Speech Service\nexport type { TTSConfig } from \"./services/TTSService.js\";\nexport { PlaybackState, TTSService } from \"./services/TTSService.js\";\nexport {\n\tPIE_TTS_CONTROL_HANDOFF_EVENT,\n\ttype TTSControlHandoffDetail,\n} from \"./services/tts-control-events.js\";\nexport { BrowserTTSProvider } from \"./services/tts/browser-provider.js\";\nexport type { SREMathSpeechOptions } from \"./services/tts/math-speech.js\";\nexport type {\n\tNormalizedTTSSpeedOption,\n\tTTSHostToolbarLayout,\n\tTTSLayoutMode,\n\tTTSRuntimeSettings,\n\tTTSSpeedOption,\n\tTTSSpeedOptionConfig,\n} from \"./services/tts-runtime-config.js\";\nexport {\n\tDEFAULT_TTS_SPEED_OPTIONS,\n\tformatTTSSpeedOptionsAsText,\n\tnormalizeTTSLayoutMode,\n\tnormalizeTTSSpeedControlOptions,\n\tnormalizeTTSSpeedOptionConfigs,\n\tnormalizeTTSSpeedOptions,\n\tparseTTSSpeedOptionsFromText,\n\tresolveTTSHostToolbarLayout,\n\tresolveTTSLayoutMode,\n\tresolveTTSRuntimeSettings,\n} from \"./services/tts-runtime-config.js\";\n// TTS Provider System\nexport type {\n\tITTSProvider,\n\tITTSProviderImplementation,\n\tTTSSpeechSegment,\n\tTTSFeature,\n\tTTSProviderCapabilities,\n} from \"@pie-players/pie-tts\";\n\n// ============================================================================\n// Item loading (client-resolvable default; optional backend hook)\n// ============================================================================\n\nexport type {\n\tCreateLoadItemOptions,\n\tLoadItem,\n\tLoadItemOptions,\n} from \"./item-loader.js\";\nexport {\n\tcreateFetchItemLoader,\n\tcreateLoadItem,\n\tItemLoadError,\n} from \"./item-loader.js\";\n\n// ============================================================================\n// Attempt Session\n// ============================================================================\n\nexport type {\n\tStorageLike,\n\tTestAttemptItemSession,\n\tTestAttemptSession,\n\tTestAttemptSessionNavigationState,\n\tTestAttemptSessionRealization,\n} from \"./attempt/TestSession.js\";\nexport {\n\tcreateMemoryStorage,\n\tcreateTestAttemptSessionIdentifier,\n\tcreateNewTestAttemptSession,\n\tgetBrowserLocalStorage,\n\tgetOrCreateAnonymousDeviceId,\n\tgetTestAttemptSessionStorageKey,\n\tloadTestAttemptSession,\n\tsaveTestAttemptSession,\n\tsetCurrentPosition,\n\tupsertItemSessionFromPieSessionChange,\n\tupsertVisitedItem,\n} from \"./attempt/TestSession.js\";\nexport type {\n\tAssessmentSession,\n\tAssessmentSectionSessionState,\n\tAssessmentSessionNavigationState,\n\tAssessmentSessionRealization,\n} from \"./attempt/AssessmentSession.js\";\nexport {\n\tcreateNewAssessmentSession,\n\tgetAssessmentSessionStorageKey,\n\tloadAssessmentSession,\n\tsaveAssessmentSession,\n\tsetCurrentSectionPosition,\n\tupsertSectionSession,\n} from \"./attempt/AssessmentSession.js\";\nexport type {\n\tActivitySessionPatchPayload,\n\tMapActivityToTestAttemptSessionArgs,\n\tPieBackendActivityDefinition,\n\tPieBackendActivityItemRef,\n\tPieBackendActivitySession,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\nexport {\n\tbuildActivitySessionItemUpdate,\n\tbuildActivitySessionPatchFromTestAttemptSession,\n\tmapActivityToTestAttemptSession,\n\ttoItemSessionsRecord,\n} from \"./attempt/adapters/activity-to-test-attempt-session.js\";\n\n// Section Player - Use @pie-players/pie-section-player web component\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\n// ItemToolBar custom element registration helper is exported via package.json exports field\n// Import using: import '@pie-players/pie-assessment-toolkit/components/item-toolbar-element';\n// PieAssessmentToolkit custom element registration helper is exported via package.json exports field\n"]}
@@ -118,6 +118,12 @@ export declare class HighlightCoordinator implements HighlightCoordinatorApi {
118
118
  * @param ranges Line (or sentence) ranges to paint with `--pie-tts-line-highlight`
119
119
  */
120
120
  highlightTTSSentence(ranges: Range[]): void;
121
+ /**
122
+ * Highlight sentence/block elements for TTS (background layer).
123
+ *
124
+ * @param elements Visible elements to paint with `--pie-tts-line-highlight`
125
+ */
126
+ highlightTTSSentenceElements(elements: Element[]): void;
121
127
  private static readonly SENTENCE_FALLBACK_SELECTOR;
122
128
  private static readonly WORD_FALLBACK_SELECTOR;
123
129
  private highlightTTSElementFallbacks;
@@ -309,27 +309,27 @@ export class HighlightCoordinator {
309
309
 
310
310
  /* Annotation highlights - persistent */
311
311
  ::highlight(annotation-yellow) {
312
- background-color: color-mix(in srgb, var(--pie-missing, #ffff00) 35%, transparent);
312
+ background-color: var(--pie-annotation-yellow-highlight, rgba(253, 233, 149, 0.5));
313
313
  color: inherit;
314
314
  }
315
315
 
316
316
  ::highlight(annotation-green) {
317
- background-color: color-mix(in srgb, var(--pie-correct, #90ee90) 35%, transparent);
317
+ background-color: var(--pie-annotation-green-highlight, rgba(166, 225, 197, 0.5));
318
318
  color: inherit;
319
319
  }
320
320
 
321
321
  ::highlight(annotation-blue) {
322
- background-color: color-mix(in srgb, var(--pie-tertiary, #add8e6) 35%, transparent);
322
+ background-color: var(--pie-annotation-blue-highlight, rgba(167, 224, 246, 0.5));
323
323
  color: inherit;
324
324
  }
325
325
 
326
326
  ::highlight(annotation-pink) {
327
- background-color: color-mix(in srgb, var(--pie-secondary-light, #ffb6c1) 35%, transparent);
327
+ background-color: var(--pie-annotation-pink-highlight, rgba(255, 159, 174, 0.5));
328
328
  color: inherit;
329
329
  }
330
330
 
331
331
  ::highlight(annotation-orange) {
332
- background-color: color-mix(in srgb, var(--pie-incorrect, #ffa500) 35%, transparent);
332
+ background-color: var(--pie-annotation-orange-highlight, rgba(255, 165, 0, 0.5));
333
333
  color: inherit;
334
334
  }
335
335
 
@@ -410,6 +410,21 @@ export class HighlightCoordinator {
410
410
  }
411
411
  this.highlightTTSElementFallbacks(ranges);
412
412
  }
413
+ /**
414
+ * Highlight sentence/block elements for TTS (background layer).
415
+ *
416
+ * @param elements Visible elements to paint with `--pie-tts-line-highlight`
417
+ */
418
+ highlightTTSSentenceElements(elements) {
419
+ if (!this.ttsSentenceHighlight)
420
+ return;
421
+ this.applyAdaptiveTTSStyle(elements[0] || null);
422
+ this.clearTTSSentence();
423
+ for (const element of elements) {
424
+ element.setAttribute("data-pie-tts-sentence-element", "true");
425
+ this.ttsSentenceElementHighlights.add(element);
426
+ }
427
+ }
413
428
  // The read-along (sentence) band legitimately covers whole equations and
414
429
  // replaced elements, so it escalates to them.
415
430
  static SENTENCE_FALLBACK_SELECTOR = "math, mjx-container, svg, img, canvas, [role='img']";