@embedpdf/plugin-annotation 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1196 -92
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +31 -2
- package/dist/lib/annotation-plugin.d.ts +177 -2
- package/dist/lib/handlers/types.d.ts +1 -1
- package/dist/lib/helpers.d.ts +6 -1
- package/dist/lib/selectors.d.ts +97 -8
- package/dist/lib/tools/default-tools.d.ts +39 -11
- package/dist/lib/tools/types.d.ts +7 -1
- package/dist/lib/types.d.ts +265 -1
- package/dist/preact/adapter.d.ts +3 -3
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +857 -403
- 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 +857 -403
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/annotation-container.d.ts +8 -1
- package/dist/shared/components/annotation-layer.d.ts +4 -2
- package/dist/shared/components/annotations/ink.d.ts +3 -3
- package/dist/shared/components/annotations/link.d.ts +28 -0
- package/dist/shared/components/annotations.d.ts +2 -1
- package/dist/shared/components/group-selection-box.d.ts +32 -0
- package/dist/shared/components/index.d.ts +1 -0
- package/dist/shared/components/text-markup/highlight.d.ts +3 -2
- package/dist/shared/components/text-markup/squiggly.d.ts +3 -2
- package/dist/shared/components/text-markup/strikeout.d.ts +3 -2
- package/dist/shared/components/text-markup/underline.d.ts +3 -2
- package/dist/shared/components/types.d.ts +7 -0
- package/dist/shared-preact/components/annotation-container.d.ts +8 -1
- package/dist/shared-preact/components/annotation-layer.d.ts +4 -2
- package/dist/shared-preact/components/annotations/ink.d.ts +3 -3
- package/dist/shared-preact/components/annotations/link.d.ts +28 -0
- package/dist/shared-preact/components/annotations.d.ts +2 -1
- package/dist/shared-preact/components/group-selection-box.d.ts +32 -0
- package/dist/shared-preact/components/index.d.ts +1 -0
- package/dist/shared-preact/components/text-markup/highlight.d.ts +3 -2
- package/dist/shared-preact/components/text-markup/squiggly.d.ts +3 -2
- package/dist/shared-preact/components/text-markup/strikeout.d.ts +3 -2
- package/dist/shared-preact/components/text-markup/underline.d.ts +3 -2
- package/dist/shared-preact/components/types.d.ts +7 -0
- package/dist/shared-react/components/annotation-container.d.ts +8 -1
- package/dist/shared-react/components/annotation-layer.d.ts +4 -2
- package/dist/shared-react/components/annotations/ink.d.ts +3 -3
- package/dist/shared-react/components/annotations/link.d.ts +28 -0
- package/dist/shared-react/components/annotations.d.ts +2 -1
- package/dist/shared-react/components/group-selection-box.d.ts +32 -0
- package/dist/shared-react/components/index.d.ts +1 -0
- package/dist/shared-react/components/text-markup/highlight.d.ts +3 -2
- package/dist/shared-react/components/text-markup/squiggly.d.ts +3 -2
- package/dist/shared-react/components/text-markup/strikeout.d.ts +3 -2
- package/dist/shared-react/components/text-markup/underline.d.ts +3 -2
- package/dist/shared-react/components/types.d.ts +7 -0
- package/dist/svelte/components/AnnotationLayer.svelte.d.ts +5 -1
- package/dist/svelte/components/Annotations.svelte.d.ts +5 -1
- package/dist/svelte/components/GroupSelectionBox.svelte.d.ts +32 -0
- package/dist/svelte/components/annotations/Ink.svelte.d.ts +2 -1
- package/dist/svelte/components/annotations/Link.svelte.d.ts +24 -0
- package/dist/svelte/components/annotations/index.d.ts +1 -0
- package/dist/svelte/components/index.d.ts +1 -0
- package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +2 -1
- package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +2 -1
- package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +2 -1
- package/dist/svelte/components/text-markup/Underline.svelte.d.ts +2 -1
- package/dist/svelte/components/types.d.ts +2 -0
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +905 -255
- package/dist/svelte/index.js.map +1 -1
- package/dist/svelte/types.d.ts +7 -0
- package/dist/vue/components/annotation-container.vue.d.ts +2 -0
- package/dist/vue/components/annotation-layer.vue.d.ts +28 -5
- package/dist/vue/components/annotations/index.d.ts +1 -0
- package/dist/vue/components/annotations/ink.vue.d.ts +2 -2
- package/dist/vue/components/annotations/line.vue.d.ts +1 -1
- package/dist/vue/components/annotations/link.vue.d.ts +29 -0
- package/dist/vue/components/annotations/polygon.vue.d.ts +1 -1
- package/dist/vue/components/annotations/polyline.vue.d.ts +1 -1
- package/dist/vue/components/annotations.vue.d.ts +65 -1
- package/dist/vue/components/group-selection-box.vue.d.ts +73 -0
- package/dist/vue/components/index.d.ts +1 -0
- package/dist/vue/components/text-markup/highlight.vue.d.ts +2 -2
- package/dist/vue/components/text-markup/squiggly.vue.d.ts +2 -2
- package/dist/vue/components/text-markup/strikeout.vue.d.ts +2 -2
- package/dist/vue/components/text-markup/underline.vue.d.ts +2 -2
- package/dist/vue/hooks/use-annotation.d.ts +2 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +946 -406
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/types.d.ts +7 -0
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/preact/adapter.ts","../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/preview-renderer.tsx","../../src/shared/components/annotation-paint-layer.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { JSX, Fragment } from 'preact';\nexport { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const suppressContentEditableWarningProps = {};\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\nimport { useState, useEffect } from '@framework';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n\n/**\n * Hook for annotation state for a specific document\n * @param documentId Document ID\n */\nexport const useAnnotation = (documentId: string) => {\n const { provides } = useAnnotationCapability();\n const [state, setState] = useState<AnnotationDocumentState>(\n provides?.forDocument(documentId)?.getState() ?? initialDocumentState(),\n );\n\n useEffect(() => {\n if (!provides) return;\n\n const scope = provides.forDocument(documentId);\n\n // Get initial state\n setState(scope.getState());\n\n // Subscribe to state changes\n return scope.onStateChange((newState) => {\n setState(newState);\n });\n }, [provides, documentId]);\n\n return {\n state,\n provides: provides?.forDocument(documentId) ?? null,\n };\n};\n","import { PdfAnnotationObject } from '@embedpdf/models';\nimport {\n CounterRotate,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, JSX, CSSProperties, useRef, useEffect, useMemo } from '@framework';\nimport { useDocumentPermissions } from '@embedpdf/core/@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { VertexConfig } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n isSelected: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n style?: CSSProperties;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: any) => void; // You'll need to import proper MouseEvent type\n onSelect: (event: any) => void;\n zIndex?: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<T>;\n}\n\n// Simplified AnnotationContainer\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n documentId,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style = {},\n vertexConfig,\n selectionMenu,\n outlineOffset = 1,\n onDoubleClick,\n onSelect,\n zIndex = 1,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n customAnnotationRenderer,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const [preview, setPreview] = useState<T>(trackedAnnotation.object);\n const { provides: annotationCapability } = useAnnotationCapability();\n const { canModifyAnnotations } = useDocumentPermissions(documentId);\n const gestureBaseRef = useRef<T | null>(null);\n\n // Override props based on permission\n const effectiveIsDraggable = canModifyAnnotations && isDraggable;\n const effectiveIsResizable = canModifyAnnotations && isResizable;\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n const currentObject = preview\n ? { ...trackedAnnotation.object, ...preview }\n : trackedAnnotation.object;\n\n // Defaults retain current behavior\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const VERTEX_COLOR = vertexUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n const VERTEX_SIZE = vertexUI?.size ?? 12;\n\n const { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n enabled: isSelected,\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n\n if (event.state === 'start') {\n gestureBaseRef.current = currentObject;\n }\n\n const transformType = event.transformData.type;\n const base = gestureBaseRef.current ?? currentObject;\n\n const changes = event.transformData.changes.vertices\n ? vertexConfig?.transformAnnotation(base, event.transformData.changes.vertices)\n : { rect: event.transformData.changes.rect };\n\n const patched = annotationCapability?.transformAnnotation<T>(base, {\n type: transformType,\n changes: changes as Partial<T>,\n metadata: event.transformData.metadata,\n });\n\n if (patched) {\n setPreview((prev) => ({\n ...prev,\n ...patched,\n }));\n }\n\n if (event.state === 'end' && patched) {\n gestureBaseRef.current = null;\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.object.id, patched);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n });\n\n // Wrap onDoubleClick to respect permissions\n const guardedOnDoubleClick = useMemo(() => {\n if (!canModifyAnnotations || !onDoubleClick) return undefined;\n return onDoubleClick;\n }, [canModifyAnnotations, onDoubleClick]);\n\n const doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n return (\n <div data-no-interaction>\n <div\n {...(effectiveIsDraggable && isSelected ? dragProps : {})}\n {...doubleProps}\n style={{\n position: 'absolute',\n left: currentObject.rect.origin.x * scale,\n top: currentObject.rect.origin.y * scale,\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n outline: isSelected ? `1px solid ${selectionOutlineColor}` : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n pointerEvents: isSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: isSelected && effectiveIsDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {(() => {\n const childrenRender =\n typeof children === 'function' ? children(currentObject) : children;\n // Check for custom renderer first\n const customRender = customAnnotationRenderer?.({\n annotation: currentObject,\n children: childrenRender,\n isSelected,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n pageIndex,\n onSelect,\n });\n if (customRender !== null && customRender !== undefined) {\n return customRender;\n }\n\n // Fall back to default children rendering\n return childrenRender;\n })()}\n\n {isSelected &&\n effectiveIsResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n\n {isSelected &&\n canModifyAnnotations &&\n vertices.map(({ key, ...vProps }) =>\n vertexUI?.component ? (\n vertexUI.component({\n key,\n ...vProps,\n backgroundColor: VERTEX_COLOR,\n })\n ) : (\n <div\n key={key}\n {...vProps}\n style={{ ...vProps.style, backgroundColor: VERTEX_COLOR }}\n />\n ),\n )}\n </div>\n {/* CounterRotate remains unchanged */}\n {selectionMenu && (\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(props) =>\n selectionMenu({\n ...props,\n context: {\n type: 'annotation',\n annotation: trackedAnnotation,\n pageIndex,\n },\n selected: isSelected,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: HighlightProps) {\n return (\n <>\n {segmentRects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n />\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\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 { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\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 { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n // Calculate angles in the direction of the line segments\n const startRad = toAngle(localPts[0], localPts[1]); // direction FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // direction FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from line start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip points in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n\n // New optional props for preview rendering\n currentVertex?: Position;\n handleSize?: number;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex, // A preview-only prop\n handleSize = 14, // in CSS pixels\n}: PolygonProps): JSX.Element {\n const allPoints = currentVertex ? [...vertices, currentVertex] : vertices;\n\n const localPts = useMemo(\n () => allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [allPoints, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n // Don't close the path with 'Z' if it's a preview\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n }, [localPts, currentVertex]);\n\n const isPreviewing = currentVertex && vertices.length > 0;\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: currentVertex ? 'none' : color, // No fill during preview\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n {/* --- Preview-only elements --- */}\n {isPreviewing && vertices.length > 1 && (\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style={{ stroke: strokeColor, strokeWidth, strokeDasharray: '4,4', opacity: 0.7 }}\n />\n )}\n {isPreviewing && vertices.length >= 2 && (\n <rect\n x={localPts[0].x - handleSize / scale / 2}\n y={localPts[0].y - handleSize / scale / 2}\n width={handleSize / scale}\n height={handleSize / scale}\n fill={strokeColor}\n opacity={0.4}\n stroke={strokeColor}\n strokeWidth={strokeWidth / 2}\n />\n )}\n </svg>\n );\n}\n","import {\n MouseEvent,\n TouchEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n suppressContentEditableWarningProps,\n} from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n const [isIOS, setIsIOS] = useState(false);\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n useLayoutEffect(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n setIsIOS(ios);\n } catch {\n setIsIOS(false);\n }\n }, []);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n // iOS zoom prevention: keep focused font-size >= 16px, visually scale down if needed.\n const computedFontPx = annotation.object.fontSize * scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n tabIndex={0}\n style={{\n color: annotation.object.fontColor,\n fontSize: adjustedFontPx,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n }}\n contentEditable={isEditing}\n {...suppressContentEditableWarningProps}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n documentId,\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.forDocument(documentId).renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, documentId, 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 display: 'block',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({\n isSelected,\n annotation,\n documentId,\n pageIndex,\n scale,\n onClick,\n}: 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 cursor: 'pointer',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n documentId={documentId}\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { blendModeToCss, PdfAnnotationObject, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n} from '@embedpdf/plugin-annotation';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { Square } from './annotations/square';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { Circle } from './annotations/circle';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\n\ninterface AnnotationsProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { documentId, pageIndex, scale, selectionMenu } = annotationsProps;\n const { provides: annotationCapability } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ documentId, pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n useEffect(() => {\n if (annotationProvides) {\n // Initialize with current state immediately\n const currentState = annotationProvides.getState();\n setAnnotations(getAnnotationsByPageIndex(currentState, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(currentState, pageIndex));\n\n // Then subscribe to changes\n return annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides, pageIndex]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n selectionProvides.clear();\n if (annotation.object.id !== editingId) {\n setEditingId(null);\n }\n }\n },\n [annotationProvides, selectionProvides, editingId, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers, {\n documentId,\n });\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.object.id === annotation.object.id;\n const isEditing = editingId === annotation.object.id;\n const tool = annotationProvides?.findToolForAnnotation(annotation.object);\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ],\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n linePoints: {\n start: vertices[0],\n end: vertices[1],\n },\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={(tool?.interaction.isDraggable ?? true) && !isEditing}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\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 documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ documentId, pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<AnnotationTool | null>(null);\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n return selectionProvides.forDocument(documentId).onSelectionChange(() => {\n setRects(selectionProvides.forDocument(documentId).getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.forDocument(documentId).getBoundingRectForPage(pageIndex));\n });\n }, [selectionProvides, documentId, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current active tool\n setActiveTool(annotationProvides.forDocument(documentId).getActiveTool());\n\n return annotationProvides\n .forDocument(documentId)\n .onActiveToolChange((event) => setActiveTool(event));\n }, [annotationProvides, documentId]);\n\n if (!boundingRect) return null;\n if (!activeTool || !activeTool.defaults) return null;\n\n switch (activeTool.defaults.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { Circle } from './annotations/circle';\nimport { Square } from './annotations/square';\nimport { Polygon } from './annotations/polygon';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Polyline } from './annotations/polyline';\nimport { Line } from './annotations/line';\nimport { Ink } from './annotations/ink';\n\ninterface Props {\n preview: AnyPreviewState;\n scale: number;\n}\n\nexport function PreviewRenderer({ preview, scale }: Props) {\n const { bounds } = preview;\n\n const style = {\n position: 'absolute' as const,\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n pointerEvents: 'none' as const,\n zIndex: 10,\n };\n\n // Use type guards for proper type narrowing\n if (preview.type === PdfAnnotationSubtype.CIRCLE) {\n return (\n <div style={style}>\n <Circle isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.SQUARE) {\n return (\n <div style={style}>\n <Square isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYGON) {\n return (\n <div style={style}>\n <Polygon isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYLINE) {\n return (\n <div style={style}>\n <Polyline isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.LINE) {\n return (\n <div style={style}>\n <Line isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.INK) {\n return (\n <div style={style}>\n <Ink isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.FREETEXT) {\n return (\n <div style={style}>\n {/* Render a simple dashed border preview */}\n <div\n style={{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }}\n />\n </div>\n );\n }\n\n return null;\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport { PreviewRenderer } from './preview-renderer';\n\ninterface Props {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ documentId, pageIndex, scale }: Props) {\n const { plugin: annotationPlugin } = useAnnotationPlugin();\n const [previews, setPreviews] = useState<Map<string, AnyPreviewState>>(new Map());\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const services = useMemo<HandlerServices>(\n () => ({\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef.current) return;\n const input = fileInputRef.current;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef.current;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n }),\n [],\n );\n\n useEffect(() => {\n if (!annotationPlugin) return;\n\n return annotationPlugin.registerPageHandlers(documentId, pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n setPreviews((prev) => {\n const next = new Map(prev);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n return next;\n });\n },\n });\n }, [documentId, pageIndex, scale, annotationPlugin, services]);\n\n return (\n <>\n {/* Hidden DOM elements required by services */}\n <input ref={fileInputRef} type=\"file\" style={{ display: 'none' }} />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n\n {/* Render any active previews from any tool */}\n {Array.from(previews.entries()).map(([toolId, preview]) => (\n <PreviewRenderer key={toolId} preview={preview} scale={scale} />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, useMemo } from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport {\n ResizeHandleUI,\n VertexHandleUI,\n CustomAnnotationRenderer,\n AnnotationSelectionMenuRenderFn,\n} from './types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject, Rotation } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n /** The ID of the document that this layer displays annotations for */\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: number;\n /** Customize selection menu across all annotations on this layer */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n style?: CSSProperties;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize annotation renderer */\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n};\n\nexport function AnnotationLayer({\n style,\n documentId,\n pageIndex,\n scale: overrideScale,\n rotation: overrideRotation,\n selectionMenu,\n resizeUI,\n vertexUI,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n const documentState = useDocumentState(documentId);\n const page = documentState?.document?.pages?.[pageIndex];\n const width = page?.size?.width ?? 0;\n const height = page?.size?.height ?? 0;\n\n const actualScale = useMemo(() => {\n if (overrideScale !== undefined) return overrideScale;\n return documentState?.scale ?? 1;\n }, [overrideScale, documentState?.scale]);\n\n const actualRotation = useMemo(() => {\n if (overrideRotation !== undefined) return overrideRotation;\n return documentState?.rotation ?? Rotation.Degree0;\n }, [overrideRotation, documentState?.rotation]);\n\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n documentId={documentId}\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={actualScale}\n rotation={actualRotation}\n pageWidth={width}\n pageHeight={height}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n <AnnotationPaintLayer documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n </div>\n );\n}\n"],"names":["suppressContentEditableWarningProps","useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","AnnotationContainer","scale","documentId","pageIndex","rotation","pageWidth","pageHeight","trackedAnnotation","children","isSelected","isDraggable","isResizable","lockAspectRatio","style","vertexConfig","selectionMenu","outlineOffset","onDoubleClick","onSelect","zIndex","resizeUI","vertexUI","selectionOutlineColor","customAnnotationRenderer","props","preview","setPreview","useState","object","provides","annotationCapability","canModifyAnnotations","useDocumentPermissions","gestureBaseRef","useRef","effectiveIsDraggable","effectiveIsResizable","annotationProvides","useMemo","forDocument","currentObject","HANDLE_COLOR","color","VERTEX_COLOR","HANDLE_SIZE","size","VERTEX_SIZE","dragProps","vertices","resize","useInteractionHandles","controller","element","rect","extractVertices","constraints","minWidth","minHeight","boundingBox","width","height","maintainAspectRatio","pageRotation","enabled","onUpdate","event","_a","transformData","type","state","current","transformType","base","changes","transformAnnotation","patched","metadata","prev","updateAnnotation","handleSize","spacing","offsetMode","includeSides","vertexSize","includeVertices","guardedOnDoubleClick","doubleProps","useDoublePressProps","useEffect","jsxs","position","left","origin","x","top","y","outline","pointerEvents","touchAction","cursor","childrenRender","customRender","annotation","map","key","hProps","component","backgroundColor","jsx","vProps","CounterRotate","context","selected","placement","suggestTop","Highlight","opacity","segmentRects","onClick","Fragment","b","i","onPointerDown","onTouchStart","background","Underline","thickness","r","bottom","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","Math","max","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","length","first","rest","p","toAngle","a","startRad","endRad","Polygon","currentVertex","allPoints","isPreview","isPreviewing","FreeText","isEditing","editorRef","isIOS","setIsIOS","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","useLayoutEffect","nav","navigator","ios","test","userAgent","platform","maxTouchPoints","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","ref","onBlur","contents","innerText","tabIndex","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","transformOrigin","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","currentState","getState","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","onStateChange","handlers","_","pe","target","currentTarget","deselectAnnotation","handleClick","useCallback","e","stopPropagation","selectAnnotation","clear","tool","findToolForAnnotation","isInk","interaction","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","rects","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","getActiveTool","onActiveToolChange","defaults","PdfAnnotationSubtype","UNDERLINE","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","PreviewRenderer","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","border","AnnotationPaintLayer","plugin","annotationPlugin","previews","setPreviews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","value","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","Array","from","entries","overrideScale","overrideRotation","documentState","useDocumentState","page","pages","actualScale","actualRotation","Rotation","Degree0","setState","initialDocumentState","scope","newState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/preact/adapter.ts","../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/group-selection-box.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations/link.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/preview-renderer.tsx","../../src/shared/components/annotation-paint-layer.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { JSX, Fragment, createContext } from 'preact';\nexport {\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n useLayoutEffect,\n useContext,\n} from 'preact/hooks';\nexport type { ComponentChildren as ReactNode, JSX } from 'preact';\n\nexport { Fragment, createContext };\nexport type CSSProperties = import('preact').JSX.CSSProperties;\nexport type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<\n T extends EventTarget ? T : never\n>;\nexport type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;\nexport type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;\nexport type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;\nexport type TouchEvent<T = Element> = JSX.TargetedTouchEvent<T extends EventTarget ? T : never>;\n\nexport const suppressContentEditableWarningProps = {};\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\nimport { useState, useEffect } from '@framework';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n\n/**\n * Hook for annotation state for a specific document\n * @param documentId Document ID\n */\nexport const useAnnotation = (documentId: string) => {\n const { provides } = useAnnotationCapability();\n const [state, setState] = useState<AnnotationDocumentState>(\n provides?.forDocument(documentId)?.getState() ?? initialDocumentState(),\n );\n\n useEffect(() => {\n if (!provides) return;\n\n const scope = provides.forDocument(documentId);\n\n // Get initial state\n setState(scope.getState());\n\n // Subscribe to state changes\n return scope.onStateChange((newState) => {\n setState(newState);\n });\n }, [provides, documentId]);\n\n return {\n state,\n provides: provides?.forDocument(documentId) ?? null,\n };\n};\n","import { PdfAnnotationObject, Rect } from '@embedpdf/models';\nimport {\n CounterRotate,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, JSX, CSSProperties, useRef, useEffect, useMemo, useCallback } from '@framework';\nimport { useDocumentPermissions } from '@embedpdf/core/@framework';\n\nimport { useAnnotationCapability, useAnnotationPlugin } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { VertexConfig } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n isSelected: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n style?: CSSProperties;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: any) => void;\n onSelect: (event: any) => void;\n zIndex?: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<T>;\n}\n\n/**\n * AnnotationContainer wraps individual annotations with interaction handles.\n * When isMultiSelected is true, the container becomes passive - drag/resize\n * is handled by the GroupSelectionBox instead.\n */\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n documentId,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isMultiSelected = false,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style = {},\n vertexConfig,\n selectionMenu,\n outlineOffset = 1,\n onDoubleClick,\n onSelect,\n zIndex = 1,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n customAnnotationRenderer,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const [preview, setPreview] = useState<T>(trackedAnnotation.object);\n const { provides: annotationCapability } = useAnnotationCapability();\n const { plugin } = useAnnotationPlugin();\n const { canModifyAnnotations } = useDocumentPermissions(documentId);\n const gestureBaseRef = useRef<T | null>(null);\n\n // When multi-selected, disable individual drag/resize - GroupSelectionBox handles it\n const effectiveIsDraggable = canModifyAnnotations && isDraggable && !isMultiSelected;\n const effectiveIsResizable = canModifyAnnotations && isResizable && !isMultiSelected;\n // Get scoped API for this document\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n const currentObject = preview\n ? { ...trackedAnnotation.object, ...preview }\n : trackedAnnotation.object;\n\n // UI constants\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const VERTEX_COLOR = vertexUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n const VERTEX_SIZE = vertexUI?.size ?? 12;\n\n // Store original rect at gesture start (only need rect for delta calculation)\n const gestureBaseRectRef = useRef<Rect | null>(null);\n\n // Handle single-annotation drag/resize (only when NOT multi-selected)\n // Uses the unified plugin API - all preview updates come from event subscriptions!\n const handleUpdate = useCallback(\n (\n event: Parameters<\n NonNullable<Parameters<typeof useInteractionHandles>[0]['controller']['onUpdate']>\n >[0],\n ) => {\n if (!event.transformData?.type || isMultiSelected || !plugin) return;\n\n const { type, changes, metadata } = event.transformData;\n const id = trackedAnnotation.object.id;\n const pageSize = { width: pageWidth, height: pageHeight };\n\n // Gesture start - initialize plugin drag/resize\n if (event.state === 'start') {\n gestureBaseRectRef.current = trackedAnnotation.object.rect;\n gestureBaseRef.current = trackedAnnotation.object; // For vertex edit\n if (type === 'move') {\n plugin.startDrag(documentId, { annotationIds: [id], pageSize });\n } else if (type === 'resize') {\n plugin.startResize(documentId, {\n annotationIds: [id],\n pageSize,\n resizeHandle: metadata?.handle ?? 'se',\n });\n }\n }\n\n // Gesture update - call plugin, preview comes from subscription\n if (changes.rect && gestureBaseRectRef.current) {\n if (type === 'move') {\n const delta = {\n x: changes.rect.origin.x - gestureBaseRectRef.current.origin.x,\n y: changes.rect.origin.y - gestureBaseRectRef.current.origin.y,\n };\n plugin.updateDrag(documentId, delta);\n } else if (type === 'resize') {\n plugin.updateResize(documentId, changes.rect);\n }\n }\n\n // Vertex edit - handle directly (no attached link handling needed)\n if (type === 'vertex-edit' && changes.vertices && vertexConfig) {\n const base = gestureBaseRef.current ?? trackedAnnotation.object;\n const vertexChanges = vertexConfig.transformAnnotation(base, changes.vertices);\n const patched = annotationCapability?.transformAnnotation<T>(base, {\n type,\n changes: vertexChanges as Partial<T>,\n metadata,\n });\n if (patched) {\n setPreview((prev) => ({ ...prev, ...patched }));\n if (event.state === 'end') {\n annotationProvides?.updateAnnotation(pageIndex, id, patched);\n }\n }\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureBaseRectRef.current = null;\n gestureBaseRef.current = null;\n if (type === 'move') plugin.commitDrag(documentId);\n else if (type === 'resize') plugin.commitResize(documentId);\n }\n },\n [\n plugin,\n documentId,\n trackedAnnotation.object,\n pageWidth,\n pageHeight,\n pageIndex,\n isMultiSelected,\n vertexConfig,\n annotationCapability,\n annotationProvides,\n ],\n );\n\n const { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n // Disable interaction handles when multi-selected\n enabled: isSelected && !isMultiSelected,\n onUpdate: handleUpdate,\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n });\n\n // Wrap onDoubleClick to respect permissions\n const guardedOnDoubleClick = useMemo(() => {\n if (!canModifyAnnotations || !onDoubleClick) return undefined;\n return onDoubleClick;\n }, [canModifyAnnotations, onDoubleClick]);\n\n const doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n // Sync preview with tracked annotation when it changes\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n // Subscribe to unified drag changes - plugin sends pre-computed patches!\n // ALL preview updates come through here (primary, attached links, multi-select)\n useEffect(() => {\n if (!plugin) return;\n const id = trackedAnnotation.object.id;\n\n const handleEvent = (event: {\n documentId: string;\n type: string;\n previewPatches?: Record<string, any>;\n }) => {\n if (event.documentId !== documentId) return;\n const patch = event.previewPatches?.[id];\n if (event.type === 'update' && patch) setPreview((prev) => ({ ...prev, ...patch }) as T);\n else if (event.type === 'cancel') setPreview(trackedAnnotation.object);\n };\n\n const unsubs = [plugin.onDragChange(handleEvent), plugin.onResizeChange(handleEvent)];\n\n return () => unsubs.forEach((u) => u());\n }, [plugin, documentId, trackedAnnotation.object]);\n\n // Determine if we should show the outline\n // When multi-selected, don't show individual outlines - GroupSelectionBox shows the group outline\n const showOutline = isSelected && !isMultiSelected;\n\n return (\n <div data-no-interaction>\n <div\n {...(effectiveIsDraggable && isSelected ? dragProps : {})}\n {...doubleProps}\n style={{\n position: 'absolute',\n left: currentObject.rect.origin.x * scale,\n top: currentObject.rect.origin.y * scale,\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n outline: showOutline ? `1px solid ${selectionOutlineColor}` : 'none',\n outlineOffset: showOutline ? `${outlineOffset}px` : '0px',\n pointerEvents: isSelected && !isMultiSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: isSelected && effectiveIsDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {(() => {\n const childrenRender =\n typeof children === 'function' ? children(currentObject) : children;\n const customRender = customAnnotationRenderer?.({\n annotation: currentObject,\n children: childrenRender,\n isSelected,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n pageIndex,\n onSelect,\n });\n if (customRender !== null && customRender !== undefined) {\n return customRender;\n }\n return childrenRender;\n })()}\n\n {/* Resize handles - only when single-selected */}\n {isSelected &&\n effectiveIsResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n\n {/* Vertex handles - only when single-selected */}\n {isSelected &&\n canModifyAnnotations &&\n !isMultiSelected &&\n vertices.map(({ key, ...vProps }) =>\n vertexUI?.component ? (\n vertexUI.component({\n key,\n ...vProps,\n backgroundColor: VERTEX_COLOR,\n })\n ) : (\n <div\n key={key}\n {...vProps}\n style={{ ...vProps.style, backgroundColor: VERTEX_COLOR }}\n />\n ),\n )}\n </div>\n\n {/* Selection menu - hide when multi-selected */}\n {selectionMenu && !isMultiSelected && (\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(counterRotateProps) =>\n selectionMenu({\n ...counterRotateProps,\n context: {\n type: 'annotation',\n annotation: trackedAnnotation,\n pageIndex,\n },\n selected: isSelected,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { Rect, boundingRectOrEmpty } from '@embedpdf/models';\nimport { useInteractionHandles, CounterRotate } from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, useMemo, useCallback, useRef, useEffect } from '@framework';\n\nimport { useAnnotationPlugin } from '../hooks';\nimport { ResizeHandleUI, GroupSelectionMenuRenderFn } from './types';\n\ninterface GroupSelectionBoxProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n /** All selected annotations on this page */\n selectedAnnotations: TrackedAnnotation[];\n /** Whether the group is draggable (all annotations must be group-draggable) */\n isDraggable: boolean;\n /** Whether the group is resizable (all annotations must be group-resizable) */\n isResizable: boolean;\n /** Resize handle UI customization */\n resizeUI?: ResizeHandleUI;\n /** Selection outline color */\n selectionOutlineColor?: string;\n /** Outline offset */\n outlineOffset?: number;\n /** Z-index for the group box */\n zIndex?: number;\n /** Group selection menu render function */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n}\n\n/**\n * GroupSelectionBox renders a bounding box around all selected annotations\n * with drag and resize handles for group manipulation.\n */\nexport function GroupSelectionBox({\n documentId,\n pageIndex,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n selectedAnnotations,\n isDraggable,\n isResizable,\n resizeUI,\n selectionOutlineColor = '#007ACC',\n outlineOffset = 2,\n zIndex = 100,\n groupSelectionMenu,\n}: GroupSelectionBoxProps): JSX.Element | null {\n const { plugin } = useAnnotationPlugin();\n const gestureBaseRef = useRef<Rect | null>(null);\n const isDraggingRef = useRef(false);\n const isResizingRef = useRef(false);\n\n // Compute the group bounding box from all selected annotations\n const groupBox = useMemo(() => {\n const rects = selectedAnnotations.map((ta) => ta.object.rect);\n return boundingRectOrEmpty(rects);\n }, [selectedAnnotations]);\n\n // Preview state for the group box during drag/resize\n const [previewGroupBox, setPreviewGroupBox] = useState<Rect>(groupBox);\n\n // Sync preview with actual group box when not dragging/resizing\n useEffect(() => {\n if (!isDraggingRef.current && !isResizingRef.current) {\n setPreviewGroupBox(groupBox);\n }\n }, [groupBox]);\n\n // Handle both drag and resize updates using unified plugin API\n // The plugin handles attached links automatically and commits all patches\n const handleUpdate = useCallback(\n (\n event: Parameters<\n NonNullable<Parameters<typeof useInteractionHandles>[0]['controller']['onUpdate']>\n >[0],\n ) => {\n if (!event.transformData?.type) return;\n if (!plugin) return;\n\n const transformType = event.transformData.type;\n const isMove = transformType === 'move';\n const isResize = transformType === 'resize';\n\n // Skip drag operations if group is not draggable\n if (isMove && !isDraggable) return;\n\n if (event.state === 'start') {\n gestureBaseRef.current = groupBox;\n\n if (isMove) {\n isDraggingRef.current = true;\n // Use unified drag API - plugin handles attached links automatically\n plugin.startDrag(documentId, {\n annotationIds: selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: pageWidth, height: pageHeight },\n });\n } else if (isResize) {\n isResizingRef.current = true;\n // Use unified resize API - plugin handles attached links automatically\n plugin.startResize(documentId, {\n annotationIds: selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: pageWidth, height: pageHeight },\n resizeHandle: event.transformData.metadata?.handle ?? 'se',\n });\n }\n }\n\n const base = gestureBaseRef.current ?? groupBox;\n\n if (isMove && event.transformData.changes.rect) {\n // Calculate delta from original position\n const newRect = event.transformData.changes.rect;\n const rawDelta = {\n x: newRect.origin.x - base.origin.x,\n y: newRect.origin.y - base.origin.y,\n };\n\n // Plugin clamps delta and emits events (attached links receive updates too)\n const clampedDelta = plugin.updateDrag(documentId, rawDelta);\n\n // Update preview group box with clamped delta\n setPreviewGroupBox({\n ...base,\n origin: {\n x: base.origin.x + clampedDelta.x,\n y: base.origin.y + clampedDelta.y,\n },\n });\n } else if (isResize && event.transformData.changes.rect) {\n const newGroupBox = event.transformData.changes.rect;\n\n // Plugin computes rects for all participants and emits events\n plugin.updateResize(documentId, newGroupBox);\n\n // Update preview\n setPreviewGroupBox(newGroupBox);\n }\n\n if (event.state === 'end') {\n gestureBaseRef.current = null;\n\n if (isMove && isDraggingRef.current) {\n isDraggingRef.current = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitDrag(documentId);\n } else if (isResize && isResizingRef.current) {\n isResizingRef.current = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitResize(documentId);\n }\n }\n },\n [plugin, documentId, pageWidth, pageHeight, groupBox, isDraggable, selectedAnnotations],\n );\n\n // UI constants\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n\n // Use interaction handles for both drag and resize\n const { dragProps, resize } = useInteractionHandles({\n controller: {\n element: previewGroupBox,\n constraints: {\n minWidth: 20,\n minHeight: 20,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: false,\n pageRotation: rotation,\n scale: scale,\n enabled: true,\n onUpdate: handleUpdate,\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: zIndex,\n },\n includeVertices: false,\n });\n\n // Don't render if less than 2 annotations selected\n if (selectedAnnotations.length < 2) {\n return null;\n }\n\n return (\n <div data-group-selection-box data-no-interaction>\n {/* Group box - draggable only if isDraggable is true */}\n <div\n {...(isDraggable\n ? dragProps\n : {\n onPointerDown: (e) => e.stopPropagation(),\n })}\n style={{\n position: 'absolute',\n left: previewGroupBox.origin.x * scale,\n top: previewGroupBox.origin.y * scale,\n width: previewGroupBox.size.width * scale,\n height: previewGroupBox.size.height * scale,\n outline: `2px dashed ${selectionOutlineColor}`,\n outlineOffset: outlineOffset - 1,\n cursor: isDraggable ? 'move' : 'default',\n touchAction: 'none',\n zIndex,\n }}\n >\n {/* Resize handles */}\n {isResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n </div>\n\n {/* Group selection menu */}\n {groupSelectionMenu && (\n <CounterRotate\n rect={{\n origin: {\n x: previewGroupBox.origin.x * scale,\n y: previewGroupBox.origin.y * scale,\n },\n size: {\n width: previewGroupBox.size.width * scale,\n height: previewGroupBox.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(counterRotateProps) =>\n groupSelectionMenu({\n ...counterRotateProps,\n context: {\n type: 'group',\n annotations: selectedAnnotations,\n pageIndex,\n },\n selected: true,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: HighlightProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n\n return (\n <>\n {segmentRects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n />\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: UnderlineProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: StrikeoutProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n const thickness = 2 * scale;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\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: resolvedColor,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: SquigglyProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\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=\"${resolvedColor}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke color */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n strokeColor,\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n const resolvedColor = strokeColor ?? '#000000';\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n // Calculate angles in the direction of the line segments\n const startRad = toAngle(localPts[0], localPts[1]); // direction FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // direction FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from line start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip points in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n\n // New optional props for preview rendering\n currentVertex?: Position;\n handleSize?: number;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex, // A preview-only prop\n handleSize = 14, // in CSS pixels\n}: PolygonProps): JSX.Element {\n const allPoints = currentVertex ? [...vertices, currentVertex] : vertices;\n\n const localPts = useMemo(\n () => allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [allPoints, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n // Don't close the path with 'Z' if it's a preview\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n }, [localPts, currentVertex]);\n\n const isPreviewing = currentVertex && vertices.length > 0;\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: currentVertex ? 'none' : color, // No fill during preview\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n {/* --- Preview-only elements --- */}\n {isPreviewing && vertices.length > 1 && (\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style={{ stroke: strokeColor, strokeWidth, strokeDasharray: '4,4', opacity: 0.7 }}\n />\n )}\n {isPreviewing && vertices.length >= 2 && (\n <rect\n x={localPts[0].x - handleSize / scale / 2}\n y={localPts[0].y - handleSize / scale / 2}\n width={handleSize / scale}\n height={handleSize / scale}\n fill={strokeColor}\n opacity={0.4}\n stroke={strokeColor}\n strokeWidth={strokeWidth / 2}\n />\n )}\n </svg>\n );\n}\n","import {\n MouseEvent,\n TouchEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n suppressContentEditableWarningProps,\n} from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n const [isIOS, setIsIOS] = useState(false);\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n useLayoutEffect(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n setIsIOS(ios);\n } catch {\n setIsIOS(false);\n }\n }, []);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n // iOS zoom prevention: keep focused font-size >= 16px, visually scale down if needed.\n const computedFontPx = annotation.object.fontSize * scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n tabIndex={0}\n style={{\n color: annotation.object.fontColor,\n fontSize: adjustedFontPx,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.color ?? annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n }}\n contentEditable={isEditing}\n {...suppressContentEditableWarningProps}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n documentId,\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.forDocument(documentId).renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, documentId, 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 display: 'block',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({\n isSelected,\n annotation,\n documentId,\n pageIndex,\n scale,\n onClick,\n}: 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 cursor: 'pointer',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n documentId={documentId}\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LinkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour – defaults to blue when omitted */\n strokeColor?: string;\n /** Stroke width in PDF units */\n strokeWidth?: number;\n /** Stroke type – defaults to underline when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – for dashed style */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether this link has an IRT (In Reply To) reference - disables direct interaction */\n hasIRT?: boolean;\n}\n\n/**\n * Renders a PDF Link annotation as SVG.\n * Supports underline (default), solid, and dashed border styles.\n */\nexport function Link({\n isSelected,\n strokeColor = '#0000FF',\n strokeWidth = 2,\n strokeStyle = PdfAnnotationBorderStyle.UNDERLINE,\n strokeDashArray,\n rect,\n scale,\n onClick,\n hasIRT = false,\n}: LinkProps): JSX.Element {\n const { width, height } = useMemo(() => {\n return {\n width: rect.size.width,\n height: rect.size.height,\n };\n }, [rect]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n // Calculate dash array for SVG\n const dashArray = useMemo(() => {\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n return strokeDashArray?.join(',') ?? `${strokeWidth * 3},${strokeWidth}`;\n }\n return undefined;\n }, [strokeStyle, strokeDashArray, strokeWidth]);\n\n // For underline style, render a line at the bottom\n // For solid/dashed, render a rectangle border\n const isUnderline = strokeStyle === PdfAnnotationBorderStyle.UNDERLINE;\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 {/* Invisible hit area for the entire link region */}\n {/* IRT links are not directly clickable - interaction goes through parent */}\n <rect\n x={0}\n y={0}\n width={width}\n height={height}\n fill=\"transparent\"\n onPointerDown={hasIRT ? undefined : onClick}\n onTouchStart={hasIRT ? undefined : onClick}\n style={{\n cursor: hasIRT ? 'default' : isSelected ? 'move' : 'pointer',\n pointerEvents: hasIRT ? 'none' : isSelected ? 'none' : 'visible',\n }}\n />\n\n {isUnderline ? (\n // Underline style: line at bottom of rect\n <line\n x1={1}\n y1={height - 1}\n x2={width - 1}\n y2={height - 1}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n strokeDasharray={dashArray}\n style={{\n pointerEvents: 'none',\n }}\n />\n ) : (\n // Solid/Dashed style: rectangle border\n <rect\n x={strokeWidth / 2}\n y={strokeWidth / 2}\n width={Math.max(width - strokeWidth, 0)}\n height={Math.max(height - strokeWidth, 0)}\n fill=\"transparent\"\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n strokeDasharray={dashArray}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </svg>\n );\n}\n","import { blendModeToCss, PdfAnnotationObject, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n isLink,\n} from '@embedpdf/plugin-annotation';\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { PointerEventHandlers, EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { GroupSelectionBox } from './group-selection-box';\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 {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { Circle } from './annotations/circle';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\nimport { Link } from './annotations/link';\n\ninterface AnnotationsProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { documentId, pageIndex, scale, pageWidth, pageHeight, selectionMenu } = annotationsProps;\n const { provides: annotationCapability } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ documentId, pageIndex });\n const [allSelectedIds, setAllSelectedIds] = useState<string[]>([]);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n // Check if multiple annotations are selected\n const isMultiSelected = allSelectedIds.length > 1;\n\n useEffect(() => {\n if (annotationProvides) {\n // Initialize with current state immediately\n const currentState = annotationProvides.getState();\n setAnnotations(getAnnotationsByPageIndex(currentState, pageIndex));\n setAllSelectedIds(getSelectedAnnotationIds(currentState));\n\n // Then subscribe to changes\n return annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setAllSelectedIds(getSelectedAnnotationIds(state));\n });\n }\n }, [annotationProvides, pageIndex]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<EmbedPdfPointerEvent<MouseEvent>> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n selectionProvides.clear();\n\n // Check for modifier key (Cmd on Mac, Ctrl on Windows/Linux)\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n // Toggle selection: add or remove from current selection\n annotationProvides.toggleSelection(pageIndex, annotation.object.id);\n } else {\n // Exclusive select: clear and select only this one\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n }\n\n if (annotation.object.id !== editingId) {\n setEditingId(null);\n }\n }\n },\n [annotationProvides, selectionProvides, editingId, pageIndex],\n );\n\n // Special handler for link annotations - if IRT exists, select the parent\n const handleLinkClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation<PdfLinkAnnoObject>) => {\n e.stopPropagation();\n if (!annotationProvides || !selectionProvides) return;\n\n selectionProvides.clear();\n\n // If link has IRT, select the parent annotation instead\n if (annotation.object.inReplyToId) {\n const parentId = annotation.object.inReplyToId;\n const parent = annotations.find((a) => a.object.id === parentId);\n if (parent) {\n annotationProvides.selectAnnotation(parent.object.pageIndex, parentId);\n return;\n }\n }\n\n // Standalone link - select it directly\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n },\n [annotationProvides, selectionProvides, annotations, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers, {\n documentId,\n });\n }, [register, handlers]);\n // Get selected annotations that are on THIS page (for group selection box)\n const selectedAnnotationsOnPage = useMemo(() => {\n return annotations.filter((anno) => allSelectedIds.includes(anno.object.id));\n }, [annotations, allSelectedIds]);\n\n // Check if all selected annotations on this page are draggable in group context\n const areAllSelectedDraggable = useMemo(() => {\n if (selectedAnnotationsOnPage.length < 2) return false;\n\n return selectedAnnotationsOnPage.every((ta) => {\n const tool = annotationProvides?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupDraggable ?? tool?.interaction.isDraggable ?? true;\n });\n }, [selectedAnnotationsOnPage, annotationProvides]);\n\n // Check if all selected annotations on this page are resizable in group context\n const areAllSelectedResizable = useMemo(() => {\n if (selectedAnnotationsOnPage.length < 2) return false;\n\n return selectedAnnotationsOnPage.every((ta) => {\n const tool = annotationProvides?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupResizable ?? tool?.interaction.isResizable ?? true;\n });\n }, [selectedAnnotationsOnPage, annotationProvides]);\n\n // Check if all selected annotations are on the same page (this page)\n const allSelectedOnSamePage = useMemo(() => {\n if (!annotationProvides) return false;\n const allSelected = annotationProvides.getSelectedAnnotations();\n // All selected must be on this page\n return allSelected.length > 1 && allSelected.every((ta) => ta.object.pageIndex === pageIndex);\n }, [annotationProvides, pageIndex, allSelectedIds]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = allSelectedIds.includes(annotation.object.id);\n const isEditing = editingId === annotation.object.id;\n const tool = annotationProvides?.findToolForAnnotation(annotation.object);\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ],\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n linePoints: {\n start: vertices[0],\n end: vertices[1],\n },\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={(tool?.interaction.isDraggable ?? true) && !isEditing}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\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 documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLink(annotation)) {\n // IRT-linked links are not independently draggable/resizable\n const hasIRT = !!annotation.object.inReplyToId;\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={false}\n isResizable={false}\n lockAspectRatio={false}\n selectionMenu={hasIRT ? undefined : selectionMenu}\n onSelect={(e) => handleLinkClick(e, annotation)}\n {...annotationsProps}\n >\n {(obj) => (\n <Link\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleLinkClick(e, annotation)}\n hasIRT={hasIRT}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n\n {/* Group selection box for multi-select drag/resize */}\n {allSelectedOnSamePage && selectedAnnotationsOnPage.length >= 2 && (\n <GroupSelectionBox\n documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n rotation={annotationsProps.rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n selectedAnnotations={selectedAnnotationsOnPage}\n isDraggable={areAllSelectedDraggable}\n isResizable={areAllSelectedResizable}\n resizeUI={annotationsProps.resizeUI}\n selectionOutlineColor={annotationsProps.selectionOutlineColor}\n groupSelectionMenu={annotationsProps.groupSelectionMenu}\n />\n )}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ documentId, pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<AnnotationTool | null>(null);\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n return selectionProvides.forDocument(documentId).onSelectionChange(() => {\n setRects(selectionProvides.forDocument(documentId).getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.forDocument(documentId).getBoundingRectForPage(pageIndex));\n });\n }, [selectionProvides, documentId, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current active tool\n setActiveTool(annotationProvides.forDocument(documentId).getActiveTool());\n\n return annotationProvides\n .forDocument(documentId)\n .onActiveToolChange((event) => setActiveTool(event));\n }, [annotationProvides, documentId]);\n\n if (!boundingRect) return null;\n if (!activeTool || !activeTool.defaults) return null;\n\n switch (activeTool.defaults.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { Circle } from './annotations/circle';\nimport { Square } from './annotations/square';\nimport { Polygon } from './annotations/polygon';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Polyline } from './annotations/polyline';\nimport { Line } from './annotations/line';\nimport { Ink } from './annotations/ink';\n\ninterface Props {\n preview: AnyPreviewState;\n scale: number;\n}\n\nexport function PreviewRenderer({ preview, scale }: Props) {\n const { bounds } = preview;\n\n const style = {\n position: 'absolute' as const,\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n pointerEvents: 'none' as const,\n zIndex: 10,\n };\n\n // Use type guards for proper type narrowing\n if (preview.type === PdfAnnotationSubtype.CIRCLE) {\n return (\n <div style={style}>\n <Circle isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.SQUARE) {\n return (\n <div style={style}>\n <Square isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYGON) {\n return (\n <div style={style}>\n <Polygon isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYLINE) {\n return (\n <div style={style}>\n <Polyline isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.LINE) {\n return (\n <div style={style}>\n <Line isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.INK) {\n return (\n <div style={style}>\n <Ink isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.FREETEXT) {\n return (\n <div style={style}>\n {/* Render a simple dashed border preview */}\n <div\n style={{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }}\n />\n </div>\n );\n }\n\n return null;\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport { PreviewRenderer } from './preview-renderer';\n\ninterface Props {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ documentId, pageIndex, scale }: Props) {\n const { plugin: annotationPlugin } = useAnnotationPlugin();\n const [previews, setPreviews] = useState<Map<string, AnyPreviewState>>(new Map());\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const services = useMemo<HandlerServices>(\n () => ({\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef.current) return;\n const input = fileInputRef.current;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef.current;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n }),\n [],\n );\n\n useEffect(() => {\n if (!annotationPlugin) return;\n\n return annotationPlugin.registerPageHandlers(documentId, pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n setPreviews((prev) => {\n const next = new Map(prev);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n return next;\n });\n },\n });\n }, [documentId, pageIndex, scale, annotationPlugin, services]);\n\n return (\n <>\n {/* Hidden DOM elements required by services */}\n <input ref={fileInputRef} type=\"file\" style={{ display: 'none' }} />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n\n {/* Render any active previews from any tool */}\n {Array.from(previews.entries()).map(([toolId, preview]) => (\n <PreviewRenderer key={toolId} preview={preview} scale={scale} />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, useMemo } from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport {\n ResizeHandleUI,\n VertexHandleUI,\n CustomAnnotationRenderer,\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n} from './types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject, Rotation } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n /** The ID of the document that this layer displays annotations for */\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: number;\n /** Customize selection menu across all annotations on this layer */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Customize group selection menu across all annotations on this layer */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n style?: CSSProperties;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize annotation renderer */\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n};\n\nexport function AnnotationLayer({\n style,\n documentId,\n pageIndex,\n scale: overrideScale,\n rotation: overrideRotation,\n selectionMenu,\n groupSelectionMenu,\n resizeUI,\n vertexUI,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n const documentState = useDocumentState(documentId);\n const page = documentState?.document?.pages?.[pageIndex];\n const width = page?.size?.width ?? 0;\n const height = page?.size?.height ?? 0;\n\n const actualScale = useMemo(() => {\n if (overrideScale !== undefined) return overrideScale;\n return documentState?.scale ?? 1;\n }, [overrideScale, documentState?.scale]);\n\n const actualRotation = useMemo(() => {\n if (overrideRotation !== undefined) return overrideRotation;\n return documentState?.rotation ?? Rotation.Degree0;\n }, [overrideRotation, documentState?.rotation]);\n\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n documentId={documentId}\n selectionMenu={selectionMenu}\n groupSelectionMenu={groupSelectionMenu}\n pageIndex={pageIndex}\n scale={actualScale}\n rotation={actualRotation}\n pageWidth={width}\n pageHeight={height}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n <AnnotationPaintLayer documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n </div>\n );\n}\n"],"names":["suppressContentEditableWarningProps","useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","AnnotationContainer","scale","documentId","pageIndex","rotation","pageWidth","pageHeight","trackedAnnotation","children","isSelected","isMultiSelected","isDraggable","isResizable","lockAspectRatio","style","vertexConfig","selectionMenu","outlineOffset","onDoubleClick","onSelect","zIndex","resizeUI","vertexUI","selectionOutlineColor","customAnnotationRenderer","props","preview","setPreview","useState","object","provides","annotationCapability","plugin","canModifyAnnotations","useDocumentPermissions","gestureBaseRef","useRef","effectiveIsDraggable","effectiveIsResizable","annotationProvides","useMemo","forDocument","currentObject","HANDLE_COLOR","color","VERTEX_COLOR","HANDLE_SIZE","size","VERTEX_SIZE","gestureBaseRectRef","handleUpdate","useCallback","event","_a","transformData","type","changes","metadata","pageSize","width","height","state","current","rect","startDrag","annotationIds","startResize","resizeHandle","handle","delta","x","origin","y","updateDrag","updateResize","vertices","base","vertexChanges","transformAnnotation","patched","prev","updateAnnotation","commitDrag","commitResize","dragProps","resize","useInteractionHandles","controller","element","extractVertices","constraints","minWidth","minHeight","boundingBox","maintainAspectRatio","pageRotation","enabled","onUpdate","handleSize","spacing","offsetMode","includeSides","vertexSize","includeVertices","guardedOnDoubleClick","doubleProps","useDoublePressProps","useEffect","handleEvent","patch","previewPatches","unsubs","onDragChange","onResizeChange","forEach","u","showOutline","jsxs","position","left","top","outline","pointerEvents","touchAction","cursor","childrenRender","customRender","annotation","map","key","hProps","component","backgroundColor","jsx","vProps","CounterRotate","counterRotateProps","context","selected","placement","suggestTop","GroupSelectionBox","selectedAnnotations","groupSelectionMenu","isDraggingRef","isResizingRef","groupBox","rects","ta","boundingRectOrEmpty","previewGroupBox","setPreviewGroupBox","transformType","isMove","isResize","_b","newRect","rawDelta","clampedDelta","newGroupBox","length","onPointerDown","e","stopPropagation","annotations","Highlight","strokeColor","opacity","segmentRects","onClick","resolvedColor","Fragment","b","i","onTouchStart","background","Underline","thickness","r","bottom","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","points","d","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","Math","max","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","first","rest","p","toAngle","a","startRad","endRad","Polygon","currentVertex","allPoints","isPreview","isPreviewing","FreeText","isEditing","editorRef","isIOS","setIsIOS","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","useLayoutEffect","nav","navigator","ios","test","userAgent","platform","maxTouchPoints","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","ref","onBlur","contents","innerText","tabIndex","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","transformOrigin","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Link","UNDERLINE","hasIRT","dashArray","isUnderline","Annotations","annotationsProps","selectionProvides","useSelectionCapability","setAnnotations","register","usePointerHandlers","allSelectedIds","setAllSelectedIds","editingId","setEditingId","currentState","getState","getAnnotationsByPageIndex","getSelectedAnnotationIds","onStateChange","handlers","_","pe","target","currentTarget","deselectAnnotation","handleClick","clear","metaKey","ctrlKey","toggleSelection","selectAnnotation","handleLinkClick","inReplyToId","parentId","parent","find","selectedAnnotationsOnPage","filter","anno","includes","areAllSelectedDraggable","every","tool","findToolForAnnotation","interaction","isGroupDraggable","areAllSelectedResizable","isGroupResizable","allSelectedOnSamePage","allSelected","getSelectedAnnotations","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","isLink","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","getActiveTool","onActiveToolChange","defaults","PdfAnnotationSubtype","inset","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","PreviewRenderer","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","border","AnnotationPaintLayer","annotationPlugin","previews","setPreviews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","value","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","Array","from","entries","overrideScale","overrideRotation","documentState","useDocumentState","page","pages","actualScale","actualRotation","Rotation","Degree0","setState","initialDocumentState","scope","newState"],"mappings":"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"}
|