@embedpdf/plugin-annotation 1.0.17 → 1.0.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.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/preact/adapter.ts","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/patch-ink.ts","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/vertex-patchers.ts","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotations/circle-paint.tsx","../../src/shared/components/annotations/square-paint.tsx","../../src/shared/components/annotations/polyline-paint.tsx","../../src/shared/components/annotations/line-paint.tsx","../../src/shared/components/annotations/polygon-paint.tsx","../../src/shared/components/annotations/free-text-paint.tsx","../../src/shared/components/annotations/stamp-paint.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","import { Rect, Rotation, Size } 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 { JSX, Fragment } from 'preact';\nexport { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDblClick: handler } : {});\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { ComputePatch } from './patchers';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport const patchInk: ComputePatch<PdfInkAnnoObject> = (original, ctx) => {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = ctx.rect.size.width / oldRect.size.width;\n let scaleY = ctx.rect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (ctx.rect.size.width < minSize || ctx.rect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.rect = {\n origin: ctx.rect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n ctx.rect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: ctx.rect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: ctx.rect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = Math.round(original.strokeWidth * avgScale);\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: ctx.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n};\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts[1], localPts[0]); // direction INTO first segment\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]);\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from first segment start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad,\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string; // interior fill colour\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n}: PolygonProps): JSX.Element {\n // Translate vertices into local coords\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('') + 'Z').trim();\n }, [localPts]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nexport interface PatchContext {\n rect: Rect;\n vertices?: Position[];\n}\n\nexport type PatchFn<T extends PdfAnnotationObject> = (original: T, ctx: PatchContext) => Partial<T>;\n\nexport const patchLine: PatchFn<PdfLineAnnoObject> = (orig, ctx) => {\n /* ---------- vertex edit ------------------------------------------------ */\n if (ctx.vertices && ctx.vertices.length >= 2) {\n const rect = patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start: ctx.vertices[0], end: ctx.vertices[1] },\n };\n }\n\n /* ---------- rect drag -------------------------------------------------- */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n return {\n rect: ctx.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n};\n\nexport const patchPolyline: PatchFn<PdfPolylineAnnoObject> = (orig, ctx) => {\n /* vertex update */\n if (ctx.vertices && ctx.vertices.length) {\n return {\n rect: patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.vertices,\n };\n }\n\n /* rect move */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport const patchPolygon: PatchFn<PdfPolygonAnnoObject> = (orig, ctx) => {\n if (ctx.vertices && ctx.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.vertices), pad),\n vertices: ctx.vertices,\n };\n }\n\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport function getPatchFn(type: PdfAnnotationSubtype) {\n switch (type) {\n case PdfAnnotationSubtype.LINE:\n return patchLine;\n case PdfAnnotationSubtype.POLYLINE:\n return patchPolyline;\n case PdfAnnotationSubtype.POLYGON:\n return patchPolygon;\n default:\n return undefined;\n }\n}\n","import { MouseEvent, TouchEvent, useEffect, useRef } from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n style={{\n color: annotation.object.fontColor,\n fontSize: annotation.object.fontSize * scale,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: '100%',\n height: '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n }}\n contentEditable={isEditing}\n suppressContentEditableWarning={true}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { 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 scaleFactor,\n dpr: window.devicePixelRatio,\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';\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 /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const 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.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const 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';\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 /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\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 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.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 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';\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 /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\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';\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 /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\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 LineEndings,\n PdfAnnotationBorderStyle,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { Line } from './line';\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 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 /* ------------------------------------------------------------------ */\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<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 commitLine(start, current);\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 [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';\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 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 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<PointerEvent>>(\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<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 commitFreeText(start, current);\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 [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';\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 clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n inputRef.current?.click();\n },\n }),\n [pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n const onChange = async (e: ChangeEvent<HTMLInputElement>) => {\n if (!annotationProvides || !start) return;\n\n const file = e.currentTarget.files?.[0];\n if (!file) return;\n\n /* --------------------------------------------------------------- *\n * 1. Load image (keep full resolution) *\n * --------------------------------------------------------------- */\n const img = await new Promise<HTMLImageElement>((res, rej) => {\n const i = new Image();\n i.onload = () => res(i);\n i.onerror = rej;\n i.src = URL.createObjectURL(file);\n });\n\n const imgW = img.naturalWidth;\n const imgH = img.naturalHeight;\n\n /* --------------------------------------------------------------- *\n * 2. Decide rect that keeps stamp on page *\n * --------------------------------------------------------------- */\n const maxW = pageWidthPDF;\n const maxH = pageHeightPDF;\n\n // how much can we scale without overflowing?\n const scaleFactor = Math.min(1, maxW / imgW, maxH / imgH);\n const pdfW = imgW * scaleFactor;\n const pdfH = imgH * scaleFactor;\n\n // If the stamp would overflow → shift it so it stays fully visible\n const posX = clamp(start.x, 0, maxW - pdfW);\n const posY = clamp(start.y, 0, maxH - pdfH);\n\n const rect: Rect = {\n origin: { x: posX, y: posY },\n size: { width: pdfW, height: pdfH },\n };\n\n /* --------------------------------------------------------------- *\n * 3. Copy pixels to ImageData (original resolution) *\n * --------------------------------------------------------------- */\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n canvas.width = pdfW;\n canvas.height = pdfH;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, pdfW, pdfH);\n const imageData = ctx.getImageData(0, 0, pdfW, pdfH);\n\n const anno: PdfStampAnnoObject = {\n type: PdfAnnotationSubtype.STAMP,\n flags: ['print'],\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n rect,\n };\n\n annotationProvides.createAnnotation(pageIndex, anno, { imageData });\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n\n setStart(null);\n };\n\n return (\n <Fragment>\n <canvas style={{ display: 'none' }} ref={canvasRef} />\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n style={{ display: 'none' }}\n onChange={onChange}\n />\n </Fragment>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\nimport { SelectionMenu } from '../types';\nimport { CirclePaint } from './annotations/circle-paint';\nimport { SquarePaint } from './annotations/square-paint';\nimport { PolylinePaint } from './annotations/polyline-paint';\nimport { LinePaint } from './annotations/line-paint';\nimport { PolygonPaint } from './annotations/polygon-paint';\nimport { FreeTextPaint } from './annotations/free-text-paint';\nimport { StampPaint } from './annotations/stamp-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n selectionMenu?: SelectionMenu;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n selectionMenu,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n <CirclePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <SquarePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolygonPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolylinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <LinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <FreeTextPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <StampPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n </div>\n );\n}\n"],"names":["useAnnotationCapability","useCapability","AnnotationPlugin","id","CounterRotate","children","props","rect","rotation","matrix","width","height","w","h","size","getCounterRotation","menuWrapperProps","style","position","left","origin","x","top","y","transform","transformOrigin","pointerEvents","zIndex","onPointerDown","e","stopPropagation","onTouchStart","Fragment","VertexEditor","scale","vertices","onEdit","onCommit","handleSize","dragIdx","setDragIdx","useState","startScreen","useRef","startVerts","applyDelta","deltaScreen","deltaPdf","restoreOffset","next","current","handleMove","deltaRaw","clientX","clientY","handleUp","target","releasePointerCapture","pointerId","map","v","i","jsxRuntime","jsx","borderRadius","background","cursor","idx","preventDefault","setPointerCapture","onPointerMove","onPointerUp","useDragResize","pageWidth","pageHeight","tracked","isSelected","isDraggable","isResizable","computePatch","computeVertices","lockAspectRatio","currentRect","setCurrentRect","setCurrentVertices","setPreviewObject","commit","drag","dir","startPos","startRect","clamp","min","max","Math","pageW","pageH","beginDrag","kind","disp","nextRect","dx","dy","ox","oy","includes","ratio","anchorRight","anchorBottom","patch","object","direction","finishDragInternal","usedDir","currentTarget","onTouchEnd","useEffect","rootHandlers","onPointerCancel","onLostPointerCapture","t","touches","onTouchMove","onTouchCancel","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","onDoubleClick","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","useLayoutEffect","rectEquals","prev","currentObject","handler","onDblClick","outline","touchAction","length","annotation","selected","Highlight","color","opacity","rects","onClick","b","Underline","thickness","r","Strikeout","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","patchInk","original","ctx","type","PdfAnnotationSubtype","INK","Error","oldRect","scaleX","scaleY","uniform","minScale","newInkList","p","avgScale","newStrokeWidth","round","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","first","rest","toAngle","a","startRad","endRad","Polygon","patchLine","orig","lineRectWithEndings","patchPolyline","moved","patchPolygon","pad","expandRect","rectFromPoints","FreeText","isEditing","editorRef","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","ref","onBlur","contents","innerText","fontColor","fontSize","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","backgroundColor","lineHeight","contentEditable","suppressContentEditableWarning","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","state","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","deselectAnnotation","handleClick","useCallback","selectAnnotation","clear","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","segmentRects","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","variantKey","defaults","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","subtype","UNDERLINE","_a","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","InkPaint","toolColor","toolOpacity","toolStrokeWidth","toolBlendMode","intent","modeId","currentStrokes","setCurrentStrokes","isDrawing","setIsDrawing","timerRef","pageWidthPDF","pageHeightPDF","pos","evt","curX","curY","clearTimeout","call","newLast","slice","setTimeout","allPoints","flatMap","s","anno","created","Date","uuidV4","createAnnotation","setActiveVariant","CirclePaint","CIRCLE","toolStrokeColor","toolStrokeStyle","toolStrokeDashArray","setStart","setCurrent","minX","minY","maxX","maxY","halfStroke","flags","svgMinX","svgMinY","dw","dh","SquarePaint","SQUARE","PolylinePaint","POLYLINE","toolLineEndings","setVertices","pts","commitPolyline","allPts","LinePaint","LINE","p1","p2","abs","commitLine","PolygonPaint","POLYGON","commitPolygon","xs","ys","half","v0","isInsideStartHandle","mainPath","dottedPath","handleSizePDF","hHalf","hx","hy","FreeTextPaint","FREETEXT","toolFontColor","toolFontSize","toolFontFamily","toolBackgroundColor","toolTextAlign","toolVerticalAlign","toolContent","content","commitFreeText","StampPaint","inputRef","canvasRef","STAMP","click","accept","onChange","async","file","files","img","Promise","res","rej","Image","onload","onerror","imgW","naturalWidth","imgH","naturalHeight","maxW","maxH","pdfW","pdfH","canvas","getContext","drawImage","imageData","getImageData","usePlugin"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/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/preact/adapter.ts","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/patch-ink.ts","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/vertex-patchers.ts","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotations/circle-paint.tsx","../../src/shared/components/annotations/square-paint.tsx","../../src/shared/components/annotations/polyline-paint.tsx","../../src/shared/components/annotations/line-paint.tsx","../../src/shared/components/annotations/polygon-paint.tsx","../../src/shared/components/annotations/free-text-paint.tsx","../../src/shared/components/annotations/stamp-paint.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","import { 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 { JSX, Fragment } from 'preact';\nexport { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDblClick: handler } : {});\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { ComputePatch } from './patchers';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport const patchInk: ComputePatch<PdfInkAnnoObject> = (original, ctx) => {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = ctx.rect.size.width / oldRect.size.width;\n let scaleY = ctx.rect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (ctx.rect.size.width < minSize || ctx.rect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.rect = {\n origin: ctx.rect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n ctx.rect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: ctx.rect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: ctx.rect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = Math.round(original.strokeWidth * avgScale);\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: ctx.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n};\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts[1], localPts[0]); // direction INTO first segment\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]);\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from first segment start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad,\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string; // interior fill colour\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n}: PolygonProps): JSX.Element {\n // Translate vertices into local coords\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('') + 'Z').trim();\n }, [localPts]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nexport interface PatchContext {\n rect: Rect;\n vertices?: Position[];\n}\n\nexport type PatchFn<T extends PdfAnnotationObject> = (original: T, ctx: PatchContext) => Partial<T>;\n\nexport const patchLine: PatchFn<PdfLineAnnoObject> = (orig, ctx) => {\n /* ---------- vertex edit ------------------------------------------------ */\n if (ctx.vertices && ctx.vertices.length >= 2) {\n const rect = patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start: ctx.vertices[0], end: ctx.vertices[1] },\n };\n }\n\n /* ---------- rect drag -------------------------------------------------- */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n return {\n rect: ctx.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n};\n\nexport const patchPolyline: PatchFn<PdfPolylineAnnoObject> = (orig, ctx) => {\n /* vertex update */\n if (ctx.vertices && ctx.vertices.length) {\n return {\n rect: patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.vertices,\n };\n }\n\n /* rect move */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport const patchPolygon: PatchFn<PdfPolygonAnnoObject> = (orig, ctx) => {\n if (ctx.vertices && ctx.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.vertices), pad),\n vertices: ctx.vertices,\n };\n }\n\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport function getPatchFn(type: PdfAnnotationSubtype) {\n switch (type) {\n case PdfAnnotationSubtype.LINE:\n return patchLine;\n case PdfAnnotationSubtype.POLYLINE:\n return patchPolyline;\n case PdfAnnotationSubtype.POLYGON:\n return patchPolygon;\n default:\n return undefined;\n }\n}\n","import { MouseEvent, TouchEvent, useEffect, useRef } from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n style={{\n color: annotation.object.fontColor,\n fontSize: annotation.object.fontSize * scale,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: '100%',\n height: '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n }}\n contentEditable={isEditing}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { 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 scaleFactor,\n dpr: window.devicePixelRatio,\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, annotation.id, width, height]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return (\n <Fragment>\n {imageUrl && (\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n {...props}\n style={{\n width: '100%',\n height: '100%',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({ isSelected, annotation, pageIndex, scale, onClick }: StampProps) {\n return (\n <div\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { blendModeToCss, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n} from '@embedpdf/plugin-annotation';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { Square } from './annotations/square';\nimport { SelectionMenu } from '../types';\nimport { Circle } from './annotations/circle';\nimport { patchInk } from '../patch-ink';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { patchLine, patchPolygon, patchPolyline } from '../vertex-patchers';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale, selectionMenu } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n selectionProvides.clear();\n setEditingId(null);\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.object.id === annotation.object.id;\n const isEditing = editingId === annotation.object.id;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n computePatch={patchInk}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n isSelected={isSelected}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n inkList={obj.inkList}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n rect={obj.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchLine}\n computeVertices={(annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ]}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n linePoints={obj.linePoints}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchPolyline}\n computeVertices={(annotation) => annotation.vertices}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computeVertices={(annotation) => annotation.vertices}\n computePatch={patchPolygon}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n outlineOffset={6}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n lockAspectRatio={true}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(_object) => (\n <Stamp\n isSelected={isSelected}\n annotation={annotation}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!boundingRect) return null;\n if (!activeTool.defaults) return null;\n\n switch (activeTool.defaults.subtype) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState, JSX } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfInkListObject,\n Rect,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n PdfBlendMode,\n rectFromPoints,\n expandRect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n const toolBlendMode = activeTool.defaults?.blendMode ?? PdfBlendMode.Normal;\n const intent = activeTool.defaults?.intent;\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n evt.releasePointerCapture?.();\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\n\n // Ignore tiny drawings\n if (rect.size.width < 1 || rect.size.height < 1) return;\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n intent,\n blendMode: toolBlendMode,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n created: new Date(),\n pageIndex,\n id: uuidV4(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n evt.releasePointerCapture?.();\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={rect.size.width * scale}\n height={rect.size.height * scale}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={toolOpacity}\n style={{\n stroke: toolColor,\n strokeWidth: toolStrokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfCircleAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface CirclePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const CirclePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: CirclePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.CIRCLE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'circle', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small circles\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfCircleAnnoObject = {\n type: PdfAnnotationSubtype.CIRCLE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n created: new Date(),\n pageIndex,\n id: uuidV4(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\n\n const cx = halfStroke + width / 2;\n const cy = halfStroke + height / 2;\n const rx = width / 2;\n const ry = height / 2;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfSquareAnnoObject,\n Rect,\n PdfAnnotationFlags,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface SquarePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const SquarePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: SquarePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.SQUARE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'square', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small squares\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfSquareAnnoObject = {\n type: PdfAnnotationSubtype.SQUARE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n <rect\n x={halfStroke}\n y={halfStroke}\n width={width}\n height={height}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolylineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { patching } from '@embedpdf/plugin-annotation';\nimport { Polyline } from './polyline';\nimport { clamp } from '@embedpdf/core';\n\ninterface PolylinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const PolylinePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolylinePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYLINE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolLineEndings = activeTool.defaults.lineEndings;\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'polyline', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – vertices & current pointer */\n /* ------------------------------------------------------------------ */\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitPolyline = (pts: { x: number; y: number }[]) => {\n if (pts.length < 2) return; // need at least a line\n\n const rect = patching.lineRectWithEndings(pts, toolStrokeWidth, toolLineEndings);\n\n const anno: PdfPolylineAnnoObject = {\n type: PdfAnnotationSubtype.POLYLINE,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 1 && annotationProvides) {\n commitPolyline(vertices);\n }\n setVertices([]);\n setCurrent(null);\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const rect = patching.lineRectWithEndings(allPts, toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor: cursor,\n }}\n >\n <Polyline\n rect={rect}\n vertices={allPts}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n />\n </div>\n );\n};\n","import { useEffect, useState, useMemo } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool, patching } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfLineAnnoObject,\n PdfAnnotationBorderStyle,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { Line } from './line';\nimport { clamp } from '@embedpdf/core';\n\ninterface LinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const LinePaint = ({ pageIndex, scale, pageWidth, pageHeight, cursor }: LinePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.LINE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n const toolLineEndings = activeTool.defaults.lineEndings;\n const intent = activeTool.defaults.intent;\n /* ------------------------------------------------------------------ */\n /* interaction manager integration */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: ['line', 'lineArrow'], pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitLine = (p1: { x: number; y: number }, p2: { x: number; y: number }) => {\n // ignore tiny lines\n if (Math.abs(p2.x - p1.x) < 1 && Math.abs(p2.y - p1.y) < 1) return;\n\n const rect = patching.lineRectWithEndings([p1, p2], toolStrokeWidth, toolLineEndings);\n\n const anno: PdfLineAnnoObject = {\n type: PdfAnnotationSubtype.LINE,\n rect,\n linePoints: { start: p1, end: p2 },\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n intent,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n commitLine(start, current);\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [start, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const rect = patching.lineRectWithEndings([start, current], toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor,\n }}\n >\n <Line\n rect={rect}\n linePoints={{ start, end: current }}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n strokeStyle={toolStrokeStyle}\n strokeDashArray={toolStrokeDashArray}\n />\n </div>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolygonAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface PolygonPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n cursor?: string;\n}\n\nconst HANDLE_SIZE_PX = 14; // visual square size on screen\n\nexport const PolygonPaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolygonPaintProps) => {\n const { provides: annotationProvides } = useAnnotationCapability();\n\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => annotationProvides?.onActiveToolChange(setActiveTool), [annotationProvides]);\n\n if (!activeTool.defaults || activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYGON)\n return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n const { register } = usePointerHandlers({ modeId: 'polygon', pageIndex });\n\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const commitPolygon = (pts: { x: number; y: number }[]) => {\n const xs = pts.map((p) => p.x),\n ys = pts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n if (maxX - minX < 1 || maxY - minY < 1) return;\n\n const half = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - half, y: minY - half },\n size: { width: maxX - minX + toolStrokeWidth, height: maxY - minY + toolStrokeWidth },\n };\n\n const anno: PdfPolygonAnnoObject = {\n type: PdfAnnotationSubtype.POLYGON,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n // Square hit-test in PDF units\n const isInsideStartHandle = (x: number, y: number) => {\n if (vertices.length < 2) return false;\n const sizePDF = HANDLE_SIZE_PX / scale;\n const half = sizePDF / 2;\n const v0 = vertices[0];\n return x >= v0.x - half && x <= v0.x + half && y >= v0.y - half && y <= v0.y + half;\n };\n\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n\n // Click on start-handle ⇒ close polygon\n if (isInsideStartHandle(x, y) && vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n return;\n }\n\n // Normal vertex add\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n } else {\n setVertices([]);\n setCurrent(null);\n }\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n // ---------- preview ----------\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const xs = allPts.map((p) => p.x),\n ys = allPts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n\n const half = toolStrokeWidth / 2;\n const svgMinX = minX - half;\n const svgMinY = minY - half;\n const svgMaxX = maxX + half;\n const svgMaxY = maxY + half;\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const mainPath = useMemo(() => {\n let d = '';\n allPts.forEach(({ x, y }, i) => {\n d += (i === 0 ? 'M' : 'L') + (x - svgMinX) + ' ' + (y - svgMinY) + ' ';\n });\n return d.trim();\n }, [allPts, svgMinX, svgMinY]);\n\n const dottedPath =\n vertices.length >= 2\n ? (() => {\n const curLx = current.x - svgMinX;\n const curLy = current.y - svgMinY;\n const firstLx = vertices[0].x - svgMinX;\n const firstLy = vertices[0].y - svgMinY;\n return `M ${curLx} ${curLy} L ${firstLx} ${firstLy}`;\n })()\n : null;\n\n // Start-handle rect (screen px converted to pdf units, then to local svg coords)\n const handleSizePDF = HANDLE_SIZE_PX / scale;\n const hHalf = handleSizePDF / 2;\n const hx = vertices[0].x - hHalf - svgMinX;\n const hy = vertices[0].y - hHalf - svgMinY;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none', // we handle clicks at the page layer\n zIndex: 2,\n overflow: 'visible',\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {/* solid preview edges */}\n <path\n d={mainPath}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* dotted closing helper */}\n {dottedPath && (\n <path\n d={dottedPath}\n fill=\"none\"\n style={{ stroke: toolStrokeColor, strokeWidth: toolStrokeWidth, strokeDasharray: '4,4' }}\n />\n )}\n\n {/* clickable start-handle (visual only; hit-test done in handler) */}\n {vertices.length >= 3 && (\n <rect\n x={hx}\n y={hy}\n width={handleSizePDF}\n height={handleSizePDF}\n fill={toolStrokeColor}\n opacity={0.4}\n stroke={toolStrokeColor}\n strokeWidth={toolStrokeWidth / 2}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </svg>\n );\n};\n","// packages/plugin-annotation/src/shared/components/annotations/free-text-paint.tsx\nimport { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationSubtype, PdfFreeTextAnnoObject, Rect, uuidV4 } from '@embedpdf/models';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../../hooks';\n\ninterface FreeTextPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const FreeTextPaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor = 'text',\n}: FreeTextPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n /* ------------------------------------------------------------------ */\n /* active tool */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => annotationProvides?.onActiveToolChange(setActiveTool), [annotationProvides]);\n\n if (!activeTool.defaults || activeTool.defaults.subtype !== PdfAnnotationSubtype.FREETEXT)\n return null;\n\n const toolFontColor = activeTool.defaults.fontColor ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolFontSize = activeTool.defaults.fontSize ?? 12;\n const toolFontFamily = activeTool.defaults.fontFamily;\n const toolBackgroundColor = activeTool.defaults.backgroundColor ?? 'transparent';\n const toolTextAlign = activeTool.defaults.textAlign;\n const toolVerticalAlign = activeTool.defaults.verticalAlign;\n const toolContent = activeTool.defaults.content ?? 'Insert text here';\n\n /* ------------------------------------------------------------------ */\n /* interaction-manager integration */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'freeText', pageIndex });\n\n /* helpers ----------------------------------------------------------- */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* local drag state -------------------------------------------------- */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* commit helper ----------------------------------------------------- */\n const commitFreeText = (p1: { x: number; y: number }, p2: { x: number; y: number }) => {\n const minX = Math.min(p1.x, p2.x);\n const minY = Math.min(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n const maxY = Math.max(p1.y, p2.y);\n const w = maxX - minX;\n const h = maxY - minY;\n\n if (w < 1 || h < 1) return; // ignore tiny boxes\n\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width: w, height: h },\n };\n\n const anno: PdfFreeTextAnnoObject = {\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n contents: toolContent,\n fontColor: toolFontColor,\n fontSize: toolFontSize,\n fontFamily: toolFontFamily,\n opacity: toolOpacity,\n backgroundColor: toolBackgroundColor,\n textAlign: toolTextAlign,\n verticalAlign: toolVerticalAlign,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* pointer handlers -------------------------------------------------- */\n const handlers = useMemo<PointerEventHandlers>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n commitFreeText(start, current);\n }\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n evt.releasePointerCapture?.();\n setStart(null);\n setCurrent(null);\n },\n }),\n [start, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register with interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview while dragging */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const dw = maxX - minX;\n const dh = maxY - minY;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: minX * scale,\n top: minY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {/* Simple outline preview */}\n <rect\n x={0}\n y={0}\n width={dw}\n height={dh}\n fill=\"transparent\"\n style={{\n stroke: toolFontColor,\n strokeWidth: 1,\n strokeDasharray: '4,4',\n cursor,\n }}\n />\n </svg>\n );\n};\n","import { PdfAnnotationSubtype, PdfStampAnnoObject, Rect, uuidV4 } from '@embedpdf/models';\nimport { useState, useEffect, useMemo, useRef, ChangeEvent, Fragment } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../../hooks';\nimport { clamp } from '@embedpdf/core';\n\ninterface StampPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n}\n\nexport const StampPaint = ({ pageIndex, scale, pageWidth, pageHeight }: StampPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.STAMP) return null;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'stamp', pageIndex });\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n inputRef.current?.click();\n },\n }),\n [pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n const onChange = async (e: ChangeEvent<HTMLInputElement>) => {\n if (!annotationProvides || !start) return;\n\n const file = e.currentTarget.files?.[0];\n if (!file) return;\n\n /* --------------------------------------------------------------- *\n * 1. Load image (keep full resolution) *\n * --------------------------------------------------------------- */\n const img = await new Promise<HTMLImageElement>((res, rej) => {\n const i = new Image();\n i.onload = () => res(i);\n i.onerror = rej;\n i.src = URL.createObjectURL(file);\n });\n\n const imgW = img.naturalWidth;\n const imgH = img.naturalHeight;\n\n /* --------------------------------------------------------------- *\n * 2. Decide rect that keeps stamp on page *\n * --------------------------------------------------------------- */\n const maxW = pageWidthPDF;\n const maxH = pageHeightPDF;\n\n // how much can we scale without overflowing?\n const scaleFactor = Math.min(1, maxW / imgW, maxH / imgH);\n const pdfW = imgW * scaleFactor;\n const pdfH = imgH * scaleFactor;\n\n // If the stamp would overflow → shift it so it stays fully visible\n const posX = clamp(start.x, 0, maxW - pdfW);\n const posY = clamp(start.y, 0, maxH - pdfH);\n\n const rect: Rect = {\n origin: { x: posX, y: posY },\n size: { width: pdfW, height: pdfH },\n };\n\n /* --------------------------------------------------------------- *\n * 3. Copy pixels to ImageData (original resolution) *\n * --------------------------------------------------------------- */\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n canvas.width = pdfW;\n canvas.height = pdfH;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, pdfW, pdfH);\n const imageData = ctx.getImageData(0, 0, pdfW, pdfH);\n\n const anno: PdfStampAnnoObject = {\n type: PdfAnnotationSubtype.STAMP,\n flags: ['print'],\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n rect,\n };\n\n annotationProvides.createAnnotation(pageIndex, anno, { imageData });\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n\n setStart(null);\n };\n\n return (\n <Fragment>\n <canvas style={{ display: 'none' }} ref={canvasRef} />\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n style={{ display: 'none' }}\n onChange={onChange}\n />\n </Fragment>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\nimport { SelectionMenu } from '../types';\nimport { CirclePaint } from './annotations/circle-paint';\nimport { SquarePaint } from './annotations/square-paint';\nimport { PolylinePaint } from './annotations/polyline-paint';\nimport { LinePaint } from './annotations/line-paint';\nimport { PolygonPaint } from './annotations/polygon-paint';\nimport { FreeTextPaint } from './annotations/free-text-paint';\nimport { StampPaint } from './annotations/stamp-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n selectionMenu?: SelectionMenu;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n selectionMenu,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n <CirclePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <SquarePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolygonPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolylinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <LinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <FreeTextPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <StampPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n </div>\n );\n}\n"],"names":["useAnnotationCapability","useCapability","AnnotationPlugin","id","CounterRotate","children","props","rect","rotation","matrix","width","height","w","h","size","getCounterRotation","menuWrapperProps","style","position","left","origin","x","top","y","transform","transformOrigin","pointerEvents","zIndex","onPointerDown","e","stopPropagation","onTouchStart","Fragment","VertexEditor","scale","vertices","onEdit","onCommit","handleSize","dragIdx","setDragIdx","useState","startScreen","useRef","startVerts","applyDelta","deltaScreen","deltaPdf","restoreOffset","next","current","handleMove","deltaRaw","clientX","clientY","handleUp","target","releasePointerCapture","pointerId","map","v","i","jsxRuntime","jsx","borderRadius","background","cursor","idx","preventDefault","setPointerCapture","onPointerMove","onPointerUp","useDragResize","pageWidth","pageHeight","tracked","isSelected","isDraggable","isResizable","computePatch","computeVertices","lockAspectRatio","currentRect","setCurrentRect","setCurrentVertices","setPreviewObject","commit","drag","dir","startPos","startRect","clamp","min","max","Math","pageW","pageH","beginDrag","kind","disp","nextRect","dx","dy","ox","oy","includes","ratio","anchorRight","anchorBottom","patch","object","direction","finishDragInternal","usedDir","currentTarget","onTouchEnd","useEffect","rootHandlers","onPointerCancel","onLostPointerCapture","t","touches","onTouchMove","onTouchCancel","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","onDoubleClick","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","useLayoutEffect","rectEquals","prev","currentObject","handler","onDblClick","outline","touchAction","length","annotation","selected","Highlight","color","opacity","rects","onClick","b","Underline","thickness","r","Strikeout","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","patchInk","original","ctx","type","PdfAnnotationSubtype","INK","Error","oldRect","scaleX","scaleY","uniform","minScale","newInkList","p","avgScale","newStrokeWidth","round","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","first","rest","toAngle","a","startRad","endRad","Polygon","patchLine","orig","lineRectWithEndings","patchPolyline","moved","patchPolygon","pad","expandRect","rectFromPoints","FreeText","isEditing","editorRef","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","ref","onBlur","contents","innerText","fontColor","fontSize","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","backgroundColor","lineHeight","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","state","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","deselectAnnotation","handleClick","useCallback","selectAnnotation","clear","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","segmentRects","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","variantKey","defaults","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","subtype","UNDERLINE","_a","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","InkPaint","toolColor","toolOpacity","toolStrokeWidth","toolBlendMode","intent","modeId","currentStrokes","setCurrentStrokes","isDrawing","setIsDrawing","timerRef","pageWidthPDF","pageHeightPDF","pos","evt","curX","curY","clearTimeout","call","newLast","slice","setTimeout","allPoints","flatMap","s","anno","created","Date","uuidV4","createAnnotation","setActiveVariant","CirclePaint","CIRCLE","toolStrokeColor","toolStrokeStyle","toolStrokeDashArray","setStart","setCurrent","minX","minY","maxX","maxY","halfStroke","flags","svgMinX","svgMinY","dw","dh","SquarePaint","SQUARE","PolylinePaint","POLYLINE","toolLineEndings","setVertices","pts","commitPolyline","allPts","LinePaint","LINE","p1","p2","abs","commitLine","PolygonPaint","POLYGON","commitPolygon","xs","ys","half","v0","isInsideStartHandle","mainPath","dottedPath","handleSizePDF","hHalf","hx","hy","FreeTextPaint","FREETEXT","toolFontColor","toolFontSize","toolFontFamily","toolBackgroundColor","toolTextAlign","toolVerticalAlign","toolContent","content","commitFreeText","StampPaint","inputRef","canvasRef","STAMP","click","accept","onChange","async","file","files","img","Promise","res","rej","Image","onload","onerror","imgW","naturalWidth","imgH","naturalHeight","maxW","maxH","pdfW","pdfH","canvas","getContext","drawImage","imageData","getImageData","usePlugin"],"mappings":"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"}