@prose-reader/enhancer-annotations 1.121.0 → 1.123.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENCE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2021 @prose-reader/core
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -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 ? "2px 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":"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"}
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 ? \"2px 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 ? "2px 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 ? \"2px 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.121.0",
3
+ "version": "1.123.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -22,5 +22,6 @@
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@prose-reader/core": "^1.117.0"
25
- }
25
+ },
26
+ "gitHead": "003e9adde8bbaa147a462d2819804aab03452b2b"
26
27
  }