@prose-reader/enhancer-annotations 1.271.0 → 1.273.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.
@@ -0,0 +1,5 @@
1
+ import { ReactiveEntity } from '@prose-reader/core';
2
+ import { AnnotationsEnhancerOptions } from './types';
3
+ export declare class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {
4
+ update(settings: AnnotationsEnhancerOptions): void;
5
+ }
@@ -1,5 +1,5 @@
1
1
  import { DestroyableClass, Reader } from '@prose-reader/core';
2
- import { BehaviorSubject } from 'rxjs';
2
+ import { Observable } from 'rxjs';
3
3
  import { SpineItemHighlights } from './SpineItemHighlights';
4
4
  import { RuntimeAnnotation } from './types';
5
5
  export declare class ReaderHighlights extends DestroyableClass {
@@ -8,8 +8,8 @@ export declare class ReaderHighlights extends DestroyableClass {
8
8
  private selectedHighlight;
9
9
  private spineItemHighlights;
10
10
  tap$: SpineItemHighlights["tap$"];
11
- constructor(reader: Reader, highlights: BehaviorSubject<RuntimeAnnotation[]>, selectedHighlight: BehaviorSubject<string | undefined>);
11
+ constructor(reader: Reader, highlights: Observable<RuntimeAnnotation[]>, selectedHighlight: Observable<string | undefined>);
12
12
  getHighlightsForTarget: (target: EventTarget) => RuntimeAnnotation[];
13
13
  isTargetWithinHighlight: (target: EventTarget) => boolean;
14
- layout(): import('rxjs').Observable<((null | undefined)[] | null)[] | null>;
14
+ layout(): Observable<((null | undefined)[] | null)[] | null>;
15
15
  }
@@ -5,7 +5,7 @@ export declare class SpineItemHighlight extends DestroyableClass {
5
5
  private spineItem;
6
6
  private containerElement;
7
7
  private reader;
8
- readonly highlight: RuntimeAnnotation;
8
+ highlight: RuntimeAnnotation;
9
9
  private isSelected;
10
10
  private container;
11
11
  readonly tap$: Observable<{
@@ -14,6 +14,7 @@ export declare class SpineItemHighlight extends DestroyableClass {
14
14
  }>;
15
15
  private resolvedCfi$;
16
16
  constructor(spineItem: SpineItem, containerElement: HTMLElement, reader: Reader, highlight: RuntimeAnnotation, isSelected: Observable<boolean>);
17
+ updateStateOnSelection(isSelected: boolean): void;
17
18
  render(): Observable<null | undefined>;
18
19
  isWithinTarget(target: Node): boolean;
19
20
  destroy(): void;
@@ -1,4 +1,6 @@
1
1
  import { Reader } from '@prose-reader/core';
2
- import { AnnotationsEnhancerAPI } from './types';
2
+ import { AnnotationsEnhancerAPI, AnnotationsEnhancerOptions } from './types';
3
3
  export type { AnnotationsEnhancerAPI };
4
- export declare const annotationsEnhancer: <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) => (options: InheritOptions) => InheritOutput & AnnotationsEnhancerAPI;
4
+ export declare const annotationsEnhancer: <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) => (options: InheritOptions & {
5
+ annotations?: AnnotationsEnhancerOptions;
6
+ }) => InheritOutput & AnnotationsEnhancerAPI;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { DestroyableClass, isDefined } from '@prose-reader/core';
2
- import { fromEvent, map, share, shareReplay, skip, tap, takeUntil, merge, first, switchMap, distinctUntilChanged, of, forkJoin, defaultIfEmpty, BehaviorSubject, Subject, filter, debounceTime, combineLatest } from 'rxjs';
1
+ import { DestroyableClass, ReactiveEntity, isShallowEqual, generateRootCfi } from '@prose-reader/core';
2
+ import { fromEvent, map, share, shareReplay, tap, merge, takeUntil, first, withLatestFrom, switchMap, distinctUntilChanged, of, forkJoin, defaultIfEmpty, BehaviorSubject, NEVER, debounceTime, combineLatest } from 'rxjs';
3
3
 
4
4
  const createElementForRange = (range, container, color) => {
5
5
  const rects = Array.from(range.getClientRects());
@@ -77,26 +77,28 @@ class SpineItemHighlight extends DestroyableClass {
77
77
  map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),
78
78
  shareReplay({ refCount: true, bufferSize: 1 })
79
79
  );
80
- this.isSelected.pipe(
81
- skip(1),
80
+ const updateStateOnSelection$ = this.isSelected.pipe(
82
81
  tap((isSelected2) => {
83
- Array.from(this.container.children).forEach((child) => {
84
- if (child instanceof HTMLElement) {
85
- child.style.border = isSelected2 ? "3px dashed red" : "3px dashed transparent";
86
- }
87
- });
88
- }),
89
- takeUntil(this.destroy$)
90
- ).subscribe();
91
- merge(this.resolvedCfi$).pipe(takeUntil(this.destroy$)).subscribe();
82
+ this.updateStateOnSelection(isSelected2);
83
+ })
84
+ );
85
+ merge(this.resolvedCfi$, updateStateOnSelection$).pipe(takeUntil(this.destroy$)).subscribe();
92
86
  }
93
87
  container;
94
88
  tap$;
95
89
  resolvedCfi$;
