@embedpdf/plugin-annotation 1.0.11 → 1.0.12

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.
Files changed (71) hide show
  1. package/dist/index.cjs +2 -693
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -266
  4. package/dist/index.js +180 -158
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +104 -0
  7. package/dist/lib/annotation-plugin.d.ts +33 -0
  8. package/dist/lib/index.d.ts +10 -0
  9. package/dist/lib/manifest.d.ts +4 -0
  10. package/dist/lib/reducer.d.ts +5 -0
  11. package/dist/lib/selectors.d.ts +13 -0
  12. package/dist/lib/types.d.ts +121 -0
  13. package/dist/lib/utils.d.ts +11 -0
  14. package/dist/lib/variant-key.d.ts +8 -0
  15. package/dist/preact/adapter.d.ts +8 -0
  16. package/dist/preact/core.d.ts +1 -0
  17. package/dist/preact/index.cjs +2 -1038
  18. package/dist/preact/index.cjs.map +1 -1
  19. package/dist/preact/index.d.ts +1 -28
  20. package/dist/preact/index.js +126 -156
  21. package/dist/preact/index.js.map +1 -1
  22. package/dist/preact/interaction-manager.d.ts +1 -0
  23. package/dist/preact/selection.d.ts +1 -0
  24. package/dist/react/adapter.d.ts +2 -0
  25. package/dist/react/core.d.ts +1 -0
  26. package/dist/react/index.cjs +2 -0
  27. package/dist/react/index.cjs.map +1 -0
  28. package/dist/react/index.d.ts +1 -0
  29. package/dist/react/index.js +983 -0
  30. package/dist/react/index.js.map +1 -0
  31. package/dist/react/interaction-manager.d.ts +1 -0
  32. package/dist/react/selection.d.ts +1 -0
  33. package/dist/shared-preact/components/annotation-container.d.ts +19 -0
  34. package/dist/shared-preact/components/annotation-layer.d.ts +11 -0
  35. package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
  36. package/dist/shared-preact/components/annotations/ink-paint.d.ts +17 -0
  37. package/dist/shared-preact/components/annotations/ink.d.ts +23 -0
  38. package/dist/shared-preact/components/annotations.d.ts +7 -0
  39. package/dist/shared-preact/components/index.d.ts +1 -0
  40. package/dist/shared-preact/components/render-annotation.d.ts +11 -0
  41. package/dist/shared-preact/components/text-markup/highlight.d.ts +13 -0
  42. package/dist/shared-preact/components/text-markup/squiggly.d.ts +13 -0
  43. package/dist/shared-preact/components/text-markup/strikeout.d.ts +13 -0
  44. package/dist/shared-preact/components/text-markup/underline.d.ts +13 -0
  45. package/dist/shared-preact/components/text-markup.d.ts +6 -0
  46. package/dist/shared-preact/hooks/index.d.ts +1 -0
  47. package/dist/shared-preact/hooks/use-annotation.d.ts +11 -0
  48. package/dist/shared-preact/index.d.ts +2 -0
  49. package/dist/shared-preact/resize-ink.d.ts +17 -0
  50. package/dist/shared-preact/types.d.ts +1 -0
  51. package/dist/shared-react/components/annotation-container.d.ts +19 -0
  52. package/dist/shared-react/components/annotation-layer.d.ts +11 -0
  53. package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
  54. package/dist/shared-react/components/annotations/ink-paint.d.ts +17 -0
  55. package/dist/shared-react/components/annotations/ink.d.ts +23 -0
  56. package/dist/shared-react/components/annotations.d.ts +7 -0
  57. package/dist/shared-react/components/index.d.ts +1 -0
  58. package/dist/shared-react/components/render-annotation.d.ts +11 -0
  59. package/dist/shared-react/components/text-markup/highlight.d.ts +13 -0
  60. package/dist/shared-react/components/text-markup/squiggly.d.ts +13 -0
  61. package/dist/shared-react/components/text-markup/strikeout.d.ts +13 -0
  62. package/dist/shared-react/components/text-markup/underline.d.ts +13 -0
  63. package/dist/shared-react/components/text-markup.d.ts +6 -0
  64. package/dist/shared-react/hooks/index.d.ts +1 -0
  65. package/dist/shared-react/hooks/use-annotation.d.ts +11 -0
  66. package/dist/shared-react/index.d.ts +2 -0
  67. package/dist/shared-react/resize-ink.d.ts +17 -0
  68. package/dist/shared-react/types.d.ts +1 -0
  69. package/package.json +17 -15
  70. package/dist/index.d.cts +0 -266
  71. package/dist/preact/index.d.cts +0 -28
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/resize-ink.ts","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","import {\n JSX,\n HTMLAttributes,\n CSSProperties,\n useEffect,\n useRef,\n useState,\n PointerEvent,\n} from '@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Rect, restoreOffset } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { ResizeDirection } from '../../shared/types';\n\ntype AnnotationContainerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'children'> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation;\n children: JSX.Element | ((annotation: PdfAnnotationObject) => JSX.Element);\n style?: CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n computeResizePatch?: (\n original: PdfAnnotationObject,\n newRect: Rect,\n direction: ResizeDirection,\n ) => Partial<PdfAnnotationObject>;\n};\n\ntype Point = { x: number; y: number };\n\nexport function AnnotationContainer({\n scale,\n pageIndex,\n rotation,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n computeResizePatch,\n ...props\n}: AnnotationContainerProps): JSX.Element {\n const { provides: annotationProvides } = useAnnotationCapability();\n const ref = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<'idle' | 'dragging' | 'resizing'>('idle');\n const [resizeDirection, setResizeDirection] = useState<ResizeDirection | null>(null);\n const [startPos, setStartPos] = useState<Point | null>(null);\n const [startRect, setStartRect] = useState<Rect | null>(null);\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [previewObject, setPreviewObject] = useState<Partial<PdfAnnotationObject> | null>(null);\n\n useEffect(() => {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject(null);\n }, [trackedAnnotation]);\n\n const handlePointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n const target = e.target as HTMLElement;\n\n if (isResizable && target.classList.contains('resize-handle')) {\n setDragState('resizing');\n setResizeDirection(target.dataset.direction as ResizeDirection);\n } else if (isDraggable) {\n setDragState('dragging');\n } else {\n return;\n }\n\n setStartPos({ x: e.clientX, y: e.clientY });\n setStartRect(currentRect);\n\n ref.current?.setPointerCapture(e.pointerId);\n };\n\n const handlePointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (dragState === 'idle' || !startPos || !startRect) return;\n\n const dispDelta = { x: e.clientX - startPos.x, y: e.clientY - startPos.y };\n const { x: dx, y: dy } = restoreOffset(dispDelta, rotation, scale);\n\n let newOriginX = startRect.origin.x;\n let newOriginY = startRect.origin.y;\n let newWidth = startRect.size.width;\n let newHeight = startRect.size.height;\n\n if (dragState === 'dragging') {\n newOriginX += dx;\n newOriginY += dy;\n } else if (dragState === 'resizing' && resizeDirection) {\n if (resizeDirection.includes('right')) {\n newWidth += dx;\n } else if (resizeDirection.includes('left')) {\n newOriginX += dx;\n newWidth -= dx;\n }\n\n if (resizeDirection.includes('bottom')) {\n newHeight += dy;\n } else if (resizeDirection.includes('top')) {\n newOriginY += dy;\n newHeight -= dy;\n }\n\n // Prevent negative dimensions\n if (newWidth < 1 || newHeight < 1) return;\n }\n\n const tentativeRect = {\n origin: { x: newOriginX, y: newOriginY },\n size: { width: newWidth, height: newHeight },\n };\n\n let previewPatch: Partial<PdfAnnotationObject> = { rect: tentativeRect };\n\n if (computeResizePatch) {\n const dir = dragState === 'resizing' ? resizeDirection : 'bottom-right';\n if (dir) {\n previewPatch = computeResizePatch(trackedAnnotation.object, tentativeRect, dir);\n }\n }\n\n setCurrentRect(previewPatch.rect || tentativeRect);\n setPreviewObject(previewPatch);\n };\n\n const handlePointerUp = (e: PointerEvent<HTMLDivElement>) => {\n if (dragState === 'idle') return;\n\n const usedDirection = resizeDirection || 'bottom-right';\n setDragState('idle');\n setResizeDirection(null);\n\n ref.current?.releasePointerCapture(e.pointerId);\n\n // Commit the changes\n if (annotationProvides && trackedAnnotation) {\n let patch: Partial<PdfAnnotationObject> = { rect: currentRect };\n if (computeResizePatch && usedDirection) {\n patch = computeResizePatch(trackedAnnotation.object, currentRect, usedDirection);\n }\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.localId, patch);\n }\n\n setStartPos(null);\n setStartRect(null);\n setPreviewObject(null);\n };\n\n const currentObject = previewObject\n ? ({ ...trackedAnnotation.object, ...previewObject } as PdfAnnotationObject)\n : trackedAnnotation.object;\n\n return (\n <div\n ref={ref}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n position: 'absolute',\n outline: isSelected ? '1px solid #007ACC' : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n left: `${currentRect.origin.x * scale}px`,\n top: `${currentRect.origin.y * scale}px`,\n width: `${currentRect.size.width * scale}px`,\n height: `${currentRect.size.height * scale}px`,\n pointerEvents: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...style,\n }}\n {...props}\n >\n {typeof children === 'function' ? children(currentObject) : children}\n {isSelected && isResizable && (\n <>\n <div\n className=\"resize-handle\"\n data-direction=\"top-left\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"top-right\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-left\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-right\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n </>\n )}\n </div>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={opacity}\n pointerEvents=\"visibleStroke\"\n onMouseDown={onClick}\n style={{\n cursor: 'pointer',\n }}\n />\n ))}\n </svg>\n );\n}\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { ResizeDirection } from './types';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport function resizeInkAnnotation(\n original: PdfAnnotationObject, // Assumes type=INK\n newRect: Rect,\n direction: ResizeDirection,\n uniform: boolean = false,\n): Partial<PdfInkAnnoObject> {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n newRect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n newRect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: newRect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: newRect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = original.strokeWidth * avgScale;\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: newRect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n}\n","import {\n blendModeToCss,\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfInkAnnoObject,\n} from '@embedpdf/models';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n TrackedAnnotation,\n} from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../hooks';\nimport { useMemo, useState, useEffect, useCallback, MouseEvent } from '@framework';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport { resizeInkAnnotation } from '../../shared/resize-ink';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\n selectionProvides.clear();\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.localId === annotation.localId;\n\n switch (annotation.object.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Underline\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Strikeout\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Squiggly\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n rect={annotation.object.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(\n annotation.object.blendMode ?? PdfBlendMode.Multiply,\n ),\n }}\n {...annotationsProps}\n >\n <Highlight\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n rect={annotation.object.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.INK:\n return (\n <AnnotationContainer\n key={annotation.localId}\n isSelected={isSelected}\n trackedAnnotation={annotation}\n outlineOffset={6}\n computeResizePatch={resizeInkAnnotation}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj: PdfAnnotationObject) => (\n <Ink\n color={(obj as PdfInkAnnoObject).color}\n opacity={(obj as PdfInkAnnoObject).opacity}\n strokeWidth={(obj as PdfInkAnnoObject).strokeWidth}\n inkList={(obj as PdfInkAnnoObject).inkList}\n rect={(obj as PdfInkAnnoObject).rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n default:\n return null;\n }\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { ActiveTool, makeVariantKey } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!boundingRect) return null;\n\n switch (activeTool.variantKey) {\n case makeVariantKey(PdfAnnotationSubtype.UNDERLINE):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.STRIKEOUT):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.SQUIGGLY):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { PdfInkListObject, Rect, PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\nconst MAX_STROKE_WIDTH = 30;\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand rect by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const rectMinX = minX - halfStroke;\n const rectMinY = minY - halfStroke;\n const rectMaxX = maxX + halfStroke;\n const rectMaxY = maxY + halfStroke;\n\n // Ignore tiny drawings\n if (rectMaxX - rectMinX < 1 || rectMaxY - rectMinY < 1) return;\n\n const rect: Rect = {\n origin: { x: rectMinX, y: rectMinY },\n size: { width: rectMaxX - rectMinX, height: rectMaxY - rectMinY },\n };\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand bounds by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const svgMaxX = maxX + halfStroke;\n const svgMaxY = maxY + halfStroke;\n\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\n const lx = x - svgMinX;\n const ly = y - svgMinY;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={toolColor}\n strokeWidth={toolStrokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={toolOpacity}\n />\n ))}\n </svg>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations pageIndex={pageIndex} scale={scale} rotation={rotation} />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n </div>\n );\n}\n"],"names":["_b","_a","allPoints","minX","minY","maxX","maxY","halfStroke"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/plugin-interaction-manager/react';
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/plugin-selection/react';
@@ -0,0 +1,19 @@
1
+ import { JSX, HTMLAttributes, CSSProperties } from '../../preact/adapter.ts';
2
+ import { TrackedAnnotation } from '../../lib/index.ts';
3
+ import { PdfAnnotationObject, Rect } from '@embedpdf/models';
4
+ import { ResizeDirection } from '../../shared/types';
5
+ type AnnotationContainerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'children'> & {
6
+ scale: number;
7
+ isSelected?: boolean;
8
+ pageIndex: number;
9
+ rotation: number;
10
+ trackedAnnotation: TrackedAnnotation;
11
+ children: JSX.Element | ((annotation: PdfAnnotationObject) => JSX.Element);
12
+ style?: CSSProperties;
13
+ isDraggable?: boolean;
14
+ isResizable?: boolean;
15
+ outlineOffset?: number;
16
+ computeResizePatch?: (original: PdfAnnotationObject, newRect: Rect, direction: ResizeDirection) => Partial<PdfAnnotationObject>;
17
+ };
18
+ export declare function AnnotationContainer({ scale, pageIndex, rotation, trackedAnnotation, children, style, outlineOffset, isSelected, isDraggable, isResizable, computeResizePatch, ...props }: AnnotationContainerProps): JSX.Element;
19
+ export {};
@@ -0,0 +1,11 @@
1
+ import { HTMLAttributes, CSSProperties } from '../../preact/adapter.ts';
2
+ type AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
3
+ pageIndex: number;
4
+ scale: number;
5
+ pageWidth: number;
6
+ pageHeight: number;
7
+ rotation: number;
8
+ style?: CSSProperties;
9
+ };
10
+ export declare function AnnotationLayer({ pageIndex, scale, pageWidth, pageHeight, rotation, style, ...props }: AnnotationLayerProps): import("preact").JSX.Element;
11
+ export {};
@@ -0,0 +1,17 @@
1
+ interface InkPaintProps {
2
+ /** Index of the page this layer lives on */
3
+ pageIndex: number;
4
+ /** Scale of the page */
5
+ scale: number;
6
+ /** Width of the page */
7
+ pageWidth: number;
8
+ /** Height of the page */
9
+ pageHeight: number;
10
+ }
11
+ /**
12
+ * Allows the user to draw freehand ink annotations.
13
+ * Hook it into the interaction-manager with modeId = 'inkPaint'.
14
+ * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.
15
+ */
16
+ export declare const InkPaint: ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => import("preact").JSX.Element | null;
17
+ export {};
@@ -0,0 +1,23 @@
1
+ import { MouseEvent } from '../../../preact/adapter.ts';
2
+ import { PdfInkListObject, Rect } from '@embedpdf/models';
3
+ interface InkProps {
4
+ /** Stroke colour (falls back to PDFium default black) */
5
+ color?: string;
6
+ /** 0 – 1 */
7
+ opacity?: number;
8
+ /** Line width in PDF units */
9
+ strokeWidth: number;
10
+ /** Array of strokes — exactly as in your JSON */
11
+ inkList: PdfInkListObject[];
12
+ /** Bounding box of the whole annotation */
13
+ rect: Rect;
14
+ /** Page zoom factor */
15
+ scale: number;
16
+ /** Callback for when the annotation is clicked */
17
+ onClick?: (e: MouseEvent<SVGPathElement>) => void;
18
+ }
19
+ /**
20
+ * Renders a PDF Ink annotation (free-hand drawing) as SVG.
21
+ */
22
+ export declare function Ink({ color, opacity, strokeWidth, inkList, rect, scale, onClick, }: InkProps): JSX.Element;
23
+ export {};
@@ -0,0 +1,7 @@
1
+ interface AnnotationsProps {
2
+ pageIndex: number;
3
+ scale: number;
4
+ rotation: number;
5
+ }
6
+ export declare function Annotations(annotationsProps: AnnotationsProps): import("preact").JSX.Element;
7
+ export {};
@@ -0,0 +1 @@
1
+ export * from './annotation-layer';
@@ -0,0 +1,11 @@
1
+ import { HTMLAttributes, CSSProperties } from '../../preact/adapter.ts';
2
+ import { PdfAnnotationObject } from '@embedpdf/models';
3
+ type RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {
4
+ pageIndex: number;
5
+ annotation: PdfAnnotationObject;
6
+ scaleFactor?: number;
7
+ dpr?: number;
8
+ style?: CSSProperties;
9
+ };
10
+ export declare function RenderAnnotation({ pageIndex, annotation, scaleFactor, dpr, style, ...props }: RenderAnnotationProps): import("preact").JSX.Element;
11
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../preact/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Highlight({ color, opacity, rects, rect, scale, onClick, style, ...props }: HighlightProps): import("preact").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../preact/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Squiggly({ color, opacity, rects, rect, scale, onClick, style, ...props }: SquigglyProps): import("preact").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../preact/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Strikeout({ color, opacity, rects, rect, scale, onClick, style, ...props }: StrikeoutProps): import("preact").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../preact/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Underline({ color, opacity, rects, rect, scale, onClick, style, ...props }: UnderlineProps): import("preact").JSX.Element;
13
+ export {};
@@ -0,0 +1,6 @@
1
+ interface TextMarkupProps {
2
+ pageIndex: number;
3
+ scale: number;
4
+ }
5
+ export declare function TextMarkup({ pageIndex, scale }: TextMarkupProps): import("preact").JSX.Element | null;
6
+ export {};
@@ -0,0 +1 @@
1
+ export * from './use-annotation';
@@ -0,0 +1,11 @@
1
+ import { AnnotationPlugin } from '../../lib/index.ts';
2
+ export declare const useAnnotationPlugin: () => {
3
+ plugin: AnnotationPlugin | null;
4
+ isLoading: boolean;
5
+ ready: Promise<void>;
6
+ };
7
+ export declare const useAnnotationCapability: () => {
8
+ provides: Readonly<import('../../lib/index.ts').AnnotationCapability> | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
@@ -0,0 +1,2 @@
1
+ export * from './hooks';
2
+ export * from './components';
@@ -0,0 +1,17 @@
1
+ import { PdfAnnotationObject, PdfInkAnnoObject, Rect } from '@embedpdf/models';
2
+ import { ResizeDirection } from './types';
3
+ /**
4
+ * Computes a patch for resizing an ink annotation.
5
+ * - Scales all points in inkList to fit the new rect.
6
+ * - Scales strokeWidth proportionally (using average scale factor).
7
+ * - Handles non-uniform scaling (stretch).
8
+ * - Optionally preserves aspect ratio (set uniform=true).
9
+ *
10
+ * @param original The original ink annotation object.
11
+ * @param newRect The new bounding rect after resize.
12
+ * @param direction The resize handle direction (affects origin adjustments if needed).
13
+ * @param uniform If true, constrains to uniform scaling (uses min scale factor).
14
+ * @returns Partial patch { rect, inkList, strokeWidth } to apply.
15
+ */
16
+ export declare function resizeInkAnnotation(original: PdfAnnotationObject, // Assumes type=INK
17
+ newRect: Rect, direction: ResizeDirection, uniform?: boolean): Partial<PdfInkAnnoObject>;
@@ -0,0 +1 @@
1
+ export type ResizeDirection = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none';
@@ -0,0 +1,19 @@
1
+ import { JSX, HTMLAttributes, CSSProperties } from '../../react/adapter.ts';
2
+ import { TrackedAnnotation } from '../../lib/index.ts';
3
+ import { PdfAnnotationObject, Rect } from '@embedpdf/models';
4
+ import { ResizeDirection } from '../../shared/types';
5
+ type AnnotationContainerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'children'> & {
6
+ scale: number;
7
+ isSelected?: boolean;
8
+ pageIndex: number;
9
+ rotation: number;
10
+ trackedAnnotation: TrackedAnnotation;
11
+ children: JSX.Element | ((annotation: PdfAnnotationObject) => JSX.Element);
12
+ style?: CSSProperties;
13
+ isDraggable?: boolean;
14
+ isResizable?: boolean;
15
+ outlineOffset?: number;
16
+ computeResizePatch?: (original: PdfAnnotationObject, newRect: Rect, direction: ResizeDirection) => Partial<PdfAnnotationObject>;
17
+ };
18
+ export declare function AnnotationContainer({ scale, pageIndex, rotation, trackedAnnotation, children, style, outlineOffset, isSelected, isDraggable, isResizable, computeResizePatch, ...props }: AnnotationContainerProps): JSX.Element;
19
+ export {};
@@ -0,0 +1,11 @@
1
+ import { HTMLAttributes, CSSProperties } from '../../react/adapter.ts';
2
+ type AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
3
+ pageIndex: number;
4
+ scale: number;
5
+ pageWidth: number;
6
+ pageHeight: number;
7
+ rotation: number;
8
+ style?: CSSProperties;
9
+ };
10
+ export declare function AnnotationLayer({ pageIndex, scale, pageWidth, pageHeight, rotation, style, ...props }: AnnotationLayerProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,17 @@
1
+ interface InkPaintProps {
2
+ /** Index of the page this layer lives on */
3
+ pageIndex: number;
4
+ /** Scale of the page */
5
+ scale: number;
6
+ /** Width of the page */
7
+ pageWidth: number;
8
+ /** Height of the page */
9
+ pageHeight: number;
10
+ }
11
+ /**
12
+ * Allows the user to draw freehand ink annotations.
13
+ * Hook it into the interaction-manager with modeId = 'inkPaint'.
14
+ * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.
15
+ */
16
+ export declare const InkPaint: ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => import("react/jsx-runtime").JSX.Element | null;
17
+ export {};
@@ -0,0 +1,23 @@
1
+ import { MouseEvent } from '../../../react/adapter.ts';
2
+ import { PdfInkListObject, Rect } from '@embedpdf/models';
3
+ interface InkProps {
4
+ /** Stroke colour (falls back to PDFium default black) */
5
+ color?: string;
6
+ /** 0 – 1 */
7
+ opacity?: number;
8
+ /** Line width in PDF units */
9
+ strokeWidth: number;
10
+ /** Array of strokes — exactly as in your JSON */
11
+ inkList: PdfInkListObject[];
12
+ /** Bounding box of the whole annotation */
13
+ rect: Rect;
14
+ /** Page zoom factor */
15
+ scale: number;
16
+ /** Callback for when the annotation is clicked */
17
+ onClick?: (e: MouseEvent<SVGPathElement>) => void;
18
+ }
19
+ /**
20
+ * Renders a PDF Ink annotation (free-hand drawing) as SVG.
21
+ */
22
+ export declare function Ink({ color, opacity, strokeWidth, inkList, rect, scale, onClick, }: InkProps): JSX.Element;
23
+ export {};
@@ -0,0 +1,7 @@
1
+ interface AnnotationsProps {
2
+ pageIndex: number;
3
+ scale: number;
4
+ rotation: number;
5
+ }
6
+ export declare function Annotations(annotationsProps: AnnotationsProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1 @@
1
+ export * from './annotation-layer';
@@ -0,0 +1,11 @@
1
+ import { HTMLAttributes, CSSProperties } from '../../react/adapter.ts';
2
+ import { PdfAnnotationObject } from '@embedpdf/models';
3
+ type RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {
4
+ pageIndex: number;
5
+ annotation: PdfAnnotationObject;
6
+ scaleFactor?: number;
7
+ dpr?: number;
8
+ style?: CSSProperties;
9
+ };
10
+ export declare function RenderAnnotation({ pageIndex, annotation, scaleFactor, dpr, style, ...props }: RenderAnnotationProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../react/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Highlight({ color, opacity, rects, rect, scale, onClick, style, ...props }: HighlightProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../react/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Squiggly({ color, opacity, rects, rect, scale, onClick, style, ...props }: SquigglyProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../react/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Strikeout({ color, opacity, rects, rect, scale, onClick, style, ...props }: StrikeoutProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { HTMLAttributes, CSSProperties, MouseEvent } from '../../../react/adapter.ts';
2
+ import { Rect } from '@embedpdf/models';
3
+ type UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {
4
+ color?: string;
5
+ opacity?: number;
6
+ rects: Rect[];
7
+ rect?: Rect;
8
+ scale: number;
9
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
10
+ style?: CSSProperties;
11
+ };
12
+ export declare function Underline({ color, opacity, rects, rect, scale, onClick, style, ...props }: UnderlineProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,6 @@
1
+ interface TextMarkupProps {
2
+ pageIndex: number;
3
+ scale: number;
4
+ }
5
+ export declare function TextMarkup({ pageIndex, scale }: TextMarkupProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
@@ -0,0 +1 @@
1
+ export * from './use-annotation';
@@ -0,0 +1,11 @@
1
+ import { AnnotationPlugin } from '../../lib/index.ts';
2
+ export declare const useAnnotationPlugin: () => {
3
+ plugin: AnnotationPlugin | null;
4
+ isLoading: boolean;
5
+ ready: Promise<void>;
6
+ };
7
+ export declare const useAnnotationCapability: () => {
8
+ provides: Readonly<import('../../lib/index.ts').AnnotationCapability> | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
@@ -0,0 +1,2 @@
1
+ export * from './hooks';
2
+ export * from './components';
@@ -0,0 +1,17 @@
1
+ import { PdfAnnotationObject, PdfInkAnnoObject, Rect } from '@embedpdf/models';
2
+ import { ResizeDirection } from './types';
3
+ /**
4
+ * Computes a patch for resizing an ink annotation.
5
+ * - Scales all points in inkList to fit the new rect.
6
+ * - Scales strokeWidth proportionally (using average scale factor).
7
+ * - Handles non-uniform scaling (stretch).
8
+ * - Optionally preserves aspect ratio (set uniform=true).
9
+ *
10
+ * @param original The original ink annotation object.
11
+ * @param newRect The new bounding rect after resize.
12
+ * @param direction The resize handle direction (affects origin adjustments if needed).
13
+ * @param uniform If true, constrains to uniform scaling (uses min scale factor).
14
+ * @returns Partial patch { rect, inkList, strokeWidth } to apply.
15
+ */
16
+ export declare function resizeInkAnnotation(original: PdfAnnotationObject, // Assumes type=INK
17
+ newRect: Rect, direction: ResizeDirection, uniform?: boolean): Partial<PdfInkAnnoObject>;
@@ -0,0 +1 @@
1
+ export type ResizeDirection = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none';