@prose-reader/enhancer-annotations 1.122.0 → 1.124.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,10 +26,15 @@ export declare class Commands extends DestroyableClass {
26
26
  id: string;
27
27
  data: Pick<HighlightParams, "color" | "contents">;
28
28
  }>;
29
+ readonly select$: import('rxjs').Observable<{
30
+ type: "select";
31
+ id: string | undefined;
32
+ }>;
29
33
  highlight: (params: HighlightParams) => void;
30
34
  add: (data: Highlight | Highlight[]) => void;
31
35
  delete: (id: string) => void;
32
36
  update: (id: string, data: Pick<HighlightParams, "color" | "contents">) => void;
37
+ select: (id: string | undefined) => void;
33
38
  destroy(): void;
34
39
  }
35
40
  export {};
@@ -11,6 +11,7 @@ export declare const annotationsEnhancer: <InheritOptions, InheritOutput extends
11
11
  add: Commands["add"];
12
12
  delete: Commands["delete"];
13
13
  update: Commands["update"];
14
+ select: Commands["select"];
14
15
  isTargetWithinHighlight: (target: EventTarget) => boolean;
15
16
  };
16
17
  };
@@ -5,9 +5,10 @@ import { SpineItemHighlights } from './SpineItemHighlights';
5
5
  export declare class ReaderHighlights extends DestroyableClass {
6
6
  private reader;
7
7
  private highlights;
8
+ private selectedHighlight;
8
9
  private spineItemHighlights;
9
10
  tap$: SpineItemHighlights["tap$"];
10
- constructor(reader: Reader, highlights: BehaviorSubject<Highlight[]>);
11
+ constructor(reader: Reader, highlights: BehaviorSubject<Highlight[]>, selectedHighlight: BehaviorSubject<string | undefined>);
11
12
  getHighlightsForTarget: (target: EventTarget) => import('../types').RuntimeHighlight[];
12
13
  isTargetWithinHighlight: (target: EventTarget) => boolean;
13
14
  }