90
+ updateStateOnSelection(isSelected) {
91
+ Array.from(this.container.children).forEach((child) => {
92
+ if (child instanceof HTMLElement) {
93
+ child.style.border = isSelected ? "3px dashed red" : "3px dashed transparent";
94
+ }
95
+ });
96
+ }
96
97
  render() {
97
98
  return this.resolvedCfi$.pipe(
98
99
  first(),
99
- map((resolvedCfi) => {
100
+ withLatestFrom(this.isSelected),
101
+ map(([resolvedCfi, isSelected]) => {
100
102
  if (!resolvedCfi || !resolvedCfi.isCfiRange) return void 0;
101
103
  const range = resolvedCfi.range;
102
104
  this.container.innerHTML = "";
@@ -126,6 +128,7 @@ class SpineItemHighlight extends DestroyableClass {
126
128
  noteIcon.style.opacity = "50%";
127
129
  firstElement.appendChild(noteIcon);
128
130
  }
131
+ this.updateStateOnSelection(isSelected);
129
132
  return null;
130
133
  })
131
134
  );
@@ -153,11 +156,27 @@ class SpineItemHighlights extends DestroyableClass {
153
156
  );
154
157
  const itemHighlights$ = this.annotations$.pipe(
155
158
  switchMap((annotations) => {
156
- this.highlights.forEach((highlight) => {
157
- highlight.destroy();
159
+ const newAnnotations = annotations.filter(
160
+ (annotation) => !this.highlights.some(
161
+ (highlight) => highlight.highlight.id === annotation.id
162
+ )
163
+ );
164
+ const oldAnnotations = this.highlights.filter(
165
+ (highlight) => highlight.highlight.itemIndex !== this.spineItem.item.index
166
+ );
167
+ this.highlights.forEach((highlight, index) => {
168
+ const existingAnnotation = annotations.find(
169
+ (annotation) => annotation.id === highlight.highlight.id
170
+ );
171
+ if (oldAnnotations.includes(highlight)) {
172
+ highlight.destroy();
173
+ this.highlights = this.highlights.splice(index, 1);
174
+ }
175
+ if (existingAnnotation) {
176
+ highlight.highlight = existingAnnotation;
177
+ }
158
178
  });
159
- this.highlights = [];
160
- annotations.forEach((annotation) => {
179
+ newAnnotations.forEach((annotation) => {
161
180
  if (annotation.itemIndex !== this.spineItem.item.index) return;
162
181
  const isSelected$ = this.selectedHighlight.pipe(
163
182
  map((id) => id === annotation.id),
@@ -260,53 +279,6 @@ class ReaderHighlights extends DestroyableClass {
260
279
  }
261
280
  }
262
281
 
263
- class Commands extends DestroyableClass {
264
- commandSubject = new Subject();
265
- annotate$ = this.commandSubject.pipe(
266
- filter((command) => command.type === "annotate")
267
- );
268
- add$ = this.commandSubject.pipe(
269
- filter((command) => command.type === "add")
270
- );
271
- delete$ = this.commandSubject.pipe(
272
- filter((command) => command.type === "delete")
273
- );
274
- update$ = this.commandSubject.pipe(
275
- filter((command) => command.type === "update")
276
- );
277
- select$ = this.commandSubject.pipe(
278
- filter((command) => command.type === "select")
279
- );
280
- reset$ = this.commandSubject.pipe(
281
- filter((command) => command.type === "reset")
282
- );
283
- annotate = (params) => {
284
- this.commandSubject.next({ type: "annotate", data: params });
285
- };
286
- annotateAbsolutePage = (params) => {
287
- this.commandSubject.next({ type: "annotate", data: params });
288
- };
289
- add = (data) => {
290
- this.commandSubject.next({ type: "add", data });
291
- };
292
- delete = (id) => {
293
- this.commandSubject.next({ type: "delete", id });
294
- };
295
- update = (id, data) => {
296
- this.commandSubject.next({ type: "update", id, data });
297
- };
298
- select = (id) => {
299
- this.commandSubject.next({ type: "select", id });
300
- };
301
- reset = () => {
302
- this.commandSubject.next({ type: "reset" });
303
- };
304
- destroy() {
305
- super.destroy();
306
- this.commandSubject.complete();
307
- }
308
- }
309
-
310
282
  const h = () => {
311
283
  if (!(typeof window > "u"))
312
284
  return window;
@@ -383,15 +355,34 @@ const name = "@prose-reader/enhancer-annotations";
383
355
  const IS_DEBUG_ENABLED = true;
384
356
  const report = _.namespace(name, IS_DEBUG_ENABLED);
385
357
 
358
+ class Settings extends ReactiveEntity {
359
+ update(settings) {
360
+ super.mergeCompare(settings);
361
+ }
362
+ }
363
+
386
364
  const annotationsEnhancer = (next) => (options) => {
387
- const reader = next(options);
388
- const commands = new Commands();
389
- const annotationsSubject = new BehaviorSubject([]);
390
- const selectedHighlightSubject = new BehaviorSubject(
391
- void 0
392
- );
393
- const annotations$ = annotationsSubject.asObservable().pipe(
394
- distinctUntilChanged(),
365
+ const { annotations: annotationsOptions, ...rest } = options;
366
+ const settings = new Settings({
367
+ annotations$: annotationsOptions?.annotations$
368
+ });
369
+ const reader = next(rest);
370
+ const annotations$ = settings.watch("annotations$").pipe(switchMap((annotations) => annotations ?? NEVER));
371
+ const runtimeAnnotations$ = annotations$.pipe(
372
+ distinctUntilChanged(isShallowEqual),
373
+ map((annotations) => {
374
+ const runtimeAnnotations = annotations.map(
375
+ (annotation) => {
376
+ const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? "");
377
+ const highlight = {
378
+ ...annotation,
379
+ itemIndex
380
+ };
381
+ return highlight;
382
+ }
383
+ );
384
+ return runtimeAnnotations;
385
+ }),
395
386
  tap((annotations) => {
396
387
  report.debug("annotations", annotations);
397
388
  }),
@@ -400,10 +391,17 @@ const annotationsEnhancer = (next) => (options) => {
400
391
  bufferSize: 1
401
392
  })
402
393
  );
394
+ const selectedHighlight$ = runtimeAnnotations$.pipe(
395
+ map(
396
+ (annotations) => annotations.find((annotation) => annotation.selected)?.id
397
+ ),
398
+ distinctUntilChanged(),
399
+ shareReplay({ refCount: true, bufferSize: 1 })
400
+ );
403
401
  const readerHighlights = new ReaderHighlights(
404
402
  reader,
405
- annotationsSubject,
406
- selectedHighlightSubject
403
+ runtimeAnnotations$,
404
+ selectedHighlight$
407
405
  );
408
406
  const resolveItemInformation = (params) => {
409
407
  if (params.itemIndex !== void 0)
@@ -415,72 +413,35 @@ const annotationsEnhancer = (next) => (options) => {
415
413
  }
416
414
  return void 0;
417
415
  };
418
- const annotated$ = commands.annotate$.pipe(
419
- map(({ data: { selection, ...rest } }) => {
420
- const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {};
421
- const spineItem = reader.spineItemsManager.get(itemIndex);
422
- if (!spineItem) return void 0;
423
- const range = selection ? reader.selection.createOrderedRangeFromSelection({
424
- selection,
425
- spineItem
426
- }) : void 0;
427
- const cfi = range ? reader.cfi.generateCfiFromRange(range, spineItem.item) : reader.cfi.generateCfiForSpineItemPage({ pageIndex, spineItem });
428
- const highlight = {
429
- cfi,
430
- itemIndex: spineItem.index,
431
- id: window.crypto.randomUUID(),
432
- ...rest
433
- };
434
- annotationsSubject.next([...annotationsSubject.getValue(), highlight]);
435
- return [highlight.id];
436
- }),
437
- filter(isDefined),
438
- share()
439
- );
440
- const add$ = commands.add$.pipe(
441
- map(({ data }) => {
442
- const annotations = Array.isArray(data) ? data : [data];
443
- const addedHighlights = annotations.map((annotation) => {
444
- const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? "");
445
- const highlight = {
446
- ...annotation,
447
- itemIndex
448
- };
449
- return highlight;
450
- });
451
- annotationsSubject.next([
452
- ...annotationsSubject.getValue(),
453
- ...addedHighlights
454
- ]);
455
- })
456
- );
457
- const delete$ = commands.delete$.pipe(
458
- tap(({ id }) => {
459
- annotationsSubject.next(
460
- annotationsSubject.value.filter((highlight) => highlight.id !== id)
461
- );
462
- })
463
- );
464
- const update$ = commands.update$.pipe(
465
- tap(({ id, data }) => {
466
- annotationsSubject.next(
467
- annotationsSubject.getValue().map((highlight) => {
468
- return highlight.id === id ? { ...highlight, ...data } : highlight;
469
- })
470
- );
471
- })
472
- );
473
- const select$ = commands.select$.pipe(
474
- tap(({ id }) => {
475
- selectedHighlightSubject.next(id);
476
- })
477
- );
478
- const reset$ = commands.reset$.pipe(
479
- tap(() => {
480
- annotationsSubject.next([]);
481
- })
482
- );
483
- const renderAnnotations$ = merge(annotations$, reader.layout$).pipe(
416
+ const createAnnotation = ({
417
+ selection,
418
+ ...rest2
419
+ }) => {
420
+ const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest2) ?? {};
421
+ const spineItem = reader.spineItemsManager.get(itemIndex);
422
+ const id = window.crypto.randomUUID();
423
+ if (!spineItem) return void 0;
424
+ const range = selection ? reader.selection.createOrderedRangeFromSelection({
425
+ selection,
426
+ spineItem
427
+ }) : void 0;
428
+ const pageEntry = reader.spine.pages.fromSpineItemPageIndex(
429
+ spineItem,
430
+ pageIndex
431
+ );
432
+ const cfiWithRangeOrFirstNodeOrRoot = range ? reader.cfi.generateCfiFromRange(range, spineItem.item) : pageEntry?.firstVisibleNode ? reader.cfi.generateCfiForSpineItemPage({
433
+ spineItem: spineItem.item,
434
+ pageNode: pageEntry.firstVisibleNode
435
+ }) : generateRootCfi(spineItem.item);
436
+ const highlight = {
437
+ cfi: cfiWithRangeOrFirstNodeOrRoot,
438
+ itemIndex: spineItem.index,
439
+ id,
440
+ ...rest2
441
+ };
442
+ return highlight;
443
+ };
444
+ const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(
484
445
  debounceTime(50),
485
446
  switchMap(() => readerHighlights.layout())
486
447
  );
@@ -497,37 +458,21 @@ const annotationsEnhancer = (next) => (options) => {
497
458
  )
498
459
  )
499
460
  );
500
- merge(
501
- annotated$,
502
- add$,
503
- delete$,
504
- update$,
505
- select$,
506
- reset$,
507
- renderAnnotations$,
508
- annotations$
509
- ).pipe(takeUntil(reader.$.destroy$)).subscribe();
461
+ merge(renderAnnotations$, annotations$).pipe(takeUntil(reader.$.destroy$)).subscribe();
510
462
  return {
511
463
  ...reader,
512
464
  __PROSE_READER_ENHANCER_ANNOTATIONS: true,
513
465
  destroy: () => {
514
- annotationsSubject.complete();
515
- commands.destroy();
516
466
  readerHighlights.destroy();
517
467
  reader.destroy();
518
468
  },
519
469
  annotations: {
520
- annotations$,
470
+ annotations$: runtimeAnnotations$,
521
471
  highlightTap$: readerHighlights.tap$,
522
472
  candidates$,
523
473
  isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,
524
- annotate: commands.annotate,
525
- annotateAbsolutePage: commands.annotateAbsolutePage,
526
- add: commands.add,
527
- delete: commands.delete,
528
- update: commands.update,
529
- select: commands.select,
530
- reset: commands.reset
474
+ createAnnotation,
475
+ update: settings.update.bind(settings)
531
476
  }
532
477
  };
533
478
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../src/Commands.ts","../../shared/dist/index.js","../src/report.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\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 rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\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 = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n skip,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeAnnotation,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\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\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n\n merge(this.resolvedCfi$).pipe(takeUntil(this.destroy$)).subscribe()\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n map((resolvedCfi) => {\n if (!resolvedCfi || !resolvedCfi.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n\n return null\n }),\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => {\n highlight.destroy()\n })\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\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$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\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 public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport type { Annotation } from \"./types\"\n\ntype AnnotationSharedParams = Omit<Annotation, \"id\" | \"cfi\"> & {\n selection?: Selection\n}\n\ntype AnnotateParams = AnnotationSharedParams & {\n itemIndex: number\n}\n\ntype AnnotateAbsolutePageParams = AnnotationSharedParams & {\n absolutePageIndex: number\n}\n\ntype Command =\n | {\n type: \"annotate\"\n data: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }\n }\n | { type: \"add\"; data: Annotation | Annotation[] }\n | { type: \"delete\"; id: string }\n | {\n type: \"update\"\n id: string\n data: Pick<AnnotationSharedParams, \"highlightColor\" | \"notes\">\n }\n | { type: \"select\"; id: string | undefined }\n | { type: \"reset\" }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly annotate$ = this.commandSubject.pipe(\n filter((command) => command.type === \"annotate\"),\n )\n public readonly add$ = this.commandSubject.pipe(\n filter((command) => command.type === \"add\"),\n )\n public readonly delete$ = this.commandSubject.pipe(\n filter((command) => command.type === \"delete\"),\n )\n public readonly update$ = this.commandSubject.pipe(\n filter((command) => command.type === \"update\"),\n )\n public readonly select$ = this.commandSubject.pipe(\n filter((command) => command.type === \"select\"),\n )\n public readonly reset$ = this.commandSubject.pipe(\n filter((command) => command.type === \"reset\"),\n )\n\n annotate = (params: AnnotateParams) => {\n this.commandSubject.next({ type: \"annotate\", data: params })\n }\n\n annotateAbsolutePage = (params: AnnotateAbsolutePageParams) => {\n this.commandSubject.next({ type: \"annotate\", data: params })\n }\n\n add = (data: Annotation | Annotation[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (\n id: string,\n data: Pick<AnnotationSharedParams, \"highlightColor\" | \"notes\">,\n ) => {\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 reset = () => {\n this.commandSubject.next({ type: \"reset\" })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","const a = (o, n) => o === n ? !0 : o.length !== n.length ? !1 : o.every((e, t) => e === n[t]), f = (o) => o.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction s(o) {\n const n = [];\n if (o.length === 0)\n return \"\";\n if (typeof o[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${o[0]}`);\n o[0].match(/^[^/:]+:\\/*$/) && o.length > 1 && (o[0] = o.shift() + o[0]), o[0].match(/^file:\\/\\/\\//) ? o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < o.length; l++) {\n let r = o[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 < o.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let e = n.join(\"/\");\n e = e.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const t = e.split(\"?\");\n return e = t.shift() + (t.length > 0 ? \"?\" : \"\") + t.join(\"&\"), e;\n}\nfunction E(...o) {\n const n = Array.from(Array.isArray(o[0]) ? o[0] : o);\n return s(n);\n}\nfunction y(o) {\n const n = o.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst p = (o) => {\n switch (f(o)) {\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}, w = ({\n mimeType: o,\n uri: n\n}) => (o ?? p(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), R = (o) => o.length ? o.indexOf(\";\") ? o.substring(0, o.indexOf(\";\")) : o : void 0, g = Object.prototype.hasOwnProperty, d = (o, n) => o === n ? o !== 0 || n !== 0 || 1 / o === 1 / n : !1, m = (o, n, e) => {\n if (o === n)\n return !0;\n if (typeof o != \"object\" || o === null || typeof n != \"object\" || n === null)\n return !1;\n const t = Object.keys(o), l = Object.keys(n);\n if (t.length !== l.length)\n return !1;\n const r = e && typeof e.customEqual == \"function\" ? e.customEqual : d;\n for (let c = 0; c < t.length; c++) {\n const i = t[c] || \"\";\n if (!g.call(n, i) || !r(o[i], n[i]))\n return !1;\n }\n return !0;\n}, v = (o, n) => o.reduce(\n (e, t) => {\n const l = n(t);\n return e[l] || (e[l] = []), e[l].push(t), e;\n },\n {}\n);\nfunction O(o, n) {\n const e = { ...o };\n for (const t in n)\n if (Object.hasOwn(n, t)) {\n const l = n[t];\n (l !== void 0 || !(t in o)) && (e[t] = l);\n }\n return e;\n}\nconst h = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction $() {\n const o = h()?.__PROSE_READER_DEBUG;\n return o === !0 || o === \"true\";\n}\nconst u = (o, n = $(), e) => ({\n namespace: (t, l) => u(`${o} [${t}]`, l, e),\n debug: n ? o ? Function.prototype.bind.call(\n console.debug,\n console,\n o,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n info: n ? o ? Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n log: n ? o ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(console.log, console) : () => {\n },\n warn: n ? o ? Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n error: n ? o ? Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n }\n}), _ = {\n ...u(),\n namespace: (o, n, e) => u(`[${o}]`, n, e)\n}, x = \"prose-reader-resource-error\";\nexport {\n x as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n a as arrayEqual,\n p as detectMimeTypeFromName,\n y as getParentPath,\n f as getUrlExtension,\n v as groupBy,\n d as is,\n m as isShallowEqual,\n w as isXmlBasedMimeType,\n R as parseContentType,\n O as shallowMergeIfDefined,\n E as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { isDefined, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { Commands } from \"./Commands\"\nimport { report } from \"./report\"\nimport type { AnnotationsEnhancerAPI } from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AnnotationsEnhancerAPI => {\n const reader = next(options)\n const commands = new Commands()\n const annotationsSubject = new BehaviorSubject<RuntimeAnnotation[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(\n undefined,\n )\n\n const annotations$ = annotationsSubject.asObservable().pipe(\n distinctUntilChanged(),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n annotationsSubject,\n selectedHighlightSubject,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const annotated$ = commands.annotate$.pipe(\n map(({ data: { selection, ...rest } }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const cfi = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : reader.cfi.generateCfiForSpineItemPage({ pageIndex, spineItem })\n\n const highlight = {\n cfi,\n itemIndex: spineItem.index,\n id: window.crypto.randomUUID(),\n ...rest,\n } satisfies RuntimeAnnotation\n\n annotationsSubject.next([...annotationsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n })\n\n annotationsSubject.next([\n ...annotationsSubject.getValue(),\n ...addedHighlights,\n ])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n annotationsSubject.next(\n annotationsSubject.value.filter((highlight) => highlight.id !== id),\n )\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n annotationsSubject.next(\n annotationsSubject.getValue().map((highlight) => {\n return highlight.id === id ? { ...highlight, ...data } : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const reset$ = commands.reset$.pipe(\n tap(() => {\n annotationsSubject.next([])\n }),\n )\n\n const renderAnnotations$ = merge(annotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(\n annotated$,\n add$,\n delete$,\n update$,\n select$,\n reset$,\n renderAnnotations$,\n annotations$,\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n annotationsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: annotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n annotate: commands.annotate,\n annotateAbsolutePage: commands.annotateAbsolutePage,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n reset: commands.reset,\n },\n }\n }\n"],"names":["isSelected","highlights","Report"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\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 rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\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 = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi || !resolvedCfi.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n\n this.updateStateOnSelection(isSelected)\n\n return null\n }),\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\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$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\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 public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","const a = (o, n) => o === n ? !0 : o.length !== n.length ? !1 : o.every((e, t) => e === n[t]), f = (o) => o.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction s(o) {\n const n = [];\n if (o.length === 0)\n return \"\";\n if (typeof o[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${o[0]}`);\n o[0].match(/^[^/:]+:\\/*$/) && o.length > 1 && (o[0] = o.shift() + o[0]), o[0].match(/^file:\\/\\/\\//) ? o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < o.length; l++) {\n let r = o[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 < o.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let e = n.join(\"/\");\n e = e.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const t = e.split(\"?\");\n return e = t.shift() + (t.length > 0 ? \"?\" : \"\") + t.join(\"&\"), e;\n}\nfunction E(...o) {\n const n = Array.from(Array.isArray(o[0]) ? o[0] : o);\n return s(n);\n}\nfunction y(o) {\n const n = o.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst p = (o) => {\n switch (f(o)) {\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}, w = ({\n mimeType: o,\n uri: n\n}) => (o ?? p(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), R = (o) => o.length ? o.indexOf(\";\") ? o.substring(0, o.indexOf(\";\")) : o : void 0, g = Object.prototype.hasOwnProperty, d = (o, n) => o === n ? o !== 0 || n !== 0 || 1 / o === 1 / n : !1, m = (o, n, e) => {\n if (o === n)\n return !0;\n if (typeof o != \"object\" || o === null || typeof n != \"object\" || n === null)\n return !1;\n const t = Object.keys(o), l = Object.keys(n);\n if (t.length !== l.length)\n return !1;\n const r = e && typeof e.customEqual == \"function\" ? e.customEqual : d;\n for (let c = 0; c < t.length; c++) {\n const i = t[c] || \"\";\n if (!g.call(n, i) || !r(o[i], n[i]))\n return !1;\n }\n return !0;\n}, v = (o, n) => o.reduce(\n (e, t) => {\n const l = n(t);\n return e[l] || (e[l] = []), e[l].push(t), e;\n },\n {}\n);\nfunction O(o, n) {\n const e = { ...o };\n for (const t in n)\n if (Object.hasOwn(n, t)) {\n const l = n[t];\n (l !== void 0 || !(t in o)) && (e[t] = l);\n }\n return e;\n}\nconst h = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction $() {\n const o = h()?.__PROSE_READER_DEBUG;\n return o === !0 || o === \"true\";\n}\nconst u = (o, n = $(), e) => ({\n namespace: (t, l) => u(`${o} [${t}]`, l, e),\n debug: n ? o ? Function.prototype.bind.call(\n console.debug,\n console,\n o,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n info: n ? o ? Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n log: n ? o ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(console.log, console) : () => {\n },\n warn: n ? o ? Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n error: n ? o ? Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n }\n}), _ = {\n ...u(),\n namespace: (o, n, e) => u(`[${o}]`, n, e)\n}, x = \"prose-reader-resource-error\";\nexport {\n x as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n a as arrayEqual,\n p as detectMimeTypeFromName,\n y as getParentPath,\n f as getUrlExtension,\n v as groupBy,\n d as is,\n m as isShallowEqual,\n w as isXmlBasedMimeType,\n R as parseContentType,\n O as shallowMergeIfDefined,\n E as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import {\n generateRootCfi,\n isShallowEqual,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"names":["isSelected","highlights","Report","rest"],"mappings":"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"}
@@ -80,26 +80,28 @@
80
80
  rxjs.map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),
81
81
  rxjs.shareReplay({ refCount: true, bufferSize: 1 })
82
82
  );
83
- this.isSelected.pipe(
84
- rxjs.skip(1),
83
+ const updateStateOnSelection$ = this.isSelected.pipe(
85
84
  rxjs.tap((isSelected2) => {
86
- Array.from(this.container.children).forEach((child) => {
87
- if (child instanceof HTMLElement) {
88
- child.style.border = isSelected2 ? "3px dashed red" : "3px dashed transparent";
89
- }
90
- });
91
- }),
92
- rxjs.takeUntil(this.destroy$)
93
- ).subscribe();
94
- rxjs.merge(this.resolvedCfi$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
85
+ this.updateStateOnSelection(isSelected2);
86
+ })
87
+ );
88
+ rxjs.merge(this.resolvedCfi$, updateStateOnSelection$).pipe(rxjs.takeUntil(this.destroy$)).subscribe();
95
89
  }
96
90
  container;
97
91
  tap$;
98
92
  resolvedCfi$;
93
+ updateStateOnSelection(isSelected) {
94
+ Array.from(this.container.children).forEach((child) => {
95
+ if (child instanceof HTMLElement) {
96
+ child.style.border = isSelected ? "3px dashed red" : "3px dashed transparent";
97
+ }
98
+ });
99
+ }
99
100
  render() {
100
101
  return this.resolvedCfi$.pipe(
101
102
  rxjs.first(),
102
- rxjs.map((resolvedCfi) => {
103
+ rxjs.withLatestFrom(this.isSelected),
104
+ rxjs.map(([resolvedCfi, isSelected]) => {
103
105
  if (!resolvedCfi || !resolvedCfi.isCfiRange) return void 0;
104
106
  const range = resolvedCfi.range;
105
107
  this.container.innerHTML = "";
@@ -129,6 +131,7 @@
129
131
  noteIcon.style.opacity = "50%";
130
132
  firstElement.appendChild(noteIcon);
131
133
  }
134
+ this.updateStateOnSelection(isSelected);
132
135
  return null;
133
136
  })
134
137
  );
@@ -156,11 +159,27 @@
156
159
  );
157
160
  const itemHighlights$ = this.annotations$.pipe(
158
161
  rxjs.switchMap((annotations) => {
159
- this.highlights.forEach((highlight) => {
160
- highlight.destroy();
162
+ const newAnnotations = annotations.filter(
163
+ (annotation) => !this.highlights.some(
164
+ (highlight) => highlight.highlight.id === annotation.id
165
+ )
166
+ );
167
+ const oldAnnotations = this.highlights.filter(
168
+ (highlight) => highlight.highlight.itemIndex !== this.spineItem.item.index
169
+ );
170
+ this.highlights.forEach((highlight, index) => {
171
+ const existingAnnotation = annotations.find(
172
+ (annotation) => annotation.id === highlight.highlight.id
173
+ );
174
+ if (oldAnnotations.includes(highlight)) {
175
+ highlight.destroy();
176
+ this.highlights = this.highlights.splice(index, 1);
177
+ }
178
+ if (existingAnnotation) {
179
+ highlight.highlight = existingAnnotation;
180
+ }
161
181
  });
162
- this.highlights = [];
163
- annotations.forEach((annotation) => {
182
+ newAnnotations.forEach((annotation) => {
164
183
  if (annotation.itemIndex !== this.spineItem.item.index) return;
165
184
  const isSelected$ = this.selectedHighlight.pipe(
166
185
  rxjs.map((id) => id === annotation.id),
@@ -263,53 +282,6 @@
263
282
  }
264
283
  }
265
284
 
266
- class Commands extends core.DestroyableClass {
267
- commandSubject = new rxjs.Subject();
268
- annotate$ = this.commandSubject.pipe(
269
- rxjs.filter((command) => command.type === "annotate")
270
- );
271
- add$ = this.commandSubject.pipe(
272
- rxjs.filter((command) => command.type === "add")
273
- );
274
- delete$ = this.commandSubject.pipe(
275
- rxjs.filter((command) => command.type === "delete")
276
- );
277
- update$ = this.commandSubject.pipe(
278
- rxjs.filter((command) => command.type === "update")
279
- );
280
- select$ = this.commandSubject.pipe(
281
- rxjs.filter((command) => command.type === "select")
282
- );
283
- reset$ = this.commandSubject.pipe(
284
- rxjs.filter((command) => command.type === "reset")
285
- );
286
- annotate = (params) => {
287
- this.commandSubject.next({ type: "annotate", data: params });
288
- };
289
- annotateAbsolutePage = (params) => {
290
- this.commandSubject.next({ type: "annotate", data: params });
291
- };
292
- add = (data) => {
293
- this.commandSubject.next({ type: "add", data });
294
- };
295
- delete = (id) => {
296
- this.commandSubject.next({ type: "delete", id });
297
- };
298
- update = (id, data) => {
299
- this.commandSubject.next({ type: "update", id, data });
300
- };
301
- select = (id) => {
302
- this.commandSubject.next({ type: "select", id });
303
- };
304
- reset = () => {
305
- this.commandSubject.next({ type: "reset" });
306
- };
307
- destroy() {
308
- super.destroy();
309
- this.commandSubject.complete();
310
- }
311
- }
312
-
313
285
  const h = () => {
314
286
  if (!(typeof window > "u"))
315
287
  return window;
@@ -386,15 +358,34 @@
386
358
  const IS_DEBUG_ENABLED = true;
387
359
  const report = _.namespace(name, IS_DEBUG_ENABLED);
388
360
 
361
+ class Settings extends core.ReactiveEntity {
362
+ update(settings) {
363
+ super.mergeCompare(settings);
364
+ }
365
+ }
366
+
389
367
  const annotationsEnhancer = (next) => (options) => {
390
- const reader = next(options);
391
- const commands = new Commands();
392
- const annotationsSubject = new rxjs.BehaviorSubject([]);
393
- const selectedHighlightSubject = new rxjs.BehaviorSubject(
394
- void 0
395
- );
396
- const annotations$ = annotationsSubject.asObservable().pipe(
397
- rxjs.distinctUntilChanged(),
368
+ const { annotations: annotationsOptions, ...rest } = options;
369
+ const settings = new Settings({
370
+ annotations$: annotationsOptions?.annotations$
371
+ });
372
+ const reader = next(rest);
373
+ const annotations$ = settings.watch("annotations$").pipe(rxjs.switchMap((annotations) => annotations ?? rxjs.NEVER));
374
+ const runtimeAnnotations$ = annotations$.pipe(
375
+ rxjs.distinctUntilChanged(core.isShallowEqual),
376
+ rxjs.map((annotations) => {
377
+ const runtimeAnnotations = annotations.map(
378
+ (annotation) => {
379
+ const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? "");
380
+ const highlight = {
381
+ ...annotation,
382
+ itemIndex
383
+ };
384
+ return highlight;
385
+ }
386
+ );
387
+ return runtimeAnnotations;
388
+ }),
398
389
  rxjs.tap((annotations) => {
399
390
  report.debug("annotations", annotations);
400
391
  }),
@@ -403,10 +394,17 @@
403
394
  bufferSize: 1
404
395
  })
405
396
  );
397
+ const selectedHighlight$ = runtimeAnnotations$.pipe(
398
+ rxjs.map(
399
+ (annotations) => annotations.find((annotation) => annotation.selected)?.id
400
+ ),
401
+ rxjs.distinctUntilChanged(),
402
+ rxjs.shareReplay({ refCount: true, bufferSize: 1 })
403
+ );
406
404
  const readerHighlights = new ReaderHighlights(
407
405
  reader,
408
- annotationsSubject,
409
- selectedHighlightSubject
406
+ runtimeAnnotations$,
407
+ selectedHighlight$
410
408
  );
411
409
  const resolveItemInformation = (params) => {
412
410
  if (params.itemIndex !== void 0)
@@ -418,72 +416,35 @@
418
416
  }
419
417
  return void 0;
420
418
  };
421
- const annotated$ = commands.annotate$.pipe(
422
- rxjs.map(({ data: { selection, ...rest } }) => {
423
- const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {};
424
- const spineItem = reader.spineItemsManager.get(itemIndex);
425
- if (!spineItem) return void 0;
426
- const range = selection ? reader.selection.createOrderedRangeFromSelection({
427
- selection,
428
- spineItem
429
- }) : void 0;
430
- const cfi = range ? reader.cfi.generateCfiFromRange(range, spineItem.item) : reader.cfi.generateCfiForSpineItemPage({ pageIndex, spineItem });
431
- const highlight = {
432
- cfi,
433
- itemIndex: spineItem.index,
434
- id: window.crypto.randomUUID(),
435
- ...rest
436
- };
437
- annotationsSubject.next([...annotationsSubject.getValue(), highlight]);
438
- return [highlight.id];
439
- }),
440
- rxjs.filter(core.isDefined),
441
- rxjs.share()
442
- );
443
- const add$ = commands.add$.pipe(
444
- rxjs.map(({ data }) => {
445
- const annotations = Array.isArray(data) ? data : [data];
446
- const addedHighlights = annotations.map((annotation) => {
447
- const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? "");
448
- const highlight = {
449
- ...annotation,
450
- itemIndex
451
- };
452
- return highlight;
453
- });
454
- annotationsSubject.next([
455
- ...annotationsSubject.getValue(),
456
- ...addedHighlights
457
- ]);
458
- })
459
- );
460
- const delete$ = commands.delete$.pipe(
461
- rxjs.tap(({ id }) => {
462
- annotationsSubject.next(
463
- annotationsSubject.value.filter((highlight) => highlight.id !== id)
464
- );
465
- })
466
- );
467
- const update$ = commands.update$.pipe(
468
- rxjs.tap(({ id, data }) => {
469
- annotationsSubject.next(
470
- annotationsSubject.getValue().map((highlight) => {
471
- return highlight.id === id ? { ...highlight, ...data } : highlight;
472
- })
473
- );
474
- })
475
- );
476
- const select$ = commands.select$.pipe(
477
- rxjs.tap(({ id }) => {
478
- selectedHighlightSubject.next(id);
479
- })
480
- );
481
- const reset$ = commands.reset$.pipe(
482
- rxjs.tap(() => {
483
- annotationsSubject.next([]);
484
- })
485
- );
486
- const renderAnnotations$ = rxjs.merge(annotations$, reader.layout$).pipe(
419
+ const createAnnotation = ({
420
+ selection,
421
+ ...rest2
422
+ }) => {
423
+ const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest2) ?? {};
424
+ const spineItem = reader.spineItemsManager.get(itemIndex);
425
+ const id = window.crypto.randomUUID();
426
+ if (!spineItem) return void 0;
427
+ const range = selection ? reader.selection.createOrderedRangeFromSelection({
428
+ selection,
429
+ spineItem
430
+ }) : void 0;
431
+ const pageEntry = reader.spine.pages.fromSpineItemPageIndex(
432
+ spineItem,
433
+ pageIndex
434
+ );
435
+ const cfiWithRangeOrFirstNodeOrRoot = range ? reader.cfi.generateCfiFromRange(range, spineItem.item) : pageEntry?.firstVisibleNode ? reader.cfi.generateCfiForSpineItemPage({
436
+ spineItem: spineItem.item,
437
+ pageNode: pageEntry.firstVisibleNode
438
+ }) : core.generateRootCfi(spineItem.item);
439
+ const highlight = {
440
+ cfi: cfiWithRangeOrFirstNodeOrRoot,
441
+ itemIndex: spineItem.index,
442
+ id,
443
+ ...rest2
444
+ };
445
+ return highlight;
446
+ };
447
+ const renderAnnotations$ = rxjs.merge(runtimeAnnotations$, reader.layout$).pipe(
487
448
  rxjs.debounceTime(50),
488
449
  rxjs.switchMap(() => readerHighlights.layout())
489
450
  );
@@ -500,37 +461,21 @@
500
461
  )
501
462
  )
502
463
  );
503
- rxjs.merge(
504
- annotated$,
505
- add$,
506
- delete$,
507
- update$,
508
- select$,
509
- reset$,
510
- renderAnnotations$,
511
- annotations$
512
- ).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
464
+ rxjs.merge(renderAnnotations$, annotations$).pipe(rxjs.takeUntil(reader.$.destroy$)).subscribe();
513
465
  return {
514
466
  ...reader,
515
467
  __PROSE_READER_ENHANCER_ANNOTATIONS: true,
516
468
  destroy: () => {
517
- annotationsSubject.complete();
518
- commands.destroy();
519
469
  readerHighlights.destroy();
520
470
  reader.destroy();
521
471
  },
522
472
  annotations: {
523
- annotations$,
473
+ annotations$: runtimeAnnotations$,
524
474
  highlightTap$: readerHighlights.tap$,
525
475
  candidates$,
526
476
  isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,
527
- annotate: commands.annotate,
528
- annotateAbsolutePage: commands.annotateAbsolutePage,
529
- add: commands.add,
530
- delete: commands.delete,
531
- update: commands.update,
532
- select: commands.select,
533
- reset: commands.reset
477
+ createAnnotation,
478
+ update: settings.update.bind(settings)
534
479
  }
535
480
  };
536
481
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../src/Commands.ts","../../shared/dist/index.js","../src/report.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\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 rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\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 = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n skip,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: RuntimeAnnotation,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\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\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n\n merge(this.resolvedCfi$).pipe(takeUntil(this.destroy$)).subscribe()\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n map((resolvedCfi) => {\n if (!resolvedCfi || !resolvedCfi.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n\n return null\n }),\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => {\n highlight.destroy()\n })\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\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$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\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 public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport type { Annotation } from \"./types\"\n\ntype AnnotationSharedParams = Omit<Annotation, \"id\" | \"cfi\"> & {\n selection?: Selection\n}\n\ntype AnnotateParams = AnnotationSharedParams & {\n itemIndex: number\n}\n\ntype AnnotateAbsolutePageParams = AnnotationSharedParams & {\n absolutePageIndex: number\n}\n\ntype Command =\n | {\n type: \"annotate\"\n data: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }\n }\n | { type: \"add\"; data: Annotation | Annotation[] }\n | { type: \"delete\"; id: string }\n | {\n type: \"update\"\n id: string\n data: Pick<AnnotationSharedParams, \"highlightColor\" | \"notes\">\n }\n | { type: \"select\"; id: string | undefined }\n | { type: \"reset\" }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly annotate$ = this.commandSubject.pipe(\n filter((command) => command.type === \"annotate\"),\n )\n public readonly add$ = this.commandSubject.pipe(\n filter((command) => command.type === \"add\"),\n )\n public readonly delete$ = this.commandSubject.pipe(\n filter((command) => command.type === \"delete\"),\n )\n public readonly update$ = this.commandSubject.pipe(\n filter((command) => command.type === \"update\"),\n )\n public readonly select$ = this.commandSubject.pipe(\n filter((command) => command.type === \"select\"),\n )\n public readonly reset$ = this.commandSubject.pipe(\n filter((command) => command.type === \"reset\"),\n )\n\n annotate = (params: AnnotateParams) => {\n this.commandSubject.next({ type: \"annotate\", data: params })\n }\n\n annotateAbsolutePage = (params: AnnotateAbsolutePageParams) => {\n this.commandSubject.next({ type: \"annotate\", data: params })\n }\n\n add = (data: Annotation | Annotation[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (\n id: string,\n data: Pick<AnnotationSharedParams, \"highlightColor\" | \"notes\">,\n ) => {\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 reset = () => {\n this.commandSubject.next({ type: \"reset\" })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","const a = (o, n) => o === n ? !0 : o.length !== n.length ? !1 : o.every((e, t) => e === n[t]), f = (o) => o.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction s(o) {\n const n = [];\n if (o.length === 0)\n return \"\";\n if (typeof o[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${o[0]}`);\n o[0].match(/^[^/:]+:\\/*$/) && o.length > 1 && (o[0] = o.shift() + o[0]), o[0].match(/^file:\\/\\/\\//) ? o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < o.length; l++) {\n let r = o[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 < o.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let e = n.join(\"/\");\n e = e.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const t = e.split(\"?\");\n return e = t.shift() + (t.length > 0 ? \"?\" : \"\") + t.join(\"&\"), e;\n}\nfunction E(...o) {\n const n = Array.from(Array.isArray(o[0]) ? o[0] : o);\n return s(n);\n}\nfunction y(o) {\n const n = o.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst p = (o) => {\n switch (f(o)) {\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}, w = ({\n mimeType: o,\n uri: n\n}) => (o ?? p(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), R = (o) => o.length ? o.indexOf(\";\") ? o.substring(0, o.indexOf(\";\")) : o : void 0, g = Object.prototype.hasOwnProperty, d = (o, n) => o === n ? o !== 0 || n !== 0 || 1 / o === 1 / n : !1, m = (o, n, e) => {\n if (o === n)\n return !0;\n if (typeof o != \"object\" || o === null || typeof n != \"object\" || n === null)\n return !1;\n const t = Object.keys(o), l = Object.keys(n);\n if (t.length !== l.length)\n return !1;\n const r = e && typeof e.customEqual == \"function\" ? e.customEqual : d;\n for (let c = 0; c < t.length; c++) {\n const i = t[c] || \"\";\n if (!g.call(n, i) || !r(o[i], n[i]))\n return !1;\n }\n return !0;\n}, v = (o, n) => o.reduce(\n (e, t) => {\n const l = n(t);\n return e[l] || (e[l] = []), e[l].push(t), e;\n },\n {}\n);\nfunction O(o, n) {\n const e = { ...o };\n for (const t in n)\n if (Object.hasOwn(n, t)) {\n const l = n[t];\n (l !== void 0 || !(t in o)) && (e[t] = l);\n }\n return e;\n}\nconst h = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction $() {\n const o = h()?.__PROSE_READER_DEBUG;\n return o === !0 || o === \"true\";\n}\nconst u = (o, n = $(), e) => ({\n namespace: (t, l) => u(`${o} [${t}]`, l, e),\n debug: n ? o ? Function.prototype.bind.call(\n console.debug,\n console,\n o,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n info: n ? o ? Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n log: n ? o ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(console.log, console) : () => {\n },\n warn: n ? o ? Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n error: n ? o ? Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n }\n}), _ = {\n ...u(),\n namespace: (o, n, e) => u(`[${o}]`, n, e)\n}, x = \"prose-reader-resource-error\";\nexport {\n x as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n a as arrayEqual,\n p as detectMimeTypeFromName,\n y as getParentPath,\n f as getUrlExtension,\n v as groupBy,\n d as is,\n m as isShallowEqual,\n w as isXmlBasedMimeType,\n R as parseContentType,\n O as shallowMergeIfDefined,\n E as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { isDefined, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { Commands } from \"./Commands\"\nimport { report } from \"./report\"\nimport type { AnnotationsEnhancerAPI } from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AnnotationsEnhancerAPI => {\n const reader = next(options)\n const commands = new Commands()\n const annotationsSubject = new BehaviorSubject<RuntimeAnnotation[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(\n undefined,\n )\n\n const annotations$ = annotationsSubject.asObservable().pipe(\n distinctUntilChanged(),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n annotationsSubject,\n selectedHighlightSubject,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const annotated$ = commands.annotate$.pipe(\n map(({ data: { selection, ...rest } }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const cfi = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : reader.cfi.generateCfiForSpineItemPage({ pageIndex, spineItem })\n\n const highlight = {\n cfi,\n itemIndex: spineItem.index,\n id: window.crypto.randomUUID(),\n ...rest,\n } satisfies RuntimeAnnotation\n\n annotationsSubject.next([...annotationsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n })\n\n annotationsSubject.next([\n ...annotationsSubject.getValue(),\n ...addedHighlights,\n ])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n annotationsSubject.next(\n annotationsSubject.value.filter((highlight) => highlight.id !== id),\n )\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n annotationsSubject.next(\n annotationsSubject.getValue().map((highlight) => {\n return highlight.id === id ? { ...highlight, ...data } : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const reset$ = commands.reset$.pipe(\n tap(() => {\n annotationsSubject.next([])\n }),\n )\n\n const renderAnnotations$ = merge(annotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(\n annotated$,\n add$,\n delete$,\n update$,\n select$,\n reset$,\n renderAnnotations$,\n annotations$,\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n annotationsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: annotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n annotate: commands.annotate,\n annotateAbsolutePage: commands.annotateAbsolutePage,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n reset: commands.reset,\n },\n }\n }\n"],"names":["DestroyableClass","fromEvent","map","share","shareReplay","skip","tap","isSelected","takeUntil","merge","first","switchMap","distinctUntilChanged","of","forkJoin","defaultIfEmpty","highlights","BehaviorSubject","Subject","filter","Report","isDefined","debounceTime","combineLatest"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\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 rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\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 = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi || !resolvedCfi.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n\n this.updateStateOnSelection(isSelected)\n\n return null\n }),\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 {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\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<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\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$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\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 public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","const a = (o, n) => o === n ? !0 : o.length !== n.length ? !1 : o.every((e, t) => e === n[t]), f = (o) => o.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction s(o) {\n const n = [];\n if (o.length === 0)\n return \"\";\n if (typeof o[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${o[0]}`);\n o[0].match(/^[^/:]+:\\/*$/) && o.length > 1 && (o[0] = o.shift() + o[0]), o[0].match(/^file:\\/\\/\\//) ? o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : o[0] = o[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let l = 0; l < o.length; l++) {\n let r = o[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 < o.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\n }\n let e = n.join(\"/\");\n e = e.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const t = e.split(\"?\");\n return e = t.shift() + (t.length > 0 ? \"?\" : \"\") + t.join(\"&\"), e;\n}\nfunction E(...o) {\n const n = Array.from(Array.isArray(o[0]) ? o[0] : o);\n return s(n);\n}\nfunction y(o) {\n const n = o.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst p = (o) => {\n switch (f(o)) {\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}, w = ({\n mimeType: o,\n uri: n\n}) => (o ?? p(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), R = (o) => o.length ? o.indexOf(\";\") ? o.substring(0, o.indexOf(\";\")) : o : void 0, g = Object.prototype.hasOwnProperty, d = (o, n) => o === n ? o !== 0 || n !== 0 || 1 / o === 1 / n : !1, m = (o, n, e) => {\n if (o === n)\n return !0;\n if (typeof o != \"object\" || o === null || typeof n != \"object\" || n === null)\n return !1;\n const t = Object.keys(o), l = Object.keys(n);\n if (t.length !== l.length)\n return !1;\n const r = e && typeof e.customEqual == \"function\" ? e.customEqual : d;\n for (let c = 0; c < t.length; c++) {\n const i = t[c] || \"\";\n if (!g.call(n, i) || !r(o[i], n[i]))\n return !1;\n }\n return !0;\n}, v = (o, n) => o.reduce(\n (e, t) => {\n const l = n(t);\n return e[l] || (e[l] = []), e[l].push(t), e;\n },\n {}\n);\nfunction O(o, n) {\n const e = { ...o };\n for (const t in n)\n if (Object.hasOwn(n, t)) {\n const l = n[t];\n (l !== void 0 || !(t in o)) && (e[t] = l);\n }\n return e;\n}\nconst h = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction $() {\n const o = h()?.__PROSE_READER_DEBUG;\n return o === !0 || o === \"true\";\n}\nconst u = (o, n = $(), e) => ({\n namespace: (t, l) => u(`${o} [${t}]`, l, e),\n debug: n ? o ? Function.prototype.bind.call(\n console.debug,\n console,\n o,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n info: n ? o ? Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.info,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n log: n ? o ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(console.log, console) : () => {\n },\n warn: n ? o ? Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.warn,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n },\n error: n ? o ? Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : Function.prototype.bind.call(\n console.error,\n console,\n `%c${o}`,\n e?.color ? `color: ${e.color}` : void 0\n ) : () => {\n }\n}), _ = {\n ...u(),\n namespace: (o, n, e) => u(`[${o}]`, n, e)\n}, x = \"prose-reader-resource-error\";\nexport {\n x as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n a as arrayEqual,\n p as detectMimeTypeFromName,\n y as getParentPath,\n f as getUrlExtension,\n v as groupBy,\n d as is,\n m as isShallowEqual,\n w as isXmlBasedMimeType,\n R as parseContentType,\n O as shallowMergeIfDefined,\n E as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import {\n generateRootCfi,\n isShallowEqual,\n type Reader,\n} from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"names":["DestroyableClass","fromEvent","map","share","shareReplay","tap","isSelected","merge","takeUntil","first","withLatestFrom","switchMap","distinctUntilChanged","of","forkJoin","defaultIfEmpty","highlights","BehaviorSubject","Report","ReactiveEntity","NEVER","isShallowEqual","rest","generateRootCfi","debounceTime","combineLatest"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { Observable } from 'rxjs';
2
- import { Commands } from './Commands';
3
2
  import { ReaderHighlights } from './annotations/ReaderHighlights';
4
3
  import { RuntimeAnnotation } from './annotations/types';
5
4
  export interface Annotation {
@@ -7,20 +6,29 @@ export interface Annotation {
7
6
  cfi: string;
8
7
  highlightColor?: string;
9
8
  notes?: string;
9
+ selected?: boolean;
10
10
  }
11
+ type AnnotationSharedParams = Omit<Annotation, "id" | "cfi"> & {
12
+ selection?: Selection;
13
+ };
14
+ export type AnnotateParams = AnnotationSharedParams & {
15
+ itemIndex: number;
16
+ };
17
+ export type AnnotateAbsolutePageParams = AnnotationSharedParams & {
18
+ absolutePageIndex: number;
19
+ };
20
+ export type AnnotationsEnhancerOptions = {
21
+ annotations$?: Observable<Annotation[]>;
22
+ };
11
23
  export type AnnotationsEnhancerAPI = {
12
24
  readonly __PROSE_READER_ENHANCER_ANNOTATIONS: boolean;
13
25
  annotations: {
26
+ update: (settings: Partial<AnnotationsEnhancerOptions>) => void;
14
27
  annotations$: Observable<RuntimeAnnotation[]>;
15
28
  highlightTap$: ReaderHighlights["tap$"];
16
29
  candidates$: Observable<boolean[]>;
17
- annotate: Commands["annotate"];
18
- annotateAbsolutePage: Commands["annotateAbsolutePage"];
19
- add: Commands["add"];
20
- delete: Commands["delete"];
21
- update: Commands["update"];
22
- select: Commands["select"];
23
- reset: Commands["reset"];
30
+ createAnnotation: (params: AnnotateParams | AnnotateAbsolutePageParams) => Annotation | undefined;
24
31
  isTargetWithinHighlight: (target: EventTarget) => boolean;
25
32
  };
26
33
  };
34
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-annotations",
3
- "version": "1.271.0",
3
+ "version": "1.273.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -21,5 +21,5 @@
21
21
  "peerDependencies": {
22
22
  "@prose-reader/core": "^1.117.0"
23
23
  },
24
- "gitHead": "41073a47a0480bdc7b9f646579cfb4182b188ca7"
24
+ "gitHead": "0ca54c403d328f7cc8c88e3771c93d65c93d9bee"
25
25
  }
@@ -1,49 +0,0 @@
1
- import { DestroyableClass } from '@prose-reader/core';
2
- import { Annotation } from './types';
3
- type AnnotationSharedParams = Omit<Annotation, "id" | "cfi"> & {
4
- selection?: Selection;
5
- };
6
- type AnnotateParams = AnnotationSharedParams & {
7
- itemIndex: number;
8
- };
9
- type AnnotateAbsolutePageParams = AnnotationSharedParams & {
10
- absolutePageIndex: number;
11
- };
12
- export declare class Commands extends DestroyableClass {
13
- private commandSubject;
14
- readonly annotate$: import('rxjs').Observable<{
15
- type: "annotate";
16
- data: (AnnotateParams | AnnotateAbsolutePageParams) & {
17
- absolutePageIndex?: number;
18
- };
19
- }>;
20
- readonly add$: import('rxjs').Observable<{
21
- type: "add";
22
- data: Annotation | Annotation[];
23
- }>;
24
- readonly delete$: import('rxjs').Observable<{
25
- type: "delete";
26
- id: string;
27
- }>;
28
- readonly update$: import('rxjs').Observable<{
29
- type: "update";
30
- id: string;
31
- data: Pick<AnnotationSharedParams, "highlightColor" | "notes">;
32
- }>;
33
- readonly select$: import('rxjs').Observable<{
34
- type: "select";
35
- id: string | undefined;
36
- }>;
37
- readonly reset$: import('rxjs').Observable<{
38
- type: "reset";
39
- }>;
40
- annotate: (params: AnnotateParams) => void;
41
- annotateAbsolutePage: (params: AnnotateAbsolutePageParams) => void;
42
- add: (data: Annotation | Annotation[]) => void;
43
- delete: (id: string) => void;
44
- update: (id: string, data: Pick<AnnotationSharedParams, "highlightColor" | "notes">) => void;
45
- select: (id: string | undefined) => void;
46
- reset: () => void;
47
- destroy(): void;
48
- }
49
- export {};