@embedpdf/plugin-annotation 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/annotation-plugin.d.ts +1 -0
- package/dist/lib/helpers.d.ts +1 -0
- package/dist/lib/types.d.ts +6 -3
- package/dist/preact/adapter.d.ts +1 -0
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +235 -4
- package/dist/preact/index.js.map +1 -1
- package/dist/react/adapter.d.ts +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +235 -4
- package/dist/react/index.js.map +1 -1
- package/dist/shared-preact/components/annotation-container.d.ts +2 -1
- package/dist/shared-preact/components/annotations/stamp-paint.d.ts +8 -0
- package/dist/shared-preact/components/annotations/stamp.d.ts +12 -0
- package/dist/shared-preact/components/render-annotation.d.ts +1 -1
- package/dist/shared-preact/hooks/use-drag-resize.d.ts +5 -2
- package/dist/shared-react/components/annotation-container.d.ts +2 -1
- package/dist/shared-react/components/annotations/stamp-paint.d.ts +8 -0
- package/dist/shared-react/components/annotations/stamp.d.ts +12 -0
- package/dist/shared-react/components/render-annotation.d.ts +1 -1
- package/dist/shared-react/hooks/use-drag-resize.d.ts +5 -2
- package/package.json +9 -9
|
@@ -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/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/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 } 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}\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 };\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, 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\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 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 /* 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 /* ── pointer handlers for the container ─────────────────── */\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isDraggable) return;\n e.stopPropagation();\n e.preventDefault();\n drag.current = 'dragging';\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (drag.current === 'idle' || !startPos.current) return;\n const disp = {\n x: e.clientX - startPos.current.x,\n y: e.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 onPointerUp = () => {\n if (drag.current === 'idle') return;\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 /* ── 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 drag.current = 'resizing';\n dir.current = direction;\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\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 },\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};\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 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 computePatch,\n computeVertices,\n currentRect,\n setCurrentRect,\n setCurrentVertices,\n setPreviewObject,\n commit: (patch) =>\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.localId, 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 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.localId, 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>;\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDblClick: handler } : {});\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement>) => void;\n /** Cursor on the ink */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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 } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\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 cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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 } 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>) => 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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, 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>) => 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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, 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>) => 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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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, useEffect, useRef } from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfStandardFont,\n PdfVerticalAlignment,\n Rect,\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>) => 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.localId, {\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 >\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 { 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 isTextMarkup,\n isFreeText,\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 { useMemo, useState, useEffect, useCallback, MouseEvent, Fragment } 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 { VertexEditor } from './vertex-editor';\nimport { patchLine, patchPolygon, patchPolyline } from '../vertex-patchers';\nimport { TextMarkup } from './text-markup';\nimport { FreeText } from './annotations/free-text';\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<number | 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, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\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?.localId === annotation.localId;\n const isEditing = editingId === annotation.localId;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId);\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 /* --------- 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} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n const toolBlendMode = activeTool.defaults?.blendMode ?? PdfBlendMode.Normal;\n const intent = activeTool.defaults?.intent;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const 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 pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const 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} from '@embedpdf/models';\nimport { useAnnotationCapability } 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 pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (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} 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: Date.now() + Math.random(),\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} 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: Date.now() + Math.random(),\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} 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 /* ------------------------------------------------------------------ */\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: Date.now() + Math.random(),\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} 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: Date.now() + Math.random(),\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 } from '@embedpdf/models';\nimport { useAnnotationCapability } 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 /* ------------------------------------------------------------------ */\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: Date.now() + Math.random(),\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 { 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';\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 </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","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","currentRect","setCurrentRect","setCurrentVertices","setPreviewObject","commit","drag","dir","startPos","startRect","clamp","min","max","Math","pageW","pageH","useEffect","rootHandlers","currentTarget","disp","nextRect","dx","dy","ox","oy","includes","patch","object","direction","usedDir","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","onDoubleClick","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","localId","useLayoutEffect","rectEquals","prev","currentObject","handler","onDblClick","outline","length","annotation","selected","Highlight","color","opacity","rects","onClick","b","onMouseDown","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","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","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","Date","now","random","createAnnotation","setActiveVariant","onPointerCancel","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","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, Size } from '@embedpdf/models';\nimport { ReactNode, CSSProperties, PointerEvent, Fragment } 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}\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 };\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, 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 /* ── pointer handlers for the container ─────────────────── */\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isDraggable) return;\n e.stopPropagation();\n e.preventDefault();\n drag.current = 'dragging';\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (drag.current === 'idle' || !startPos.current) return;\n const disp = {\n x: e.clientX - startPos.current.x,\n y: e.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 onPointerUp = (e?: PointerEvent<HTMLDivElement>) => {\n if (drag.current === 'idle') return;\n\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 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 /* ── 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 drag.current = 'resizing';\n dir.current = direction;\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\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 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.localId, 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 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.localId, 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>;\n\nexport const mapDoubleClick = (handler: any) => (handler ? { onDblClick: handler } : {});\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement>) => void;\n /** Cursor on the ink */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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 } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\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 cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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 } 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>) => 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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, 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>) => 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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, 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>) => 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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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, useEffect, useRef } from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfStandardFont,\n PdfVerticalAlignment,\n Rect,\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>) => 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.localId, {\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 >\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 } 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>) => 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 >\n {annotation.pdfId !== undefined && (\n <RenderAnnotation\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.pdfId }}\n scaleFactor={scale}\n />\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 isTextMarkup,\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 { useMemo, useState, useEffect, useCallback, MouseEvent, Fragment } 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 { VertexEditor } from './vertex-editor';\nimport { patchLine, patchPolygon, patchPolyline } from '../vertex-patchers';\nimport { TextMarkup } from './text-markup';\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<number | 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, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\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?.localId === annotation.localId;\n const isEditing = editingId === annotation.localId;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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 cursor={isSelected ? 'move' : 'pointer'}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId}\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.localId);\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.localId}\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} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n const toolBlendMode = activeTool.defaults?.blendMode ?? PdfBlendMode.Normal;\n const intent = activeTool.defaults?.intent;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const 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 pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const 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} from '@embedpdf/models';\nimport { useAnnotationCapability } 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 pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (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} 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: Date.now() + Math.random(),\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} 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: Date.now() + Math.random(),\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} 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 /* ------------------------------------------------------------------ */\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: Date.now() + Math.random(),\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} 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: Date.now() + Math.random(),\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 } from '@embedpdf/models';\nimport { useAnnotationCapability } 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 /* ------------------------------------------------------------------ */\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: Date.now() + Math.random(),\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 } 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: Date.now() + Math.random(),\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","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","currentTarget","usedDir","patch","object","direction","useEffect","rootHandlers","disp","nextRect","dx","dy","ox","oy","includes","ratio","anchorRight","anchorBottom","onPointerCancel","onLostPointerCapture","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","onDoubleClick","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","localId","useLayoutEffect","rectEquals","prev","currentObject","handler","onDblClick","outline","length","annotation","selected","Highlight","color","opacity","rects","onClick","b","onMouseDown","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","pdfId","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","Date","now","random","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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"}
|