@@ -6,12 +6,13 @@ export declare class SpineItemHighlight extends DestroyableClass {
6
6
  private containerElement;
7
7
  private reader;
8
8
  readonly highlight: RuntimeHighlight;
9
+ private isSelected;
9
10
  private container;
10
11
  readonly tap$: Observable<{
11
12
  event: Event;
12
13
  highlight: RuntimeHighlight;
13
14
  }>;
14
- constructor(spineItem: SpineItem, containerElement: HTMLElement, reader: Reader, highlight: RuntimeHighlight);
15
+ constructor(spineItem: SpineItem, containerElement: HTMLElement, reader: Reader, highlight: RuntimeHighlight, isSelected: Observable<boolean>);
15
16
  render(): void;
16
17
  isWithinTarget(target: Node): boolean;
17
18
  destroy(): void;
@@ -6,10 +6,11 @@ export declare class SpineItemHighlights extends DestroyableClass {
6
6
  private annotations$;
7
7
  private spineItem;
8
8
  private reader;
9
+ private selectedHighlight;
9
10
  private layer;
10
11
  private highlights;
11
12
  readonly tap$: SpineItemHighlight["tap$"];
12
- constructor(annotations$: Observable<RuntimeHighlight[]>, spineItem: SpineItem, reader: Reader);
13
+ constructor(annotations$: Observable<RuntimeHighlight[]>, spineItem: SpineItem, reader: Reader, selectedHighlight: Observable<string | undefined>);
13
14
  layout(): void;
14
15
  getHighlightsForTarget(target: EventTarget): SpineItemHighlight[];
15
16
  destroy(): void;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { fromEvent, map, share, switchMap, of, shareReplay, takeUntil, merge, BehaviorSubject, Subject, filter, tap } from 'rxjs';
1
+ import { fromEvent, map, share, skip, tap, takeUntil, switchMap, distinctUntilChanged, of, shareReplay, merge, BehaviorSubject, Subject, filter } from 'rxjs';
2
2
  import { DestroyableClass } from '@prose-reader/core';
3
3
 
4
4
  const c = "@prose-reader", i = (e) => `[${e}]`, p = (e, n) => ({
@@ -84,12 +84,13 @@ const layoutAnnotationLayer = (layer, annotationLayer) => {
84
84
  };
85
85
 
86
86
  class SpineItemHighlight extends DestroyableClass {
87
- constructor(spineItem, containerElement, reader, highlight) {
87
+ constructor(spineItem, containerElement, reader, highlight, isSelected) {
88
88
  super();
89
89
  this.spineItem = spineItem;
90
90
  this.containerElement = containerElement;
91
91
  this.reader = reader;
92
92
  this.highlight = highlight;
93
+ this.isSelected = isSelected;
93
94
  void this.spineItem;
94
95
  this.container = this.containerElement.ownerDocument.createElement("div");
95
96
  this.container.dataset["highlightContainer"] = this.highlight.id;
@@ -99,6 +100,17 @@ class SpineItemHighlight extends DestroyableClass {
99
100
  share()
100
101
  );
101
102
  this.render();
103
+ this.isSelected.pipe(
104
+ skip(1),
105
+ tap((isSelected2) => {
106
+ Array.from(this.container.children).forEach((child) => {
107
+ if (child instanceof HTMLElement) {
108
+ child.style.border = isSelected2 ? "3px dashed red" : "none";
109
+ }
110
+ });
111
+ }),
112
+ takeUntil(this.destroy$)
113
+ ).subscribe();
102
114
  }
103
115
  container;
104
116
  tap$;
@@ -134,11 +146,12 @@ class SpineItemHighlight extends DestroyableClass {
134
146
  }
135
147
 
136
148
  class SpineItemHighlights extends DestroyableClass {
137
- constructor(annotations$, spineItem, reader) {
149
+ constructor(annotations$, spineItem, reader, selectedHighlight) {
138
150
  super();
139
151
  this.annotations$ = annotations$;
140
152
  this.spineItem = spineItem;
141
153
  this.reader = reader;
154
+ this.selectedHighlight = selectedHighlight;
142
155
  const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement("div");
143
156
  this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement);
144
157
  const highlights$ = this.annotations$.pipe(
@@ -147,7 +160,12 @@ class SpineItemHighlights extends DestroyableClass {
147
160
  this.highlights = [];
148
161
  annotations.forEach((annotation) => {
149
162
  if (annotation.itemId !== this.spineItem.item.id) return;
150
- this.highlights.push(new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation));
163
+ const isSelected$ = this.selectedHighlight.pipe(
164
+ map((id) => id === annotation.id),
165
+ distinctUntilChanged()
166
+ );
167
+ const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$);
168
+ this.highlights.push(spineItemHighlight);
151
169
  });
152
170
  return of(this.highlights);
153
171
  }),
@@ -175,17 +193,18 @@ class SpineItemHighlights extends DestroyableClass {
175
193
  }
176
194
 
177
195
  class ReaderHighlights extends DestroyableClass {
178
- constructor(reader, highlights) {
196
+ constructor(reader, highlights, selectedHighlight) {
179
197
  super();
180
198
  this.reader = reader;
181
199
  this.highlights = highlights;
200
+ this.selectedHighlight = selectedHighlight;
182
201
  this.reader.hookManager.register("item.onDocumentLoad", ({ itemId, destroy }) => {
183
202
  const spineItem = reader.spineItemsManager.get(itemId);
184
203
  if (!spineItem) return;
185
204
  const spineItemHighlights$ = this.highlights.pipe(
186
205
  map((highlights2) => highlights2.filter((highlight) => highlight.itemId === itemId))
187
206
  );
188
- const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader);
207
+ const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight);
189
208
  this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights]);
190
209
  const deregister = reader.hookManager.register("item.onAfterLayout", ({ item }) => {
191
210
  if (item.id !== itemId) return;
@@ -215,6 +234,7 @@ class Commands extends DestroyableClass {
215
234
  add$ = this.commandSubject.pipe(filter((command) => command.type === "add"));
216
235
  delete$ = this.commandSubject.pipe(filter((command) => command.type === "delete"));
217
236
  update$ = this.commandSubject.pipe(filter((command) => command.type === "update"));
237
+ select$ = this.commandSubject.pipe(filter((command) => command.type === "select"));
218
238
  highlight = (params) => {
219
239
  this.commandSubject.next({ type: "highlight", data: params });
220
240
  };
@@ -227,6 +247,9 @@ class Commands extends DestroyableClass {
227
247
  update = (id, data) => {
228
248
  this.commandSubject.next({ type: "update", id, data });
229
249
  };
250
+ select = (id) => {
251
+ this.commandSubject.next({ type: "select", id });
252
+ };
230
253
  destroy() {
231
254
  super.destroy();
232
255
  this.commandSubject.complete();
@@ -237,6 +260,8 @@ const annotationsEnhancer = (next) => (options) => {
237
260
  const reader = next(options);
238
261
  const commands = new Commands();
239
262
  const highlightsSubject = new BehaviorSubject([]);
263
+ const selectedHighlightSubject = new BehaviorSubject(void 0);
264
+ const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
240
265
  const highlight$ = commands.highlight$.pipe(
241
266
  tap(({ data: { itemId, selection, ...rest } }) => {
242
267
  const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection });
@@ -262,13 +287,18 @@ const annotationsEnhancer = (next) => (options) => {
262
287
  );
263
288
  })
264
289
  );
290
+ const select$ = commands.select$.pipe(
291
+ tap(({ id }) => {
292
+ selectedHighlightSubject.next(id);
293
+ })
294
+ );
265
295
  const annotations$ = highlightsSubject.asObservable();
266
- const readerHighlights = new ReaderHighlights(reader, highlightsSubject);
267
296
  merge(
268
297
  highlight$,
269
298
  add$,
270
299
  delete$,
271
300
  update$,
301
+ select$,
272
302
  annotations$.pipe(
273
303
  tap((annotations) => {
274
304
  report.debug("annotations", annotations);
@@ -290,7 +320,8 @@ const annotationsEnhancer = (next) => (options) => {
290
320
  highlight: commands.highlight,
291
321
  add: commands.add,
292
322
  delete: commands.delete,
293
- update: commands.update
323
+ update: commands.update,
324
+ select: commands.select
294
325
  }
295
326
  };
296
327
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nconst E = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","import { report } from \"../report\"\n\nexport const getElementsForRange = (range: Range, container: HTMLElement) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectElt.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n opacity: 50%;\n `\n\n return rectElt\n })\n}\n\nexport const getRangeFromSelection = (\n overlayElement: HTMLElement,\n anchor: { node: Node; offset?: number },\n focus: { node: Node; offset?: number },\n) => {\n const range = overlayElement.ownerDocument.createRange()\n const comparison = anchor.node.compareDocumentPosition(focus.node)\n\n try {\n // If focus comes before anchor in the document\n if (comparison & Node.DOCUMENT_POSITION_PRECEDING) {\n range.setStart(focus.node, focus.offset || 0)\n range.setEnd(anchor.node, anchor.offset || 0)\n // If focus comes after anchor in the document\n } else if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStart(anchor.node, anchor.offset || 0)\n range.setEnd(focus.node, focus.offset || 0)\n }\n // If they're the same node\n else {\n const startOffset = Math.min(anchor.offset || 0, focus.offset || 0)\n const endOffset = Math.max(anchor.offset || 0, focus.offset || 0)\n range.setStart(anchor.node, startOffset)\n range.setEnd(anchor.node, endOffset)\n }\n } catch (e) {\n report.error(e)\n }\n\n return range\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n// annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { RuntimeHighlight } from \"../types\"\nimport { getElementsForRange, getRangeFromSelection } from \"./utils\"\nimport { report } from \"../report\"\nimport { fromEvent, map, Observable, share } from \"rxjs\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: RuntimeHighlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeHighlight,\n ) {\n super()\n\n void this.spineItem\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const { node: anchorNode, offset: anchorOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.anchorCfi ?? `` }) ?? {}\n const { node: focusNode, offset: focusOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.focusCfi ?? `` }) ?? {}\n\n if (!anchorNode || !focusNode) {\n report.error(`Unable to resolve anchor cfi: ${this.highlight.anchorCfi}`)\n\n return\n }\n\n const range = getRangeFromSelection(\n this.containerElement,\n { node: anchorNode, offset: anchorOffset },\n { node: focusNode, offset: focusOffset },\n )\n\n const rectElements = getElementsForRange(range, this.container)\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.style.backgroundColor = this.highlight.color ?? \"yellow\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { RuntimeHighlight } from \"../types\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private annotations$: Observable<RuntimeHighlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const highlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemId !== this.spineItem.item.id) return\n\n this.highlights.push(new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation))\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = highlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { Highlight } from \"../types\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemId === itemId)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n const deregister = reader.hookManager.register(\"item.onAfterLayout\", ({ item }) => {\n if (item.id !== itemId) return\n\n spineItemHighlights.layout()\n })\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n\n deregister()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { Highlight } from \"./types\"\n\ntype HighlightParams = { document: Document; selection: Selection; itemId: string; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: Highlight | Highlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: Highlight | Highlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable } from \"rxjs\"\nimport { report } from \"./report\"\nimport { RuntimeHighlight } from \"./types\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n annotations$: Observable<RuntimeHighlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<RuntimeHighlight[]>([])\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemId, selection, ...rest } }) => {\n const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection })\n\n const annotation = { anchorCfi, focusCfi, itemId, id: window.crypto.randomUUID(), ...rest }\n\n highlightsSubject.next([...highlightsSubject.getValue(), annotation])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...annotations])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => (highlight.id === id ? { ...highlight, ...data } : highlight)),\n )\n }),\n )\n\n const annotations$ = highlightsSubject.asObservable()\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject)\n\n merge(\n highlight$,\n add$,\n delete$,\n update$,\n annotations$.pipe(\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n },\n }\n }\n"],"names":["Report","highlights"],"mappings":";;;AA2EA,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM;AAC/D,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,oBAAoB,MAAM,CAAC,CAAC,GAAG,MAAM;AACtF,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjJ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,oBAAoB,MAAM,CAAC,CAAC,GAAG,MAAM;AACrF,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/I,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,oBAAoB,MAAM,CAAC,CAAC,GAAG,MAAM;AACtF,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChJ,CAAC,CAAC,EAAE,CAAC,GAAG;AACR,EAAE,GAAG,CAAC,EAAE;AACR,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;;ACnFD,MAAM,gBAAmB,GAAA,IAAA;AAElB,MAAM,MAAS,GAAAA,CAAA,CAAO,SAAU,CAAA,CAAA,oBAAA,CAAA,EAAwB,gBAAgB,CAAA;;ACFlE,MAAA,mBAAA,GAAsB,CAAC,KAAA,EAAc,SAA2B,KAAA;AAE3E,EAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,IAAK,CAAA,KAAA,CAAM,gBAAgB,CAAA;AAC/C,EAAM,MAAA,UAAA,uBAAiB,GAAuB,EAAA;AAE9C,EAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACtB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAI,CAAA,KAAK,CAAG,EAAA;AAC1B,MAAW,UAAA,CAAA,GAAA,CAAI,KAAO,EAAA,EAAE,CAAA;AAAA;AAE1B,IAAA,UAAA,CAAW,GAAI,CAAA,KAAK,CAAG,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,GACjC,CAAA;AAGD,EAAO,OAAA,KAAA,CAAM,KAAK,UAAW,CAAA,MAAA,EAAQ,CAAE,CAAA,GAAA,CAAI,CAAC,SAAc,KAAA;AAExD,IAAM,MAAA,IAAA,GAAO,IAAK,CAAA,GAAA,CAAI,GAAG,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAE,CAAA,IAAI,CAAC,CAAA;AACrD,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,GAAA,CAAI,GAAG,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAE,CAAA,KAAK,CAAC,CAAA;AACvD,IAAM,MAAA,GAAA,GAAM,SAAU,CAAA,CAAC,CAAG,EAAA,GAAA;AAC1B,IAAM,MAAA,MAAA,GAAS,SAAU,CAAA,CAAC,CAAG,EAAA,MAAA;AAE7B,IAAA,MAAM,OAAU,GAAA,SAAA,CAAU,aAAc,CAAA,aAAA,CAAc,KAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,MAAM,OAAU,GAAA;AAAA;AAAA,eAAA,EAEX,QAAQ,IAAI,CAAA;AAAA,gBAAA,EACX,MAAM,CAAA;AAAA,aAAA,EACT,GAAG,CAAA;AAAA,cAAA,EACF,IAAI,CAAA;AAAA;AAAA,IAAA,CAAA;AAIhB,IAAO,OAAA,OAAA;AAAA,GACR,CAAA;AACH,CAAA;AAEO,MAAM,qBAAwB,GAAA,CACnC,cACA,EAAA,MAAA,EACA,KACG,KAAA;AACH,EAAM,MAAA,KAAA,GAAQ,cAAe,CAAA,aAAA,CAAc,WAAY,EAAA;AACvD,EAAA,MAAM,UAAa,GAAA,MAAA,CAAO,IAAK,CAAA,uBAAA,CAAwB,MAAM,IAAI,CAAA;AAEjE,EAAI,IAAA;AAEF,IAAI,IAAA,UAAA,GAAa,KAAK,2BAA6B,EAAA;AACjD,MAAA,KAAA,CAAM,QAAS,CAAA,KAAA,CAAM,IAAM,EAAA,KAAA,CAAM,UAAU,CAAC,CAAA;AAC5C,MAAA,KAAA,CAAM,MAAO,CAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,KAE9C,MAAA,IAAW,UAAa,GAAA,IAAA,CAAK,2BAA6B,EAAA;AACxD,MAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,UAAU,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,MAAO,CAAA,KAAA,CAAM,IAAM,EAAA,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,KAGvC,MAAA;AACH,MAAM,MAAA,WAAA,GAAc,KAAK,GAAI,CAAA,MAAA,CAAO,UAAU,CAAG,EAAA,KAAA,CAAM,UAAU,CAAC,CAAA;AAClE,MAAM,MAAA,SAAA,GAAY,KAAK,GAAI,CAAA,MAAA,CAAO,UAAU,CAAG,EAAA,KAAA,CAAM,UAAU,CAAC,CAAA;AAChE,MAAM,KAAA,CAAA,QAAA,CAAS,MAAO,CAAA,IAAA,EAAM,WAAW,CAAA;AACvC,MAAM,KAAA,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA,EAAM,SAAS,CAAA;AAAA;AACrC,WACO,CAAG,EAAA;AACV,IAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA;AAGhB,EAAO,OAAA,KAAA;AACT,CAAA;AAEa,MAAA,iBAAA,GAAoB,CAAC,MAAA,EAAqB,MAAwB,KAAA;AAC7E,EAAO,MAAA,CAAA,KAAA,CAAM,OAAU,GAAA,MAAA,CAAO,KAAM,CAAA,OAAA;AACtC,CAAA;AAEa,MAAA,qBAAA,GAAwB,CAAC,SAAA,EAAwB,KAAuB,KAAA;AACnF,EAAA,MAAM,eAAkB,GAAA,SAAA,CAAU,aAAc,CAAA,aAAA,CAAc,KAAK,CAAA;AAEnE,EAAA,qBAAA,CAAsB,OAAO,eAAe,CAAA;AAE5C,EAAA,SAAA,CAAU,YAAY,eAAe,CAAA;AAErC,EAAO,OAAA,eAAA;AACT,CAAA;AAEa,MAAA,qBAAA,GAAwB,CAAC,KAAA,EAAoB,eAAiC,KAAA;AACzF,EAAA,iBAAA,CAAkB,OAAO,eAAe,CAAA;AAExC,EAAI,IAAA,KAAA,CAAM,KAAM,CAAA,QAAA,KAAa,EAAI,EAAA;AAC/B,IAAA,eAAA,CAAgB,MAAM,QAAW,GAAA,UAAA;AACjC,IAAA,eAAA,CAAgB,MAAM,GAAM,GAAA,GAAA;AAAA;AAI9B,EAAA,eAAA,CAAgB,MAAM,OAAU,GAAA,GAAA;AAChC,EAAA,eAAA,CAAgB,MAAM,aAAgB,GAAA,MAAA;AACxC,CAAA;;ACxFO,MAAM,2BAA2B,gBAAiB,CAAA;AAAA,EAKvD,WACU,CAAA,SAAA,EACA,gBACA,EAAA,MAAA,EACQ,SAChB,EAAA;AACA,IAAM,KAAA,EAAA;AALE,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACQ,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIhB,IAAA,KAAK,IAAK,CAAA,SAAA;AAEV,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,gBAAiB,CAAA,aAAA,CAAc,cAAc,KAAK,CAAA;AACxE,IAAA,IAAA,CAAK,SAAU,CAAA,OAAA,CAAQ,oBAAoB,CAAA,GAAI,KAAK,SAAU,CAAA,EAAA;AAC9D,IAAK,IAAA,CAAA,gBAAA,CAAiB,WAAY,CAAA,IAAA,CAAK,SAAS,CAAA;AAEhD,IAAA,IAAA,CAAK,IAAO,GAAA,SAAA,CAAU,IAAK,CAAA,SAAA,EAAW,OAAO,CAAE,CAAA,IAAA;AAAA,MAC7C,GAAA,CAAI,CAAC,KAAW,MAAA,EAAE,OAAO,SAAW,EAAA,IAAA,CAAK,WAAY,CAAA,CAAA;AAAA,MACrD,KAAM;AAAA,KACR;AAEA,IAAA,IAAA,CAAK,MAAO,EAAA;AAAA;AACd,EAxBQ,SAAA;AAAA,EAEQ,IAAA;AAAA,EAwBT,MAAS,GAAA;AACd,IAAA,IAAA,CAAK,UAAU,SAAY,GAAA,EAAA;AAE3B,IAAA,MAAM,EAAE,IAAM,EAAA,UAAA,EAAY,QAAQ,YAAa,EAAA,GAAI,KAAK,MAAO,CAAA,GAAA,CAAI,UAAW,CAAA,EAAE,KAAK,IAAK,CAAA,SAAA,CAAU,aAAa,CAAG,CAAA,EAAC,KAAK,EAAC;AAC3H,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,QAAQ,WAAY,EAAA,GAAI,KAAK,MAAO,CAAA,GAAA,CAAI,UAAW,CAAA,EAAE,KAAK,IAAK,CAAA,SAAA,CAAU,YAAY,CAAG,CAAA,EAAC,KAAK,EAAC;AAExH,IAAI,IAAA,CAAC,UAAc,IAAA,CAAC,SAAW,EAAA;AAC7B,MAAA,MAAA,CAAO,KAAM,CAAA,CAAA,8BAAA,EAAiC,IAAK,CAAA,SAAA,CAAU,SAAS,CAAE,CAAA,CAAA;AAExE,MAAA;AAAA;AAGF,IAAA,MAAM,KAAQ,GAAA,qBAAA;AAAA,MACZ,IAAK,CAAA,gBAAA;AAAA,MACL,EAAE,IAAA,EAAM,UAAY,EAAA,MAAA,EAAQ,YAAa,EAAA;AAAA,MACzC,EAAE,IAAA,EAAM,SAAW,EAAA,MAAA,EAAQ,WAAY;AAAA,KACzC;AAEA,IAAA,MAAM,YAAe,GAAA,mBAAA,CAAoB,KAAO,EAAA,IAAA,CAAK,SAAS,CAAA;AAE9D,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AAC5B,MAAA,GAAA,CAAI,MAAM,aAAgB,GAAA,SAAA;AAC1B,MAAA,GAAA,CAAI,MAAM,MAAS,GAAA,SAAA;AACnB,MAAA,GAAA,CAAI,KAAM,CAAA,eAAA,GAAkB,IAAK,CAAA,SAAA,CAAU,KAAS,IAAA,QAAA;AACpD,MAAA,GAAA,CAAI,OAAQ,CAAA,eAAe,CAAI,GAAA,IAAA,CAAK,SAAU,CAAA,EAAA;AAE9C,MAAK,IAAA,CAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAAA,KAC/B,CAAA;AAAA;AACH,EAEA,eAAe,MAAc,EAAA;AAC3B,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,QAAA,CAAS,MAAM,CAAA;AAAA;AACvC,EAEO,OAAU,GAAA;AACf,IAAA,KAAA,CAAM,OAAQ,EAAA;AAEd,IAAA,IAAA,CAAK,UAAU,MAAO,EAAA;AAAA;AAE1B;;AClEO,MAAM,4BAA4B,gBAAiB,CAAA;AAAA,EAMxD,WAAA,CACU,YACA,EAAA,SAAA,EACA,MACR,EAAA;AACA,IAAM,KAAA,EAAA;AAJE,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIR,IAAM,MAAA,iBAAA,GAAoB,UAAU,QAAS,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,OAAA,IAAW,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA;AAE/F,IAAA,IAAA,CAAK,KAAQ,GAAA,qBAAA,CAAsB,IAAK,CAAA,SAAA,CAAU,kBAAkB,iBAAiB,CAAA;AAErF,IAAM,MAAA,WAAA,GAAc,KAAK,YAAa,CAAA,IAAA;AAAA,MACpC,SAAA,CAAU,CAAC,WAAgB,KAAA;AACzB,QAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,CAAC,SAAc,KAAA,SAAA,CAAU,SAAS,CAAA;AAC1D,QAAA,IAAA,CAAK,aAAa,EAAC;AAEnB,QAAY,WAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AAClC,UAAA,IAAI,UAAW,CAAA,MAAA,KAAW,IAAK,CAAA,SAAA,CAAU,KAAK,EAAI,EAAA;AAElD,UAAK,IAAA,CAAA,UAAA,CAAW,IAAK,CAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,SAAW,EAAA,IAAA,CAAK,KAAO,EAAA,IAAA,CAAK,MAAQ,EAAA,UAAU,CAAC,CAAA;AAAA,SACjG,CAAA;AAED,QAAO,OAAA,EAAA,CAAG,KAAK,UAAU,CAAA;AAAA,OAC1B,CAAA;AAAA,MACD,YAAY,CAAC,CAAA;AAAA,MACb,SAAA,CAAU,KAAK,QAAQ;AAAA,KACzB;AAEA,IAAA,IAAA,CAAK,OAAO,WAAY,CAAA,IAAA,CAAK,SAAU,CAAA,CAAC,eAAe,KAAM,CAAA,GAAG,UAAW,CAAA,GAAA,CAAI,CAAC,SAAc,KAAA,SAAA,CAAU,IAAI,CAAC,CAAC,CAAC,CAAA;AAE/G,IAAA,WAAA,CAAY,SAAU,EAAA;AAAA;AACxB,EApCQ,KAAA;AAAA,EACA,aAAmC,EAAC;AAAA,EAE5B,IAAA;AAAA,EAmChB,MAAS,GAAA;AACP,IAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,OAAA,IAAW,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA;AAEpG,IAAsB,qBAAA,CAAA,iBAAA,EAAmB,KAAK,KAAK,CAAA;AAEnD,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,CAAC,SAAc,KAAA,SAAA,CAAU,QAAQ,CAAA;AAAA;AAC3D,EAEA,uBAAuB,MAAqB,EAAA;AAC1C,IAAO,OAAA,IAAA,CAAK,UAAW,CAAA,MAAA,CAAO,CAAC,SAAA,KAAc,kBAAkB,IAAQ,IAAA,SAAA,CAAU,cAAe,CAAA,MAAM,CAAC,CAAA;AAAA;AACzG,EAEA,OAAU,GAAA;AACR,IAAA,KAAA,CAAM,OAAQ,EAAA;AAEd,IAAA,IAAA,CAAK,MAAM,MAAO,EAAA;AAAA;AAEtB;;ACzDO,MAAM,yBAAyB,gBAAiB,CAAA;AAAA,EAKrD,WAAA,CACU,QACA,UACR,EAAA;AACA,IAAM,KAAA,EAAA;AAHE,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAIR,IAAK,IAAA,CAAA,MAAA,CAAO,YAAY,QAAS,CAAA,qBAAA,EAAuB,CAAC,EAAE,MAAA,EAAQ,SAAc,KAAA;AAC/E,MAAA,MAAM,SAAY,GAAA,MAAA,CAAO,iBAAkB,CAAA,GAAA,CAAI,MAAM,CAAA;AAErD,MAAA,IAAI,CAAC,SAAW,EAAA;AAEhB,MAAM,MAAA,oBAAA,GAAuB,KAAK,UAAW,CAAA,IAAA;AAAA,QAC3C,GAAA,CAAI,CAACC,WAAAA,KAAeA,WAAW,CAAA,MAAA,CAAO,CAAC,SAAc,KAAA,SAAA,CAAU,MAAW,KAAA,MAAM,CAAC;AAAA,OACnF;AAEA,MAAA,MAAM,mBAAsB,GAAA,IAAI,mBAAoB,CAAA,oBAAA,EAAsB,WAAW,MAAM,CAAA;AAE3F,MAAK,IAAA,CAAA,mBAAA,CAAoB,KAAK,CAAC,GAAG,KAAK,mBAAoB,CAAA,QAAA,EAAY,EAAA,mBAAmB,CAAC,CAAA;AAE3F,MAAM,MAAA,UAAA,GAAa,OAAO,WAAY,CAAA,QAAA,CAAS,sBAAsB,CAAC,EAAE,MAAW,KAAA;AACjF,QAAI,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA;AAExB,QAAA,mBAAA,CAAoB,MAAO,EAAA;AAAA,OAC5B,CAAA;AAED,MAAA,OAAA,CAAQ,MAAM;AACZ,QAAK,IAAA,CAAA,mBAAA,CAAoB,IAAK,CAAA,IAAA,CAAK,mBAAoB,CAAA,QAAA,EAAW,CAAA,MAAA,CAAO,CAAC,KAAA,KAAU,KAAU,KAAA,mBAAmB,CAAC,CAAA;AAElH,QAAA,mBAAA,CAAoB,OAAQ,EAAA;AAE5B,QAAW,UAAA,EAAA;AAAA,OACZ,CAAA;AAAA,KACF,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAK,CAAA,mBAAA,CAAoB,IAAK,CAAA,SAAA,CAAU,CAAC,MAAW,KAAA,KAAA,CAAM,GAAG,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;AAAA;AAC9G,EAvCQ,mBAAsB,GAAA,IAAI,eAAuC,CAAA,EAAE,CAAA;AAAA,EAEpE,IAAA;AAAA,EAuCP,sBAAA,GAAyB,CAAC,MAAwB,KAAA;AAChD,IAAA,OAAO,KAAK,mBACT,CAAA,QAAA,EACA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA,KAAA,CAAM,sBAAuB,CAAA,MAAM,CAAC,CACvD,CAAA,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,SAAS,CAAA;AAAA,GAC7C;AAAA,EAEA,uBAAA,GAA0B,CAAC,MAAwB,KAAA;AACjD,IAAA,OAAO,CAAC,CAAC,IAAK,CAAA,sBAAA,CAAuB,MAAM,CAAE,CAAA,MAAA;AAAA,GAC/C;AACF;;AC7CO,MAAM,iBAAiB,gBAAiB,CAAA;AAAA,EACrC,cAAA,GAAiB,IAAI,OAAiB,EAAA;AAAA,EAE9B,UAAA,GAAa,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAS,KAAA,WAAW,CAAC,CAAA;AAAA,EACvF,IAAA,GAAO,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAS,KAAA,KAAK,CAAC,CAAA;AAAA,EAC3E,OAAA,GAAU,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAS,KAAA,QAAQ,CAAC,CAAA;AAAA,EACjF,OAAA,GAAU,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAS,KAAA,QAAQ,CAAC,CAAA;AAAA,EAEjG,SAAA,GAAY,CAAC,MAA4B,KAAA;AACvC,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,EAAE,MAAM,WAAa,EAAA,IAAA,EAAM,QAAQ,CAAA;AAAA,GAC9D;AAAA,EAEA,GAAA,GAAM,CAAC,IAAkC,KAAA;AACvC,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,EAAE,IAAM,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,GAChD;AAAA,EAEA,MAAA,GAAS,CAAC,EAAe,KAAA;AACvB,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,EAAE,IAAM,EAAA,QAAA,EAAU,IAAI,CAAA;AAAA,GACjD;AAAA,EAEA,MAAA,GAAS,CAAC,EAAA,EAAY,IAAsD,KAAA;AAC1E,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,EAAE,MAAM,QAAU,EAAA,EAAA,EAAI,MAAM,CAAA;AAAA,GACvD;AAAA,EAEA,OAAU,GAAA;AACR,IAAA,KAAA,CAAM,OAAQ,EAAA;AACd,IAAA,IAAA,CAAK,eAAe,QAAS,EAAA;AAAA;AAEjC;;ACjCO,MAAM,mBACX,GAAA,CAA+C,IAC/C,KAAA,CACE,OAWG,KAAA;AACH,EAAM,MAAA,MAAA,GAAS,KAAK,OAAO,CAAA;AAC3B,EAAM,MAAA,QAAA,GAAW,IAAI,QAAS,EAAA;AAC9B,EAAA,MAAM,iBAAoB,GAAA,IAAI,eAAoC,CAAA,EAAE,CAAA;AAEpE,EAAM,MAAA,UAAA,GAAa,SAAS,UAAW,CAAA,IAAA;AAAA,IACrC,GAAA,CAAI,CAAC,EAAE,IAAM,EAAA,EAAE,QAAQ,SAAW,EAAA,GAAG,IAAK,EAAA,EAAQ,KAAA;AAChD,MAAM,MAAA,EAAE,SAAW,EAAA,QAAA,EAAa,GAAA,MAAA,CAAO,UAAU,YAAa,CAAA,EAAE,MAAQ,EAAA,SAAA,EAAW,CAAA;AAEnF,MAAM,MAAA,UAAA,GAAa,EAAE,SAAA,EAAW,QAAU,EAAA,MAAA,EAAQ,EAAI,EAAA,MAAA,CAAO,MAAO,CAAA,UAAA,EAAc,EAAA,GAAG,IAAK,EAAA;AAE1F,MAAA,iBAAA,CAAkB,KAAK,CAAC,GAAG,kBAAkB,QAAS,EAAA,EAAG,UAAU,CAAC,CAAA;AAAA,KACrE;AAAA,GACH;AAEA,EAAM,MAAA,IAAA,GAAO,SAAS,IAAK,CAAA,IAAA;AAAA,IACzB,GAAI,CAAA,CAAC,EAAE,IAAA,EAAW,KAAA;AAChB,MAAA,MAAM,cAAc,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAI,GAAA,IAAA,GAAO,CAAC,IAAI,CAAA;AAEtD,MAAkB,iBAAA,CAAA,IAAA,CAAK,CAAC,GAAG,iBAAA,CAAkB,UAAY,EAAA,GAAG,WAAW,CAAC,CAAA;AAAA,KACzE;AAAA,GACH;AAEA,EAAM,MAAA,OAAA,GAAU,SAAS,OAAQ,CAAA,IAAA;AAAA,IAC/B,GAAI,CAAA,CAAC,EAAE,EAAA,EAAS,KAAA;AACd,MAAkB,iBAAA,CAAA,IAAA,CAAK,iBAAkB,CAAA,QAAA,EAAW,CAAA,MAAA,CAAO,CAAC,SAAc,KAAA,SAAA,CAAU,EAAO,KAAA,EAAE,CAAC,CAAA;AAAA,KAC/F;AAAA,GACH;AAEA,EAAM,MAAA,OAAA,GAAU,SAAS,OAAQ,CAAA,IAAA;AAAA,IAC/B,GAAI,CAAA,CAAC,EAAE,EAAA,EAAI,MAAW,KAAA;AACpB,MAAkB,iBAAA,CAAA,IAAA;AAAA,QAChB,iBAAkB,CAAA,QAAA,EAAW,CAAA,GAAA,CAAI,CAAC,SAAe,KAAA,SAAA,CAAU,EAAO,KAAA,EAAA,GAAK,EAAE,GAAG,SAAA,EAAW,GAAG,IAAA,KAAS,SAAU;AAAA,OAC/G;AAAA,KACD;AAAA,GACH;AAEA,EAAM,MAAA,YAAA,GAAe,kBAAkB,YAAa,EAAA;AAEpD,EAAA,MAAM,gBAAmB,GAAA,IAAI,gBAAiB,CAAA,MAAA,EAAQ,iBAAiB,CAAA;AAEvE,EAAA,KAAA;AAAA,IACE,UAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAa,CAAA,IAAA;AAAA,MACX,GAAA,CAAI,CAAC,WAAgB,KAAA;AACnB,QAAO,MAAA,CAAA,KAAA,CAAM,eAAe,WAAW,CAAA;AAAA,OACxC;AAAA;AACH,GACF,CACG,KAAK,SAAU,CAAA,MAAA,CAAO,EAAE,QAAQ,CAAC,EACjC,SAAU,EAAA;AAEb,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAS,MAAM;AACb,MAAA,iBAAA,CAAkB,QAAS,EAAA;AAC3B,MAAA,QAAA,CAAS,OAAQ,EAAA;AACjB,MAAA,gBAAA,CAAiB,OAAQ,EAAA;AACzB,MAAA,MAAA,CAAO,OAAQ,EAAA;AAAA,KACjB;AAAA,IACA,WAAa,EAAA;AAAA,MACX,YAAA;AAAA,MACA,eAAe,gBAAiB,CAAA,IAAA;AAAA,MAChC,yBAAyB,gBAAiB,CAAA,uBAAA;AAAA,MAC1C,WAAW,QAAS,CAAA,SAAA;AAAA,MACpB,KAAK,QAAS,CAAA,GAAA;AAAA,MACd,QAAQ,QAAS,CAAA,MAAA;AAAA,MACjB,QAAQ,QAAS,CAAA;AAAA;AACnB,GACF;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nconst E = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","import { report } from \"../report\"\n\nexport const getElementsForRange = (range: Range, container: HTMLElement) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectElt.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n opacity: 50%;\n `\n\n return rectElt\n })\n}\n\nexport const getRangeFromSelection = (\n overlayElement: HTMLElement,\n anchor: { node: Node; offset?: number },\n focus: { node: Node; offset?: number },\n) => {\n const range = overlayElement.ownerDocument.createRange()\n const comparison = anchor.node.compareDocumentPosition(focus.node)\n\n try {\n // If focus comes before anchor in the document\n if (comparison & Node.DOCUMENT_POSITION_PRECEDING) {\n range.setStart(focus.node, focus.offset || 0)\n range.setEnd(anchor.node, anchor.offset || 0)\n // If focus comes after anchor in the document\n } else if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStart(anchor.node, anchor.offset || 0)\n range.setEnd(focus.node, focus.offset || 0)\n }\n // If they're the same node\n else {\n const startOffset = Math.min(anchor.offset || 0, focus.offset || 0)\n const endOffset = Math.max(anchor.offset || 0, focus.offset || 0)\n range.setStart(anchor.node, startOffset)\n range.setEnd(anchor.node, endOffset)\n }\n } catch (e) {\n report.error(e)\n }\n\n return range\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n// annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { RuntimeHighlight } from \"../types\"\nimport { getElementsForRange, getRangeFromSelection } from \"./utils\"\nimport { report } from \"../report\"\nimport { fromEvent, map, Observable, share, skip, takeUntil, tap } from \"rxjs\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: RuntimeHighlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeHighlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected ? \"3px dashed red\" : \"none\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const { node: anchorNode, offset: anchorOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.anchorCfi ?? `` }) ?? {}\n const { node: focusNode, offset: focusOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.focusCfi ?? `` }) ?? {}\n\n if (!anchorNode || !focusNode) {\n report.error(`Unable to resolve anchor cfi: ${this.highlight.anchorCfi}`)\n\n return\n }\n\n const range = getRangeFromSelection(\n this.containerElement,\n { node: anchorNode, offset: anchorOffset },\n { node: focusNode, offset: focusOffset },\n )\n\n const rectElements = getElementsForRange(range, this.container)\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.style.backgroundColor = this.highlight.color ?? \"yellow\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { distinctUntilChanged, map, merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { RuntimeHighlight } from \"../types\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private annotations$: Observable<RuntimeHighlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const highlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemId !== this.spineItem.item.id) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$)\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = highlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { Highlight } from \"../types\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemId === itemId)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n const deregister = reader.hookManager.register(\"item.onAfterLayout\", ({ item }) => {\n if (item.id !== itemId) return\n\n spineItemHighlights.layout()\n })\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n\n deregister()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { Highlight } from \"./types\"\n\ntype HighlightParams = { document: Document; selection: Selection; itemId: string; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: Highlight | Highlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n public readonly select$ = this.commandSubject.pipe(filter((command) => command.type === \"select\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: Highlight | Highlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable } from \"rxjs\"\nimport { report } from \"./report\"\nimport { RuntimeHighlight } from \"./types\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n annotations$: Observable<RuntimeHighlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<RuntimeHighlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(undefined)\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemId, selection, ...rest } }) => {\n const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection })\n\n const annotation = { anchorCfi, focusCfi, itemId, id: window.crypto.randomUUID(), ...rest }\n\n highlightsSubject.next([...highlightsSubject.getValue(), annotation])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...annotations])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => (highlight.id === id ? { ...highlight, ...data } : highlight)),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const annotations$ = highlightsSubject.asObservable()\n\n merge(\n highlight$,\n add$,\n delete$,\n update$,\n select$,\n annotations$.pipe(\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","isSelected","highlights"],"mappings":"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"}
@@ -87,12 +87,13 @@
87
87
  };
88
88
 
89
89
  class SpineItemHighlight extends core.DestroyableClass {
90
- constructor(spineItem, containerElement, reader, highlight) {
90
+ constructor(spineItem, containerElement, reader, highlight, isSelected) {
91
91
  super();
92
92
  this.spineItem = spineItem;
93
93
  this.containerElement = containerElement;
94
94
  this.reader = reader;
95
95
  this.highlight = highlight;
96
+ this.isSelected = isSelected;
96
97
  void this.spineItem;
97
98
  this.container = this.containerElement.ownerDocument.createElement("div");
98
99
  this.container.dataset["highlightContainer"] = this.highlight.id;
@@ -102,6 +103,17 @@
102
103
  rxjs.share()
103
104
  );
104
105
  this.render();
106
+ this.isSelected.pipe(
107
+ rxjs.skip(1),
108
+ rxjs.tap((isSelected2) => {
109
+ Array.from(this.container.children).forEach((child) => {
110
+ if (child instanceof HTMLElement) {
111
+ child.style.border = isSelected2 ? "3px dashed red" : "none";
112
+ }
113
+ });
114
+ }),
115
+ rxjs.takeUntil(this.destroy$)
116
+ ).subscribe();
105
117
  }
106
118
  container;
107
119
  tap$;
@@ -137,11 +149,12 @@
137
149
  }
138
150
 
139
151
  class SpineItemHighlights extends core.DestroyableClass {
140
- constructor(annotations$, spineItem, reader) {
152
+ constructor(annotations$, spineItem, reader, selectedHighlight) {
141
153
  super();
142
154
  this.annotations$ = annotations$;
143
155
  this.spineItem = spineItem;
144
156
  this.reader = reader;
157
+ this.selectedHighlight = selectedHighlight;
145
158
  const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement("div");
146
159
  this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement);
147
160
  const highlights$ = this.annotations$.pipe(
@@ -150,7 +163,12 @@
150
163
  this.highlights = [];
151
164
  annotations.forEach((annotation) => {
152
165
  if (annotation.itemId !== this.spineItem.item.id) return;
153
- this.highlights.push(new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation));
166
+ const isSelected$ = this.selectedHighlight.pipe(
167
+ rxjs.map((id) => id === annotation.id),
168
+ rxjs.distinctUntilChanged()
169
+ );
170
+ const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$);
171
+ this.highlights.push(spineItemHighlight);
154
172
  });
155
173
  return rxjs.of(this.highlights);
156
174
  }),
@@ -178,17 +196,18 @@
178
196
  }
179
197
 
180
198
  class ReaderHighlights extends core.DestroyableClass {
181
- constructor(reader, highlights) {
199
+ constructor(reader, highlights, selectedHighlight) {
182
200
  super();
183
201
  this.reader = reader;
184
202
  this.highlights = highlights;
203
+ this.selectedHighlight = selectedHighlight;
185
204
  this.reader.hookManager.register("item.onDocumentLoad", ({ itemId, destroy }) => {
186
205
  const spineItem = reader.spineItemsManager.get(itemId);
187
206
  if (!spineItem) return;
188
207
  const spineItemHighlights$ = this.highlights.pipe(
189
208
  rxjs.map((highlights2) => highlights2.filter((highlight) => highlight.itemId === itemId))
190
209
  );
191
- const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader);
210
+ const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight);
192
211
  this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights]);
193
212
  const deregister = reader.hookManager.register("item.onAfterLayout", ({ item }) => {
194
213
  if (item.id !== itemId) return;
@@ -218,6 +237,7 @@
218
237
  add$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "add"));
219
238
  delete$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "delete"));
220
239
  update$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "update"));
240
+ select$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "select"));
221
241
  highlight = (params) => {
222
242
  this.commandSubject.next({ type: "highlight", data: params });
223
243
  };
@@ -230,6 +250,9 @@
230
250
  update = (id, data) => {
231
251
  this.commandSubject.next({ type: "update", id, data });
232
252
  };
253
+ select = (id) => {
254
+ this.commandSubject.next({ type: "select", id });
255
+ };
233
256
  destroy() {
234
257
  super.destroy();
235
258
  this.commandSubject.complete();
@@ -240,6 +263,8 @@
240
263
  const reader = next(options);
241
264
  const commands = new Commands();
242
265
  const highlightsSubject = new rxjs.BehaviorSubject([]);
266
+ const selectedHighlightSubject = new rxjs.BehaviorSubject(void 0);
267
+ const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
243
268
  const highlight$ = commands.highlight$.pipe(
244
269
  rxjs.tap(({ data: { itemId, selection, ...rest } }) => {
245
270
  const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection });
@@ -265,13 +290,18 @@
265
290
  );
266
291
  })
267
292
  );
293
+ const select$ = commands.select$.pipe(
294
+ rxjs.tap(({ id }) => {
295
+ selectedHighlightSubject.next(id);
296
+ })
297
+ );
268
298
  const annotations$ = highlightsSubject.asObservable();
269
- const readerHighlights = new ReaderHighlights(reader, highlightsSubject);
270
299
  rxjs.merge(
271
300
  highlight$,
272
301
  add$,
273
302
  delete$,
274
303
  update$,
304
+ select$,
275
305
  annotations$.pipe(
276
306
  rxjs.tap((annotations) => {
277
307
  report.debug("annotations", annotations);
@@ -293,7 +323,8 @@
293
323
  highlight: commands.highlight,
294
324
  add: commands.add,
295
325
  delete: commands.delete,
296
- update: commands.update
326
+ update: commands.update,
327
+ select: commands.select
297
328
  }
298
329
  };
299
330
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nconst E = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","import { report } from \"../report\"\n\nexport const getElementsForRange = (range: Range, container: HTMLElement) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectElt.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n opacity: 50%;\n `\n\n return rectElt\n })\n}\n\nexport const getRangeFromSelection = (\n overlayElement: HTMLElement,\n anchor: { node: Node; offset?: number },\n focus: { node: Node; offset?: number },\n) => {\n const range = overlayElement.ownerDocument.createRange()\n const comparison = anchor.node.compareDocumentPosition(focus.node)\n\n try {\n // If focus comes before anchor in the document\n if (comparison & Node.DOCUMENT_POSITION_PRECEDING) {\n range.setStart(focus.node, focus.offset || 0)\n range.setEnd(anchor.node, anchor.offset || 0)\n // If focus comes after anchor in the document\n } else if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStart(anchor.node, anchor.offset || 0)\n range.setEnd(focus.node, focus.offset || 0)\n }\n // If they're the same node\n else {\n const startOffset = Math.min(anchor.offset || 0, focus.offset || 0)\n const endOffset = Math.max(anchor.offset || 0, focus.offset || 0)\n range.setStart(anchor.node, startOffset)\n range.setEnd(anchor.node, endOffset)\n }\n } catch (e) {\n report.error(e)\n }\n\n return range\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n// annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { RuntimeHighlight } from \"../types\"\nimport { getElementsForRange, getRangeFromSelection } from \"./utils\"\nimport { report } from \"../report\"\nimport { fromEvent, map, Observable, share } from \"rxjs\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: RuntimeHighlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeHighlight,\n ) {\n super()\n\n void this.spineItem\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const { node: anchorNode, offset: anchorOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.anchorCfi ?? `` }) ?? {}\n const { node: focusNode, offset: focusOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.focusCfi ?? `` }) ?? {}\n\n if (!anchorNode || !focusNode) {\n report.error(`Unable to resolve anchor cfi: ${this.highlight.anchorCfi}`)\n\n return\n }\n\n const range = getRangeFromSelection(\n this.containerElement,\n { node: anchorNode, offset: anchorOffset },\n { node: focusNode, offset: focusOffset },\n )\n\n const rectElements = getElementsForRange(range, this.container)\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.style.backgroundColor = this.highlight.color ?? \"yellow\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { RuntimeHighlight } from \"../types\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private annotations$: Observable<RuntimeHighlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const highlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemId !== this.spineItem.item.id) return\n\n this.highlights.push(new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation))\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = highlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { Highlight } from \"../types\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemId === itemId)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n const deregister = reader.hookManager.register(\"item.onAfterLayout\", ({ item }) => {\n if (item.id !== itemId) return\n\n spineItemHighlights.layout()\n })\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n\n deregister()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { Highlight } from \"./types\"\n\ntype HighlightParams = { document: Document; selection: Selection; itemId: string; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: Highlight | Highlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: Highlight | Highlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable } from \"rxjs\"\nimport { report } from \"./report\"\nimport { RuntimeHighlight } from \"./types\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n annotations$: Observable<RuntimeHighlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<RuntimeHighlight[]>([])\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemId, selection, ...rest } }) => {\n const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection })\n\n const annotation = { anchorCfi, focusCfi, itemId, id: window.crypto.randomUUID(), ...rest }\n\n highlightsSubject.next([...highlightsSubject.getValue(), annotation])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...annotations])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => (highlight.id === id ? { ...highlight, ...data } : highlight)),\n )\n }),\n )\n\n const annotations$ = highlightsSubject.asObservable()\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject)\n\n merge(\n highlight$,\n add$,\n delete$,\n update$,\n annotations$.pipe(\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n },\n }\n }\n"],"names":["Report","DestroyableClass","fromEvent","map","share","switchMap","of","shareReplay","takeUntil","merge","highlights","BehaviorSubject","Subject","filter","tap"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nconst E = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","import { report } from \"../report\"\n\nexport const getElementsForRange = (range: Range, container: HTMLElement) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectElt.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n opacity: 50%;\n `\n\n return rectElt\n })\n}\n\nexport const getRangeFromSelection = (\n overlayElement: HTMLElement,\n anchor: { node: Node; offset?: number },\n focus: { node: Node; offset?: number },\n) => {\n const range = overlayElement.ownerDocument.createRange()\n const comparison = anchor.node.compareDocumentPosition(focus.node)\n\n try {\n // If focus comes before anchor in the document\n if (comparison & Node.DOCUMENT_POSITION_PRECEDING) {\n range.setStart(focus.node, focus.offset || 0)\n range.setEnd(anchor.node, anchor.offset || 0)\n // If focus comes after anchor in the document\n } else if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n range.setStart(anchor.node, anchor.offset || 0)\n range.setEnd(focus.node, focus.offset || 0)\n }\n // If they're the same node\n else {\n const startOffset = Math.min(anchor.offset || 0, focus.offset || 0)\n const endOffset = Math.max(anchor.offset || 0, focus.offset || 0)\n range.setStart(anchor.node, startOffset)\n range.setEnd(anchor.node, endOffset)\n }\n } catch (e) {\n report.error(e)\n }\n\n return range\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n// annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { RuntimeHighlight } from \"../types\"\nimport { getElementsForRange, getRangeFromSelection } from \"./utils\"\nimport { report } from \"../report\"\nimport { fromEvent, map, Observable, share, skip, takeUntil, tap } from \"rxjs\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: RuntimeHighlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeHighlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected ? \"3px dashed red\" : \"none\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const { node: anchorNode, offset: anchorOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.anchorCfi ?? `` }) ?? {}\n const { node: focusNode, offset: focusOffset } = this.reader.cfi.resolveCfi({ cfi: this.highlight.focusCfi ?? `` }) ?? {}\n\n if (!anchorNode || !focusNode) {\n report.error(`Unable to resolve anchor cfi: ${this.highlight.anchorCfi}`)\n\n return\n }\n\n const range = getRangeFromSelection(\n this.containerElement,\n { node: anchorNode, offset: anchorOffset },\n { node: focusNode, offset: focusOffset },\n )\n\n const rectElements = getElementsForRange(range, this.container)\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.style.backgroundColor = this.highlight.color ?? \"yellow\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { distinctUntilChanged, map, merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { RuntimeHighlight } from \"../types\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private annotations$: Observable<RuntimeHighlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const highlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemId !== this.spineItem.item.id) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$)\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = highlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { Highlight } from \"../types\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemId === itemId)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n const deregister = reader.hookManager.register(\"item.onAfterLayout\", ({ item }) => {\n if (item.id !== itemId) return\n\n spineItemHighlights.layout()\n })\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n\n deregister()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { Highlight } from \"./types\"\n\ntype HighlightParams = { document: Document; selection: Selection; itemId: string; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: Highlight | Highlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n public readonly select$ = this.commandSubject.pipe(filter((command) => command.type === \"select\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: Highlight | Highlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable } from \"rxjs\"\nimport { report } from \"./report\"\nimport { RuntimeHighlight } from \"./types\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n annotations$: Observable<RuntimeHighlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<RuntimeHighlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(undefined)\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemId, selection, ...rest } }) => {\n const { anchorCfi, focusCfi } = reader.selection.generateCfis({ itemId, selection })\n\n const annotation = { anchorCfi, focusCfi, itemId, id: window.crypto.randomUUID(), ...rest }\n\n highlightsSubject.next([...highlightsSubject.getValue(), annotation])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...annotations])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => (highlight.id === id ? { ...highlight, ...data } : highlight)),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const annotations$ = highlightsSubject.asObservable()\n\n merge(\n highlight$,\n add$,\n delete$,\n update$,\n select$,\n annotations$.pipe(\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","DestroyableClass","fromEvent","map","share","skip","tap","isSelected","takeUntil","switchMap","distinctUntilChanged","of","shareReplay","merge","highlights","BehaviorSubject","Subject","filter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-annotations",
3
- "version": "1.122.0",
3
+ "version": "1.124.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -23,5 +23,5 @@
23
23
  "peerDependencies": {
24
24
  "@prose-reader/core": "^1.117.0"
25
25
  },
26
- "gitHead": "25e0bcbde20d35742b7da4fd1db1aad574c2c4a6"
26
+ "gitHead": "8d9f9991a83dd1d21270a58d3aef48379e8f5e57"
27
27
  }