@embedpdf/plugin-annotation 1.0.19 → 1.0.21
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 +3 -1
- package/dist/index.js.map +1 -1
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +2 -57
- package/dist/preact/index.js.map +1 -1
- package/dist/preact/utils.d.ts +1 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +3 -58
- package/dist/react/index.js.map +1 -1
- package/dist/react/utils.d.ts +1 -0
- package/dist/shared-preact/index.d.ts +1 -0
- package/dist/shared-preact/types.d.ts +1 -1
- package/dist/shared-react/index.d.ts +1 -0
- package/dist/shared-react/types.d.ts +1 -1
- package/package.json +10 -9
- package/dist/shared-preact/components/counter-rotate-container.d.ts +0 -33
- package/dist/shared-react/components/counter-rotate-container.d.ts +0 -33
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-annotation.ts","../../src/react/adapter.ts","../../src/shared/components/counter-rotate-container.tsx","../../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/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","export {\n Fragment,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n useLayoutEffect,\n JSX,\n ChangeEvent,\n} from 'react';\nexport type {\n ReactNode,\n HTMLAttributes,\n CSSProperties,\n MouseEvent,\n PointerEvent,\n TouchEvent,\n} from 'react';\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDoubleClick: handler } : {});\n","import { Rect, Rotation } from '@embedpdf/models';\nimport { ReactNode, CSSProperties, PointerEvent, Fragment, TouchEvent } from '@framework';\n\ninterface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n}\n\ninterface CounterTransformResult {\n matrix: string; // CSS matrix(a,b,c,d,e,f)\n width: number; // new width\n height: number; // new height\n}\n\n/**\n * Given an already-placed rect (left/top/width/height in px) and the page rotation,\n * return the counter-rotation matrix + adjusted width/height.\n *\n * transform-origin is expected to be \"0 0\".\n * left/top DO NOT change, apply them as-is.\n */\nexport function getCounterRotation(rect: Rect, rotation: Rotation): CounterTransformResult {\n const { width: w, height: h } = rect.size;\n\n switch (rotation % 4) {\n case 1: // 90° cw → need matrix(0,-1,1,0,0,h) and swap w/h\n return {\n matrix: `matrix(0, -1, 1, 0, 0, ${h})`,\n width: h,\n height: w,\n };\n\n case 2: // 180° → matrix(-1,0,0,-1,w,h), width/height unchanged\n return {\n matrix: `matrix(-1, 0, 0, -1, ${w}, ${h})`,\n width: w,\n height: h,\n };\n\n case 3: // 270° cw → matrix(0,1,-1,0,w,0), swap w/h\n return {\n matrix: `matrix(0, 1, -1, 0, ${w}, 0)`,\n width: h,\n height: w,\n };\n\n default:\n return {\n matrix: `matrix(1, 0, 0, 1, 0, 0)`,\n width: w,\n height: h,\n };\n }\n}\n\nexport interface MenuWrapperProps {\n style: CSSProperties;\n onPointerDown: (e: PointerEvent<HTMLDivElement>) => void;\n onTouchStart: (e: TouchEvent<HTMLDivElement>) => void;\n}\n\ninterface CounterRotateComponentProps extends CounterRotateProps {\n children: (props: {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }) => ReactNode;\n}\n\nexport function CounterRotate({ children, ...props }: CounterRotateComponentProps) {\n const { rect, rotation } = props;\n const { matrix, width, height } = getCounterRotation(rect, rotation);\n\n const menuWrapperStyle: CSSProperties = {\n position: 'absolute',\n left: rect.origin.x,\n top: rect.origin.y,\n transform: matrix,\n transformOrigin: '0 0',\n width: width,\n height: height,\n pointerEvents: 'none',\n zIndex: 3,\n };\n\n const menuWrapperProps = {\n style: menuWrapperStyle,\n onPointerDown: (e: PointerEvent<HTMLDivElement>) => e.stopPropagation(),\n onTouchStart: (e: TouchEvent<HTMLDivElement>) => e.stopPropagation(),\n };\n\n return (\n <Fragment>\n {children({\n menuWrapperProps,\n matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: width, height: height },\n },\n })}\n </Fragment>\n );\n}\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 './counter-rotate-container';\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 { 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":["clamp","Fragment","annotation","_a","allPoints","rect","minX","minY","maxX","maxY","halfStroke","xs","ys","half"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-annotation.ts","../../src/react/adapter.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/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","export {\n Fragment,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n useLayoutEffect,\n JSX,\n ChangeEvent,\n} from 'react';\nexport type {\n ReactNode,\n HTMLAttributes,\n CSSProperties,\n MouseEvent,\n PointerEvent,\n TouchEvent,\n} from 'react';\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDoubleClick: handler } : {});\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 { 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":["clamp","Fragment","annotation","_a","allPoints","rect","minX","minY","maxX","maxY","halfStroke","xs","ys","half"],"mappings":"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"}
|