@embedpdf/plugin-annotation 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1916 -390
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +21 -15
- package/dist/lib/annotation-plugin.d.ts +30 -7
- package/dist/lib/handlers/circle.handler.d.ts +3 -0
- package/dist/lib/handlers/click-detector.d.ts +27 -0
- package/dist/lib/handlers/free-text.handler.d.ts +3 -0
- package/dist/lib/handlers/index.d.ts +8 -0
- package/dist/lib/handlers/ink.handler.d.ts +3 -0
- package/dist/lib/handlers/line.handler.d.ts +3 -0
- package/dist/lib/handlers/polygon.handler.d.ts +3 -0
- package/dist/lib/handlers/polyline.handler.d.ts +3 -0
- package/dist/lib/handlers/square.handler.d.ts +3 -0
- package/dist/lib/handlers/stamp.handler.d.ts +3 -0
- package/dist/lib/handlers/types.d.ts +139 -0
- package/dist/lib/helpers.d.ts +1 -6
- package/dist/lib/index.d.ts +3 -1
- package/dist/lib/patching/index.d.ts +1 -1
- package/dist/lib/patching/patch-registry.d.ts +27 -0
- package/dist/lib/patching/patches/index.d.ts +4 -0
- package/dist/lib/patching/patches/ink.patch.d.ts +3 -0
- package/dist/lib/patching/patches/line.patch.d.ts +3 -0
- package/dist/lib/patching/patches/polygon.patch.d.ts +3 -0
- package/dist/lib/patching/patches/polyline.patch.d.ts +3 -0
- package/dist/lib/selectors.d.ts +8 -12
- package/dist/lib/tools/default-tools.d.ts +450 -0
- package/dist/lib/tools/tools-utils.d.ts +25 -0
- package/dist/lib/tools/types.d.ts +96 -0
- package/dist/lib/types.d.ts +78 -161
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/use-state.d.ts +12 -0
- package/dist/preact/adapter.d.ts +1 -5
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +390 -1795
- package/dist/preact/index.js.map +1 -1
- package/dist/react/adapter.d.ts +2 -4
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +391 -1794
- package/dist/react/index.js.map +1 -1
- package/dist/shared-preact/components/annotation-container.d.ts +18 -16
- package/dist/shared-preact/components/annotation-layer.d.ts +9 -2
- package/dist/shared-preact/components/annotation-paint-layer.d.ts +6 -0
- package/dist/shared-preact/components/annotations/free-text.d.ts +1 -0
- package/dist/shared-preact/components/annotations/polygon.d.ts +4 -1
- package/dist/shared-preact/components/annotations.d.ts +4 -1
- package/dist/shared-preact/components/preview-renderer.d.ts +7 -0
- package/dist/shared-preact/components/text-markup/highlight.d.ts +2 -2
- package/dist/shared-preact/components/text-markup/squiggly.d.ts +2 -2
- package/dist/shared-preact/components/text-markup/strikeout.d.ts +2 -2
- package/dist/shared-preact/components/text-markup/underline.d.ts +2 -2
- package/dist/shared-preact/types.d.ts +32 -2
- package/dist/shared-react/components/annotation-container.d.ts +18 -16
- package/dist/shared-react/components/annotation-layer.d.ts +9 -2
- package/dist/shared-react/components/annotation-paint-layer.d.ts +6 -0
- package/dist/shared-react/components/annotations/free-text.d.ts +1 -0
- package/dist/shared-react/components/annotations/polygon.d.ts +4 -1
- package/dist/shared-react/components/annotations.d.ts +4 -1
- package/dist/shared-react/components/preview-renderer.d.ts +7 -0
- package/dist/shared-react/components/text-markup/highlight.d.ts +2 -2
- package/dist/shared-react/components/text-markup/squiggly.d.ts +2 -2
- package/dist/shared-react/components/text-markup/strikeout.d.ts +2 -2
- package/dist/shared-react/components/text-markup/underline.d.ts +2 -2
- package/dist/shared-react/types.d.ts +32 -2
- package/dist/vue/hooks/index.d.ts +1 -0
- package/dist/vue/hooks/use-annotation.d.ts +3 -0
- package/dist/vue/index.cjs +2 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.ts +2 -0
- package/dist/vue/index.js +10 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +18 -11
- package/dist/lib/patching/derived-rect.d.ts +0 -2
- package/dist/lib/variant-key.d.ts +0 -8
- package/dist/shared-preact/components/annotations/circle-paint.d.ts +0 -10
- package/dist/shared-preact/components/annotations/free-text-paint.d.ts +0 -10
- package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-preact/components/annotations/ink-paint.d.ts +0 -18
- package/dist/shared-preact/components/annotations/line-paint.d.ts +0 -10
- package/dist/shared-preact/components/annotations/polygon-paint.d.ts +0 -9
- package/dist/shared-preact/components/annotations/polyline-paint.d.ts +0 -10
- package/dist/shared-preact/components/annotations/square-paint.d.ts +0 -10
- package/dist/shared-preact/components/annotations/stamp-paint.d.ts +0 -8
- package/dist/shared-preact/components/resize-handles.d.ts +0 -9
- package/dist/shared-preact/components/vertex-editor.d.ts +0 -19
- package/dist/shared-preact/hooks/use-drag-resize.d.ts +0 -38
- package/dist/shared-preact/patch-ink.d.ts +0 -16
- package/dist/shared-preact/patchers.d.ts +0 -9
- package/dist/shared-preact/vertex-patchers.d.ts +0 -10
- package/dist/shared-react/components/annotations/circle-paint.d.ts +0 -10
- package/dist/shared-react/components/annotations/free-text-paint.d.ts +0 -10
- package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-react/components/annotations/ink-paint.d.ts +0 -17
- package/dist/shared-react/components/annotations/line-paint.d.ts +0 -10
- package/dist/shared-react/components/annotations/polygon-paint.d.ts +0 -9
- package/dist/shared-react/components/annotations/polyline-paint.d.ts +0 -10
- package/dist/shared-react/components/annotations/square-paint.d.ts +0 -10
- package/dist/shared-react/components/annotations/stamp-paint.d.ts +0 -8
- package/dist/shared-react/components/resize-handles.d.ts +0 -9
- package/dist/shared-react/components/vertex-editor.d.ts +0 -19
- package/dist/shared-react/hooks/use-drag-resize.d.ts +0 -38
- package/dist/shared-react/patch-ink.d.ts +0 -16
- package/dist/shared-react/patchers.d.ts +0 -9
- package/dist/shared-react/vertex-patchers.d.ts +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/shared/components/vertex-editor.tsx","../../src/shared/hooks/use-drag-resize.ts","../../src/shared/components/resize-handles.tsx","../../src/shared/components/annotation-container.tsx","../../src/preact/adapter.ts","../../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/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/patch-ink.ts","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/vertex-patchers.ts","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotations/circle-paint.tsx","../../src/shared/components/annotations/square-paint.tsx","../../src/shared/components/annotations/polyline-paint.tsx","../../src/shared/components/annotations/line-paint.tsx","../../src/shared/components/annotations/polygon-paint.tsx","../../src/shared/components/annotations/free-text-paint.tsx","../../src/shared/components/annotations/stamp-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 { JSX, Fragment, PointerEvent, useState, useRef } from '@framework';\nimport { Position, Rect, restoreOffset } from '@embedpdf/models';\n\nexport interface VertexEditorProps {\n /** Bounding box (PDF units) of the annotation */\n rect: Rect;\n /** Page rotation (0-3) */\n rotation: number;\n /** Current zoom factor */\n scale: number;\n /** Array of vertices in PDF units */\n vertices: Position[];\n /** Called *every* drag frame with new vertices */\n onEdit: (v: Position[]) => void;\n /** Called once at end of drag to commit changes */\n onCommit: (v: Position[]) => void;\n /** Size of handle in CSS px */\n handleSize?: number;\n}\n\n/*\n * Renders N absolutely-positioned <div> handles *inside*\n * the already-counter-rotated AnnotationContainer.
Each\n * handle captures pointer-events and updates the vertex\n * array in PDF units via restoreOffset().\n */\nexport function VertexEditor({\n rect,\n rotation,\n scale,\n vertices,\n onEdit,\n onCommit,\n handleSize = 12,\n}: VertexEditorProps): JSX.Element {\n const [dragIdx, setDragIdx] = useState<number | null>(null);\n const startScreen = useRef<{ x: number; y: number } | null>(null);\n const startVerts = useRef<Position[]>([]);\n\n const applyDelta = (deltaScreen: { x: number; y: number }): Position[] => {\n const deltaPdf = restoreOffset(deltaScreen, rotation, scale);\n const next = [...startVerts.current];\n if (dragIdx !== null) {\n next[dragIdx] = {\n x: next[dragIdx].x + deltaPdf.x,\n y: next[dragIdx].y + deltaPdf.y,\n };\n }\n return next;\n };\n\n // ─── pointer handlers ───────────────────────────────────────\n const handleDown = (idx: number) => (e: PointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n e.preventDefault();\n setDragIdx(idx);\n startScreen.current = { x: e.clientX, y: e.clientY };\n startVerts.current = vertices;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent<HTMLDivElement>) => {\n if (dragIdx === null || !startScreen.current) return;\n const deltaRaw = {\n x: e.clientX - startScreen.current.x,\n y: e.clientY - startScreen.current.y,\n };\n onEdit(applyDelta(deltaRaw));\n };\n\n const handleUp = (e: PointerEvent<HTMLDivElement>) => {\n if (dragIdx === null || !startScreen.current) return;\n (e.target as HTMLElement).releasePointerCapture(e.pointerId);\n const deltaRaw = {\n x: e.clientX - startScreen.current.x,\n y: e.clientY - startScreen.current.y,\n };\n onCommit(applyDelta(deltaRaw));\n setDragIdx(null);\n };\n\n // ─── render handles ─────────────────────────────────────────\n return (\n <Fragment>\n {vertices.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - handleSize / 2;\n const top = (v.y - rect.origin.y) * scale - handleSize / 2;\n return (\n <div\n key={i}\n style={{\n position: 'absolute',\n left,\n top,\n width: handleSize,\n height: handleSize,\n borderRadius: '50%',\n background: '#2196f3',\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: 4,\n }}\n onPointerDown={handleDown(i)}\n onPointerMove={handleMove}\n onPointerUp={handleUp}\n />\n );\n })}\n </Fragment>\n );\n}\n","import { PointerEvent, TouchEvent, useState, useRef, useEffect } from '@framework';\nimport { PdfAnnotationObject, Position, Rect, restoreOffset } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { ResizeDirection } from '../types';\nimport { ComputePatch } from '../patchers';\n\ninterface UseDragResizeOpts<T extends PdfAnnotationObject> {\n /* invariants */\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n\n /* annotation info */\n tracked: TrackedAnnotation<T>;\n\n /* config */\n isSelected: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n computePatch?: ComputePatch<T>;\n computeVertices?: (a: T) => Position[];\n lockAspectRatio?: boolean;\n\n /* state held by caller */\n currentRect: Rect;\n setCurrentRect: (r: Rect) => void;\n setCurrentVertices: (v: Position[]) => void;\n setPreviewObject: (p: Partial<T> | null) => void;\n\n /* commit */\n commit: (patch: Partial<T>) => void;\n}\n\ntype Point = { x: number; y: number };\ntype DragState = 'idle' | 'dragging' | 'resizing';\n\nexport function useDragResize<T extends PdfAnnotationObject>({\n scale,\n pageWidth,\n pageHeight,\n rotation,\n tracked,\n isSelected,\n isDraggable,\n isResizable,\n computePatch,\n computeVertices,\n lockAspectRatio = false,\n currentRect,\n setCurrentRect,\n setCurrentVertices,\n setPreviewObject,\n commit,\n}: UseDragResizeOpts<T>) {\n /* ── local refs ─────────────────────────────────────────── */\n const drag = useRef<DragState>('idle');\n const dir = useRef<ResizeDirection>('none');\n const startPos = useRef<Point | null>(null);\n const startRect = useRef<Rect | null>(null);\n\n /* ── helpers ────────────────────────────────────────────── */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageW = pageWidth / scale;\n const pageH = pageHeight / scale;\n\n /* ── core maths shared by drag + resize ─────────────────── */\n const applyDelta = (dx: number, dy: number) => {\n if (!startRect.current) return currentRect;\n\n let { origin, size } = startRect.current;\n\n let ox = origin.x;\n let oy = origin.y;\n let w = size.width;\n let h = size.height;\n\n if (drag.current === 'dragging') {\n ox += dx;\n oy += dy;\n } else if (drag.current === 'resizing') {\n if (dir.current.includes('right')) w += dx;\n else if (dir.current.includes('left')) {\n ox += dx;\n w -= dx;\n }\n if (dir.current.includes('bottom')) h += dy;\n else if (dir.current.includes('top')) {\n oy += dy;\n h -= dy;\n }\n\n /* maintain aspect ratio if requested */\n if (lockAspectRatio && startRect.current) {\n const ratio = startRect.current.size.width / startRect.current.size.height;\n\n /* store anchors before adjusting (so we can restore them later) */\n const anchorRight = ox + w;\n const anchorBottom = oy + h;\n\n /* decide the primary axis once, based on the resize handle */\n const horizontalPrimary = dir.current.includes('left') || dir.current.includes('right');\n if (horizontalPrimary) {\n // width is changing → derive height from width\n h = w / ratio;\n } else {\n // height is changing → derive width from height\n w = h * ratio;\n }\n\n /* adjust origin to preserve anchors for left/top sides */\n if (dir.current.includes('left')) {\n ox = anchorRight - w;\n }\n if (dir.current.includes('top')) {\n oy = anchorBottom - h;\n }\n }\n }\n /* prevent negative dimensions */\n if (w < 1 || h < 1) return currentRect;\n\n /* clamp to page */\n w = clamp(w, 1, pageW);\n h = clamp(h, 1, pageH);\n ox = clamp(ox, 0, pageW - w);\n oy = clamp(oy, 0, pageH - h);\n\n return { origin: { x: ox, y: oy }, size: { width: w, height: h } };\n };\n\n /* ── helpers inside the hook ────────────────────────────── */\n const beginDrag = (kind: DragState, clientX: number, clientY: number) => {\n drag.current = kind;\n startPos.current = { x: clientX, y: clientY };\n startRect.current = currentRect;\n };\n\n const handleMove = (clientX: number, clientY: number) => {\n if (drag.current === 'idle' || !startPos.current) return;\n const disp = {\n x: clientX - startPos.current.x,\n y: clientY - startPos.current.y,\n };\n const { x, y } = restoreOffset(disp, rotation, scale);\n const nextRect = applyDelta(x, y);\n\n /* build preview patch */\n let patch: Partial<T> = { rect: nextRect } as Partial<T>;\n if (computePatch) {\n patch = computePatch(tracked.object, {\n rect: nextRect,\n direction: drag.current === 'resizing' ? dir.current : 'bottom-right',\n });\n if (computeVertices) setCurrentVertices(computeVertices({ ...tracked.object, ...patch }));\n }\n setCurrentRect(patch.rect ?? nextRect);\n setPreviewObject(patch);\n };\n\n const finishDragInternal = () => {\n if (drag.current === 'idle') return;\n\n const usedDir = dir.current || 'bottom-right';\n drag.current = 'idle';\n\n /* final patch */\n let patch: Partial<T> = { rect: currentRect } as Partial<T>;\n if (computePatch) {\n patch = computePatch(tracked.object, {\n rect: currentRect,\n direction: usedDir,\n });\n }\n commit(patch);\n\n /* cleanup */\n startPos.current = null;\n startRect.current = null;\n dir.current = 'none';\n setPreviewObject(null);\n };\n\n /* ── pointer handlers for the container ─────────────────── */\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isDraggable) return;\n e.stopPropagation();\n e.preventDefault();\n beginDrag('dragging', e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => handleMove(e.clientX, e.clientY);\n\n const onPointerUp = (e?: PointerEvent<HTMLDivElement>) => {\n finishDragInternal();\n if (e?.currentTarget && e.pointerId !== undefined) {\n try {\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n } catch {\n /* ignore – we might have already lost capture */\n }\n }\n };\n\n /* ── handle pointer-down from resize handles ────────────── */\n const startResize = (direction: ResizeDirection) => (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isResizable) return;\n e.stopPropagation();\n e.preventDefault();\n dir.current = direction;\n beginDrag('resizing', e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n /* ── touch handlers (mobile fallback) ───────────────────── */\n const onTouchStart = (e: TouchEvent<HTMLDivElement>) => {\n if (!isSelected || !isDraggable) return;\n e.stopPropagation();\n e.preventDefault();\n const t = e.touches[0];\n if (!t) return;\n beginDrag('dragging', t.clientX, t.clientY);\n };\n\n const onTouchMove = (e: TouchEvent<HTMLDivElement>) => {\n const t = e.touches[0];\n if (!t) return;\n handleMove(t.clientX, t.clientY);\n };\n\n const onTouchEnd = () => finishDragInternal();\n\n /* reset when annotation changes */\n useEffect(() => {\n drag.current = 'idle';\n dir.current = 'none';\n startPos.current = null;\n startRect.current = null;\n }, [tracked]);\n\n /* ── public surface ─────────────────────────────────────── */\n return {\n rootHandlers: {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel: () => onPointerUp(),\n onLostPointerCapture: () => onPointerUp(),\n\n /* mobile touch fallback */\n onTouchStart,\n onTouchMove,\n onTouchEnd,\n onTouchCancel: onTouchEnd,\n },\n startResize,\n };\n}\n","import { ResizeDirection } from '../types';\nimport { PointerEvent } from '@framework';\n\ninterface Props {\n rotation: number;\n outlineOffset?: number;\n startResize: (d: ResizeDirection) => (e: PointerEvent<HTMLDivElement>) => void;\n}\n\nconst commonStyle = (o: number) => ({\n position: 'absolute' as const,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n});\n\nexport function ResizeHandles({ rotation, outlineOffset = 1, startResize }: Props) {\n const o = outlineOffset;\n return (\n <>\n <div\n style={{\n ...commonStyle(o),\n top: -7 - o,\n left: -7 - o,\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n onPointerDown={startResize('top-left')}\n />\n <div\n style={{\n ...commonStyle(o),\n top: -7 - o,\n right: -7 - o,\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n onPointerDown={startResize('top-right')}\n />\n <div\n style={{\n ...commonStyle(o),\n bottom: -7 - o,\n left: -7 - o,\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n onPointerDown={startResize('bottom-left')}\n />\n <div\n style={{\n ...commonStyle(o),\n bottom: -7 - o,\n right: -7 - o,\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n onPointerDown={startResize('bottom-right')}\n />\n </>\n );\n}\n","import {\n JSX,\n HTMLAttributes,\n CSSProperties,\n useState,\n Fragment,\n useLayoutEffect,\n mapDoubleClick,\n MouseEvent,\n} from '@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Position, Rect, rectEquals } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { SelectionMenuProps } from '../../shared/types';\nimport { CounterRotate } from '@embedpdf/utils/@framework';\nimport { VertexEditor } from './vertex-editor';\nimport { ComputePatch } from '../patchers';\nimport { useDragResize } from '../hooks/use-drag-resize';\nimport { ResizeHandles } from './resize-handles';\n\ntype AnnotationContainerProps<T extends PdfAnnotationObject> = Omit<\n HTMLAttributes<HTMLDivElement>,\n 'style' | 'children'\n> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n style?: CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n selectionMenu?: (props: SelectionMenuProps) => JSX.Element;\n computeVertices?: (annotation: T) => Position[];\n computePatch?: ComputePatch<T>;\n lockAspectRatio?: boolean;\n};\n\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n lockAspectRatio = false,\n computeVertices,\n computePatch,\n selectionMenu,\n onDoubleClick,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [currentVertices, setCurrentVertices] = useState<Position[]>(\n computeVertices?.(trackedAnnotation.object) ?? [],\n );\n const [previewObject, setPreviewObject] = useState<Partial<T> | null>(null);\n\n /* hook owns every pointer detail */\n const { rootHandlers, startResize } = useDragResize({\n scale,\n pageWidth,\n pageHeight,\n rotation,\n tracked: trackedAnnotation,\n isSelected,\n isDraggable,\n isResizable,\n lockAspectRatio,\n computePatch,\n computeVertices,\n currentRect,\n setCurrentRect,\n setCurrentVertices,\n setPreviewObject,\n commit: (patch) =>\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.object.id, patch),\n });\n\n useLayoutEffect(() => {\n if (!rectEquals(trackedAnnotation.object.rect, currentRect)) {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject((prev) => (prev ? { ...prev, rect: trackedAnnotation.object.rect } : null));\n setCurrentVertices(computeVertices?.(trackedAnnotation.object) ?? []);\n }\n }, [trackedAnnotation]);\n\n const currentObject = previewObject\n ? { ...trackedAnnotation.object, ...previewObject }\n : trackedAnnotation.object;\n\n return (\n <Fragment>\n <div\n /* attach handlers */\n {...rootHandlers}\n {...mapDoubleClick(onDoubleClick)}\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 touchAction: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...(isSelected && {\n zIndex: 3,\n }),\n ...style,\n }}\n {...props}\n >\n {/* children */}\n {typeof children === 'function' ? children(currentObject) : children}\n\n {/* vertex editing – unchanged */}\n {isSelected && currentVertices.length > 0 && (\n <VertexEditor\n rect={currentRect}\n rotation={rotation}\n scale={scale}\n vertices={currentVertices}\n onEdit={(v) => {\n setCurrentVertices(v);\n if (computePatch) {\n const patch = computePatch(trackedAnnotation.object, {\n rect: currentRect,\n vertices: v,\n });\n setPreviewObject(patch);\n setCurrentRect(patch.rect || currentRect);\n }\n }}\n onCommit={(v) => {\n if (annotationProvides && computePatch) {\n const patch = computePatch(trackedAnnotation.object, {\n rect: currentRect,\n vertices: v,\n });\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.object.id, patch);\n }\n }}\n />\n )}\n\n {/* resize handles */}\n {isSelected && isResizable && (\n <ResizeHandles\n rotation={rotation}\n outlineOffset={outlineOffset}\n startResize={startResize}\n />\n )}\n </div>\n\n {/* CounterRotate remains unchanged */}\n <CounterRotate\n rect={{\n origin: { x: currentRect.origin.x * scale, y: currentRect.origin.y * scale },\n size: { width: currentRect.size.width * scale, height: currentRect.size.height * scale },\n }}\n rotation={rotation}\n >\n {({ rect, menuWrapperProps }) =>\n selectionMenu &&\n selectionMenu({\n annotation: trackedAnnotation,\n selected: isSelected,\n rect,\n menuWrapperProps,\n })\n }\n </CounterRotate>\n </Fragment>\n );\n}\n","import { JSX, Fragment } from 'preact';\nexport { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDblClick: handler } : {});\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } 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> | TouchEvent<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 onPointerDown={onClick}\n onTouchStart={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, TouchEvent } 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> | TouchEvent<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 onPointerDown={onClick}\n onTouchStart={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, TouchEvent } 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> | TouchEvent<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 onPointerDown={onClick}\n onTouchStart={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, TouchEvent } 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> | TouchEvent<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 onPointerDown={onClick}\n onTouchStart={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, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\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> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\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 overflow: 'visible',\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 opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { ComputePatch } from './patchers';\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 const patchInk: ComputePatch<PdfInkAnnoObject> = (original, ctx) => {\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 = ctx.rect.size.width / oldRect.size.width;\n let scaleY = ctx.rect.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 (ctx.rect.size.width < minSize || ctx.rect.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 ctx.rect = {\n origin: ctx.rect.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 (ctx.uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n ctx.rect.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: ctx.rect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: ctx.rect.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 = Math.round(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: ctx.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n};\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts[1], localPts[0]); // direction INTO first segment\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]);\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from first segment start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad,\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string; // interior fill colour\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n}: PolygonProps): JSX.Element {\n // Translate vertices into local coords\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('') + 'Z').trim();\n }, [localPts]);\n\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nexport interface PatchContext {\n rect: Rect;\n vertices?: Position[];\n}\n\nexport type PatchFn<T extends PdfAnnotationObject> = (original: T, ctx: PatchContext) => Partial<T>;\n\nexport const patchLine: PatchFn<PdfLineAnnoObject> = (orig, ctx) => {\n /* ---------- vertex edit ------------------------------------------------ */\n if (ctx.vertices && ctx.vertices.length >= 2) {\n const rect = patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start: ctx.vertices[0], end: ctx.vertices[1] },\n };\n }\n\n /* ---------- rect drag -------------------------------------------------- */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n return {\n rect: ctx.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n};\n\nexport const patchPolyline: PatchFn<PdfPolylineAnnoObject> = (orig, ctx) => {\n /* vertex update */\n if (ctx.vertices && ctx.vertices.length) {\n return {\n rect: patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.vertices,\n };\n }\n\n /* rect move */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport const patchPolygon: PatchFn<PdfPolygonAnnoObject> = (orig, ctx) => {\n if (ctx.vertices && ctx.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.vertices), pad),\n vertices: ctx.vertices,\n };\n }\n\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport function getPatchFn(type: PdfAnnotationSubtype) {\n switch (type) {\n case PdfAnnotationSubtype.LINE:\n return patchLine;\n case PdfAnnotationSubtype.POLYLINE:\n return patchPolyline;\n case PdfAnnotationSubtype.POLYGON:\n return patchPolygon;\n default:\n return undefined;\n }\n}\n","import { MouseEvent, TouchEvent, useEffect, useRef } from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n style={{\n color: annotation.object.fontColor,\n fontSize: annotation.object.fontSize * scale,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: '100%',\n height: '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n }}\n contentEditable={isEditing}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n pageIndex,\n annotation,\n scaleFactor = 1,\n style,\n ...props\n}: RenderAnnotationProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const urlRef = useRef<string | null>(null);\n\n const { width, height } = annotation.rect.size;\n\n useEffect(() => {\n if (annotationProvides) {\n const task = annotationProvides.renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, annotation.id, width, height]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return (\n <Fragment>\n {imageUrl && (\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n {...props}\n style={{\n width: '100%',\n height: '100%',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({ isSelected, annotation, pageIndex, scale, onClick }: StampProps) {\n return (\n <div\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { blendModeToCss, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n} from '@embedpdf/plugin-annotation';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\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 { Square } from './annotations/square';\nimport { SelectionMenu } from '../types';\nimport { Circle } from './annotations/circle';\nimport { patchInk } from '../patch-ink';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { patchLine, patchPolygon, patchPolyline } from '../vertex-patchers';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale, selectionMenu } = 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 const [editingId, setEditingId] = useState<string | 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 setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n selectionProvides.clear();\n setEditingId(null);\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?.object.id === annotation.object.id;\n const isEditing = editingId === annotation.object.id;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n computePatch={patchInk}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n isSelected={isSelected}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n inkList={obj.inkList}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n rect={obj.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchLine}\n computeVertices={(annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ]}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n linePoints={obj.linePoints}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchPolyline}\n computeVertices={(annotation) => annotation.vertices}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computeVertices={(annotation) => annotation.vertices}\n computePatch={patchPolygon}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n outlineOffset={6}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n lockAspectRatio={true}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(_object) => (\n <Stamp\n isSelected={isSelected}\n annotation={annotation}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { ActiveTool } 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 if (!activeTool.defaults) return null;\n\n switch (activeTool.defaults.subtype) {\n case 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 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 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 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, JSX } 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 {\n PdfInkListObject,\n Rect,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n PdfBlendMode,\n rectFromPoints,\n expandRect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\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\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 /* 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 const toolBlendMode = activeTool.defaults?.blendMode ?? PdfBlendMode.Normal;\n const intent = activeTool.defaults?.intent;\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\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>(\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.setPointerCapture?.();\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.releasePointerCapture?.();\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 rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\n\n // Ignore tiny drawings\n if (rect.size.width < 1 || rect.size.height < 1) return;\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n intent,\n blendMode: toolBlendMode,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n created: new Date(),\n pageIndex,\n id: uuidV4(),\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.releasePointerCapture?.();\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 rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\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 - 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\n return (\n <svg\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={rect.size.width * scale}\n height={rect.size.height * scale}\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 opacity={toolOpacity}\n style={{\n stroke: toolColor,\n strokeWidth: toolStrokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n};\n","import { useEffect, useMemo, 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 {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfCircleAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface CirclePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const CirclePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: CirclePaintProps) => {\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 return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.CIRCLE) 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 const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'circle', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small circles\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfCircleAnnoObject = {\n type: PdfAnnotationSubtype.CIRCLE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n created: new Date(),\n pageIndex,\n id: uuidV4(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\n\n const cx = halfStroke + width / 2;\n const cy = halfStroke + height / 2;\n const rx = width / 2;\n const ry = height / 2;\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 <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, 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 {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfSquareAnnoObject,\n Rect,\n PdfAnnotationFlags,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface SquarePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const SquarePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: SquarePaintProps) => {\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 return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.SQUARE) 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 const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'square', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small squares\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfSquareAnnoObject = {\n type: PdfAnnotationSubtype.SQUARE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\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 <rect\n x={halfStroke}\n y={halfStroke}\n width={width}\n height={height}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, 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 {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolylineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { patching } from '@embedpdf/plugin-annotation';\nimport { Polyline } from './polyline';\nimport { clamp } from '@embedpdf/core';\n\ninterface PolylinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const PolylinePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolylinePaintProps) => {\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 useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYLINE) 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 const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolLineEndings = activeTool.defaults.lineEndings;\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'polyline', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – vertices & current pointer */\n /* ------------------------------------------------------------------ */\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitPolyline = (pts: { x: number; y: number }[]) => {\n if (pts.length < 2) return; // need at least a line\n\n const rect = patching.lineRectWithEndings(pts, toolStrokeWidth, toolLineEndings);\n\n const anno: PdfPolylineAnnoObject = {\n type: PdfAnnotationSubtype.POLYLINE,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 1 && annotationProvides) {\n commitPolyline(vertices);\n }\n setVertices([]);\n setCurrent(null);\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const rect = patching.lineRectWithEndings(allPts, toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor: cursor,\n }}\n >\n <Polyline\n rect={rect}\n vertices={allPts}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n />\n </div>\n );\n};\n","import { useEffect, useState, useMemo } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool, patching } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfLineAnnoObject,\n PdfAnnotationBorderStyle,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { Line } from './line';\nimport { clamp } from '@embedpdf/core';\n\ninterface LinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const LinePaint = ({ pageIndex, scale, pageWidth, pageHeight, cursor }: LinePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.LINE) 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 const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n const toolLineEndings = activeTool.defaults.lineEndings;\n const intent = activeTool.defaults.intent;\n /* ------------------------------------------------------------------ */\n /* interaction manager integration */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: ['line', 'lineArrow'], pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitLine = (p1: { x: number; y: number }, p2: { x: number; y: number }) => {\n // ignore tiny lines\n if (Math.abs(p2.x - p1.x) < 1 && Math.abs(p2.y - p1.y) < 1) return;\n\n const rect = patching.lineRectWithEndings([p1, p2], toolStrokeWidth, toolLineEndings);\n\n const anno: PdfLineAnnoObject = {\n type: PdfAnnotationSubtype.LINE,\n rect,\n linePoints: { start: p1, end: p2 },\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n intent,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n commitLine(start, current);\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [start, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const rect = patching.lineRectWithEndings([start, current], toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor,\n }}\n >\n <Line\n rect={rect}\n linePoints={{ start, end: current }}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n strokeStyle={toolStrokeStyle}\n strokeDashArray={toolStrokeDashArray}\n />\n </div>\n );\n};\n","import { useEffect, useMemo, 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 {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolygonAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface PolygonPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n cursor?: string;\n}\n\nconst HANDLE_SIZE_PX = 14; // visual square size on screen\n\nexport const PolygonPaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolygonPaintProps) => {\n const { provides: annotationProvides } = useAnnotationCapability();\n\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => annotationProvides?.onActiveToolChange(setActiveTool), [annotationProvides]);\n\n if (!activeTool.defaults || activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYGON)\n 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 const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n const { register } = usePointerHandlers({ modeId: 'polygon', pageIndex });\n\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const commitPolygon = (pts: { x: number; y: number }[]) => {\n const xs = pts.map((p) => p.x),\n ys = pts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n if (maxX - minX < 1 || maxY - minY < 1) return;\n\n const half = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - half, y: minY - half },\n size: { width: maxX - minX + toolStrokeWidth, height: maxY - minY + toolStrokeWidth },\n };\n\n const anno: PdfPolygonAnnoObject = {\n type: PdfAnnotationSubtype.POLYGON,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n // Square hit-test in PDF units\n const isInsideStartHandle = (x: number, y: number) => {\n if (vertices.length < 2) return false;\n const sizePDF = HANDLE_SIZE_PX / scale;\n const half = sizePDF / 2;\n const v0 = vertices[0];\n return x >= v0.x - half && x <= v0.x + half && y >= v0.y - half && y <= v0.y + half;\n };\n\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n\n // Click on start-handle ⇒ close polygon\n if (isInsideStartHandle(x, y) && vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n return;\n }\n\n // Normal vertex add\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n } else {\n setVertices([]);\n setCurrent(null);\n }\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n // ---------- preview ----------\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const xs = allPts.map((p) => p.x),\n ys = allPts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n\n const half = toolStrokeWidth / 2;\n const svgMinX = minX - half;\n const svgMinY = minY - half;\n const svgMaxX = maxX + half;\n const svgMaxY = maxY + half;\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const mainPath = useMemo(() => {\n let d = '';\n allPts.forEach(({ x, y }, i) => {\n d += (i === 0 ? 'M' : 'L') + (x - svgMinX) + ' ' + (y - svgMinY) + ' ';\n });\n return d.trim();\n }, [allPts, svgMinX, svgMinY]);\n\n const dottedPath =\n vertices.length >= 2\n ? (() => {\n const curLx = current.x - svgMinX;\n const curLy = current.y - svgMinY;\n const firstLx = vertices[0].x - svgMinX;\n const firstLy = vertices[0].y - svgMinY;\n return `M ${curLx} ${curLy} L ${firstLx} ${firstLy}`;\n })()\n : null;\n\n // Start-handle rect (screen px converted to pdf units, then to local svg coords)\n const handleSizePDF = HANDLE_SIZE_PX / scale;\n const hHalf = handleSizePDF / 2;\n const hx = vertices[0].x - hHalf - svgMinX;\n const hy = vertices[0].y - hHalf - svgMinY;\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', // we handle clicks at the page layer\n zIndex: 2,\n overflow: 'visible',\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {/* solid preview edges */}\n <path\n d={mainPath}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* dotted closing helper */}\n {dottedPath && (\n <path\n d={dottedPath}\n fill=\"none\"\n style={{ stroke: toolStrokeColor, strokeWidth: toolStrokeWidth, strokeDasharray: '4,4' }}\n />\n )}\n\n {/* clickable start-handle (visual only; hit-test done in handler) */}\n {vertices.length >= 3 && (\n <rect\n x={hx}\n y={hy}\n width={handleSizePDF}\n height={handleSizePDF}\n fill={toolStrokeColor}\n opacity={0.4}\n stroke={toolStrokeColor}\n strokeWidth={toolStrokeWidth / 2}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </svg>\n );\n};\n","// packages/plugin-annotation/src/shared/components/annotations/free-text-paint.tsx\nimport { useEffect, useMemo, 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 { PdfAnnotationSubtype, PdfFreeTextAnnoObject, Rect, uuidV4 } from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\n\ninterface FreeTextPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const FreeTextPaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor = 'text',\n}: FreeTextPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n /* ------------------------------------------------------------------ */\n /* active tool */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => annotationProvides?.onActiveToolChange(setActiveTool), [annotationProvides]);\n\n if (!activeTool.defaults || activeTool.defaults.subtype !== PdfAnnotationSubtype.FREETEXT)\n return null;\n\n const toolFontColor = activeTool.defaults.fontColor ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolFontSize = activeTool.defaults.fontSize ?? 12;\n const toolFontFamily = activeTool.defaults.fontFamily;\n const toolBackgroundColor = activeTool.defaults.backgroundColor ?? 'transparent';\n const toolTextAlign = activeTool.defaults.textAlign;\n const toolVerticalAlign = activeTool.defaults.verticalAlign;\n const toolContent = activeTool.defaults.content ?? 'Insert text here';\n\n /* ------------------------------------------------------------------ */\n /* interaction-manager integration */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'freeText', pageIndex });\n\n /* helpers ----------------------------------------------------------- */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* local drag state -------------------------------------------------- */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* commit helper ----------------------------------------------------- */\n const commitFreeText = (p1: { x: number; y: number }, p2: { x: number; y: number }) => {\n const minX = Math.min(p1.x, p2.x);\n const minY = Math.min(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n const maxY = Math.max(p1.y, p2.y);\n const w = maxX - minX;\n const h = maxY - minY;\n\n if (w < 1 || h < 1) return; // ignore tiny boxes\n\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width: w, height: h },\n };\n\n const anno: PdfFreeTextAnnoObject = {\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n contents: toolContent,\n fontColor: toolFontColor,\n fontSize: toolFontSize,\n fontFamily: toolFontFamily,\n opacity: toolOpacity,\n backgroundColor: toolBackgroundColor,\n textAlign: toolTextAlign,\n verticalAlign: toolVerticalAlign,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* pointer handlers -------------------------------------------------- */\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n commitFreeText(start, current);\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [start, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register with interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview while dragging */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const dw = maxX - minX;\n const dh = maxY - minY;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: minX * scale,\n top: minY * 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 {/* Simple outline preview */}\n <rect\n x={0}\n y={0}\n width={dw}\n height={dh}\n fill=\"transparent\"\n style={{\n stroke: toolFontColor,\n strokeWidth: 1,\n strokeDasharray: '4,4',\n cursor,\n }}\n />\n </svg>\n );\n};\n","import { PdfAnnotationSubtype, PdfStampAnnoObject, Rect, uuidV4 } from '@embedpdf/models';\nimport { useState, useEffect, useMemo, useRef, ChangeEvent, Fragment } 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 { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface StampPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n}\n\nexport const StampPaint = ({ pageIndex, scale, pageWidth, pageHeight }: StampPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\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 return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.STAMP) return null;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'stamp', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n inputRef.current?.click();\n },\n }),\n [pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n const onChange = async (e: ChangeEvent<HTMLInputElement>) => {\n if (!annotationProvides || !start) return;\n\n const file = e.currentTarget.files?.[0];\n if (!file) return;\n\n /* --------------------------------------------------------------- *\n * 1. Load image (keep full resolution) *\n * --------------------------------------------------------------- */\n const img = await new Promise<HTMLImageElement>((res, rej) => {\n const i = new Image();\n i.onload = () => res(i);\n i.onerror = rej;\n i.src = URL.createObjectURL(file);\n });\n\n const imgW = img.naturalWidth;\n const imgH = img.naturalHeight;\n\n /* --------------------------------------------------------------- *\n * 2. Decide rect that keeps stamp on page *\n * --------------------------------------------------------------- */\n const maxW = pageWidthPDF;\n const maxH = pageHeightPDF;\n\n // how much can we scale without overflowing?\n const scaleFactor = Math.min(1, maxW / imgW, maxH / imgH);\n const pdfW = imgW * scaleFactor;\n const pdfH = imgH * scaleFactor;\n\n // If the stamp would overflow → shift it so it stays fully visible\n const posX = clamp(start.x, 0, maxW - pdfW);\n const posY = clamp(start.y, 0, maxH - pdfH);\n\n const rect: Rect = {\n origin: { x: posX, y: posY },\n size: { width: pdfW, height: pdfH },\n };\n\n /* --------------------------------------------------------------- *\n * 3. Copy pixels to ImageData (original resolution) *\n * --------------------------------------------------------------- */\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n canvas.width = pdfW;\n canvas.height = pdfH;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, pdfW, pdfH);\n const imageData = ctx.getImageData(0, 0, pdfW, pdfH);\n\n const anno: PdfStampAnnoObject = {\n type: PdfAnnotationSubtype.STAMP,\n flags: ['print'],\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n rect,\n };\n\n annotationProvides.createAnnotation(pageIndex, anno, { imageData });\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n\n setStart(null);\n };\n\n return (\n <Fragment>\n <canvas style={{ display: 'none' }} ref={canvasRef} />\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n style={{ display: 'none' }}\n onChange={onChange}\n />\n </Fragment>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\nimport { SelectionMenu } from '../types';\nimport { CirclePaint } from './annotations/circle-paint';\nimport { SquarePaint } from './annotations/square-paint';\nimport { PolylinePaint } from './annotations/polyline-paint';\nimport { LinePaint } from './annotations/line-paint';\nimport { PolygonPaint } from './annotations/polygon-paint';\nimport { FreeTextPaint } from './annotations/free-text-paint';\nimport { StampPaint } from './annotations/stamp-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n selectionMenu?: SelectionMenu;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n selectionMenu,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n <CirclePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <SquarePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolygonPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolylinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <LinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <FreeTextPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <StampPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n </div>\n );\n}\n"],"names":["useAnnotationCapability","useCapability","AnnotationPlugin","id","VertexEditor","rect","rotation","scale","vertices","onEdit","onCommit","handleSize","dragIdx","setDragIdx","useState","startScreen","useRef","startVerts","applyDelta","deltaScreen","deltaPdf","restoreOffset","next","current","x","y","handleMove","e","deltaRaw","clientX","clientY","handleUp","target","releasePointerCapture","pointerId","Fragment","children","map","v","i","left","origin","top","jsxRuntime","jsx","style","position","width","height","borderRadius","background","cursor","pointerEvents","zIndex","onPointerDown","idx","stopPropagation","preventDefault","setPointerCapture","onPointerMove","onPointerUp","useDragResize","pageWidth","pageHeight","tracked","isSelected","isDraggable","isResizable","computePatch","computeVertices","lockAspectRatio","currentRect","setCurrentRect","setCurrentVertices","setPreviewObject","commit","drag","dir","startPos","startRect","clamp","min","max","Math","pageW","pageH","beginDrag","kind","disp","nextRect","dx","dy","size","ox","oy","w","h","includes","ratio","anchorRight","anchorBottom","patch","object","direction","finishDragInternal","usedDir","currentTarget","onTouchEnd","useEffect","rootHandlers","onPointerCancel","onLostPointerCapture","onTouchStart","t","touches","onTouchMove","onTouchCancel","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","onDoubleClick","props","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","useLayoutEffect","rectEquals","prev","currentObject","handler","onDblClick","outline","touchAction","length","CounterRotate","menuWrapperProps","annotation","selected","Highlight","color","opacity","rects","onClick","b","Underline","thickness","r","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","patchInk","original","ctx","type","PdfAnnotationSubtype","INK","Error","oldRect","scaleX","scaleY","uniform","minScale","newInkList","p","avgScale","newStrokeWidth","round","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","first","rest","toAngle","a","startRad","endRad","Polygon","patchLine","orig","lineRectWithEndings","patchPolyline","moved","patchPolygon","pad","expandRect","rectFromPoints","FreeText","isEditing","editorRef","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","ref","onBlur","contents","innerText","fontColor","fontSize","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","backgroundColor","lineHeight","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","state","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","deselectAnnotation","handleClick","useCallback","selectAnnotation","clear","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","segmentRects","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","variantKey","defaults","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","subtype","UNDERLINE","_a","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","InkPaint","toolColor","toolOpacity","toolStrokeWidth","toolBlendMode","intent","modeId","currentStrokes","setCurrentStrokes","isDrawing","setIsDrawing","timerRef","pageWidthPDF","pageHeightPDF","pos","evt","curX","curY","clearTimeout","call","newLast","slice","setTimeout","allPoints","flatMap","s","anno","created","Date","uuidV4","createAnnotation","setActiveVariant","CirclePaint","CIRCLE","toolStrokeColor","toolStrokeStyle","toolStrokeDashArray","setStart","setCurrent","minX","minY","maxX","maxY","halfStroke","flags","svgMinX","svgMinY","dw","dh","SquarePaint","SQUARE","PolylinePaint","POLYLINE","toolLineEndings","setVertices","pts","commitPolyline","allPts","LinePaint","LINE","p1","p2","abs","commitLine","PolygonPaint","POLYGON","commitPolygon","xs","ys","half","v0","isInsideStartHandle","mainPath","dottedPath","handleSizePDF","hHalf","hx","hy","FreeTextPaint","FREETEXT","toolFontColor","toolFontSize","toolFontFamily","toolBackgroundColor","toolTextAlign","toolVerticalAlign","toolContent","content","commitFreeText","StampPaint","inputRef","canvasRef","STAMP","click","accept","onChange","async","file","files","img","Promise","res","rej","Image","onload","onerror","imgW","naturalWidth","imgH","naturalHeight","maxW","maxH","pdfW","pdfH","canvas","getContext","drawImage","imageData","getImageData","usePlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/preact/adapter.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/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/preview-renderer.tsx","../../src/shared/components/annotation-paint-layer.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 { JSX, Fragment } from 'preact';\nexport { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const suppressContentEditableWarningProps = {};\n","import { PdfAnnotationObject } from '@embedpdf/models';\nimport {\n CounterRotate,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, JSX, CSSProperties, useRef, useEffect } from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { ResizeHandleUI, SelectionMenuProps, VertexConfig, VertexHandleUI } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n isSelected: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n style?: CSSProperties;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: (props: SelectionMenuProps) => JSX.Element;\n outlineOffset?: number;\n onDoubleClick?: (event: any) => void; // You'll need to import proper MouseEvent type\n zIndex?: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n}\n\n// Simplified AnnotationContainer\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style = {},\n vertexConfig,\n selectionMenu,\n outlineOffset = 1,\n onDoubleClick,\n zIndex = 1,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const [preview, setPreview] = useState<T>(trackedAnnotation.object);\n const { provides: annotationProvides } = useAnnotationCapability();\n const gestureBaseRef = useRef<T | null>(null);\n\n const currentObject = preview\n ? { ...trackedAnnotation.object, ...preview }\n : trackedAnnotation.object;\n\n // Defaults retain current behavior\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const VERTEX_COLOR = vertexUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n const VERTEX_SIZE = vertexUI?.size ?? 12;\n\n const { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth / scale, height: pageHeight / scale },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n enabled: isSelected,\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n\n if (event.state === 'start') {\n gestureBaseRef.current = currentObject;\n }\n\n const transformType = event.transformData.type;\n const base = gestureBaseRef.current ?? currentObject;\n\n const changes = event.transformData.changes.vertices\n ? vertexConfig?.transformAnnotation(base, event.transformData.changes.vertices)\n : { rect: event.transformData.changes.rect };\n\n const patched = annotationProvides?.transformAnnotation<T>(base, {\n type: transformType,\n changes: changes as Partial<T>,\n metadata: event.transformData.metadata,\n });\n\n if (patched) {\n setPreview((prev) => ({\n ...prev,\n ...patched,\n }));\n }\n\n if (event.state === 'end' && patched) {\n gestureBaseRef.current = null;\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.object.id, patched);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n });\n\n const doubleProps = useDoublePressProps(onDoubleClick);\n\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n return (\n <div data-no-interaction>\n <div\n {...(isDraggable && isSelected ? dragProps : {})}\n {...doubleProps}\n style={{\n position: 'absolute',\n left: currentObject.rect.origin.x * scale,\n top: currentObject.rect.origin.y * scale,\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n outline: isSelected ? `1px solid ${selectionOutlineColor}` : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n pointerEvents: isSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {typeof children === 'function' ? children(currentObject) : children}\n\n {isSelected &&\n isResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n\n {isSelected &&\n vertices.map(({ key, ...vProps }) =>\n vertexUI?.component ? (\n vertexUI.component({\n key,\n ...vProps,\n backgroundColor: VERTEX_COLOR,\n })\n ) : (\n <div\n key={key}\n {...vProps}\n style={{ ...vProps.style, backgroundColor: VERTEX_COLOR }}\n />\n ),\n )}\n </div>\n {/* CounterRotate remains unchanged */}\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {({ rect, menuWrapperProps }) =>\n selectionMenu &&\n selectionMenu({\n annotation: trackedAnnotation,\n selected: isSelected,\n rect,\n menuWrapperProps,\n })\n }\n </CounterRotate>\n </div>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {segmentRects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={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, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\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 {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={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, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={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, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\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 {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={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, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\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> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\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 overflow: 'visible',\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 opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n // Calculate angles in the direction of the line segments\n const startRad = toAngle(localPts[0], localPts[1]); // direction FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // direction FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from line start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip points in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n\n // New optional props for preview rendering\n currentVertex?: Position;\n handleSize?: number;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex, // A preview-only prop\n handleSize = 14, // in CSS pixels\n}: PolygonProps): JSX.Element {\n const allPoints = currentVertex ? [...vertices, currentVertex] : vertices;\n\n const localPts = useMemo(\n () => allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [allPoints, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n // Don't close the path with 'Z' if it's a preview\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n }, [localPts, currentVertex]);\n\n const isPreviewing = currentVertex && vertices.length > 0;\n\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 overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: currentVertex ? 'none' : color, // No fill during preview\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n {/* --- Preview-only elements --- */}\n {isPreviewing && vertices.length > 1 && (\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style={{ stroke: strokeColor, strokeWidth, strokeDasharray: '4,4', opacity: 0.7 }}\n />\n )}\n {isPreviewing && vertices.length >= 2 && (\n <rect\n x={localPts[0].x - handleSize / scale / 2}\n y={localPts[0].y - handleSize / scale / 2}\n width={handleSize / scale}\n height={handleSize / scale}\n fill={strokeColor}\n opacity={0.4}\n stroke={strokeColor}\n strokeWidth={strokeWidth / 2}\n />\n )}\n </svg>\n );\n}\n","import {\n MouseEvent,\n TouchEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n suppressContentEditableWarningProps,\n} from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n const [isIOS, setIsIOS] = useState(false);\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n useLayoutEffect(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n setIsIOS(ios);\n } catch {\n setIsIOS(false);\n }\n }, []);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n // iOS zoom prevention: keep focused font-size >= 16px, visually scale down if needed.\n const computedFontPx = annotation.object.fontSize * scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n tabIndex={0}\n style={{\n color: annotation.object.fontColor,\n fontSize: adjustedFontPx,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n }}\n contentEditable={isEditing}\n {...suppressContentEditableWarningProps}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n pageIndex,\n annotation,\n scaleFactor = 1,\n style,\n ...props\n}: RenderAnnotationProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const urlRef = useRef<string | null>(null);\n\n const { width, height } = annotation.rect.size;\n\n useEffect(() => {\n if (annotationProvides) {\n const task = annotationProvides.renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, annotation.id, width, height]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return (\n <Fragment>\n {imageUrl && (\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n {...props}\n style={{\n width: '100%',\n height: '100%',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({ isSelected, annotation, pageIndex, scale, onClick }: StampProps) {\n return (\n <div\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { blendModeToCss, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n} from '@embedpdf/plugin-annotation';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\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 { Square } from './annotations/square';\nimport { ResizeHandleUI, SelectionMenu, VertexHandleUI } from '../types';\nimport { Circle } from './annotations/circle';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale, selectionMenu } = 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 const [editingId, setEditingId] = useState<string | 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 setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n selectionProvides.clear();\n if (annotation.object.id !== editingId) {\n setEditingId(null);\n }\n }\n },\n [annotationProvides, selectionProvides, editingId, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.object.id === annotation.object.id;\n const isEditing = editingId === annotation.object.id;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n vertexConfig={{\n extractVertices: (annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ],\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n linePoints: {\n start: vertices[0],\n end: vertices[1],\n },\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={!isEditing}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n lockAspectRatio={true}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(_object) => (\n <Stamp\n isSelected={isSelected}\n annotation={annotation}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } 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<AnnotationTool | null>(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 if (!activeTool || !activeTool.defaults) return null;\n\n switch (activeTool.defaults.type) {\n case 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 segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case 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 segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case 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 segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case 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 segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { Circle } from './annotations/circle';\nimport { Square } from './annotations/square';\nimport { Polygon } from './annotations/polygon';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Polyline } from './annotations/polyline';\nimport { Line } from './annotations/line';\nimport { Ink } from './annotations/ink';\n\ninterface Props {\n preview: AnyPreviewState;\n scale: number;\n}\n\nexport function PreviewRenderer({ preview, scale }: Props) {\n const { bounds } = preview;\n\n const style = {\n position: 'absolute' as const,\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n pointerEvents: 'none' as const,\n zIndex: 10,\n };\n\n // Use type guards for proper type narrowing\n if (preview.type === PdfAnnotationSubtype.CIRCLE) {\n return (\n <div style={style}>\n <Circle isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.SQUARE) {\n return (\n <div style={style}>\n <Square isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYGON) {\n return (\n <div style={style}>\n <Polygon isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYLINE) {\n return (\n <div style={style}>\n <Polyline isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.LINE) {\n return (\n <div style={style}>\n <Line isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.INK) {\n return (\n <div style={style}>\n <Ink isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.FREETEXT) {\n return (\n <div style={style}>\n {/* Render a simple dashed border preview */}\n <div\n style={{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }}\n />\n </div>\n );\n }\n\n return null;\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport { PreviewRenderer } from './preview-renderer';\n\ninterface Props {\n pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ pageIndex, scale }: Props) {\n const { plugin: annotationPlugin } = useAnnotationPlugin();\n const [previews, setPreviews] = useState<Map<string, AnyPreviewState>>(new Map());\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const services = useMemo<HandlerServices>(\n () => ({\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef.current) return;\n const input = fileInputRef.current;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef.current;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n }),\n [],\n );\n\n useEffect(() => {\n if (!annotationPlugin) return;\n\n return annotationPlugin.registerPageHandlers(pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n setPreviews((prev) => {\n const next = new Map(prev);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n return next;\n });\n },\n });\n }, [pageIndex, scale, annotationPlugin, services]);\n\n return (\n <>\n {/* Hidden DOM elements required by services */}\n <input ref={fileInputRef} type=\"file\" style={{ display: 'none' }} />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n\n {/* Render any active previews from any tool */}\n {Array.from(previews.entries()).map(([toolId, preview]) => (\n <PreviewRenderer key={toolId} preview={preview} scale={scale} />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { SelectionMenu, ResizeHandleUI, VertexHandleUI } from '../types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n /** Customize selection menu across all annotations on this layer */\n selectionMenu?: SelectionMenu;\n style?: CSSProperties;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n};\n\nexport function AnnotationLayer({\n style,\n pageIndex,\n scale,\n selectionMenu,\n resizeUI,\n vertexUI,\n pageWidth,\n pageHeight,\n rotation,\n selectionOutlineColor,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <AnnotationPaintLayer pageIndex={pageIndex} scale={scale} />\n </div>\n );\n}\n"],"names":["useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","suppressContentEditableWarningProps","AnnotationContainer","scale","pageIndex","rotation","pageWidth","pageHeight","trackedAnnotation","children","isSelected","isDraggable","isResizable","lockAspectRatio","style","vertexConfig","selectionMenu","outlineOffset","onDoubleClick","zIndex","resizeUI","vertexUI","selectionOutlineColor","props","preview","setPreview","useState","object","provides","annotationProvides","gestureBaseRef","useRef","currentObject","HANDLE_COLOR","color","VERTEX_COLOR","HANDLE_SIZE","size","VERTEX_SIZE","dragProps","vertices","resize","useInteractionHandles","controller","element","rect","extractVertices","constraints","minWidth","minHeight","boundingBox","width","height","maintainAspectRatio","pageRotation","enabled","onUpdate","event","_a","transformData","type","state","current","transformType","base","changes","transformAnnotation","patched","metadata","prev","updateAnnotation","handleSize","spacing","offsetMode","includeSides","vertexSize","includeVertices","doubleProps","useDoublePressProps","useEffect","jsxs","jsxRuntime","position","left","origin","x","top","y","outline","pointerEvents","touchAction","cursor","map","key","hProps","component","backgroundColor","jsx","vProps","CounterRotate","menuWrapperProps","annotation","selected","Highlight","opacity","segmentRects","onClick","Fragment","b","i","onPointerDown","onTouchStart","background","Underline","thickness","r","bottom","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","Math","max","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","length","first","rest","p","toAngle","a","startRad","endRad","Polygon","currentVertex","allPoints","isPreview","isPreviewing","FreeText","isEditing","editorRef","isIOS","setIsIOS","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","useLayoutEffect","nav","navigator","ios","test","userAgent","platform","maxTouchPoints","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","ref","onBlur","contents","innerText","tabIndex","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","transformOrigin","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","target","currentTarget","deselectAnnotation","handleClick","useCallback","e","stopPropagation","selectAnnotation","clear","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","rects","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","defaults","PdfAnnotationSubtype","UNDERLINE","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","PreviewRenderer","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","border","AnnotationPaintLayer","plugin","annotationPlugin","previews","setPreviews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","value","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","Array","from","entries"],"mappings":"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"}
|