@pie-players/pie-assessment-toolkit 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -1
- package/dist/index.d.ts +16 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/player/AssessmentPlayer.d.ts +9 -0
- package/dist/player/AssessmentPlayer.d.ts.map +1 -1
- package/dist/player/AssessmentPlayer.js +13 -4
- package/dist/player/AssessmentPlayer.js.map +1 -1
- package/dist/services/AnnotationToolbarConfig.d.ts +134 -0
- package/dist/services/AnnotationToolbarConfig.d.ts.map +1 -0
- package/dist/services/AnnotationToolbarConfig.js +100 -0
- package/dist/services/AnnotationToolbarConfig.js.map +1 -0
- package/dist/services/HighlightCoordinator.d.ts +23 -10
- package/dist/services/HighlightCoordinator.d.ts.map +1 -1
- package/dist/services/HighlightCoordinator.js +87 -40
- package/dist/services/HighlightCoordinator.js.map +1 -1
- package/dist/services/PNPToolResolver.d.ts +171 -15
- package/dist/services/PNPToolResolver.d.ts.map +1 -1
- package/dist/services/PNPToolResolver.js +324 -32
- package/dist/services/PNPToolResolver.js.map +1 -1
- package/dist/services/RangeSerializer.d.ts +119 -0
- package/dist/services/RangeSerializer.d.ts.map +1 -0
- package/dist/services/RangeSerializer.js +199 -0
- package/dist/services/RangeSerializer.js.map +1 -0
- package/dist/services/TTSService.d.ts +4 -1
- package/dist/services/TTSService.d.ts.map +1 -1
- package/dist/services/TTSService.js +58 -3
- package/dist/services/TTSService.js.map +1 -1
- package/dist/services/ToolRegistry.d.ts +225 -0
- package/dist/services/ToolRegistry.d.ts.map +1 -0
- package/dist/services/ToolRegistry.js +248 -0
- package/dist/services/ToolRegistry.js.map +1 -0
- package/dist/services/ToolkitCoordinator.d.ts +22 -0
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
- package/dist/services/ToolkitCoordinator.js +44 -0
- package/dist/services/ToolkitCoordinator.js.map +1 -1
- package/dist/services/createDefaultToolRegistry.d.ts +72 -0
- package/dist/services/createDefaultToolRegistry.d.ts.map +1 -0
- package/dist/services/createDefaultToolRegistry.js +147 -0
- package/dist/services/createDefaultToolRegistry.js.map +1 -0
- package/dist/services/interfaces.d.ts +8 -0
- package/dist/services/interfaces.d.ts.map +1 -1
- package/dist/services/interfaces.js.map +1 -1
- package/dist/services/pnp-provenance.d.ts +167 -0
- package/dist/services/pnp-provenance.d.ts.map +1 -0
- package/dist/services/pnp-provenance.js +230 -0
- package/dist/services/pnp-provenance.js.map +1 -0
- package/dist/services/pnp-standard-features.d.ts +240 -0
- package/dist/services/pnp-standard-features.d.ts.map +1 -0
- package/dist/services/pnp-standard-features.js +342 -0
- package/dist/services/pnp-standard-features.js.map +1 -0
- package/dist/services/tool-context.d.ts +150 -0
- package/dist/services/tool-context.d.ts.map +1 -0
- package/dist/services/tool-context.js +157 -0
- package/dist/services/tool-context.js.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -1
- package/dist/services/tool-providers/ToolProviderRegistry.js +7 -7
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -1
- package/dist/tools/registrations/accessibility-tools.d.ts +43 -0
- package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -0
- package/dist/tools/registrations/accessibility-tools.js +230 -0
- package/dist/tools/registrations/accessibility-tools.js.map +1 -0
- package/dist/tools/registrations/calculator.d.ts +21 -0
- package/dist/tools/registrations/calculator.d.ts.map +1 -0
- package/dist/tools/registrations/calculator.js +98 -0
- package/dist/tools/registrations/calculator.js.map +1 -0
- package/dist/tools/registrations/interaction-tools.d.ts +28 -0
- package/dist/tools/registrations/interaction-tools.d.ts.map +1 -0
- package/dist/tools/registrations/interaction-tools.js +124 -0
- package/dist/tools/registrations/interaction-tools.js.map +1 -0
- package/dist/tools/registrations/measurement-tools.d.ts +25 -0
- package/dist/tools/registrations/measurement-tools.d.ts.map +1 -0
- package/dist/tools/registrations/measurement-tools.js +112 -0
- package/dist/tools/registrations/measurement-tools.js.map +1 -0
- package/dist/tools/registrations/subject-specific-tools.d.ts +28 -0
- package/dist/tools/registrations/subject-specific-tools.d.ts.map +1 -0
- package/dist/tools/registrations/subject-specific-tools.js +118 -0
- package/dist/tools/registrations/subject-specific-tools.js.map +1 -0
- package/dist/tools/registrations/tts.d.ts +20 -0
- package/dist/tools/registrations/tts.d.ts.map +1 -0
- package/dist/tools/registrations/tts.js +86 -0
- package/dist/tools/registrations/tts.js.map +1 -0
- package/dist/tools/tool-tag-map.d.ts +24 -0
- package/dist/tools/tool-tag-map.d.ts.map +1 -0
- package/dist/tools/tool-tag-map.js +38 -0
- package/dist/tools/tool-tag-map.js.map +1 -0
- package/package.json +15 -7
- package/src/README.md +25 -11
- package/src/components/PNPProfileTester.example.svelte +188 -0
- package/src/components/PNPProfileTester.svelte +397 -0
- package/src/components/PNPProvenanceViewer.svelte +260 -0
- package/src/components/QuestionToolBar.svelte +160 -83
- package/src/components/ToolButton.svelte +146 -0
- package/src/components/ToolButtonGroup.svelte +109 -0
- package/src/reference-layout/ReferenceLayout.svelte +5 -13
- package/dist/services/PNPMapper.d.ts +0 -71
- package/dist/services/PNPMapper.d.ts.map +0 -1
- package/dist/services/PNPMapper.js +0 -98
- package/dist/services/PNPMapper.js.map +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Annotation Toolbar Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configures backend API endpoints for dictionary, picture dictionary, and translation features.
|
|
5
|
+
* These can be pointed to different backends in different environments:
|
|
6
|
+
* - Development: Local stub routes in section-demos
|
|
7
|
+
* - Production: pie-api-aws endpoints with authentication
|
|
8
|
+
*
|
|
9
|
+
* Part of PIE Assessment Toolkit.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Annotation Toolbar API Client
|
|
13
|
+
*
|
|
14
|
+
* Handles API calls to backend services for dictionary, picture dictionary, and translation.
|
|
15
|
+
* Automatically adds authentication and custom headers based on configuration.
|
|
16
|
+
*/
|
|
17
|
+
export class AnnotationToolbarAPIClient {
|
|
18
|
+
config;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Look up a word in the dictionary
|
|
24
|
+
*/
|
|
25
|
+
async lookupDictionary(keyword, language) {
|
|
26
|
+
if (!this.config.dictionaryEndpoint) {
|
|
27
|
+
throw new Error("Dictionary endpoint not configured. Set dictionaryEndpoint in AnnotationToolbarConfig.");
|
|
28
|
+
}
|
|
29
|
+
const body = {
|
|
30
|
+
keyword,
|
|
31
|
+
language: language || this.config.defaultLanguage || "en-us",
|
|
32
|
+
};
|
|
33
|
+
const response = await this.fetch(this.config.dictionaryEndpoint, body);
|
|
34
|
+
return response.json();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Look up images in the picture dictionary
|
|
38
|
+
*/
|
|
39
|
+
async lookupPictureDictionary(keyword, language, max) {
|
|
40
|
+
if (!this.config.pictureDictionaryEndpoint) {
|
|
41
|
+
throw new Error("Picture dictionary endpoint not configured. Set pictureDictionaryEndpoint in AnnotationToolbarConfig.");
|
|
42
|
+
}
|
|
43
|
+
const body = {
|
|
44
|
+
keyword,
|
|
45
|
+
language: language || this.config.defaultLanguage || "en-us",
|
|
46
|
+
max,
|
|
47
|
+
};
|
|
48
|
+
const response = await this.fetch(this.config.pictureDictionaryEndpoint, body);
|
|
49
|
+
return response.json();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Translate text
|
|
53
|
+
*/
|
|
54
|
+
async translate(text, targetLanguage, sourceLanguage) {
|
|
55
|
+
if (!this.config.translationEndpoint) {
|
|
56
|
+
throw new Error("Translation endpoint not configured. Set translationEndpoint in AnnotationToolbarConfig.");
|
|
57
|
+
}
|
|
58
|
+
const body = {
|
|
59
|
+
text,
|
|
60
|
+
targetLanguage,
|
|
61
|
+
sourceLanguage: sourceLanguage || "auto",
|
|
62
|
+
};
|
|
63
|
+
const response = await this.fetch(this.config.translationEndpoint, body);
|
|
64
|
+
return response.json();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Internal fetch helper with auth and custom headers
|
|
68
|
+
*/
|
|
69
|
+
async fetch(endpoint, body) {
|
|
70
|
+
const headers = {
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
...(this.config.headers || {}),
|
|
73
|
+
};
|
|
74
|
+
// Add auth token if configured
|
|
75
|
+
if (this.config.authToken) {
|
|
76
|
+
headers["Authorization"] = `Bearer ${this.config.authToken}`;
|
|
77
|
+
}
|
|
78
|
+
// Add organization ID if configured
|
|
79
|
+
if (this.config.organizationId) {
|
|
80
|
+
headers["X-Organization-ID"] = this.config.organizationId;
|
|
81
|
+
}
|
|
82
|
+
const response = await window.fetch(endpoint, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers,
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
});
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
const errorText = await response.text();
|
|
89
|
+
throw new Error(`API request failed (${response.status}): ${errorText}`);
|
|
90
|
+
}
|
|
91
|
+
return response;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Update configuration (useful for refreshing auth tokens)
|
|
95
|
+
*/
|
|
96
|
+
updateConfig(config) {
|
|
97
|
+
this.config = { ...this.config, ...config };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=AnnotationToolbarConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnnotationToolbarConfig.js","sourceRoot":"","sources":["../../src/services/AnnotationToolbarConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - CSS Custom Highlight API (no DOM mutation)
|
|
10
10
|
* - Full accessibility support (screen readers see original text)
|
|
11
11
|
* - Configurable colors and styles
|
|
12
|
+
* - Annotation persistence via RangeSerializer
|
|
12
13
|
*
|
|
13
14
|
* Part of PIE Assessment Toolkit.
|
|
14
15
|
*
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/CSS_Custom_Highlight_API
|
|
21
22
|
*/
|
|
22
23
|
import type { IHighlightCoordinator } from "./interfaces";
|
|
24
|
+
import { type SerializedRange } from "./RangeSerializer";
|
|
23
25
|
/**
|
|
24
26
|
* Highlight types
|
|
25
27
|
*/
|
|
@@ -36,7 +38,8 @@ export declare enum HighlightColor {
|
|
|
36
38
|
GREEN = "green",
|
|
37
39
|
BLUE = "blue",
|
|
38
40
|
PINK = "pink",
|
|
39
|
-
ORANGE = "orange"
|
|
41
|
+
ORANGE = "orange",
|
|
42
|
+
UNDERLINE = "underline"
|
|
40
43
|
}
|
|
41
44
|
/**
|
|
42
45
|
* Annotation data
|
|
@@ -58,9 +61,10 @@ export declare class HighlightCoordinator implements IHighlightCoordinator {
|
|
|
58
61
|
private ttsWordHighlight;
|
|
59
62
|
private ttsSentenceHighlight;
|
|
60
63
|
private annotations;
|
|
61
|
-
private
|
|
64
|
+
private colorHighlights;
|
|
62
65
|
private nextAnnotationId;
|
|
63
66
|
private supported;
|
|
67
|
+
private rangeSerializer;
|
|
64
68
|
constructor(config?: HighlightCoordinatorConfig);
|
|
65
69
|
/**
|
|
66
70
|
* Initialize CSS Custom Highlights
|
|
@@ -130,21 +134,30 @@ export declare class HighlightCoordinator implements IHighlightCoordinator {
|
|
|
130
134
|
*/
|
|
131
135
|
changeAnnotationColor(id: string, newColor: HighlightColor): void;
|
|
132
136
|
/**
|
|
133
|
-
* Export annotations as serializable data
|
|
137
|
+
* Export annotations as serializable data for persistence.
|
|
138
|
+
* Uses RangeSerializer for robust DOM range serialization.
|
|
139
|
+
*
|
|
140
|
+
* @param root Root element for serialization (typically document.body or content container)
|
|
141
|
+
* @returns Array of serialized annotations
|
|
134
142
|
*/
|
|
135
|
-
exportAnnotations(): Array<{
|
|
143
|
+
exportAnnotations(root?: Element): Array<SerializedRange & {
|
|
136
144
|
id: string;
|
|
137
|
-
startContainer: string;
|
|
138
|
-
startOffset: number;
|
|
139
|
-
endContainer: string;
|
|
140
|
-
endOffset: number;
|
|
141
145
|
color: HighlightColor;
|
|
142
146
|
timestamp: number;
|
|
143
147
|
}>;
|
|
144
148
|
/**
|
|
145
|
-
*
|
|
149
|
+
* Import annotations from serialized data.
|
|
150
|
+
* Restores annotations after page navigation or refresh.
|
|
151
|
+
*
|
|
152
|
+
* @param data Array of serialized annotations
|
|
153
|
+
* @param root Root element for deserialization (same as used in export)
|
|
154
|
+
* @returns Number of successfully restored annotations
|
|
146
155
|
*/
|
|
147
|
-
|
|
156
|
+
importAnnotations(data: Array<SerializedRange & {
|
|
157
|
+
id?: string;
|
|
158
|
+
color: HighlightColor;
|
|
159
|
+
timestamp?: number;
|
|
160
|
+
}>, root?: Element): number;
|
|
148
161
|
/**
|
|
149
162
|
* Highlight a text range (interface method)
|
|
150
163
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/HighlightCoordinator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HighlightCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/HighlightCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - CSS Custom Highlight API (no DOM mutation)
|
|
10
10
|
* - Full accessibility support (screen readers see original text)
|
|
11
11
|
* - Configurable colors and styles
|
|
12
|
+
* - Annotation persistence via RangeSerializer
|
|
12
13
|
*
|
|
13
14
|
* Part of PIE Assessment Toolkit.
|
|
14
15
|
*
|
|
@@ -19,6 +20,7 @@
|
|
|
19
20
|
*
|
|
20
21
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/CSS_Custom_Highlight_API
|
|
21
22
|
*/
|
|
23
|
+
import { RangeSerializer } from "./RangeSerializer";
|
|
22
24
|
/**
|
|
23
25
|
* Highlight types
|
|
24
26
|
*/
|
|
@@ -38,17 +40,21 @@ export var HighlightColor;
|
|
|
38
40
|
HighlightColor["BLUE"] = "blue";
|
|
39
41
|
HighlightColor["PINK"] = "pink";
|
|
40
42
|
HighlightColor["ORANGE"] = "orange";
|
|
43
|
+
HighlightColor["UNDERLINE"] = "underline";
|
|
41
44
|
})(HighlightColor || (HighlightColor = {}));
|
|
42
45
|
export class HighlightCoordinator {
|
|
43
46
|
config;
|
|
44
47
|
ttsWordHighlight = null;
|
|
45
48
|
ttsSentenceHighlight = null;
|
|
46
49
|
annotations = new Map();
|
|
47
|
-
|
|
50
|
+
// Shared highlights per color (one Highlight object per color, contains all ranges)
|
|
51
|
+
colorHighlights = new Map();
|
|
48
52
|
nextAnnotationId = 1;
|
|
49
53
|
supported = false;
|
|
54
|
+
rangeSerializer;
|
|
50
55
|
constructor(config = {}) {
|
|
51
56
|
this.config = config;
|
|
57
|
+
this.rangeSerializer = new RangeSerializer();
|
|
52
58
|
// SSR guard
|
|
53
59
|
if (typeof CSS === "undefined" || !("highlights" in CSS)) {
|
|
54
60
|
console.warn("CSS Custom Highlight API not supported (SSR or unsupported browser)");
|
|
@@ -64,12 +70,18 @@ export class HighlightCoordinator {
|
|
|
64
70
|
initializeHighlights() {
|
|
65
71
|
if (!this.supported)
|
|
66
72
|
return;
|
|
67
|
-
// Create highlight registries
|
|
73
|
+
// Create highlight registries for TTS
|
|
68
74
|
this.ttsWordHighlight = new Highlight();
|
|
69
75
|
this.ttsSentenceHighlight = new Highlight();
|
|
70
|
-
// Register with CSS
|
|
76
|
+
// Register TTS highlights with CSS
|
|
71
77
|
CSS.highlights.set("tts-word", this.ttsWordHighlight);
|
|
72
78
|
CSS.highlights.set("tts-sentence", this.ttsSentenceHighlight);
|
|
79
|
+
// Create shared highlights for each annotation color
|
|
80
|
+
for (const color of Object.values(HighlightColor)) {
|
|
81
|
+
const highlight = new Highlight();
|
|
82
|
+
this.colorHighlights.set(color, highlight);
|
|
83
|
+
CSS.highlights.set(`annotation-${color}`, highlight);
|
|
84
|
+
}
|
|
73
85
|
}
|
|
74
86
|
/**
|
|
75
87
|
* Register CSS styles for highlights
|
|
@@ -121,6 +133,13 @@ export class HighlightCoordinator {
|
|
|
121
133
|
background-color: rgba(255, 165, 0, 0.3);
|
|
122
134
|
color: inherit;
|
|
123
135
|
}
|
|
136
|
+
|
|
137
|
+
::highlight(annotation-underline) {
|
|
138
|
+
background-color: transparent;
|
|
139
|
+
text-decoration: underline 2px solid #0066cc;
|
|
140
|
+
text-underline-offset: 2px;
|
|
141
|
+
color: inherit;
|
|
142
|
+
}
|
|
124
143
|
`;
|
|
125
144
|
document.head.appendChild(style);
|
|
126
145
|
}
|
|
@@ -190,20 +209,23 @@ export class HighlightCoordinator {
|
|
|
190
209
|
*/
|
|
191
210
|
addAnnotation(range, color = HighlightColor.YELLOW) {
|
|
192
211
|
const id = `annotation-${this.nextAnnotationId++}`;
|
|
212
|
+
// Clone the range to store
|
|
213
|
+
const clonedRange = range.cloneRange();
|
|
193
214
|
// Store annotation data
|
|
194
215
|
const annotation = {
|
|
195
216
|
id,
|
|
196
|
-
range:
|
|
217
|
+
range: clonedRange,
|
|
197
218
|
type: HighlightType.ANNOTATION,
|
|
198
219
|
color,
|
|
199
220
|
timestamp: Date.now(),
|
|
200
221
|
};
|
|
201
222
|
this.annotations.set(id, annotation);
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
this.
|
|
205
|
-
|
|
206
|
-
|
|
223
|
+
// Add the SAME range object to the shared color highlight
|
|
224
|
+
// This ensures we can later delete it by reference
|
|
225
|
+
const colorHighlight = this.colorHighlights.get(color);
|
|
226
|
+
if (colorHighlight) {
|
|
227
|
+
colorHighlight.add(clonedRange);
|
|
228
|
+
}
|
|
207
229
|
return id;
|
|
208
230
|
}
|
|
209
231
|
/**
|
|
@@ -213,21 +235,31 @@ export class HighlightCoordinator {
|
|
|
213
235
|
*/
|
|
214
236
|
removeAnnotation(id) {
|
|
215
237
|
const annotation = this.annotations.get(id);
|
|
216
|
-
if (!annotation)
|
|
238
|
+
if (!annotation) {
|
|
239
|
+
console.warn(`[HighlightCoordinator] Annotation ${id} not found`);
|
|
217
240
|
return;
|
|
218
|
-
|
|
219
|
-
|
|
241
|
+
}
|
|
242
|
+
console.log(`[HighlightCoordinator] Removing annotation ${id} (color: ${annotation.color})`);
|
|
243
|
+
// Remove range from the shared color highlight
|
|
244
|
+
const colorHighlight = this.colorHighlights.get(annotation.color);
|
|
245
|
+
if (colorHighlight) {
|
|
246
|
+
const deleted = colorHighlight.delete(annotation.range);
|
|
247
|
+
console.log(`[HighlightCoordinator] Highlight.delete() returned:`, deleted);
|
|
248
|
+
}
|
|
220
249
|
// Clean up
|
|
221
|
-
this.annotationHighlights.delete(id);
|
|
222
250
|
this.annotations.delete(id);
|
|
251
|
+
console.log(`[HighlightCoordinator] Annotation ${id} removed from map. Remaining:`, this.annotations.size);
|
|
223
252
|
}
|
|
224
253
|
/**
|
|
225
254
|
* Remove all annotations
|
|
226
255
|
*/
|
|
227
256
|
clearAnnotations() {
|
|
228
|
-
|
|
229
|
-
|
|
257
|
+
// Clear all color highlights
|
|
258
|
+
for (const colorHighlight of this.colorHighlights.values()) {
|
|
259
|
+
colorHighlight.clear();
|
|
230
260
|
}
|
|
261
|
+
// Clear annotation data
|
|
262
|
+
this.annotations.clear();
|
|
231
263
|
}
|
|
232
264
|
/**
|
|
233
265
|
* Get all annotations
|
|
@@ -251,47 +283,55 @@ export class HighlightCoordinator {
|
|
|
251
283
|
const annotation = this.annotations.get(id);
|
|
252
284
|
if (!annotation)
|
|
253
285
|
return;
|
|
254
|
-
|
|
255
|
-
|
|
286
|
+
const oldColor = annotation.color;
|
|
287
|
+
if (oldColor === newColor)
|
|
288
|
+
return;
|
|
289
|
+
// Remove from old color highlight
|
|
290
|
+
const oldColorHighlight = this.colorHighlights.get(oldColor);
|
|
291
|
+
if (oldColorHighlight) {
|
|
292
|
+
oldColorHighlight.delete(annotation.range);
|
|
293
|
+
}
|
|
256
294
|
// Update color
|
|
257
295
|
annotation.color = newColor;
|
|
258
|
-
//
|
|
259
|
-
const
|
|
260
|
-
if (
|
|
261
|
-
|
|
296
|
+
// Add to new color highlight
|
|
297
|
+
const newColorHighlight = this.colorHighlights.get(newColor);
|
|
298
|
+
if (newColorHighlight) {
|
|
299
|
+
newColorHighlight.add(annotation.range);
|
|
262
300
|
}
|
|
263
301
|
}
|
|
264
302
|
/**
|
|
265
|
-
* Export annotations as serializable data
|
|
303
|
+
* Export annotations as serializable data for persistence.
|
|
304
|
+
* Uses RangeSerializer for robust DOM range serialization.
|
|
305
|
+
*
|
|
306
|
+
* @param root Root element for serialization (typically document.body or content container)
|
|
307
|
+
* @returns Array of serialized annotations
|
|
266
308
|
*/
|
|
267
|
-
exportAnnotations() {
|
|
268
|
-
// Note: This is a simplified export. Production implementation
|
|
269
|
-
// would need a robust way to serialize DOM ranges.
|
|
309
|
+
exportAnnotations(root = document.body) {
|
|
270
310
|
return this.getAnnotations().map((annotation) => ({
|
|
311
|
+
...this.rangeSerializer.serialize(annotation.range, root),
|
|
271
312
|
id: annotation.id,
|
|
272
|
-
startContainer: this.getNodePath(annotation.range.startContainer),
|
|
273
|
-
startOffset: annotation.range.startOffset,
|
|
274
|
-
endContainer: this.getNodePath(annotation.range.endContainer),
|
|
275
|
-
endOffset: annotation.range.endOffset,
|
|
276
313
|
color: annotation.color,
|
|
277
314
|
timestamp: annotation.timestamp,
|
|
278
315
|
}));
|
|
279
316
|
}
|
|
280
317
|
/**
|
|
281
|
-
*
|
|
318
|
+
* Import annotations from serialized data.
|
|
319
|
+
* Restores annotations after page navigation or refresh.
|
|
320
|
+
*
|
|
321
|
+
* @param data Array of serialized annotations
|
|
322
|
+
* @param root Root element for deserialization (same as used in export)
|
|
323
|
+
* @returns Number of successfully restored annotations
|
|
282
324
|
*/
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
if (
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
path.unshift(`${current.nodeName}[${index}]`);
|
|
325
|
+
importAnnotations(data, root = document.body) {
|
|
326
|
+
let restored = 0;
|
|
327
|
+
for (const item of data) {
|
|
328
|
+
const range = this.rangeSerializer.deserialize(item, root);
|
|
329
|
+
if (range) {
|
|
330
|
+
this.addAnnotation(range, item.color);
|
|
331
|
+
restored++;
|
|
291
332
|
}
|
|
292
|
-
current = current.parentNode;
|
|
293
333
|
}
|
|
294
|
-
return
|
|
334
|
+
return restored;
|
|
295
335
|
}
|
|
296
336
|
// ============================================================================
|
|
297
337
|
// IHighlightCoordinator Interface Implementation
|
|
@@ -424,6 +464,13 @@ export class HighlightCoordinator {
|
|
|
424
464
|
background-color: rgba(255, 165, 0, 0.3);
|
|
425
465
|
color: inherit;
|
|
426
466
|
}
|
|
467
|
+
|
|
468
|
+
::highlight(annotation-underline) {
|
|
469
|
+
background-color: transparent;
|
|
470
|
+
text-decoration: underline 2px solid #0066cc;
|
|
471
|
+
text-underline-offset: 2px;
|
|
472
|
+
color: inherit;
|
|
473
|
+
}
|
|
427
474
|
`;
|
|
428
475
|
}
|
|
429
476
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightCoordinator.js","sourceRoot":"","sources":["../../src/services/HighlightCoordinator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HighlightCoordinator.js","sourceRoot":"","sources":["../../src/services/HighlightCoordinator.ts"],"names":[],"mappings":"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"}
|