@anaralabs/lector 3.5.6 → 3.5.8

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.
@@ -46,10 +46,7 @@ export declare const AnnotationHighlightLayer: ({ className, style, renderToolti
46
46
  declare interface AnnotationHighlightLayerProps {
47
47
  className?: string;
48
48
  style?: React.CSSProperties;
49
- renderTooltipContent: (props: {
50
- annotation: Annotation;
51
- onClose: () => void;
52
- }) => React.ReactNode;
49
+ renderTooltipContent: (props: AnnotationTooltipContentProps) => React.ReactNode;
53
50
  renderHoverTooltipContent: (props: {
54
51
  annotation: Annotation;
55
52
  onClose: () => void;
@@ -100,12 +97,18 @@ declare interface AnnotationState {
100
97
  setAnnotations: (annotations: Annotation[]) => void;
101
98
  }
102
99
 
103
- export declare const AnnotationTooltip: ({ annotation, children, tooltipContent, hoverTooltipContent, onOpenChange, className, hoverClassName, isOpen: controlledIsOpen, tooltipBubbleSize, hoverIsOpen: controlledHoverIsOpen, }: AnnotationTooltipProps) => JSX.Element;
100
+ export declare const AnnotationTooltip: ({ annotation, children, renderTooltipContent, hoverTooltipContent, onOpenChange, className, hoverClassName, isOpen: controlledIsOpen, tooltipBubbleSize, hoverIsOpen: controlledHoverIsOpen, }: AnnotationTooltipProps) => JSX.Element;
101
+
102
+ export declare type AnnotationTooltipContentProps = {
103
+ annotation: Annotation;
104
+ onClose: () => void;
105
+ setPosition?: (position: 'top' | 'bottom' | undefined) => void;
106
+ };
104
107
 
105
108
  declare interface AnnotationTooltipProps {
106
109
  annotation: Annotation;
107
110
  children: React.ReactNode;
108
- tooltipContent: React.ReactNode;
111
+ renderTooltipContent: (props: AnnotationTooltipContentProps) => React.ReactNode;
109
112
  hoverTooltipContent?: React.ReactNode;
110
113
  onOpenChange?: (open: boolean) => void;
111
114
  isOpen?: boolean;
@@ -384,12 +387,13 @@ declare const useAnnotations: UseBoundStore<StoreApi<AnnotationState>>;
384
387
  export { useAnnotations }
385
388
  export { useAnnotations as useAnnotations_alias_1 }
386
389
 
387
- export declare const useAnnotationTooltip: ({ annotation, onOpenChange, position, }: UseAnnotationTooltipProps) => UseAnnotationTooltipReturn;
390
+ export declare const useAnnotationTooltip: ({ annotation, onOpenChange, position, isOpen: controlledIsOpen, }: UseAnnotationTooltipProps) => UseAnnotationTooltipReturn;
388
391
 
389
392
  declare interface UseAnnotationTooltipProps {
390
393
  annotation: Annotation;
391
394
  onOpenChange?: (open: boolean) => void;
392
395
  position?: "top" | "bottom" | "left" | "right";
396
+ isOpen?: boolean;
393
397
  }
394
398
 
395
399
  declare interface UseAnnotationTooltipReturn {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { AnnotationTooltipContentProps } from './_tsup-dts-rollup.js';
1
2
  export { AnnotationTooltip } from './_tsup-dts-rollup.js';
2
3
  export { AnnotationHighlightLayer } from './_tsup-dts-rollup.js';
3
4
  export { AnnotationLayer } from './_tsup-dts-rollup.js';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import React, { createContext, forwardRef, useRef, useCallback, useContext, useState, useEffect, cloneElement, createRef, useLayoutEffect } from 'react';
3
+ import React, { createContext, forwardRef, useRef, useState, useCallback, useContext, useEffect, cloneElement, createRef, useLayoutEffect } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
5
  import { useFloating, autoUpdate, offset, shift, useDismiss, useInteractions, inline, flip } from '@floating-ui/react';
6
6
  import { useVirtualizer, elementScroll, debounce } from '@tanstack/react-virtual';
@@ -134,32 +134,25 @@ var PDFStore = createZustandContext(
134
134
  var usePdf = (selector) => useStore(PDFStore.useContext(), selector);
135
135
 
136
136
  // src/hooks/useAnnotationTooltip.ts
137
- var defaultRect = {
138
- width: 0,
139
- height: 0,
140
- x: 0,
141
- y: 0,
142
- top: 0,
143
- right: 0,
144
- bottom: 0,
145
- left: 0
146
- };
147
137
  var useAnnotationTooltip = ({
148
138
  annotation,
149
139
  onOpenChange,
150
- position = "top"
140
+ position = "top",
141
+ isOpen: controlledIsOpen
151
142
  }) => {
152
143
  const isNewAnnotation = Date.now() - new Date(annotation.createdAt).getTime() < 1e3;
153
- const [isOpen, setIsOpen] = useState(isNewAnnotation);
144
+ const [isPositionCalculated, setIsPositionCalculated] = useState(false);
145
+ const [isOpen, setIsOpen] = useState(false);
154
146
  const viewportRef = usePdf((state) => state.viewportRef);
155
147
  const scale = usePdf((state) => state.zoom);
148
+ const effectiveIsOpen = (isOpen && isPositionCalculated || controlledIsOpen) ?? false;
156
149
  const {
157
150
  refs,
158
151
  floatingStyles,
159
152
  context
160
153
  } = useFloating({
161
154
  placement: position,
162
- open: isOpen,
155
+ open: effectiveIsOpen,
163
156
  onOpenChange: (open) => {
164
157
  setIsOpen(open);
165
158
  onOpenChange?.(open);
@@ -178,18 +171,27 @@ var useAnnotationTooltip = ({
178
171
  const dismiss = useDismiss(context);
179
172
  const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);
180
173
  const updateTooltipPosition = useCallback(() => {
181
- if (!annotation.highlights.length) return;
174
+ if (!annotation.highlights.length) {
175
+ setIsPositionCalculated(false);
176
+ return;
177
+ }
182
178
  const highlightRects = annotation.highlights;
183
179
  let minLeft = Infinity;
184
180
  let maxRight = -Infinity;
185
181
  let minTop = Infinity;
186
182
  let maxBottom = -Infinity;
183
+ const viewportElement = viewportRef.current;
184
+ if (!viewportElement) {
185
+ setIsPositionCalculated(false);
186
+ return;
187
+ }
188
+ const pageElement = viewportElement.querySelector(`[data-page-number="${annotation.pageNumber}"]`);
189
+ if (!pageElement) {
190
+ setIsPositionCalculated(false);
191
+ return;
192
+ }
187
193
  refs.setReference({
188
194
  getBoundingClientRect() {
189
- const viewportElement = viewportRef.current;
190
- if (!viewportElement) return defaultRect;
191
- const pageElement = viewportElement.querySelector(`[data-page-number="${annotation.pageNumber}"]`);
192
- if (!pageElement) return defaultRect;
193
195
  const pageRect = pageElement.getBoundingClientRect();
194
196
  highlightRects.forEach((highlight) => {
195
197
  const scaledLeft = highlight.left * scale;
@@ -226,10 +228,17 @@ var useAnnotationTooltip = ({
226
228
  },
227
229
  contextElement: viewportRef.current || void 0
228
230
  });
229
- }, [annotation.highlights, annotation.pageNumber, refs, viewportRef, scale]);
231
+ setIsPositionCalculated(true);
232
+ if (isNewAnnotation) {
233
+ setIsOpen(true);
234
+ }
235
+ }, [annotation.highlights, annotation.pageNumber, refs, viewportRef, scale, isNewAnnotation]);
230
236
  useEffect(() => {
231
237
  const viewport = viewportRef.current;
232
- updateTooltipPosition();
238
+ setIsPositionCalculated(false);
239
+ requestAnimationFrame(() => {
240
+ updateTooltipPosition();
241
+ });
233
242
  const handleScroll = () => {
234
243
  requestAnimationFrame(updateTooltipPosition);
235
244
  };
@@ -248,9 +257,9 @@ var useAnnotationTooltip = ({
248
257
  }
249
258
  window.removeEventListener("resize", handleResize);
250
259
  };
251
- }, [updateTooltipPosition, viewportRef]);
260
+ }, [updateTooltipPosition, viewportRef, scale, controlledIsOpen]);
252
261
  return {
253
- isOpen,
262
+ isOpen: effectiveIsOpen,
254
263
  setIsOpen,
255
264
  refs,
256
265
  floatingStyles,
@@ -261,7 +270,7 @@ var useAnnotationTooltip = ({
261
270
  var AnnotationTooltip = ({
262
271
  annotation,
263
272
  children,
264
- tooltipContent,
273
+ renderTooltipContent,
265
274
  hoverTooltipContent,
266
275
  onOpenChange,
267
276
  className,
@@ -273,6 +282,7 @@ var AnnotationTooltip = ({
273
282
  const viewportRef = usePdf((state) => state.viewportRef);
274
283
  const closeTimeoutRef = useRef(null);
275
284
  const isMouseInTooltipRef = useRef(false);
285
+ const [triggeredPosition, setTriggeredPosition] = useState();
276
286
  const {
277
287
  isOpen: uncontrolledIsOpen,
278
288
  setIsOpen,
@@ -282,7 +292,9 @@ var AnnotationTooltip = ({
282
292
  getReferenceProps
283
293
  } = useAnnotationTooltip({
284
294
  annotation,
285
- onOpenChange
295
+ onOpenChange,
296
+ position: triggeredPosition,
297
+ isOpen: controlledIsOpen
286
298
  });
287
299
  const {
288
300
  isOpen: uncontrolledHoverIsOpen,
@@ -293,7 +305,8 @@ var AnnotationTooltip = ({
293
305
  getReferenceProps: getHoverReferenceProps
294
306
  } = useAnnotationTooltip({
295
307
  position: "bottom",
296
- annotation
308
+ annotation,
309
+ isOpen: controlledHoverIsOpen
297
310
  });
298
311
  const isOpen = controlledIsOpen ?? uncontrolledIsOpen;
299
312
  const hoverIsOpen = controlledHoverIsOpen || uncontrolledHoverIsOpen;
@@ -372,7 +385,11 @@ var AnnotationTooltip = ({
372
385
  zIndex: 50
373
386
  },
374
387
  ...getFloatingProps(),
375
- children: tooltipContent
388
+ children: renderTooltipContent({
389
+ annotation,
390
+ onClose: () => setIsOpen(false),
391
+ setPosition: (position) => setTriggeredPosition(position)
392
+ })
376
393
  }
377
394
  ),
378
395
  viewportRef.current
@@ -457,11 +474,7 @@ var AnnotationHighlightLayer = ({
457
474
  onAnnotationClick(annotation);
458
475
  }
459
476
  },
460
- tooltipContent: renderTooltipContent({
461
- annotation,
462
- onClose: () => {
463
- }
464
- }),
477
+ renderTooltipContent,
465
478
  hoverTooltipContent: renderHoverTooltipContent({
466
479
  annotation,
467
480
  onClose: () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anaralabs/lector",
3
- "version": "3.5.6",
3
+ "version": "3.5.8",
4
4
  "description": "Headless PDF viewer for React",
5
5
  "author": "andrewdr (https://github.com/andrewdoro)",
6
6
  "license": "MIT",