@embedpdf/plugin-annotation 1.5.0 → 2.0.0-next.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 +1760 -1444
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +58 -19
- package/dist/lib/annotation-plugin.d.ts +14 -5
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/reducer.d.ts +2 -1
- package/dist/lib/selectors.d.ts +10 -8
- package/dist/lib/types.d.ts +53 -10
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +96 -48
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +96 -48
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/annotation-container.d.ts +4 -3
- package/dist/shared/components/annotation-layer.d.ts +7 -7
- package/dist/shared/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared/components/annotations/stamp.d.ts +2 -1
- package/dist/shared/components/annotations.d.ts +3 -2
- package/dist/shared/components/render-annotation.d.ts +2 -1
- package/dist/shared/components/text-markup.d.ts +2 -1
- package/dist/shared/components/types.d.ts +7 -7
- package/dist/shared/hooks/use-annotation.d.ts +8 -4
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared-preact/components/annotation-container.d.ts +4 -3
- package/dist/shared-preact/components/annotation-layer.d.ts +7 -7
- package/dist/shared-preact/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared-preact/components/annotations/stamp.d.ts +2 -1
- package/dist/shared-preact/components/annotations.d.ts +3 -2
- package/dist/shared-preact/components/render-annotation.d.ts +2 -1
- package/dist/shared-preact/components/text-markup.d.ts +2 -1
- package/dist/shared-preact/components/types.d.ts +7 -7
- package/dist/shared-preact/hooks/use-annotation.d.ts +8 -4
- package/dist/shared-preact/index.d.ts +1 -0
- package/dist/shared-react/components/annotation-container.d.ts +4 -3
- package/dist/shared-react/components/annotation-layer.d.ts +7 -7
- package/dist/shared-react/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared-react/components/annotations/stamp.d.ts +2 -1
- package/dist/shared-react/components/annotations.d.ts +3 -2
- package/dist/shared-react/components/render-annotation.d.ts +2 -1
- package/dist/shared-react/components/text-markup.d.ts +2 -1
- package/dist/shared-react/components/types.d.ts +7 -7
- package/dist/shared-react/hooks/use-annotation.d.ts +8 -4
- package/dist/shared-react/index.d.ts +1 -0
- package/dist/svelte/components/AnnotationContainer.svelte.d.ts +26 -0
- package/dist/svelte/components/AnnotationLayer.svelte.d.ts +27 -0
- package/dist/svelte/components/AnnotationPaintLayer.svelte.d.ts +8 -0
- package/dist/svelte/components/Annotations.svelte.d.ts +22 -0
- package/dist/svelte/components/PreviewRenderer.svelte.d.ts +8 -0
- package/dist/svelte/components/RenderAnnotation.svelte.d.ts +13 -0
- package/dist/svelte/components/TextMarkup.svelte.d.ts +8 -0
- package/dist/svelte/components/annotations/Circle.svelte.d.ts +26 -0
- package/dist/svelte/components/annotations/FreeText.svelte.d.ts +15 -0
- package/dist/svelte/components/annotations/Ink.svelte.d.ts +14 -0
- package/dist/svelte/components/annotations/Line.svelte.d.ts +18 -0
- package/dist/svelte/components/annotations/Polygon.svelte.d.ts +19 -0
- package/dist/svelte/components/annotations/Polyline.svelte.d.ts +17 -0
- package/dist/svelte/components/annotations/Square.svelte.d.ts +16 -0
- package/dist/svelte/components/annotations/Stamp.svelte.d.ts +13 -0
- package/dist/svelte/components/annotations/index.d.ts +8 -0
- package/dist/svelte/components/index.d.ts +9 -0
- package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Underline.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/index.d.ts +4 -0
- package/dist/svelte/components/types.d.ts +32 -0
- package/dist/svelte/hooks/index.d.ts +1 -0
- package/dist/svelte/hooks/use-annotation.svelte.d.ts +21 -0
- package/dist/svelte/index.cjs +2 -0
- package/dist/svelte/index.cjs.map +1 -0
- package/dist/svelte/index.d.ts +4 -0
- package/dist/svelte/index.js +3083 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/svelte/types.d.ts +54 -0
- package/dist/vue/components/annotation-container.vue.d.ts +10 -5
- package/dist/vue/components/annotation-layer.vue.d.ts +13 -7
- package/dist/vue/components/annotation-paint-layer.vue.d.ts +3 -1
- package/dist/vue/components/annotations/circle.vue.d.ts +2 -1
- package/dist/vue/components/annotations/free-text.vue.d.ts +2 -1
- package/dist/vue/components/annotations/ink.vue.d.ts +2 -1
- package/dist/vue/components/annotations/line.vue.d.ts +2 -1
- package/dist/vue/components/annotations/polygon.vue.d.ts +2 -1
- package/dist/vue/components/annotations/polyline.vue.d.ts +2 -1
- package/dist/vue/components/annotations/square.vue.d.ts +2 -1
- package/dist/vue/components/annotations/stamp.vue.d.ts +3 -1
- package/dist/vue/components/annotations.vue.d.ts +7 -3
- package/dist/vue/components/preview-renderer.vue.d.ts +2 -1
- package/dist/vue/components/render-annotation.vue.d.ts +3 -1
- package/dist/vue/components/text-markup/highlight.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/squiggly.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/strikeout.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/underline.vue.d.ts +2 -1
- package/dist/vue/components/text-markup.vue.d.ts +3 -1
- package/dist/vue/hooks/use-annotation.d.ts +21 -2682
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +354 -250
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/types.d.ts +23 -0
- package/package.json +19 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/helpers.ts","../src/lib/selectors.ts","../src/lib/utils/use-state.ts","../src/lib/handlers/ink.handler.ts","../src/lib/handlers/click-detector.ts","../src/lib/handlers/free-text.handler.ts","../src/lib/patching/line-ending-handlers.ts","../src/lib/patching/patch-utils.ts","../src/lib/patching/line-endings.ts","../src/lib/patching/patch-registry.ts","../src/lib/handlers/line.handler.ts","../src/lib/handlers/polyline.handler.ts","../src/lib/handlers/polygon.handler.ts","../src/lib/handlers/square.handler.ts","../src/lib/handlers/stamp.handler.ts","../src/lib/handlers/circle.handler.ts","../src/lib/patching/patches/ink.patch.ts","../src/lib/patching/patches/line.patch.ts","../src/lib/patching/patches/polyline.patch.ts","../src/lib/patching/patches/polygon.patch.ts","../src/lib/annotation-plugin.ts","../src/lib/tools/default-tools.ts","../src/lib/reducer.ts","../src/lib/tools/tools-utils.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { AnnotationPluginConfig } from './types';\n\nexport const ANNOTATION_PLUGIN_ID = 'annotation';\n\nexport const manifest: PluginManifest<AnnotationPluginConfig> = {\n id: ANNOTATION_PLUGIN_ID,\n name: 'Annotation Plugin',\n version: '1.0.0',\n provides: ['annotation'],\n requires: ['interaction-manager', 'selection'],\n optional: ['history'],\n defaultConfig: {\n enabled: true,\n autoCommit: true,\n annotationAuthor: 'Guest',\n deactivateToolAfterCreate: false,\n selectAfterCreate: true,\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationTool } from './tools/types';\n\nexport const SET_ANNOTATIONS = 'ANNOTATION/SET_ANNOTATIONS';\nexport const SELECT_ANNOTATION = 'ANNOTATION/SELECT_ANNOTATION';\nexport const DESELECT_ANNOTATION = 'ANNOTATION/DESELECT_ANNOTATION';\nexport const ADD_COLOR_PRESET = 'ANNOTATION/ADD_COLOR_PRESET';\nexport const CREATE_ANNOTATION = 'ANNOTATION/CREATE_ANNOTATION';\nexport const PATCH_ANNOTATION = 'ANNOTATION/PATCH_ANNOTATION';\nexport const DELETE_ANNOTATION = 'ANNOTATION/DELETE_ANNOTATION';\nexport const COMMIT_PENDING_CHANGES = 'ANNOTATION/COMMIT';\nexport const PURGE_ANNOTATION = 'ANNOTATION/PURGE_ANNOTATION';\nexport const SET_ACTIVE_TOOL_ID = 'ANNOTATION/SET_ACTIVE_TOOL_ID';\nexport const SET_TOOL_DEFAULTS = 'ANNOTATION/SET_TOOL_DEFAULTS';\nexport const ADD_TOOL = 'ANNOTATION/ADD_TOOL';\n\nexport interface SetAnnotationsAction extends Action {\n type: typeof SET_ANNOTATIONS;\n payload: Record<number, PdfAnnotationObject[]>;\n}\nexport interface SelectAnnotationAction extends Action {\n type: typeof SELECT_ANNOTATION;\n payload: { pageIndex: number; id: string };\n}\nexport interface DeselectAnnotationAction extends Action {\n type: typeof DESELECT_ANNOTATION;\n}\nexport interface AddColorPresetAction extends Action {\n type: typeof ADD_COLOR_PRESET;\n payload: string;\n}\nexport interface CreateAnnotationAction extends Action {\n type: typeof CREATE_ANNOTATION;\n payload: { pageIndex: number; annotation: PdfAnnotationObject };\n}\nexport interface PatchAnnotationAction extends Action {\n type: typeof PATCH_ANNOTATION;\n payload: { pageIndex: number; id: string; patch: Partial<PdfAnnotationObject> };\n}\nexport interface DeleteAnnotationAction extends Action {\n type: typeof DELETE_ANNOTATION;\n payload: { pageIndex: number; id: string };\n}\nexport interface CommitAction extends Action {\n type: typeof COMMIT_PENDING_CHANGES;\n}\nexport interface PurgeAnnotationAction extends Action {\n type: typeof PURGE_ANNOTATION;\n payload: { uid: string };\n}\nexport interface SetActiveToolIdAction extends Action {\n type: typeof SET_ACTIVE_TOOL_ID;\n payload: string | null;\n}\nexport interface SetToolDefaultsAction extends Action {\n type: typeof SET_TOOL_DEFAULTS;\n payload: { toolId: string; patch: Partial<any> };\n}\nexport interface AddToolAction extends Action {\n type: typeof ADD_TOOL;\n payload: AnnotationTool;\n}\n\nexport type AnnotationAction =\n | SetAnnotationsAction\n | SelectAnnotationAction\n | DeselectAnnotationAction\n | AddColorPresetAction\n | CreateAnnotationAction\n | PatchAnnotationAction\n | DeleteAnnotationAction\n | CommitAction\n | PurgeAnnotationAction\n | SetActiveToolIdAction\n | SetToolDefaultsAction\n | AddToolAction;\n\nexport const setAnnotations = (p: Record<number, PdfAnnotationObject[]>): SetAnnotationsAction => ({\n type: SET_ANNOTATIONS,\n payload: p,\n});\nexport const selectAnnotation = (pageIndex: number, id: string): SelectAnnotationAction => ({\n type: SELECT_ANNOTATION,\n payload: { pageIndex, id },\n});\nexport const deselectAnnotation = (): DeselectAnnotationAction => ({ type: DESELECT_ANNOTATION });\nexport const addColorPreset = (c: string): AddColorPresetAction => ({\n type: ADD_COLOR_PRESET,\n payload: c,\n});\nexport const createAnnotation = (\n pageIndex: number,\n annotation: PdfAnnotationObject,\n): CreateAnnotationAction => ({ type: CREATE_ANNOTATION, payload: { pageIndex, annotation } });\nexport const patchAnnotation = (\n pageIndex: number,\n id: string,\n patch: Partial<PdfAnnotationObject>,\n): PatchAnnotationAction => ({ type: PATCH_ANNOTATION, payload: { pageIndex, id, patch } });\nexport const deleteAnnotation = (pageIndex: number, id: string): DeleteAnnotationAction => ({\n type: DELETE_ANNOTATION,\n payload: { pageIndex, id },\n});\nexport const commitPendingChanges = (): CommitAction => ({ type: COMMIT_PENDING_CHANGES });\nexport const purgeAnnotation = (uid: string): PurgeAnnotationAction => ({\n type: PURGE_ANNOTATION,\n payload: { uid },\n});\nexport const setActiveToolId = (id: string | null): SetActiveToolIdAction => ({\n type: SET_ACTIVE_TOOL_ID,\n payload: id,\n});\nexport const setToolDefaults = (toolId: string, patch: Partial<any>): SetToolDefaultsAction => ({\n type: SET_TOOL_DEFAULTS,\n payload: { toolId, patch },\n});\nexport const addTool = (tool: AnnotationTool): AddToolAction => ({ type: ADD_TOOL, payload: tool });\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfSquigglyAnnoObject,\n PdfStrikeOutAnnoObject,\n PdfUnderlineAnnoObject,\n PdfHighlightAnnoObject,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from './types';\nimport { AnnotationTool } from './tools/types';\n\n/* ------------------------------------------------------------------ */\n/* 1. Generic “subtype‑to‑object” mapper */\n/* ------------------------------------------------------------------ */\n\nexport type AnnoOf<S extends PdfAnnotationSubtype> = Extract<PdfAnnotationObject, { type: S }>;\n\nexport type TextMarkupSubtype =\n | PdfAnnotationSubtype.HIGHLIGHT\n | PdfAnnotationSubtype.UNDERLINE\n | PdfAnnotationSubtype.STRIKEOUT\n | PdfAnnotationSubtype.SQUIGGLY;\nexport type SidebarSubtype =\n | TextMarkupSubtype\n | PdfAnnotationSubtype.INK\n | PdfAnnotationSubtype.SQUARE\n | PdfAnnotationSubtype.CIRCLE\n | PdfAnnotationSubtype.POLYGON\n | PdfAnnotationSubtype.LINE\n | PdfAnnotationSubtype.POLYLINE\n | PdfAnnotationSubtype.FREETEXT\n | PdfAnnotationSubtype.STAMP;\n\n/* ------------------------------------------------------------------ */\n/* 2. Narrowing type‑guards (add more as needed) */\n/* ------------------------------------------------------------------ */\n\n/** True when `a.object.type === INK` – and narrows the generic. */\nexport function isInk(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.INK>> {\n return a.object.type === PdfAnnotationSubtype.INK;\n}\n\n/** Example for Circle – create similar ones for Square, Line, etc. */\nexport function isCircle(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.CIRCLE>> {\n return a.object.type === PdfAnnotationSubtype.CIRCLE;\n}\n\nexport function isPolygon(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.POLYGON>> {\n return a.object.type === PdfAnnotationSubtype.POLYGON;\n}\n\nexport function isSquare(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.SQUARE>> {\n return a.object.type === PdfAnnotationSubtype.SQUARE;\n}\n\nexport function isLine(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.LINE>> {\n return a.object.type === PdfAnnotationSubtype.LINE;\n}\n\nexport function isPolyline(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.POLYLINE>> {\n return a.object.type === PdfAnnotationSubtype.POLYLINE;\n}\n\nexport function isHighlight(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.HIGHLIGHT>> {\n return a.object.type === PdfAnnotationSubtype.HIGHLIGHT;\n}\n\nexport function isUnderline(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.UNDERLINE>> {\n return a.object.type === PdfAnnotationSubtype.UNDERLINE;\n}\n\nexport function isStrikeout(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.STRIKEOUT>> {\n return a.object.type === PdfAnnotationSubtype.STRIKEOUT;\n}\n\nexport function isSquiggly(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.SQUIGGLY>> {\n return a.object.type === PdfAnnotationSubtype.SQUIGGLY;\n}\n\nexport function isTextMarkup(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<TextMarkupSubtype>> {\n return isHighlight(a) || isUnderline(a) || isStrikeout(a) || isSquiggly(a);\n}\n\nexport function isFreeText(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.FREETEXT>> {\n return a.object.type === PdfAnnotationSubtype.FREETEXT;\n}\n\nexport function isStamp(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.STAMP>> {\n return a.object.type === PdfAnnotationSubtype.STAMP;\n}\n\nexport function isText(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.TEXT>> {\n return a.object.type === PdfAnnotationSubtype.TEXT;\n}\n\nexport function isSidebarAnnotation(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<SidebarSubtype>> {\n return (\n isTextMarkup(a) ||\n isInk(a) ||\n isSquare(a) ||\n isCircle(a) ||\n isPolygon(a) ||\n isLine(a) ||\n isPolyline(a) ||\n isFreeText(a) ||\n isStamp(a)\n );\n}\n","import { AnnotationState, SidebarAnnotationEntry, TrackedAnnotation } from './types';\nimport { PdfTextAnnoObject } from '@embedpdf/models';\nimport { isSidebarAnnotation, isText } from './helpers';\nimport { ToolMap } from './tools/tools-utils';\n\n/* ─────────── public selectors ─────────── */\n\n/** All annotations _objects_ on a single page (order preserved). */\nexport const getAnnotationsByPageIndex = (s: AnnotationState, page: number) =>\n (s.pages[page] ?? []).map((uid) => s.byUid[uid]);\n\n/** Shortcut: every page → list of annotation objects. */\nexport const getAnnotations = (s: AnnotationState) => {\n const out: Record<number, ReturnType<typeof getAnnotationsByPageIndex>> = {};\n for (const p of Object.keys(s.pages).map(Number)) out[p] = getAnnotationsByPageIndex(s, p);\n return out;\n};\n\n/** The full `TrackedAnnotation` for the current selection. */\nexport const getSelectedAnnotation = (s: AnnotationState) =>\n s.selectedUid ? s.byUid[s.selectedUid] : null;\n\nexport const getSelectedAnnotationByPageIndex = (s: AnnotationState, pageIndex: number) => {\n if (!s.selectedUid) return null;\n\n const pageUids = s.pages[pageIndex] ?? [];\n\n // Check if the selected UID is on the requested page\n if (pageUids.includes(s.selectedUid)) {\n return s.byUid[s.selectedUid];\n }\n\n return null;\n};\n\n/** Check if a given anno on a page is the current selection. */\nexport const isAnnotationSelected = (s: AnnotationState, id: string) => s.selectedUid === id;\n\n/**\n * Returns the current defaults for a specific tool by its ID.\n * This is fully type-safe and infers the correct return type.\n *\n * @param state The annotation plugin's state.\n * @param toolId The ID of the tool (e.g., 'highlight', 'pen').\n * @returns The tool's current `defaults` object, or `undefined` if not found.\n */\nexport function getToolDefaultsById<K extends keyof ToolMap>(\n state: AnnotationState,\n toolId: K,\n): ToolMap[K]['defaults'] | undefined {\n // Find the tool in the state's tool array.\n const tool = state.tools.find((t) => t.id === toolId);\n\n // The `as` cast is safe because the generic signature guarantees\n // the return type to the caller.\n return tool?.defaults as ToolMap[K]['defaults'] | undefined;\n}\n\n/**\n * Collect every sidebar-eligible annotation and attach its TEXT replies,\n * grouped by page for efficient rendering.\n *\n * Result shape:\n * {\n * 0: [{ page: 0, annotation: <TrackedAnnotation>, replies: [ … ] }, ...],\n * 1: [{ page: 1, annotation: <TrackedAnnotation>, replies: [ … ] }, ...],\n * …\n * }\n */\nexport const getSidebarAnnotationsWithRepliesGroupedByPage = (\n s: AnnotationState,\n): Record<number, SidebarAnnotationEntry[]> => {\n /* ------------------------------------------------------------\n * 1. Build an index of TEXT replies keyed by their parent ID\n * ------------------------------------------------------------ */\n const repliesByParent: Record<string, TrackedAnnotation<PdfTextAnnoObject>[]> = {};\n\n for (const uidList of Object.values(s.pages)) {\n for (const uid of uidList) {\n const ta = s.byUid[uid];\n if (ta && isText(ta)) {\n const parentId = ta.object.inReplyToId;\n if (parentId) (repliesByParent[parentId] ||= []).push(ta);\n }\n }\n }\n\n /* ------------------------------------------------------------\n * 2. Gather sidebar annotations and group them by page\n * ------------------------------------------------------------ */\n const out: Record<number, SidebarAnnotationEntry[]> = {};\n\n for (const [pageStr, uidList] of Object.entries(s.pages)) {\n const page = Number(pageStr);\n const pageAnnotations: SidebarAnnotationEntry[] = [];\n\n for (const uid of uidList) {\n const ta = s.byUid[uid];\n if (ta && isSidebarAnnotation(ta)) {\n pageAnnotations.push({\n page,\n annotation: ta,\n replies: repliesByParent[ta.object.id] ?? [],\n });\n }\n }\n\n // Only add pages that have annotations\n if (pageAnnotations.length > 0) {\n out[page] = pageAnnotations;\n }\n }\n\n return out;\n};\n\n/**\n * Collect every sidebar-eligible annotation and attach its TEXT replies.\n *\n * Result shape:\n * [\n * { page: 0, annotation: <TrackedAnnotation>, replies: [ … ] },\n * { page: 1, annotation: <TrackedAnnotation>, replies: [ … ] },\n * …\n * ]\n */\nexport const getSidebarAnnotationsWithReplies = (s: AnnotationState): SidebarAnnotationEntry[] => {\n const grouped = getSidebarAnnotationsWithRepliesGroupedByPage(s);\n const out: SidebarAnnotationEntry[] = [];\n\n // Flatten the grouped structure while maintaining page order\n const sortedPages = Object.keys(grouped)\n .map(Number)\n .sort((a, b) => a - b);\n for (const page of sortedPages) {\n out.push(...grouped[page]);\n }\n\n return out;\n};\n","/**\n * A simple, framework-agnostic state management utility for use within handlers.\n * It creates a closure to hold a value that persists across multiple calls\n * to the handler's methods (e.g., onPointerDown, onPointerMove).\n *\n * @param initialValue The initial value to store.\n * @returns A tuple containing:\n * - The current value.\n * - A function to set a new value.\n * - A function to get the current value without causing re-renders (useful inside closures).\n */\nexport function useState<T>(initialValue: T): [() => T, (newValue: T) => void] {\n let value = initialValue;\n const getValue = () => value;\n const setValue = (newValue: T) => {\n value = newValue;\n };\n return [getValue, setValue];\n}\n","import {\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n rectFromPoints,\n expandRect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\n\nexport const inkHandlerFactory: HandlerFactory<PdfInkAnnoObject> = {\n annotationType: PdfAnnotationSubtype.INK,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize } = context;\n const [getStrokes, setStrokes] = useState<Array<{ points: { x: number; y: number }[] }>>([]);\n const [getIsDrawing, setIsDrawing] = useState(false);\n const timerRef = { current: null as any };\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.INK> | null => {\n const strokes = getStrokes();\n if (strokes.length === 0 || strokes[0].points.length === 0) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = strokes.flatMap((s) => s.points);\n const bounds = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n return {\n type: PdfAnnotationSubtype.INK,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n inkList: strokes,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setIsDrawing(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n\n const newStrokes = [...getStrokes(), { points: [clampedPos] }];\n setStrokes(newStrokes);\n onPreview(getPreview());\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!getIsDrawing()) return;\n const strokes = getStrokes();\n if (strokes.length === 0) return;\n\n const clampedPos = clampToPage(pos);\n strokes[strokes.length - 1].points.push(clampedPos);\n setStrokes(strokes);\n onPreview(getPreview());\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n evt.releasePointerCapture?.();\n\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n const strokes = getStrokes();\n if (strokes.length > 0 && strokes[0].points.length > 1) {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const allPoints = strokes.flatMap((s) => s.points);\n const rect = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n onCommit({\n ...defaults,\n inkList: strokes,\n rect,\n type: PdfAnnotationSubtype.INK,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n });\n }\n setStrokes([]);\n onPreview(null);\n }, 800); // Commit after 800ms of inactivity\n },\n onPointerCancel: (_, evt) => {\n setStrokes([]);\n setIsDrawing(false);\n onPreview(null);\n if (timerRef.current) clearTimeout(timerRef.current);\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { useState } from '../utils/use-state';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationTool } from '../tools/types';\n\ninterface ClickDetectorOptions<T extends PdfAnnotationObject> {\n threshold?: number;\n getTool: () => AnnotationTool<T> | undefined;\n onClickDetected: (pos: { x: number; y: number }, tool: AnnotationTool<T>) => void;\n}\n\nexport function useClickDetector<T extends PdfAnnotationObject>({\n threshold = 5,\n getTool,\n onClickDetected,\n}: ClickDetectorOptions<T>) {\n const [getStartPos, setStartPos] = useState<{ x: number; y: number } | null>(null);\n const [getHasMoved, setHasMoved] = useState(false);\n\n return {\n onStart: (pos: { x: number; y: number }) => {\n setStartPos(pos);\n setHasMoved(false);\n },\n\n onMove: (pos: { x: number; y: number }) => {\n const start = getStartPos();\n if (!start || getHasMoved()) return;\n\n const distance = Math.sqrt(Math.pow(pos.x - start.x, 2) + Math.pow(pos.y - start.y, 2));\n\n if (distance > threshold) {\n setHasMoved(true);\n }\n },\n\n onEnd: (pos: { x: number; y: number }) => {\n const start = getStartPos();\n if (start && !getHasMoved()) {\n const tool = getTool();\n if (tool && 'clickBehavior' in tool && tool.clickBehavior?.enabled) {\n onClickDetected(pos, tool);\n }\n }\n setStartPos(null);\n setHasMoved(false);\n },\n\n hasMoved: getHasMoved,\n reset: () => {\n setStartPos(null);\n setHasMoved(false);\n },\n };\n}\n","import {\n PdfAnnotationSubtype,\n PdfFreeTextAnnoObject,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const freeTextHandlerFactory: HandlerFactory<PdfFreeTextAnnoObject> = {\n annotationType: PdfAnnotationSubtype.FREETEXT,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize, pageIndex } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontColor: tool.defaults.fontColor ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n fontSize: tool.defaults.fontSize ?? 12,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n backgroundColor: tool.defaults.backgroundColor ?? 'transparent',\n textAlign: tool.defaults.textAlign ?? PdfTextAlignment.Left,\n verticalAlign: tool.defaults.verticalAlign ?? PdfVerticalAlignment.Top,\n contents: tool.defaults.contents ?? 'Insert text here',\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfFreeTextAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n // TypeScript knows this is FreeTextClickBehavior\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n\n // Center the text box at click position, but keep within bounds\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n\n // Use defaultContent from clickBehavior if available, otherwise use tool defaults\n const contents = clickConfig.defaultContent ?? defaults.contents;\n\n const anno: PdfFreeTextAnnoObject = {\n ...defaults,\n contents,\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.FREETEXT> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const width = Math.abs(start.x - current.x);\n const height = Math.abs(start.y - current.y);\n\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n\n return {\n type: PdfAnnotationSubtype.FREETEXT,\n bounds: rect,\n data: {\n ...defaults,\n rect,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const minX = Math.min(start.x, clampedPos.x);\n const minY = Math.min(start.y, clampedPos.y);\n const width = Math.abs(start.x - clampedPos.x);\n const height = Math.abs(start.y - clampedPos.y);\n\n // Ignore tiny boxes\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n\n const anno: PdfFreeTextAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { PdfAnnotationLineEnding, Position } from '@embedpdf/models';\n\n/**\n * A handler that encapsulates all logic for a specific line ending type,\n * including SVG path generation, geometric vertex calculation, and rotation logic.\n * This is the single source of truth for each ending.\n */\nexport interface LineEndingHandler {\n /** Returns the SVG `d` attribute string for rendering. */\n getSvgPath: (strokeWidth: number) => string;\n /** Returns the vertices used for calculating the geometric bounding box. */\n getLocalPoints: (strokeWidth: number) => Position[];\n /** Returns the final rotation angle in radians based on the line segment's angle. */\n getRotation: (segmentAngle: number) => number;\n /** True if the shape should be filled, false if only stroked. */\n filled: boolean;\n}\n\n/**\n * Factory to create handlers for arrow-like shapes.\n * @param isClosed - If true, creates a closed (filled) arrowhead.\n */\nfunction createArrowHandler(isClosed: boolean): LineEndingHandler {\n const calculateGeometry = (sw: number) => {\n const len = sw * 9;\n const a = Math.PI / 6; // 30 degrees\n return {\n x: -len * Math.cos(a),\n y: len * Math.sin(a),\n };\n };\n\n return {\n getSvgPath: (sw) => {\n const { x, y } = calculateGeometry(sw);\n return isClosed ? `M 0 0 L ${x} ${y} L ${x} ${-y} Z` : `M ${x} ${y} L 0 0 L ${x} ${-y}`;\n },\n getLocalPoints: (sw) => {\n const { x, y } = calculateGeometry(sw);\n return [\n { x: 0, y: 0 },\n { x, y },\n { x, y: -y },\n ];\n },\n getRotation: (segmentAngle) => segmentAngle,\n filled: isClosed,\n };\n}\n\n/**\n * Factory to create handlers for simple line-based shapes like Butt and Slash.\n * @param lengthFactor - Multiplier for strokeWidth to determine length.\n * @param rotationFn - Function to determine rotation from segment angle.\n */\nfunction createLineHandler(\n lengthFactor: number,\n rotationFn: (angle: number) => number,\n): LineEndingHandler {\n const getHalfLength = (sw: number) => (sw * lengthFactor) / 2;\n\n return {\n getSvgPath: (sw) => {\n const l = getHalfLength(sw);\n return `M ${-l} 0 L ${l} 0`;\n },\n getLocalPoints: (sw) => {\n const l = getHalfLength(sw);\n return [\n { x: -l, y: 0 },\n { x: l, y: 0 },\n ];\n },\n getRotation: rotationFn,\n filled: false,\n };\n}\n\nconst OpenArrowHandler = createArrowHandler(false);\nconst ClosedArrowHandler = createArrowHandler(true);\n\n/**\n * A map containing the authoritative handler for each line ending type.\n */\nexport const LINE_ENDING_HANDLERS: Partial<Record<PdfAnnotationLineEnding, LineEndingHandler>> = {\n [PdfAnnotationLineEnding.OpenArrow]: OpenArrowHandler,\n [PdfAnnotationLineEnding.ClosedArrow]: ClosedArrowHandler,\n [PdfAnnotationLineEnding.ROpenArrow]: {\n ...OpenArrowHandler,\n getRotation: (segmentAngle) => segmentAngle + Math.PI,\n },\n [PdfAnnotationLineEnding.RClosedArrow]: {\n ...ClosedArrowHandler,\n getRotation: (segmentAngle) => segmentAngle + Math.PI,\n },\n [PdfAnnotationLineEnding.Circle]: {\n getSvgPath: (sw) => {\n const r = (sw * 5) / 2;\n return `M ${r} 0 A ${r} ${r} 0 1 1 ${-r} 0 A ${r} ${r} 0 1 1 ${r} 0`;\n },\n getLocalPoints: (sw) => {\n const r = (sw * 5) / 2;\n return [\n { x: -r, y: -r },\n { x: r, y: r },\n ];\n },\n getRotation: () => 0,\n filled: true,\n },\n [PdfAnnotationLineEnding.Square]: {\n getSvgPath: (sw) => {\n const h = (sw * 6) / 2;\n return `M ${-h} ${-h} L ${h} ${-h} L ${h} ${h} L ${-h} ${h} Z`;\n },\n getLocalPoints: (sw) => {\n const h = (sw * 6) / 2;\n return [\n { x: -h, y: -h }, // TL\n { x: h, y: -h }, // TR\n { x: h, y: h }, // BR\n { x: -h, y: h }, // BL\n ];\n },\n getRotation: (segmentAngle) => segmentAngle, // keep your new orientation\n filled: true,\n },\n [PdfAnnotationLineEnding.Diamond]: {\n getSvgPath: (sw) => {\n const h = (sw * 6) / 2;\n return `M 0 ${-h} L ${h} 0 L 0 ${h} L ${-h} 0 Z`;\n },\n getLocalPoints: (sw) => {\n const h = (sw * 6) / 2;\n return [\n { x: 0, y: -h },\n { x: h, y: 0 },\n { x: 0, y: h },\n { x: -h, y: 0 },\n ];\n },\n getRotation: (segmentAngle) => segmentAngle,\n filled: true,\n },\n [PdfAnnotationLineEnding.Butt]: createLineHandler(6, (angle) => angle + Math.PI / 2),\n [PdfAnnotationLineEnding.Slash]: createLineHandler(18, (angle) => angle + Math.PI / 1.5),\n};\n","import {\n Rect,\n Position,\n LineEndings,\n PdfAnnotationLineEnding,\n rotateAndTranslatePoint,\n rectFromPoints,\n expandRect,\n} from '@embedpdf/models';\nimport { LINE_ENDING_HANDLERS } from './line-ending-handlers';\n\nconst EXTRA_PADDING = 1.2;\n\n/**\n * Computes the exact bounding box for a line or polyline, including its endings and stroke width.\n * This function uses the central `LINE_ENDING_HANDLERS` to ensure calculations are\n * perfectly in sync with the rendering logic.\n */\nexport function lineRectWithEndings(\n vertices: Position[],\n strokeWidth: number,\n endings: LineEndings | undefined,\n): Rect {\n if (!vertices || vertices.length === 0) {\n return { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } };\n }\n\n const allPoints: Position[] = [...vertices];\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const processEnding = (\n endingType: PdfAnnotationLineEnding | undefined,\n tipPos: Position,\n segmentAngle: number,\n ) => {\n if (!endingType) return;\n\n const handler = LINE_ENDING_HANDLERS[endingType];\n if (!handler) return;\n\n const localPts = handler.getLocalPoints(strokeWidth);\n const rotationAngle = handler.getRotation(segmentAngle);\n\n const transformedPts = localPts.map((p) => rotateAndTranslatePoint(p, rotationAngle, tipPos));\n allPoints.push(...transformedPts);\n };\n\n if (vertices.length >= 2) {\n // Process start ending. Angle points from the second vertex INTO the first.\n const startAngle = toAngle(vertices[1], vertices[0]);\n processEnding(endings?.start, vertices[0], startAngle);\n\n // Process end ending. Angle points from the second-to-last vertex INTO the last.\n const lastIdx = vertices.length - 1;\n const endAngle = toAngle(vertices[lastIdx - 1], vertices[lastIdx]);\n processEnding(endings?.end, vertices[lastIdx], endAngle);\n }\n\n if (allPoints.length <= 1) {\n const point = vertices[0] || { x: 0, y: 0 };\n const pad = strokeWidth;\n return {\n origin: { x: point.x - pad, y: point.y - pad },\n size: { width: pad * 2, height: pad * 2 },\n };\n }\n\n const baseRect = rectFromPoints(allPoints);\n const pad = strokeWidth / 2 + EXTRA_PADDING * strokeWidth;\n return expandRect(baseRect, pad);\n}\n","import { PdfAnnotationLineEnding } from '@embedpdf/models';\nimport { LINE_ENDING_HANDLERS } from './line-ending-handlers';\n\nexport interface SvgEnding {\n d: string;\n transform: string;\n filled: boolean;\n}\n\n/**\n * Factory that returns SVG path data and transform attributes for a given line ending.\n * It uses a central handler for each ending type to ensure consistency.\n */\nexport function createEnding(\n ending: PdfAnnotationLineEnding | undefined,\n strokeWidth: number,\n rad: number, // direction angle in radians of the line segment\n px: number, // x-coordinate of the line's endpoint\n py: number, // y-coordinate of the line's endpoint\n): SvgEnding | null {\n if (!ending) return null;\n\n const handler = LINE_ENDING_HANDLERS[ending];\n if (!handler) return null;\n\n const toDeg = (r: number) => (r * 180) / Math.PI;\n const rotationAngle = handler.getRotation(rad);\n\n return {\n d: handler.getSvgPath(strokeWidth),\n transform: `translate(${px} ${py}) rotate(${toDeg(rotationAngle)})`,\n filled: handler.filled,\n };\n}\n","// packages/plugin-annotation/src/lib/patching/patch-registry.ts\n\nimport { PdfAnnotationObject, PdfAnnotationSubtype } from '@embedpdf/models';\n\nexport interface TransformContext<T extends PdfAnnotationObject = PdfAnnotationObject> {\n /** The type of transformation being applied */\n type: 'move' | 'resize' | 'vertex-edit' | 'property-update';\n\n /** The changes being applied - can be any properties of the annotation */\n changes: Partial<T>;\n\n /** Optional metadata about the transformation */\n metadata?: {\n maintainAspectRatio?: boolean;\n [key: string]: any;\n };\n}\n\nexport type PatchFunction<T extends PdfAnnotationObject> = (\n original: T,\n context: TransformContext<T>,\n) => Partial<T>;\n\n/**\n * Registry for annotation-specific patch functions.\n * Each patch function knows how to transform its annotation type.\n */\nexport class PatchRegistry {\n private patches = new Map<PdfAnnotationSubtype, PatchFunction<any>>();\n\n register<T extends PdfAnnotationObject>(type: PdfAnnotationSubtype, patchFn: PatchFunction<T>) {\n this.patches.set(type, patchFn);\n }\n\n /**\n * Transform an annotation based on the context.\n * Returns the transformed properties or just the changes if no patch function exists.\n */\n transform<T extends PdfAnnotationObject>(\n annotation: T,\n context: TransformContext<T>,\n ): Partial<T> {\n const patchFn = this.patches.get(annotation.type);\n\n // If there's a specific patch function, use it\n if (patchFn) {\n return patchFn(annotation, context);\n }\n\n // Default behavior: just return the changes for simple annotations\n return context.changes;\n }\n}\n\nexport const patchRegistry = new PatchRegistry();\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfLineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport * as patching from '../patching';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const lineHandlerFactory: HandlerFactory<PdfLineAnnoObject> = {\n annotationType: PdfAnnotationSubtype.LINE,\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n lineEndings: tool.defaults.lineEndings ?? {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.None,\n },\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfLineAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const angle = clickConfig.defaultAngle ?? 0;\n const length = clickConfig.defaultLength;\n const halfLength = length / 2;\n\n // Calculate start and end points centered at click position\n const startX = pos.x - halfLength * Math.cos(angle);\n const startY = pos.y - halfLength * Math.sin(angle);\n const endX = pos.x + halfLength * Math.cos(angle);\n const endY = pos.y + halfLength * Math.sin(angle);\n\n // Clamp both points to page bounds\n const start = clampToPage({ x: startX, y: startY });\n const end = clampToPage({ x: endX, y: endY });\n\n // If clamping significantly altered the line, we might want to maintain the angle\n // by adjusting the opposite point, but for simplicity we'll just use the clamped points\n\n const rect = patching.lineRectWithEndings(\n [start, end],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n onCommit({\n ...defaults,\n rect,\n linePoints: { start, end },\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n type: PdfAnnotationSubtype.LINE,\n });\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.LINE> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const bounds = patching.lineRectWithEndings(\n [start, current],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n return {\n type: PdfAnnotationSubtype.LINE,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n linePoints: { start, end: current },\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n // Only create if line is long enough\n if (Math.abs(clampedPos.x - start.x) > 2 || Math.abs(clampedPos.y - start.y) > 2) {\n const rect = patching.lineRectWithEndings(\n [start, clampedPos],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n onCommit({\n ...defaults,\n rect,\n linePoints: { start, end: clampedPos },\n pageIndex,\n id: uuidV4(),\n flags: ['print'],\n created: new Date(),\n type: PdfAnnotationSubtype.LINE,\n });\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { clamp } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfPolylineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport * as patching from '../patching';\n\nexport const polylineHandlerFactory: HandlerFactory<PdfPolylineAnnoObject> = {\n annotationType: PdfAnnotationSubtype.POLYLINE,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize } = context;\n\n const [getVertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [getCurrent, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n lineEndings: tool.defaults.lineEndings ?? {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.None,\n },\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const commitPolyline = () => {\n const vertices = getVertices();\n if (vertices.length < 2) return; // A polyline needs at least two points.\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const rect = patching.lineRectWithEndings(\n vertices,\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n const anno: PdfPolylineAnnoObject = {\n ...defaults,\n vertices,\n rect,\n type: PdfAnnotationSubtype.POLYLINE,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.POLYLINE> | null => {\n const vertices = getVertices();\n const currentPos = getCurrent();\n if (vertices.length === 0 || !currentPos) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = [...vertices, currentPos];\n const bounds = patching.lineRectWithEndings(\n allPoints,\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n return {\n type: PdfAnnotationSubtype.POLYLINE,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n vertices: allPoints,\n currentVertex: currentPos,\n },\n };\n };\n\n return {\n onClick: (pos) => {\n const clampedPos = clampToPage(pos);\n const vertices = getVertices();\n const lastVertex = vertices[vertices.length - 1];\n\n // Don't add duplicate points (prevents double-click issue)\n if (\n lastVertex &&\n Math.abs(lastVertex.x - clampedPos.x) < 1 &&\n Math.abs(lastVertex.y - clampedPos.y) < 1\n ) {\n return;\n }\n\n setVertices([...vertices, clampedPos]);\n setCurrent(clampedPos);\n onPreview(getPreview());\n },\n onDoubleClick: () => {\n commitPolyline();\n },\n onPointerMove: (pos) => {\n if (getVertices().length > 0) {\n const clampedPos = clampToPage(pos);\n setCurrent(clampedPos);\n onPreview(getPreview());\n }\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfPolygonAnnoObject,\n rectFromPoints,\n expandRect,\n uuidV4,\n PdfAnnotationBorderStyle,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\n\nconst HANDLE_SIZE_PX = 14;\n\nexport const polygonHandlerFactory: HandlerFactory<PdfPolygonAnnoObject> = {\n annotationType: PdfAnnotationSubtype.POLYGON,\n create(context) {\n const { onCommit, onPreview, getTool, scale, pageSize } = context;\n\n const [getVertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [getCurrent, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const isInsideStartHandle = (pos: { x: number; y: number }) => {\n const vertices = getVertices();\n if (vertices.length < 2) return false;\n const sizePDF = HANDLE_SIZE_PX / scale;\n const half = sizePDF / 2;\n const v0 = vertices[0];\n return (\n pos.x >= v0.x - half && pos.x <= v0.x + half && pos.y >= v0.y - half && pos.y <= v0.y + half\n );\n };\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const commitPolygon = () => {\n const vertices = getVertices();\n if (vertices.length < 3) return;\n const defaults = getDefaults();\n if (!defaults) return;\n\n const rect = expandRect(rectFromPoints(vertices), defaults.strokeWidth / 2);\n const anno: PdfPolygonAnnoObject = {\n ...defaults,\n vertices,\n rect,\n type: PdfAnnotationSubtype.POLYGON,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.POLYGON> | null => {\n const vertices = getVertices();\n const currentPos = getCurrent();\n if (vertices.length === 0 || !currentPos) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = [...vertices, currentPos];\n const bounds = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n return {\n type: PdfAnnotationSubtype.POLYGON,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n vertices: vertices,\n currentVertex: currentPos,\n },\n };\n };\n\n return {\n onClick: (pos) => {\n const clampedPos = clampToPage(pos);\n\n if (isInsideStartHandle(clampedPos) && getVertices().length >= 3) {\n commitPolygon();\n return;\n }\n\n const vertices = getVertices();\n const lastVertex = vertices[vertices.length - 1];\n\n // Don't add duplicate points (prevents double-click issue)\n if (\n lastVertex &&\n Math.abs(lastVertex.x - clampedPos.x) < 1 &&\n Math.abs(lastVertex.y - clampedPos.y) < 1\n ) {\n return;\n }\n\n setVertices([...vertices, clampedPos]);\n setCurrent(clampedPos);\n onPreview(getPreview());\n },\n onDoubleClick: (_) => {\n commitPolygon();\n },\n onPointerMove: (pos) => {\n if (getVertices().length > 0) {\n const clampedPos = clampToPage(pos);\n setCurrent(clampedPos);\n onPreview(getPreview());\n }\n },\n onPointerCancel: (_) => {\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n },\n };\n },\n};\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfSquareAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const squareHandlerFactory: HandlerFactory<PdfSquareAnnoObject> = {\n annotationType: PdfAnnotationSubtype.SQUARE,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n flags: tool.defaults.flags ?? ['print'],\n strokeWidth: tool.defaults.strokeWidth ?? 2,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n };\n };\n\n const clickDetector = useClickDetector<PdfSquareAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n\n // Center at click position, but keep within bounds\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: x - halfStroke, y: y - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n const anno: PdfSquareAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.SQUARE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect,\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.SQUARE> | null => {\n const p1 = getStart();\n if (!p1) return null;\n\n const minX = Math.min(p1.x, current.x);\n const minY = Math.min(p1.y, current.y);\n const width = Math.abs(p1.x - current.x);\n const height = Math.abs(p1.y - current.y);\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n return {\n type: PdfAnnotationSubtype.SQUARE,\n bounds: rect,\n data: {\n rect,\n ...defaults,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const p1 = getStart();\n if (!p1) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const preview = getPreview(clampedPos);\n if (preview) {\n const anno: PdfSquareAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.SQUARE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect: preview.data.rect,\n };\n onCommit(anno);\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationIcon,\n PdfAnnotationSubtype,\n PdfStampAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory } from './types';\nimport { clamp } from '@embedpdf/core';\n\nexport const stampHandlerFactory: HandlerFactory<PdfStampAnnoObject> = {\n annotationType: PdfAnnotationSubtype.STAMP,\n create(context) {\n const { services, onCommit, getTool, pageSize } = context;\n\n return {\n onPointerDown: (pos) => {\n const tool = getTool();\n if (!tool) return;\n\n const { imageSrc, imageSize } = tool.defaults;\n\n const placeStamp = (imageData: ImageData, width: number, height: number) => {\n // Center the stamp at the click position, then clamp origin to stay fully on-page.\n const originX = pos.x - width / 2;\n const originY = pos.y - height / 2;\n const finalX = clamp(originX, 0, pageSize.width - width);\n const finalY = clamp(originY, 0, pageSize.height - height);\n\n const rect: Rect = {\n origin: { x: finalX, y: finalY },\n size: { width, height },\n };\n\n const anno: PdfStampAnnoObject = {\n ...tool.defaults,\n rect,\n type: PdfAnnotationSubtype.STAMP,\n icon: tool.defaults.icon ?? PdfAnnotationIcon.Draft,\n subject: tool.defaults.subject ?? 'Stamp',\n flags: tool.defaults.flags ?? ['print'],\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n onCommit(anno, { imageData });\n };\n\n if (imageSrc) {\n // Pre-defined stamp: process it with page dimensions as constraints\n services.processImage({\n source: imageSrc,\n maxWidth: pageSize.width,\n maxHeight: pageSize.height,\n onComplete: (result) =>\n placeStamp(\n result.imageData,\n imageSize?.width ?? result.width,\n imageSize?.height ?? result.height,\n ),\n });\n } else {\n // Dynamic stamp: let user select a file\n services.requestFile({\n accept: 'image/png,image/jpeg',\n onFile: (file) => {\n // Process the selected file with page dimensions as constraints\n services.processImage({\n source: file,\n maxWidth: pageSize.width,\n maxHeight: pageSize.height,\n onComplete: (result) => placeStamp(result.imageData, result.width, result.height),\n });\n },\n });\n }\n },\n };\n },\n};\n","import { clamp } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfCircleAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { useClickDetector } from './click-detector';\n\nexport const circleHandlerFactory: HandlerFactory<PdfCircleAnnoObject> = {\n annotationType: PdfAnnotationSubtype.CIRCLE,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 2,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfCircleAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n\n // Center at click position, but keep within bounds\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: x - halfStroke, y: y - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n const anno: PdfCircleAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.CIRCLE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect,\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.CIRCLE> | null => {\n const p1 = getStart();\n if (!p1) return null;\n\n const minX = Math.min(p1.x, current.x);\n const minY = Math.min(p1.y, current.y);\n const width = Math.abs(p1.x - current.x);\n const height = Math.abs(p1.y - current.y);\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n return {\n type: PdfAnnotationSubtype.CIRCLE,\n bounds: rect,\n data: {\n rect,\n ...defaults,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const p1 = getStart();\n if (!p1) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const preview = getPreview(clampedPos);\n if (preview) {\n const anno: PdfCircleAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.CIRCLE,\n flags: ['print'],\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect: preview.data.rect,\n };\n onCommit(anno);\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { expandRect, PdfInkAnnoObject, Rect, rectFromPoints } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\n\nexport const patchInk: PatchFunction<PdfInkAnnoObject> = (original, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // For ink annotations, vertex editing doesn't make much sense\n // Just return the changes as-is\n return ctx.changes;\n\n case 'move':\n // Simple move: just update rect and adjust ink points accordingly\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - original.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - original.rect.origin.y;\n\n const movedInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: p.x + dx,\n y: p.y + dy,\n })),\n }));\n\n return {\n rect: ctx.changes.rect,\n inkList: movedInkList,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = original.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Keep stroke inside rect: map inner-old -> inner-new\n const inset = (r: Rect, pad: number): Rect => ({\n origin: { x: r.origin.x + pad, y: r.origin.y + pad },\n size: {\n width: Math.max(1, r.size.width - pad * 2),\n height: Math.max(1, r.size.height - pad * 2),\n },\n });\n\n // Scale stroke by the limiting axis to avoid overflow\n const strokeScale = Math.min(\n ctx.changes.rect!.size.width / oldRect.size.width,\n ctx.changes.rect!.size.height / oldRect.size.height,\n );\n const newStrokeWidth = Math.max(1, Math.round(original.strokeWidth * strokeScale));\n\n const innerOld = inset(oldRect, original.strokeWidth / 2);\n const innerNew = inset(ctx.changes.rect!, newStrokeWidth / 2);\n\n const sx = innerNew.size.width / Math.max(innerOld.size.width, 1e-6);\n const sy = innerNew.size.height / Math.max(innerOld.size.height, 1e-6);\n\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: innerNew.origin.x + (p.x - innerOld.origin.x) * sx,\n y: innerNew.origin.y + (p.y - innerOld.origin.y) * sy,\n })),\n }));\n\n return {\n rect: ctx.changes.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth changes)\n if (ctx.changes.strokeWidth !== undefined) {\n const merged = { ...original, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const pts = merged.inkList.flatMap((s) => s.points);\n const rect = expandRect(rectFromPoints(pts), merged.strokeWidth / 2);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { PdfLineAnnoObject } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\nimport { lineRectWithEndings } from '../patch-utils';\n\nexport const patchLine: PatchFunction<PdfLineAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Line vertex editing: update line points and recalculate rect\n if (ctx.changes.linePoints) {\n const { start, end } = ctx.changes.linePoints;\n const rect = lineRectWithEndings([start, end], orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start, end },\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate line points\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n\n return {\n rect: ctx.changes.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale line points relative to old rect and apply to new rect\n const newLinePoints = {\n start: {\n x: ctx.changes.rect!.origin.x + (orig.linePoints.start.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (orig.linePoints.start.y - oldRect.origin.y) * scaleY,\n },\n end: {\n x: ctx.changes.rect!.origin.x + (orig.linePoints.end.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (orig.linePoints.end.y - oldRect.origin.y) * scaleY,\n },\n };\n\n return {\n rect: ctx.changes.rect,\n linePoints: newLinePoints,\n };\n }\n return ctx.changes;\n\n case 'property-update':\n // For property updates that might affect the rect\n if (ctx.changes.strokeWidth || ctx.changes.lineEndings) {\n const merged = { ...orig, ...ctx.changes };\n const rect = lineRectWithEndings(\n [merged.linePoints.start, merged.linePoints.end],\n merged.strokeWidth,\n merged.lineEndings,\n );\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { PdfPolylineAnnoObject } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\nimport { lineRectWithEndings } from '../patch-utils';\n\nexport const patchPolyline: PatchFunction<PdfPolylineAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Polyline vertex editing: update vertices and recalculate rect\n if (ctx.changes.vertices && ctx.changes.vertices.length) {\n return {\n rect: lineRectWithEndings(ctx.changes.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.changes.vertices,\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate all vertices\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n\n return {\n rect: ctx.changes.rect,\n vertices: moved,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale vertices relative to old rect and apply to new rect\n const scaledVertices = orig.vertices.map((vertex) => ({\n x: ctx.changes.rect!.origin.x + (vertex.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (vertex.y - oldRect.origin.y) * scaleY,\n }));\n\n return {\n rect: ctx.changes.rect,\n vertices: scaledVertices,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth or lineEndings changes)\n if (ctx.changes.strokeWidth !== undefined || ctx.changes.lineEndings !== undefined) {\n const merged = { ...orig, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const rect = lineRectWithEndings(merged.vertices, merged.strokeWidth, merged.lineEndings);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { expandRect, PdfPolygonAnnoObject, rectFromPoints } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\n\nexport const patchPolygon: PatchFunction<PdfPolygonAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Polygon vertex editing: update vertices and recalculate rect\n if (ctx.changes.vertices && ctx.changes.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.changes.vertices), pad),\n vertices: ctx.changes.vertices,\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate all vertices\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n\n return {\n rect: ctx.changes.rect,\n vertices: moved,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale vertices relative to old rect and apply to new rect\n const scaledVertices = orig.vertices.map((vertex) => ({\n x: ctx.changes.rect!.origin.x + (vertex.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (vertex.y - oldRect.origin.y) * scaleY,\n }));\n\n return {\n rect: ctx.changes.rect,\n vertices: scaledVertices,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth changes)\n if (ctx.changes.strokeWidth !== undefined) {\n const merged = { ...orig, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const pad = merged.strokeWidth / 2;\n const rect = expandRect(rectFromPoints(merged.vertices), pad);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, PluginRegistry, SET_DOCUMENT } from '@embedpdf/core';\nimport {\n ignore,\n PdfAnnotationObject,\n PdfDocumentObject,\n PdfErrorReason,\n Task,\n PdfTaskHelper,\n PdfErrorCode,\n AnnotationCreateContext,\n uuidV4,\n PdfAnnotationSubtype,\n} from '@embedpdf/models';\nimport {\n AnnotationCapability,\n AnnotationEvent,\n AnnotationPluginConfig,\n AnnotationState,\n GetPageAnnotationsOptions,\n ImportAnnotationItem,\n RenderAnnotationOptions,\n TrackedAnnotation,\n TransformOptions,\n} from './types';\nimport {\n setAnnotations,\n selectAnnotation,\n deselectAnnotation,\n AnnotationAction,\n addColorPreset,\n createAnnotation,\n patchAnnotation,\n deleteAnnotation,\n commitPendingChanges,\n purgeAnnotation,\n setToolDefaults,\n setActiveToolId,\n addTool,\n} from './actions';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { SelectionPlugin, SelectionCapability } from '@embedpdf/plugin-selection';\nimport { HistoryPlugin, HistoryCapability, Command } from '@embedpdf/plugin-history';\nimport { getSelectedAnnotation } from './selectors';\nimport { AnnotationTool } from './tools/types';\nimport { AnyPreviewState, HandlerContext, HandlerFactory, HandlerServices } from './handlers/types';\nimport {\n circleHandlerFactory,\n squareHandlerFactory,\n stampHandlerFactory,\n polygonHandlerFactory,\n polylineHandlerFactory,\n lineHandlerFactory,\n inkHandlerFactory,\n freeTextHandlerFactory,\n} from './handlers';\nimport { PatchRegistry, TransformContext } from './patching/patch-registry';\nimport { patchInk, patchLine, patchPolyline, patchPolygon } from './patching/patches';\n\nexport class AnnotationPlugin extends BasePlugin<\n AnnotationPluginConfig,\n AnnotationCapability,\n AnnotationState,\n AnnotationAction\n> {\n static readonly id = 'annotation' as const;\n private readonly ANNOTATION_HISTORY_TOPIC = 'annotations';\n\n public readonly config: AnnotationPluginConfig;\n private readonly state$ = createBehaviorEmitter<AnnotationState>();\n private readonly interactionManager: InteractionManagerCapability | null;\n private readonly selection: SelectionCapability | null;\n private readonly history: HistoryCapability | null;\n\n private pendingContexts = new Map<string, unknown>();\n private handlerFactories = new Map<PdfAnnotationSubtype, HandlerFactory<any>>();\n private readonly activeTool$ = createBehaviorEmitter<AnnotationTool | null>(null);\n private readonly events$ = createBehaviorEmitter<AnnotationEvent>();\n private readonly patchRegistry = new PatchRegistry();\n\n private isInitialLoadComplete = false;\n private importQueue: ImportAnnotationItem<PdfAnnotationObject>[] = [];\n\n constructor(id: string, registry: PluginRegistry, config: AnnotationPluginConfig) {\n super(id, registry);\n this.config = config;\n\n this.selection = registry.getPlugin<SelectionPlugin>('selection')?.provides() ?? null;\n this.history = registry.getPlugin<HistoryPlugin>('history')?.provides() ?? null;\n this.interactionManager =\n registry.getPlugin<InteractionManagerPlugin>('interaction-manager')?.provides() ?? null;\n\n this.coreStore.onAction(SET_DOCUMENT, (_, state) => {\n const doc = state.core.document;\n this.isInitialLoadComplete = false;\n if (doc) this.getAllAnnotations(doc);\n });\n\n this.registerHandlerFactories();\n this.registerBuiltInPatches();\n }\n\n private registerHandlerFactories() {\n this.handlerFactories.set(PdfAnnotationSubtype.CIRCLE, circleHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.SQUARE, squareHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.STAMP, stampHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.POLYGON, polygonHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.POLYLINE, polylineHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.LINE, lineHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.INK, inkHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.FREETEXT, freeTextHandlerFactory);\n }\n\n private registerBuiltInPatches() {\n this.patchRegistry.register(PdfAnnotationSubtype.INK, patchInk);\n this.patchRegistry.register(PdfAnnotationSubtype.LINE, patchLine);\n this.patchRegistry.register(PdfAnnotationSubtype.POLYLINE, patchPolyline);\n this.patchRegistry.register(PdfAnnotationSubtype.POLYGON, patchPolygon);\n }\n\n async initialize(): Promise<void> {\n // Register interaction modes for all tools defined in the initial state\n this.state.tools.forEach((tool) => this.registerInteractionForTool(tool));\n\n this.history?.onHistoryChange((topic) => {\n if (topic === this.ANNOTATION_HISTORY_TOPIC && this.config.autoCommit !== false) {\n this.commit();\n }\n });\n\n this.interactionManager?.onModeChange((s) => {\n const newToolId =\n this.state.tools.find((t) => (t.interaction.mode ?? t.id) === s.activeMode)?.id ?? null;\n if (newToolId !== this.state.activeToolId) {\n this.dispatch(setActiveToolId(newToolId));\n }\n });\n\n this.selection?.onEndSelection(() => {\n const activeTool = this.getActiveTool();\n if (!activeTool || !activeTool.interaction.textSelection) return;\n\n const formattedSelection = this.selection?.getFormattedSelection();\n const selectionText = this.selection?.getSelectedText();\n\n if (!formattedSelection || !selectionText) return;\n\n for (const selection of formattedSelection) {\n selectionText.wait((text) => {\n const annotationId = uuidV4();\n // Create an annotation using the defaults from the active text tool\n this.createAnnotation(selection.pageIndex, {\n ...activeTool.defaults,\n rect: selection.rect,\n segmentRects: selection.segmentRects,\n pageIndex: selection.pageIndex,\n created: new Date(),\n id: annotationId,\n custom: {\n text: text.join('\\n'),\n },\n } as PdfAnnotationObject);\n\n if (this.getToolBehavior(activeTool, 'deactivateToolAfterCreate')) {\n this.setActiveTool(null);\n }\n if (this.getToolBehavior(activeTool, 'selectAfterCreate')) {\n this.selectAnnotation(selection.pageIndex, annotationId);\n }\n }, ignore);\n }\n\n this.selection?.clear();\n });\n }\n\n private registerInteractionForTool(tool: AnnotationTool) {\n this.interactionManager?.registerMode({\n id: tool.interaction.mode ?? tool.id,\n scope: 'page',\n exclusive: tool.interaction.exclusive,\n cursor: tool.interaction.cursor,\n });\n if (tool.interaction.textSelection) {\n this.selection?.enableForMode(tool.interaction.mode ?? tool.id);\n }\n }\n\n protected buildCapability(): AnnotationCapability {\n return {\n getPageAnnotations: (options) => this.getPageAnnotations(options),\n getSelectedAnnotation: () => getSelectedAnnotation(this.state),\n selectAnnotation: (pageIndex, id) => this.selectAnnotation(pageIndex, id),\n deselectAnnotation: () => this.dispatch(deselectAnnotation()),\n getActiveTool: () => this.getActiveTool(),\n setActiveTool: (toolId) => this.setActiveTool(toolId),\n getTools: () => this.state.tools,\n getTool: (toolId) => this.getTool(toolId),\n addTool: (tool) => {\n this.dispatch(addTool(tool));\n this.registerInteractionForTool(tool);\n },\n transformAnnotation: (annotation, options) => this.transformAnnotation(annotation, options),\n registerPatchFunction: (type, patchFn) => this.registerPatchFunction(type, patchFn),\n findToolForAnnotation: (anno) => this.findToolForAnnotation(anno),\n setToolDefaults: (toolId, patch) => this.dispatch(setToolDefaults(toolId, patch)),\n getColorPresets: () => [...this.state.colorPresets],\n addColorPreset: (color) => this.dispatch(addColorPreset(color)),\n importAnnotations: (items) => this.importAnnotations(items),\n createAnnotation: (pageIndex, anno, ctx) => this.createAnnotation(pageIndex, anno, ctx),\n updateAnnotation: (pageIndex, id, patch) => this.updateAnnotation(pageIndex, id, patch),\n deleteAnnotation: (pageIndex, id) => this.deleteAnnotation(pageIndex, id),\n renderAnnotation: (options) => this.renderAnnotation(options),\n onStateChange: this.state$.on,\n onActiveToolChange: this.activeTool$.on,\n onAnnotationEvent: this.events$.on,\n commit: () => this.commit(),\n };\n }\n\n override onStoreUpdated(prev: AnnotationState, next: AnnotationState): void {\n this.state$.emit(next);\n\n // If the active tool ID changes, or the tools array itself changes, emit the new active tool\n if (prev.activeToolId !== next.activeToolId || prev.tools !== next.tools) {\n this.activeTool$.emit(this.getActiveTool());\n }\n }\n\n private registerPatchFunction<T extends PdfAnnotationObject>(\n type: PdfAnnotationSubtype,\n patchFn: (original: T, context: TransformContext<T>) => Partial<T>,\n ) {\n this.patchRegistry.register(type, patchFn);\n }\n\n private transformAnnotation<T extends PdfAnnotationObject>(\n annotation: T,\n options: TransformOptions<T>,\n ) {\n const context: TransformContext<T> = {\n type: options.type,\n changes: options.changes,\n metadata: options.metadata,\n };\n\n return this.patchRegistry.transform(annotation, context);\n }\n\n public registerPageHandlers(\n pageIndex: number,\n scale: number,\n callbacks: {\n services: HandlerServices;\n onPreview: (toolId: string, state: AnyPreviewState | null) => void;\n },\n ) {\n const page = this.coreState.core.document?.pages[pageIndex];\n if (!page) return () => {};\n if (!this.interactionManager) return () => {};\n\n const unregisterFns: (() => void)[] = [];\n\n for (const tool of this.state.tools) {\n if (!tool.defaults.type) continue;\n const factory = this.handlerFactories.get(tool.defaults.type);\n if (!factory) continue;\n\n const context: HandlerContext<PdfAnnotationObject> = {\n pageIndex,\n pageSize: page.size,\n scale,\n services: callbacks.services, // Pass through services\n onPreview: (state) => callbacks.onPreview(tool.id, state),\n onCommit: (annotation, ctx) => {\n this.createAnnotation(pageIndex, annotation, ctx);\n if (this.getToolBehavior(tool, 'deactivateToolAfterCreate')) {\n this.setActiveTool(null);\n }\n if (this.getToolBehavior(tool, 'selectAfterCreate')) {\n this.selectAnnotation(pageIndex, annotation.id);\n }\n },\n getTool: () => this.state.tools.find((t) => t.id === tool.id),\n };\n\n const unregister = this.interactionManager.registerHandlers({\n modeId: tool.interaction.mode ?? tool.id,\n handlers: factory.create(context),\n pageIndex,\n });\n\n unregisterFns.push(unregister);\n }\n\n return () => unregisterFns.forEach((fn) => fn());\n }\n\n private getAllAnnotations(doc: PdfDocumentObject) {\n const task = this.engine.getAllAnnotations(doc);\n task.wait((annotations) => {\n this.dispatch(setAnnotations(annotations));\n\n // Mark initial load as complete\n this.isInitialLoadComplete = true;\n\n // Process any queued imports\n if (this.importQueue.length > 0) {\n this.processImportQueue();\n }\n\n this.events$.emit({\n type: 'loaded',\n total: Object.values(annotations).reduce(\n (sum, pageAnnotations) => sum + pageAnnotations.length,\n 0,\n ),\n });\n }, ignore);\n }\n\n private getPageAnnotations(\n options: GetPageAnnotationsOptions,\n ): Task<PdfAnnotationObject[], PdfErrorReason> {\n const { pageIndex } = options;\n\n const doc = this.coreState.core.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n }\n\n const page = doc.pages.find((p) => p.index === pageIndex);\n\n if (!page) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Page not found' });\n }\n\n return this.engine.getPageAnnotations(doc, page);\n }\n\n private renderAnnotation({ pageIndex, annotation, options }: RenderAnnotationOptions) {\n const coreState = this.coreState.core;\n\n if (!coreState.document) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n }\n\n const page = coreState.document.pages.find((page) => page.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Page not found' });\n }\n\n return this.engine.renderPageAnnotation(coreState.document, page, annotation, options);\n }\n\n private importAnnotations(items: ImportAnnotationItem<PdfAnnotationObject>[]) {\n // If initial load hasn't completed, queue the items\n if (!this.isInitialLoadComplete) {\n this.importQueue.push(...items);\n return;\n }\n\n // Otherwise, import immediately\n this.processImportItems(items);\n }\n\n private processImportQueue() {\n if (this.importQueue.length === 0) return;\n\n const items = [...this.importQueue];\n this.importQueue = []; // Clear the queue\n this.processImportItems(items);\n }\n\n private processImportItems(items: ImportAnnotationItem<PdfAnnotationObject>[]) {\n for (const item of items) {\n const { annotation, ctx } = item;\n const pageIndex = annotation.pageIndex;\n const id = annotation.id;\n\n this.dispatch(createAnnotation(pageIndex, annotation));\n if (ctx) this.pendingContexts.set(id, ctx);\n }\n\n if (this.config.autoCommit !== false) this.commit();\n }\n\n private createAnnotation<A extends PdfAnnotationObject>(\n pageIndex: number,\n annotation: A,\n ctx?: AnnotationCreateContext<A>,\n ) {\n const id = annotation.id;\n const newAnnotation = {\n ...annotation,\n author: annotation.author ?? this.config.annotationAuthor,\n };\n const execute = () => {\n this.dispatch(createAnnotation(pageIndex, newAnnotation));\n if (ctx) this.pendingContexts.set(id, ctx);\n this.events$.emit({\n type: 'create',\n annotation: newAnnotation,\n pageIndex,\n ctx,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit) this.commit();\n return;\n }\n const command: Command = {\n execute,\n undo: () => {\n this.pendingContexts.delete(id);\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, id));\n this.events$.emit({\n type: 'delete',\n annotation: newAnnotation,\n pageIndex,\n committed: false,\n });\n },\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private buildPatch(original: PdfAnnotationObject, patch: Partial<PdfAnnotationObject>) {\n if ('rect' in patch) return patch;\n\n return this.transformAnnotation(original, {\n type: 'property-update',\n changes: patch,\n });\n }\n\n private updateAnnotation(pageIndex: number, id: string, patch: Partial<PdfAnnotationObject>) {\n const originalObject = this.state.byUid[id].object;\n const finalPatch = this.buildPatch(originalObject, {\n ...patch,\n author: patch.author ?? this.config.annotationAuthor,\n });\n\n const execute = () => {\n this.dispatch(patchAnnotation(pageIndex, id, finalPatch));\n this.events$.emit({\n type: 'update',\n annotation: originalObject,\n pageIndex,\n patch: finalPatch,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit !== false) {\n this.commit();\n }\n return;\n }\n const originalPatch = Object.fromEntries(\n Object.keys(patch).map((key) => [key, originalObject[key as keyof PdfAnnotationObject]]),\n );\n const command: Command = {\n execute,\n undo: () => {\n this.dispatch(patchAnnotation(pageIndex, id, originalPatch));\n this.events$.emit({\n type: 'update',\n annotation: originalObject,\n pageIndex,\n patch: originalPatch,\n committed: false,\n });\n },\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private deleteAnnotation(pageIndex: number, id: string) {\n const originalAnnotation = this.state.byUid[id]?.object;\n if (!originalAnnotation) return;\n\n const execute = () => {\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, id));\n this.events$.emit({\n type: 'delete',\n annotation: originalAnnotation,\n pageIndex,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit !== false) this.commit();\n return;\n }\n const command: Command = {\n execute,\n undo: () => {\n this.dispatch(createAnnotation(pageIndex, originalAnnotation));\n this.events$.emit({\n type: 'create',\n annotation: originalAnnotation,\n pageIndex,\n committed: false,\n });\n },\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private selectAnnotation(pageIndex: number, id: string) {\n this.dispatch(selectAnnotation(pageIndex, id));\n }\n\n public getActiveTool(): AnnotationTool | null {\n if (!this.state.activeToolId) return null;\n return this.state.tools.find((t) => t.id === this.state.activeToolId) ?? null;\n }\n\n public setActiveTool(toolId: string | null): void {\n if (toolId === this.state.activeToolId) return;\n const tool = this.state.tools.find((t) => t.id === toolId);\n if (tool) {\n this.interactionManager?.activate(tool.interaction.mode ?? tool.id);\n } else {\n this.interactionManager?.activateDefaultMode();\n }\n }\n\n public getTool<T extends AnnotationTool>(toolId: string): T | undefined {\n return this.state.tools.find((t) => t.id === toolId) as T | undefined;\n }\n\n public findToolForAnnotation(annotation: PdfAnnotationObject): AnnotationTool | null {\n let bestTool: AnnotationTool | null = null;\n let bestScore = 0;\n for (const tool of this.state.tools) {\n const score = tool.matchScore(annotation);\n if (score > bestScore) {\n bestScore = score;\n bestTool = tool;\n }\n }\n return bestTool;\n }\n\n private commit(): Task<boolean, PdfErrorReason> {\n const task = new Task<boolean, PdfErrorReason>();\n\n if (!this.state.hasPendingChanges) return PdfTaskHelper.resolve(true);\n\n const doc = this.coreState.core.document;\n if (!doc)\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n\n const creations: Task<any, PdfErrorReason>[] = [];\n const updates: Task<any, PdfErrorReason>[] = [];\n const deletions: { ta: TrackedAnnotation; uid: string }[] = [];\n\n // 1. Group all pending changes by operation type\n for (const [uid, ta] of Object.entries(this.state.byUid)) {\n if (ta.commitState === 'synced') continue;\n\n const page = doc.pages.find((p) => p.index === ta.object.pageIndex);\n if (!page) continue;\n\n switch (ta.commitState) {\n case 'new':\n const ctx = this.pendingContexts.get(ta.object.id) as AnnotationCreateContext<\n typeof ta.object\n >;\n const task = this.engine.createPageAnnotation!(doc, page, ta.object, ctx);\n task.wait(() => {\n this.events$.emit({\n type: 'create',\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n ctx,\n committed: true,\n });\n this.pendingContexts.delete(ta.object.id);\n }, ignore);\n creations.push(task);\n break;\n case 'dirty':\n const updateTask = this.engine.updatePageAnnotation!(doc, page, ta.object);\n updateTask.wait(() => {\n this.events$.emit({\n type: 'update',\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n patch: ta.object,\n committed: true,\n });\n }, ignore);\n updates.push(updateTask);\n break;\n case 'deleted':\n deletions.push({ ta, uid });\n break;\n }\n }\n\n // 2. Create deletion tasks\n const deletionTasks: Task<any, PdfErrorReason>[] = [];\n for (const { ta, uid } of deletions) {\n const page = doc.pages.find((p) => p.index === ta.object.pageIndex)!;\n // Only delete if it was previously synced (i.e., exists in the PDF)\n if (ta.commitState === 'deleted' && ta.object.id) {\n const task = new Task<any, PdfErrorReason>();\n const removeTask = this.engine.removePageAnnotation!(doc, page, ta.object);\n removeTask.wait(() => {\n this.dispatch(purgeAnnotation(uid));\n this.events$.emit({\n type: 'delete',\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n committed: true,\n });\n task.resolve(true);\n }, task.fail);\n deletionTasks.push(task);\n } else {\n // If it was never synced, just remove from state\n this.dispatch(purgeAnnotation(uid));\n }\n }\n\n // 3. Chain the operations: creations/updates -> deletions -> finalize\n const allWriteTasks = [...creations, ...updates, ...deletionTasks];\n\n Task.allSettled(allWriteTasks).wait(() => {\n // 4. Finalize the commit by updating the commitState of all items.\n this.dispatch(commitPendingChanges());\n task.resolve(true);\n }, task.fail);\n\n return task;\n }\n\n /**\n * Gets the effective behavior setting for a tool, checking tool-specific config first,\n * then falling back to plugin config.\n */\n private getToolBehavior(\n tool: AnnotationTool,\n setting: 'deactivateToolAfterCreate' | 'selectAfterCreate',\n ): boolean {\n // Check if tool has specific behavior setting\n if (tool.behavior?.[setting] !== undefined) {\n return tool.behavior[setting];\n }\n\n // Fall back to plugin config\n return this.config[setting] !== false;\n }\n}\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n} from '@embedpdf/models';\nimport { AnnotationTool } from './types';\n\nexport const defaultTools = [\n // Text Markup Tools\n {\n id: 'highlight' as const,\n name: 'Highlight',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.HIGHLIGHT ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.HIGHLIGHT,\n color: '#FFCD45',\n opacity: 1,\n blendMode: PdfBlendMode.Multiply,\n },\n },\n {\n id: 'underline' as const,\n name: 'Underline',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.UNDERLINE ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.UNDERLINE,\n color: '#E44234',\n opacity: 1,\n },\n },\n {\n id: 'strikeout' as const,\n name: 'Strikeout',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.STRIKEOUT ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n },\n defaults: {\n type: PdfAnnotationSubtype.STRIKEOUT,\n color: '#E44234',\n opacity: 1,\n },\n },\n {\n id: 'squiggly' as const,\n name: 'Squiggly',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.SQUIGGLY ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.SQUIGGLY,\n color: '#E44234',\n opacity: 1,\n },\n },\n\n // Drawing Tools\n {\n id: 'ink' as const,\n name: 'Pen',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.INK && a.intent !== 'InkHighlight' ? 5 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.INK,\n color: '#E44234',\n opacity: 1,\n strokeWidth: 6,\n },\n },\n {\n id: 'inkHighlighter' as const,\n name: 'Ink Highlighter',\n matchScore: (a) =>\n a.type === PdfAnnotationSubtype.INK && a.intent === 'InkHighlight' ? 10 : 0,\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.INK,\n intent: 'InkHighlight',\n color: '#FFCD45',\n opacity: 1,\n strokeWidth: 14,\n blendMode: PdfBlendMode.Multiply,\n },\n },\n\n // Shape Tools\n {\n id: 'circle' as const,\n name: 'Circle',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.CIRCLE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.CIRCLE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 100 },\n },\n },\n {\n id: 'square' as const,\n name: 'Square',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.SQUARE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.SQUARE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 100 },\n },\n },\n {\n id: 'line' as const,\n name: 'Line',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.LINE && a.intent !== 'LineArrow' ? 5 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.LINE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n clickBehavior: {\n enabled: true,\n defaultLength: 100,\n defaultAngle: 0,\n },\n },\n {\n id: 'lineArrow' as const,\n name: 'Arrow',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.LINE && a.intent === 'LineArrow' ? 10 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.LINE,\n intent: 'LineArrow',\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n lineEndings: {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.OpenArrow,\n },\n },\n clickBehavior: {\n enabled: true,\n defaultLength: 100,\n defaultAngle: 0,\n },\n },\n {\n id: 'polyline' as const,\n name: 'Polyline',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.POLYLINE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.POLYLINE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n },\n {\n id: 'polygon' as const,\n name: 'Polygon',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.POLYGON ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.POLYGON,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n },\n\n // Text & Stamp\n {\n id: 'freeText' as const,\n name: 'Free Text',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.FREETEXT ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.FREETEXT,\n contents: 'Insert text',\n fontSize: 14,\n fontColor: '#E44234',\n fontFamily: PdfStandardFont.Helvetica,\n textAlign: PdfTextAlignment.Left,\n verticalAlign: PdfVerticalAlignment.Top,\n backgroundColor: 'transparent',\n opacity: 1,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 20 },\n defaultContent: 'Insert text',\n },\n },\n {\n id: 'stamp' as const,\n name: 'Image',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.STAMP ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'copy',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: true,\n },\n defaults: {\n type: PdfAnnotationSubtype.STAMP,\n // No imageSrc by default, which tells the UI to open a file picker\n },\n },\n] satisfies readonly AnnotationTool[];\n","import { Reducer } from '@embedpdf/core';\nimport {\n ADD_COLOR_PRESET,\n COMMIT_PENDING_CHANGES,\n CREATE_ANNOTATION,\n DELETE_ANNOTATION,\n DESELECT_ANNOTATION,\n PATCH_ANNOTATION,\n PURGE_ANNOTATION,\n SELECT_ANNOTATION,\n SET_ACTIVE_TOOL_ID,\n SET_ANNOTATIONS,\n AnnotationAction,\n SET_TOOL_DEFAULTS,\n ADD_TOOL,\n} from './actions';\nimport { AnnotationPluginConfig, AnnotationState, TrackedAnnotation } from './types';\nimport { defaultTools } from './tools/default-tools';\nimport { AnnotationTool } from './tools/types';\n\nconst DEFAULT_COLORS = [\n '#E44234',\n '#FF8D00',\n '#FFCD45',\n '#5CC96E',\n '#25D2D1',\n '#597CE2',\n '#C544CE',\n '#7D2E25',\n '#000000',\n '#FFFFFF',\n];\n\nconst patchAnno = (\n state: AnnotationState,\n uid: string,\n patch: Partial<TrackedAnnotation['object']>,\n): AnnotationState => {\n const prev = state.byUid[uid];\n if (!prev) return state;\n return {\n ...state,\n byUid: {\n ...state.byUid,\n [uid]: {\n ...prev,\n commitState: prev.commitState === 'synced' ? 'dirty' : prev.commitState,\n object: { ...prev.object, ...patch },\n } as TrackedAnnotation,\n },\n hasPendingChanges: true,\n };\n};\n\nexport const initialState = (cfg: AnnotationPluginConfig): AnnotationState => {\n // Create a Map with a general type signature. This resolves the type conflicts.\n const toolMap = new Map<string, AnnotationTool>();\n\n // The `satisfies` operator has already validated the specific types in `defaultTools`.\n // Now, we cast each one to the general `AnnotationTool` type for storage in our unified map.\n defaultTools.forEach((t) => toolMap.set(t.id, t as AnnotationTool));\n\n // User-provided tools can now be safely added, as they also match the `AnnotationTool` type.\n (cfg.tools || []).forEach((t) => toolMap.set(t.id, t));\n\n return {\n pages: {},\n byUid: {},\n selectedUid: null,\n activeToolId: null,\n // `Array.from(toolMap.values())` now correctly returns `AnnotationTool[]`, which matches the state's type.\n tools: Array.from(toolMap.values()),\n colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,\n hasPendingChanges: false,\n };\n};\n\nexport const reducer: Reducer<AnnotationState, AnnotationAction> = (state, action) => {\n switch (action.type) {\n case SET_ANNOTATIONS: {\n const newPages = { ...state.pages };\n const newByUid = { ...state.byUid };\n for (const [pgStr, list] of Object.entries(action.payload)) {\n const pageIndex = Number(pgStr);\n const oldUidsOnPage = state.pages[pageIndex] || [];\n for (const uid of oldUidsOnPage) {\n delete newByUid[uid];\n }\n const newUidsOnPage = list.map((a) => {\n const uid = a.id;\n newByUid[uid] = { commitState: 'synced', object: a };\n return uid;\n });\n newPages[pageIndex] = newUidsOnPage;\n }\n return { ...state, pages: newPages, byUid: newByUid };\n }\n\n case SET_ACTIVE_TOOL_ID:\n return { ...state, activeToolId: action.payload };\n\n case ADD_TOOL: {\n const toolMap = new Map(state.tools.map((t) => [t.id, t]));\n toolMap.set(action.payload.id, action.payload);\n return { ...state, tools: Array.from(toolMap.values()) };\n }\n\n case SET_TOOL_DEFAULTS: {\n const { toolId, patch } = action.payload;\n return {\n ...state,\n tools: state.tools.map((tool) => {\n if (tool.id === toolId) {\n return { ...tool, defaults: { ...tool.defaults, ...patch } };\n }\n return tool;\n }),\n };\n }\n\n case SELECT_ANNOTATION:\n return { ...state, selectedUid: action.payload.id };\n\n case DESELECT_ANNOTATION:\n return { ...state, selectedUid: null };\n\n case ADD_COLOR_PRESET:\n return state.colorPresets.includes(action.payload)\n ? state\n : { ...state, colorPresets: [...state.colorPresets, action.payload] };\n\n case CREATE_ANNOTATION: {\n const { pageIndex, annotation } = action.payload;\n const uid = annotation.id;\n return {\n ...state,\n pages: { ...state.pages, [pageIndex]: [...(state.pages[pageIndex] ?? []), uid] },\n byUid: { ...state.byUid, [uid]: { commitState: 'new', object: annotation } },\n hasPendingChanges: true,\n };\n }\n\n case DELETE_ANNOTATION: {\n const { pageIndex, id: uid } = action.payload;\n if (!state.byUid[uid]) return state;\n\n /* keep the object but mark it as deleted */\n return {\n ...state,\n pages: {\n ...state.pages,\n [pageIndex]: (state.pages[pageIndex] ?? []).filter((u) => u !== uid),\n },\n byUid: {\n ...state.byUid,\n [uid]: { ...state.byUid[uid], commitState: 'deleted' },\n },\n hasPendingChanges: true,\n };\n }\n\n case PATCH_ANNOTATION:\n return patchAnno(state, action.payload.id, action.payload.patch);\n\n case COMMIT_PENDING_CHANGES: {\n const cleaned: AnnotationState['byUid'] = {};\n for (const [uid, ta] of Object.entries(state.byUid)) {\n cleaned[uid] = {\n ...ta,\n commitState:\n ta.commitState === 'dirty' || ta.commitState === 'new' ? 'synced' : ta.commitState,\n };\n }\n return { ...state, byUid: cleaned, hasPendingChanges: false };\n }\n\n case PURGE_ANNOTATION: {\n const { uid } = action.payload;\n const { [uid]: _gone, ...rest } = state.byUid;\n return { ...state, byUid: rest };\n }\n\n default:\n return state;\n }\n};\n","import { AnnotationTool } from './types';\nimport { defaultTools } from './default-tools';\n\n// Infer the exact union type of all tool objects.\ntype DefaultTool = (typeof defaultTools)[number];\n\n// Create a map from a tool's ID to its specific type.\nexport type ToolMap = {\n [T in DefaultTool as T['id']]: T;\n};\n\n/**\n * A factory that creates a type-safe predicate function for a specific tool ID.\n * This is more reliable for TypeScript's type inference than a single generic function.\n */\nexport function createToolPredicate<K extends keyof ToolMap>(id: K) {\n // This function returns ANOTHER function, which is the actual type predicate.\n return (tool: AnnotationTool<any> | undefined): tool is ToolMap[K] => {\n return tool?.id === id;\n };\n}\n\n// Export the generated predicates for common tools.\nexport const isHighlightTool = createToolPredicate('highlight');\nexport const isSquigglyTool = createToolPredicate('squiggly');\nexport const isUnderlineTool = createToolPredicate('underline');\nexport const isStrikeoutTool = createToolPredicate('strikeout');\nexport const isInkTool = createToolPredicate('ink');\nexport const isInkHighlighterTool = createToolPredicate('inkHighlighter');\nexport const isSquareTool = createToolPredicate('square');\nexport const isCircleTool = createToolPredicate('circle');\nexport const isLineTool = createToolPredicate('line');\nexport const isPolylineTool = createToolPredicate('polyline');\nexport const isPolygonTool = createToolPredicate('polygon');\nexport const isFreeTextTool = createToolPredicate('freeText');\nexport const isStampTool = createToolPredicate('stamp');\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, ANNOTATION_PLUGIN_ID } from './manifest';\nimport { AnnotationPluginConfig, AnnotationState } from './types';\nimport { AnnotationPlugin } from './annotation-plugin';\nimport { initialState, reducer } from './reducer';\nimport { AnnotationAction } from './actions';\n\nexport const AnnotationPluginPackage: PluginPackage<\n AnnotationPlugin,\n AnnotationPluginConfig,\n AnnotationState,\n AnnotationAction\n> = {\n manifest,\n create: (registry, config) => new AnnotationPlugin(ANNOTATION_PLUGIN_ID, registry, config),\n reducer,\n initialState: (_, config) => initialState(config),\n};\n\nexport * from './annotation-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './selectors';\nexport * from './helpers';\nexport * from './handlers/types';\nexport * from './tools/types';\nexport * from './tools/tools-utils';\nexport * as patching from './patching';\nexport { initialState } from './reducer';\n"],"names":["pad","patching.lineRectWithEndings","defaults","_a","_b","_c","page","task"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/helpers.ts","../src/lib/selectors.ts","../src/lib/tools/default-tools.ts","../src/lib/reducer.ts","../src/lib/utils/use-state.ts","../src/lib/handlers/ink.handler.ts","../src/lib/handlers/click-detector.ts","../src/lib/handlers/free-text.handler.ts","../src/lib/patching/line-ending-handlers.ts","../src/lib/patching/patch-utils.ts","../src/lib/patching/line-endings.ts","../src/lib/patching/patch-registry.ts","../src/lib/handlers/line.handler.ts","../src/lib/handlers/polyline.handler.ts","../src/lib/handlers/polygon.handler.ts","../src/lib/handlers/square.handler.ts","../src/lib/handlers/stamp.handler.ts","../src/lib/handlers/circle.handler.ts","../src/lib/patching/patches/ink.patch.ts","../src/lib/patching/patches/line.patch.ts","../src/lib/patching/patches/polyline.patch.ts","../src/lib/patching/patches/polygon.patch.ts","../src/lib/annotation-plugin.ts","../src/lib/tools/tools-utils.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { AnnotationPluginConfig } from './types';\n\nexport const ANNOTATION_PLUGIN_ID = 'annotation';\n\nexport const manifest: PluginManifest<AnnotationPluginConfig> = {\n id: ANNOTATION_PLUGIN_ID,\n name: 'Annotation Plugin',\n version: '1.0.0',\n provides: ['annotation'],\n requires: ['interaction-manager', 'selection'],\n optional: ['history'],\n defaultConfig: {\n enabled: true,\n autoCommit: true,\n annotationAuthor: 'Guest',\n deactivateToolAfterCreate: false,\n selectAfterCreate: true,\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationTool } from './tools/types';\nimport { AnnotationDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_ANNOTATION_STATE = 'ANNOTATION/INIT_STATE';\nexport const CLEANUP_ANNOTATION_STATE = 'ANNOTATION/CLEANUP_STATE';\nexport const SET_ACTIVE_DOCUMENT = 'ANNOTATION/SET_ACTIVE_DOCUMENT';\n\n// Per-document actions\nexport const SET_ANNOTATIONS = 'ANNOTATION/SET_ANNOTATIONS';\nexport const SELECT_ANNOTATION = 'ANNOTATION/SELECT_ANNOTATION';\nexport const DESELECT_ANNOTATION = 'ANNOTATION/DESELECT_ANNOTATION';\nexport const SET_ACTIVE_TOOL_ID = 'ANNOTATION/SET_ACTIVE_TOOL_ID';\nexport const CREATE_ANNOTATION = 'ANNOTATION/CREATE_ANNOTATION';\nexport const PATCH_ANNOTATION = 'ANNOTATION/PATCH_ANNOTATION';\nexport const DELETE_ANNOTATION = 'ANNOTATION/DELETE_ANNOTATION';\nexport const COMMIT_PENDING_CHANGES = 'ANNOTATION/COMMIT';\nexport const PURGE_ANNOTATION = 'ANNOTATION/PURGE_ANNOTATION';\n\n// Global actions\nexport const ADD_COLOR_PRESET = 'ANNOTATION/ADD_COLOR_PRESET';\nexport const SET_TOOL_DEFAULTS = 'ANNOTATION/SET_TOOL_DEFAULTS';\nexport const ADD_TOOL = 'ANNOTATION/ADD_TOOL';\n\n// Document lifecycle actions\nexport interface InitAnnotationStateAction extends Action {\n type: typeof INIT_ANNOTATION_STATE;\n payload: {\n documentId: string;\n state: AnnotationDocumentState;\n };\n}\n\nexport interface CleanupAnnotationStateAction extends Action {\n type: typeof CLEANUP_ANNOTATION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface SetAnnotationsAction extends Action {\n type: typeof SET_ANNOTATIONS;\n payload: { documentId: string; annotations: Record<number, PdfAnnotationObject[]> };\n}\nexport interface SelectAnnotationAction extends Action {\n type: typeof SELECT_ANNOTATION;\n payload: { documentId: string; pageIndex: number; id: string };\n}\nexport interface DeselectAnnotationAction extends Action {\n type: typeof DESELECT_ANNOTATION;\n payload: { documentId: string };\n}\nexport interface SetActiveToolIdAction extends Action {\n type: typeof SET_ACTIVE_TOOL_ID;\n payload: { documentId: string; toolId: string | null };\n}\nexport interface CreateAnnotationAction extends Action {\n type: typeof CREATE_ANNOTATION;\n payload: { documentId: string; pageIndex: number; annotation: PdfAnnotationObject };\n}\nexport interface PatchAnnotationAction extends Action {\n type: typeof PATCH_ANNOTATION;\n payload: {\n documentId: string;\n pageIndex: number;\n id: string;\n patch: Partial<PdfAnnotationObject>;\n };\n}\nexport interface DeleteAnnotationAction extends Action {\n type: typeof DELETE_ANNOTATION;\n payload: { documentId: string; pageIndex: number; id: string };\n}\nexport interface CommitAction extends Action {\n type: typeof COMMIT_PENDING_CHANGES;\n payload: { documentId: string };\n}\nexport interface PurgeAnnotationAction extends Action {\n type: typeof PURGE_ANNOTATION;\n payload: { documentId: string; uid: string };\n}\n\n// Global actions\nexport interface AddColorPresetAction extends Action {\n type: typeof ADD_COLOR_PRESET;\n payload: string;\n}\nexport interface SetToolDefaultsAction extends Action {\n type: typeof SET_TOOL_DEFAULTS;\n payload: { toolId: string; patch: Partial<any> };\n}\nexport interface AddToolAction extends Action {\n type: typeof ADD_TOOL;\n payload: AnnotationTool;\n}\n\nexport type AnnotationAction =\n | InitAnnotationStateAction\n | CleanupAnnotationStateAction\n | SetActiveDocumentAction\n | SetAnnotationsAction\n | SelectAnnotationAction\n | DeselectAnnotationAction\n | SetActiveToolIdAction\n | CreateAnnotationAction\n | PatchAnnotationAction\n | DeleteAnnotationAction\n | CommitAction\n | PurgeAnnotationAction\n | AddColorPresetAction\n | SetToolDefaultsAction\n | AddToolAction;\n\n// Document lifecycle action creators\nexport function initAnnotationState(\n documentId: string,\n state: AnnotationDocumentState,\n): InitAnnotationStateAction {\n return { type: INIT_ANNOTATION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupAnnotationState(documentId: string): CleanupAnnotationStateAction {\n return { type: CLEANUP_ANNOTATION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\n// Per-document action creators\nexport const setAnnotations = (\n documentId: string,\n annotations: Record<number, PdfAnnotationObject[]>,\n): SetAnnotationsAction => ({\n type: SET_ANNOTATIONS,\n payload: { documentId, annotations },\n});\n\nexport const selectAnnotation = (\n documentId: string,\n pageIndex: number,\n id: string,\n): SelectAnnotationAction => ({\n type: SELECT_ANNOTATION,\n payload: { documentId, pageIndex, id },\n});\n\nexport const deselectAnnotation = (documentId: string): DeselectAnnotationAction => ({\n type: DESELECT_ANNOTATION,\n payload: { documentId },\n});\n\nexport const setActiveToolId = (\n documentId: string,\n toolId: string | null,\n): SetActiveToolIdAction => ({\n type: SET_ACTIVE_TOOL_ID,\n payload: { documentId, toolId },\n});\n\nexport const createAnnotation = (\n documentId: string,\n pageIndex: number,\n annotation: PdfAnnotationObject,\n): CreateAnnotationAction => ({\n type: CREATE_ANNOTATION,\n payload: { documentId, pageIndex, annotation },\n});\n\nexport const patchAnnotation = (\n documentId: string,\n pageIndex: number,\n id: string,\n patch: Partial<PdfAnnotationObject>,\n): PatchAnnotationAction => ({\n type: PATCH_ANNOTATION,\n payload: { documentId, pageIndex, id, patch },\n});\n\nexport const deleteAnnotation = (\n documentId: string,\n pageIndex: number,\n id: string,\n): DeleteAnnotationAction => ({\n type: DELETE_ANNOTATION,\n payload: { documentId, pageIndex, id },\n});\n\nexport const commitPendingChanges = (documentId: string): CommitAction => ({\n type: COMMIT_PENDING_CHANGES,\n payload: { documentId },\n});\n\nexport const purgeAnnotation = (documentId: string, uid: string): PurgeAnnotationAction => ({\n type: PURGE_ANNOTATION,\n payload: { documentId, uid },\n});\n\n// Global action creators\nexport const addColorPreset = (c: string): AddColorPresetAction => ({\n type: ADD_COLOR_PRESET,\n payload: c,\n});\n\nexport const setToolDefaults = (toolId: string, patch: Partial<any>): SetToolDefaultsAction => ({\n type: SET_TOOL_DEFAULTS,\n payload: { toolId, patch },\n});\n\nexport const addTool = (tool: AnnotationTool): AddToolAction => ({\n type: ADD_TOOL,\n payload: tool,\n});\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfSquigglyAnnoObject,\n PdfStrikeOutAnnoObject,\n PdfUnderlineAnnoObject,\n PdfHighlightAnnoObject,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from './types';\nimport { AnnotationTool } from './tools/types';\n\n/* ------------------------------------------------------------------ */\n/* 1. Generic “subtype‑to‑object” mapper */\n/* ------------------------------------------------------------------ */\n\nexport type AnnoOf<S extends PdfAnnotationSubtype> = Extract<PdfAnnotationObject, { type: S }>;\n\nexport type TextMarkupSubtype =\n | PdfAnnotationSubtype.HIGHLIGHT\n | PdfAnnotationSubtype.UNDERLINE\n | PdfAnnotationSubtype.STRIKEOUT\n | PdfAnnotationSubtype.SQUIGGLY;\nexport type SidebarSubtype =\n | TextMarkupSubtype\n | PdfAnnotationSubtype.INK\n | PdfAnnotationSubtype.SQUARE\n | PdfAnnotationSubtype.CIRCLE\n | PdfAnnotationSubtype.POLYGON\n | PdfAnnotationSubtype.LINE\n | PdfAnnotationSubtype.POLYLINE\n | PdfAnnotationSubtype.FREETEXT\n | PdfAnnotationSubtype.STAMP;\n\n/* ------------------------------------------------------------------ */\n/* 2. Narrowing type‑guards (add more as needed) */\n/* ------------------------------------------------------------------ */\n\n/** True when `a.object.type === INK` – and narrows the generic. */\nexport function isInk(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.INK>> {\n return a.object.type === PdfAnnotationSubtype.INK;\n}\n\n/** Example for Circle – create similar ones for Square, Line, etc. */\nexport function isCircle(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.CIRCLE>> {\n return a.object.type === PdfAnnotationSubtype.CIRCLE;\n}\n\nexport function isPolygon(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.POLYGON>> {\n return a.object.type === PdfAnnotationSubtype.POLYGON;\n}\n\nexport function isSquare(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.SQUARE>> {\n return a.object.type === PdfAnnotationSubtype.SQUARE;\n}\n\nexport function isLine(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.LINE>> {\n return a.object.type === PdfAnnotationSubtype.LINE;\n}\n\nexport function isPolyline(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.POLYLINE>> {\n return a.object.type === PdfAnnotationSubtype.POLYLINE;\n}\n\nexport function isHighlight(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.HIGHLIGHT>> {\n return a.object.type === PdfAnnotationSubtype.HIGHLIGHT;\n}\n\nexport function isUnderline(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.UNDERLINE>> {\n return a.object.type === PdfAnnotationSubtype.UNDERLINE;\n}\n\nexport function isStrikeout(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.STRIKEOUT>> {\n return a.object.type === PdfAnnotationSubtype.STRIKEOUT;\n}\n\nexport function isSquiggly(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.SQUIGGLY>> {\n return a.object.type === PdfAnnotationSubtype.SQUIGGLY;\n}\n\nexport function isTextMarkup(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<TextMarkupSubtype>> {\n return isHighlight(a) || isUnderline(a) || isStrikeout(a) || isSquiggly(a);\n}\n\nexport function isFreeText(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.FREETEXT>> {\n return a.object.type === PdfAnnotationSubtype.FREETEXT;\n}\n\nexport function isStamp(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.STAMP>> {\n return a.object.type === PdfAnnotationSubtype.STAMP;\n}\n\nexport function isText(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.TEXT>> {\n return a.object.type === PdfAnnotationSubtype.TEXT;\n}\n\nexport function isSidebarAnnotation(\n a: TrackedAnnotation,\n): a is TrackedAnnotation<AnnoOf<SidebarSubtype>> {\n return (\n isTextMarkup(a) ||\n isInk(a) ||\n isSquare(a) ||\n isCircle(a) ||\n isPolygon(a) ||\n isLine(a) ||\n isPolyline(a) ||\n isFreeText(a) ||\n isStamp(a)\n );\n}\n","import {\n AnnotationState,\n AnnotationDocumentState,\n SidebarAnnotationEntry,\n TrackedAnnotation,\n} from './types';\nimport { PdfTextAnnoObject } from '@embedpdf/models';\nimport { isSidebarAnnotation, isText } from './helpers';\nimport { ToolMap } from './tools/tools-utils';\n\n/* ─────────── document state selectors ─────────── */\n\n/** All annotations _objects_ on a single page (order preserved). */\nexport const getAnnotationsByPageIndex = (s: AnnotationDocumentState, page: number) =>\n (s.pages[page] ?? []).map((uid) => s.byUid[uid]);\n\n/** Shortcut: every page → list of annotation objects. */\nexport const getAnnotations = (s: AnnotationDocumentState) => {\n const out: Record<number, ReturnType<typeof getAnnotationsByPageIndex>> = {};\n for (const p of Object.keys(s.pages).map(Number)) out[p] = getAnnotationsByPageIndex(s, p);\n return out;\n};\n\n/** The full `TrackedAnnotation` for the current selection. */\nexport const getSelectedAnnotation = (s: AnnotationDocumentState) =>\n s.selectedUid ? s.byUid[s.selectedUid] : null;\n\n/** Get a tracked annotation by its ID */\nexport const getAnnotationByUid = (s: AnnotationDocumentState, uid: string) => s.byUid[uid] ?? null;\n\nexport const getSelectedAnnotationByPageIndex = (s: AnnotationDocumentState, pageIndex: number) => {\n if (!s.selectedUid) return null;\n\n const pageUids = s.pages[pageIndex] ?? [];\n\n // Check if the selected UID is on the requested page\n if (pageUids.includes(s.selectedUid)) {\n return s.byUid[s.selectedUid];\n }\n\n return null;\n};\n\n/** Check if a given anno on a page is the current selection. */\nexport const isAnnotationSelected = (s: AnnotationDocumentState, id: string) =>\n s.selectedUid === id;\n\n/**\n * Returns the current defaults for a specific tool by its ID.\n * This is fully type-safe and infers the correct return type.\n *\n * @param state The annotation plugin's state.\n * @param toolId The ID of the tool (e.g., 'highlight', 'pen').\n * @returns The tool's current `defaults` object, or `undefined` if not found.\n */\nexport function getToolDefaultsById<K extends keyof ToolMap>(\n state: AnnotationState,\n toolId: K,\n): ToolMap[K]['defaults'] | undefined {\n // Find the tool in the state's tool array.\n const tool = state.tools.find((t) => t.id === toolId);\n\n // The `as` cast is safe because the generic signature guarantees\n // the return type to the caller.\n return tool?.defaults as ToolMap[K]['defaults'] | undefined;\n}\n\n/**\n * Collect every sidebar-eligible annotation and attach its TEXT replies,\n * grouped by page for efficient rendering.\n *\n * Result shape:\n * {\n * 0: [{ page: 0, annotation: <TrackedAnnotation>, replies: [ … ] }, ...],\n * 1: [{ page: 1, annotation: <TrackedAnnotation>, replies: [ … ] }, ...],\n * …\n * }\n */\nexport const getSidebarAnnotationsWithRepliesGroupedByPage = (\n s: AnnotationDocumentState,\n): Record<number, SidebarAnnotationEntry[]> => {\n /* ------------------------------------------------------------\n * 1. Build an index of TEXT replies keyed by their parent ID\n * ------------------------------------------------------------ */\n const repliesByParent: Record<string, TrackedAnnotation<PdfTextAnnoObject>[]> = {};\n\n for (const uidList of Object.values(s.pages)) {\n for (const uid of uidList) {\n const ta = s.byUid[uid];\n if (ta && isText(ta)) {\n const parentId = ta.object.inReplyToId;\n if (parentId) (repliesByParent[parentId] ||= []).push(ta);\n }\n }\n }\n\n /* ------------------------------------------------------------\n * 2. Gather sidebar annotations and group them by page\n * ------------------------------------------------------------ */\n const out: Record<number, SidebarAnnotationEntry[]> = {};\n\n for (const [pageStr, uidList] of Object.entries(s.pages)) {\n const page = Number(pageStr);\n const pageAnnotations: SidebarAnnotationEntry[] = [];\n\n for (const uid of uidList) {\n const ta = s.byUid[uid];\n if (ta && isSidebarAnnotation(ta)) {\n pageAnnotations.push({\n page,\n annotation: ta,\n replies: repliesByParent[ta.object.id] ?? [],\n });\n }\n }\n\n // Only add pages that have annotations\n if (pageAnnotations.length > 0) {\n out[page] = pageAnnotations;\n }\n }\n\n return out;\n};\n\n/**\n * Collect every sidebar-eligible annotation and attach its TEXT replies.\n *\n * Result shape:\n * [\n * { page: 0, annotation: <TrackedAnnotation>, replies: [ … ] },\n * { page: 1, annotation: <TrackedAnnotation>, replies: [ … ] },\n * …\n * ]\n */\nexport const getSidebarAnnotationsWithReplies = (\n s: AnnotationDocumentState,\n): SidebarAnnotationEntry[] => {\n const grouped = getSidebarAnnotationsWithRepliesGroupedByPage(s);\n const out: SidebarAnnotationEntry[] = [];\n\n // Flatten the grouped structure while maintaining page order\n const sortedPages = Object.keys(grouped)\n .map(Number)\n .sort((a, b) => a - b);\n for (const page of sortedPages) {\n out.push(...grouped[page]);\n }\n\n return out;\n};\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n} from '@embedpdf/models';\nimport { AnnotationTool } from './types';\n\nexport const defaultTools = [\n // Text Markup Tools\n {\n id: 'highlight' as const,\n name: 'Highlight',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.HIGHLIGHT ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.HIGHLIGHT,\n color: '#FFCD45',\n opacity: 1,\n blendMode: PdfBlendMode.Multiply,\n },\n },\n {\n id: 'underline' as const,\n name: 'Underline',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.UNDERLINE ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.UNDERLINE,\n color: '#E44234',\n opacity: 1,\n },\n },\n {\n id: 'strikeout' as const,\n name: 'Strikeout',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.STRIKEOUT ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n },\n defaults: {\n type: PdfAnnotationSubtype.STRIKEOUT,\n color: '#E44234',\n opacity: 1,\n },\n },\n {\n id: 'squiggly' as const,\n name: 'Squiggly',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.SQUIGGLY ? 1 : 0),\n interaction: {\n exclusive: false,\n textSelection: true,\n isDraggable: false,\n isResizable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.SQUIGGLY,\n color: '#E44234',\n opacity: 1,\n },\n },\n\n // Drawing Tools\n {\n id: 'ink' as const,\n name: 'Pen',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.INK && a.intent !== 'InkHighlight' ? 5 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.INK,\n color: '#E44234',\n opacity: 1,\n strokeWidth: 6,\n },\n },\n {\n id: 'inkHighlighter' as const,\n name: 'Ink Highlighter',\n matchScore: (a) =>\n a.type === PdfAnnotationSubtype.INK && a.intent === 'InkHighlight' ? 10 : 0,\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.INK,\n intent: 'InkHighlight',\n color: '#FFCD45',\n opacity: 1,\n strokeWidth: 14,\n blendMode: PdfBlendMode.Multiply,\n },\n },\n\n // Shape Tools\n {\n id: 'circle' as const,\n name: 'Circle',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.CIRCLE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.CIRCLE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 100 },\n },\n },\n {\n id: 'square' as const,\n name: 'Square',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.SQUARE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.SQUARE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 100 },\n },\n },\n {\n id: 'line' as const,\n name: 'Line',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.LINE && a.intent !== 'LineArrow' ? 5 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.LINE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n clickBehavior: {\n enabled: true,\n defaultLength: 100,\n defaultAngle: 0,\n },\n },\n {\n id: 'lineArrow' as const,\n name: 'Arrow',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.LINE && a.intent === 'LineArrow' ? 10 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.LINE,\n intent: 'LineArrow',\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n lineEndings: {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.OpenArrow,\n },\n },\n clickBehavior: {\n enabled: true,\n defaultLength: 100,\n defaultAngle: 0,\n },\n },\n {\n id: 'polyline' as const,\n name: 'Polyline',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.POLYLINE ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.POLYLINE,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n },\n {\n id: 'polygon' as const,\n name: 'Polygon',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.POLYGON ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: false,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.POLYGON,\n color: 'transparent',\n opacity: 1,\n strokeWidth: 6,\n strokeColor: '#E44234',\n },\n },\n\n // Text & Stamp\n {\n id: 'freeText' as const,\n name: 'Free Text',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.FREETEXT ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.FREETEXT,\n contents: 'Insert text',\n fontSize: 14,\n fontColor: '#E44234',\n fontFamily: PdfStandardFont.Helvetica,\n textAlign: PdfTextAlignment.Left,\n verticalAlign: PdfVerticalAlignment.Top,\n backgroundColor: 'transparent',\n opacity: 1,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 100, height: 20 },\n defaultContent: 'Insert text',\n },\n },\n {\n id: 'stamp' as const,\n name: 'Image',\n matchScore: (a) => (a.type === PdfAnnotationSubtype.STAMP ? 1 : 0),\n interaction: {\n exclusive: false,\n cursor: 'copy',\n isDraggable: true,\n isResizable: true,\n lockAspectRatio: true,\n },\n defaults: {\n type: PdfAnnotationSubtype.STAMP,\n // No imageSrc by default, which tells the UI to open a file picker\n },\n },\n] satisfies readonly AnnotationTool[];\n","import { Reducer } from '@embedpdf/core';\nimport {\n ADD_COLOR_PRESET,\n COMMIT_PENDING_CHANGES,\n CREATE_ANNOTATION,\n DELETE_ANNOTATION,\n DESELECT_ANNOTATION,\n PATCH_ANNOTATION,\n PURGE_ANNOTATION,\n SELECT_ANNOTATION,\n SET_ACTIVE_TOOL_ID,\n SET_ANNOTATIONS,\n AnnotationAction,\n SET_TOOL_DEFAULTS,\n ADD_TOOL,\n INIT_ANNOTATION_STATE,\n CLEANUP_ANNOTATION_STATE,\n SET_ACTIVE_DOCUMENT,\n} from './actions';\nimport {\n AnnotationPluginConfig,\n AnnotationState,\n AnnotationDocumentState,\n TrackedAnnotation,\n} from './types';\nimport { defaultTools } from './tools/default-tools';\nimport { AnnotationTool } from './tools/types';\n\nconst DEFAULT_COLORS = [\n '#E44234',\n '#FF8D00',\n '#FFCD45',\n '#5CC96E',\n '#25D2D1',\n '#597CE2',\n '#C544CE',\n '#7D2E25',\n '#000000',\n '#FFFFFF',\n];\n\n// Per-document initial state\nexport const initialDocumentState = (): AnnotationDocumentState => ({\n pages: {},\n byUid: {},\n selectedUid: null,\n activeToolId: null,\n hasPendingChanges: false,\n});\n\n// Helper function to patch an annotation in a document state\nconst patchAnno = (\n docState: AnnotationDocumentState,\n uid: string,\n patch: Partial<TrackedAnnotation['object']>,\n): AnnotationDocumentState => {\n const prev = docState.byUid[uid];\n if (!prev) return docState;\n return {\n ...docState,\n byUid: {\n ...docState.byUid,\n [uid]: {\n ...prev,\n commitState: prev.commitState === 'synced' ? 'dirty' : prev.commitState,\n object: { ...prev.object, ...patch },\n } as TrackedAnnotation,\n },\n hasPendingChanges: true,\n };\n};\n\nexport const initialState = (cfg: AnnotationPluginConfig): AnnotationState => {\n // Create a Map with a general type signature. This resolves the type conflicts.\n const toolMap = new Map<string, AnnotationTool>();\n\n // The `satisfies` operator has already validated the specific types in `defaultTools`.\n // Now, we cast each one to the general `AnnotationTool` type for storage in our unified map.\n defaultTools.forEach((t) => toolMap.set(t.id, t as AnnotationTool));\n\n // User-provided tools can now be safely added, as they also match the `AnnotationTool` type.\n (cfg.tools || []).forEach((t) => toolMap.set(t.id, t));\n\n return {\n documents: {},\n activeDocumentId: null,\n // `Array.from(toolMap.values())` now correctly returns `AnnotationTool[]`, which matches the state's type.\n tools: Array.from(toolMap.values()),\n colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,\n };\n};\n\nexport const reducer: Reducer<AnnotationState, AnnotationAction> = (state, action) => {\n switch (action.type) {\n case INIT_ANNOTATION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_ANNOTATION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_ANNOTATIONS: {\n const { documentId, annotations } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const newPages: Record<number, string[]> = {};\n const newByUid: Record<string, TrackedAnnotation> = {};\n\n for (const [pgStr, list] of Object.entries(annotations)) {\n const pageIndex = Number(pgStr);\n const oldUidsOnPage = docState.pages[pageIndex] || [];\n for (const uid of oldUidsOnPage) {\n delete newByUid[uid];\n }\n const newUidsOnPage = list.map((a) => {\n const uid = a.id;\n newByUid[uid] = { commitState: 'synced', object: a };\n return uid;\n });\n newPages[pageIndex] = newUidsOnPage;\n }\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n pages: newPages,\n byUid: newByUid,\n },\n },\n };\n }\n\n case SELECT_ANNOTATION: {\n const { documentId, id } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: { ...docState, selectedUid: id },\n },\n };\n }\n\n case DESELECT_ANNOTATION: {\n const { documentId } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: { ...docState, selectedUid: null },\n },\n };\n }\n\n case SET_ACTIVE_TOOL_ID: {\n const { documentId, toolId } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: { ...docState, activeToolId: toolId },\n },\n };\n }\n\n case CREATE_ANNOTATION: {\n const { documentId, pageIndex, annotation } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const uid = annotation.id;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n pages: {\n ...docState.pages,\n [pageIndex]: [...(docState.pages[pageIndex] ?? []), uid],\n },\n byUid: {\n ...docState.byUid,\n [uid]: { commitState: 'new', object: annotation },\n },\n hasPendingChanges: true,\n },\n },\n };\n }\n\n case DELETE_ANNOTATION: {\n const { documentId, pageIndex, id: uid } = action.payload;\n const docState = state.documents[documentId];\n if (!docState || !docState.byUid[uid]) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n pages: {\n ...docState.pages,\n [pageIndex]: (docState.pages[pageIndex] ?? []).filter((u) => u !== uid),\n },\n byUid: {\n ...docState.byUid,\n [uid]: { ...docState.byUid[uid], commitState: 'deleted' },\n },\n hasPendingChanges: true,\n },\n },\n };\n }\n\n case PATCH_ANNOTATION: {\n const { documentId, id, patch } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: patchAnno(docState, id, patch),\n },\n };\n }\n\n case COMMIT_PENDING_CHANGES: {\n const { documentId } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const cleaned: Record<string, TrackedAnnotation> = {};\n for (const [uid, ta] of Object.entries(docState.byUid)) {\n cleaned[uid] = {\n ...ta,\n commitState:\n ta.commitState === 'dirty' || ta.commitState === 'new' ? 'synced' : ta.commitState,\n };\n }\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: { ...docState, byUid: cleaned, hasPendingChanges: false },\n },\n };\n }\n\n case PURGE_ANNOTATION: {\n const { documentId, uid } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n const { [uid]: _gone, ...rest } = docState.byUid;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: { ...docState, byUid: rest },\n },\n };\n }\n\n // Global actions\n case ADD_TOOL: {\n const toolMap = new Map(state.tools.map((t) => [t.id, t]));\n toolMap.set(action.payload.id, action.payload);\n return { ...state, tools: Array.from(toolMap.values()) };\n }\n\n case SET_TOOL_DEFAULTS: {\n const { toolId, patch } = action.payload;\n return {\n ...state,\n tools: state.tools.map((tool) => {\n if (tool.id === toolId) {\n return { ...tool, defaults: { ...tool.defaults, ...patch } };\n }\n return tool;\n }),\n };\n }\n\n case ADD_COLOR_PRESET:\n return state.colorPresets.includes(action.payload)\n ? state\n : { ...state, colorPresets: [...state.colorPresets, action.payload] };\n\n default:\n return state;\n }\n};\n","/**\n * A simple, framework-agnostic state management utility for use within handlers.\n * It creates a closure to hold a value that persists across multiple calls\n * to the handler's methods (e.g., onPointerDown, onPointerMove).\n *\n * @param initialValue The initial value to store.\n * @returns A tuple containing:\n * - The current value.\n * - A function to set a new value.\n * - A function to get the current value without causing re-renders (useful inside closures).\n */\nexport function useState<T>(initialValue: T): [() => T, (newValue: T) => void] {\n let value = initialValue;\n const getValue = () => value;\n const setValue = (newValue: T) => {\n value = newValue;\n };\n return [getValue, setValue];\n}\n","import {\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n rectFromPoints,\n expandRect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\n\nexport const inkHandlerFactory: HandlerFactory<PdfInkAnnoObject> = {\n annotationType: PdfAnnotationSubtype.INK,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize } = context;\n const [getStrokes, setStrokes] = useState<Array<{ points: { x: number; y: number }[] }>>([]);\n const [getIsDrawing, setIsDrawing] = useState(false);\n const timerRef = { current: null as any };\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.INK> | null => {\n const strokes = getStrokes();\n if (strokes.length === 0 || strokes[0].points.length === 0) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = strokes.flatMap((s) => s.points);\n const bounds = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n return {\n type: PdfAnnotationSubtype.INK,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n inkList: strokes,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setIsDrawing(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n\n const newStrokes = [...getStrokes(), { points: [clampedPos] }];\n setStrokes(newStrokes);\n onPreview(getPreview());\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!getIsDrawing()) return;\n const strokes = getStrokes();\n if (strokes.length === 0) return;\n\n const clampedPos = clampToPage(pos);\n strokes[strokes.length - 1].points.push(clampedPos);\n setStrokes(strokes);\n onPreview(getPreview());\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n evt.releasePointerCapture?.();\n\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n const strokes = getStrokes();\n if (strokes.length > 0 && strokes[0].points.length > 1) {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const allPoints = strokes.flatMap((s) => s.points);\n const rect = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n onCommit({\n ...defaults,\n inkList: strokes,\n rect,\n type: PdfAnnotationSubtype.INK,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n });\n }\n setStrokes([]);\n onPreview(null);\n }, 800); // Commit after 800ms of inactivity\n },\n onPointerCancel: (_, evt) => {\n setStrokes([]);\n setIsDrawing(false);\n onPreview(null);\n if (timerRef.current) clearTimeout(timerRef.current);\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { useState } from '../utils/use-state';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationTool } from '../tools/types';\n\ninterface ClickDetectorOptions<T extends PdfAnnotationObject> {\n threshold?: number;\n getTool: () => AnnotationTool<T> | undefined;\n onClickDetected: (pos: { x: number; y: number }, tool: AnnotationTool<T>) => void;\n}\n\nexport function useClickDetector<T extends PdfAnnotationObject>({\n threshold = 5,\n getTool,\n onClickDetected,\n}: ClickDetectorOptions<T>) {\n const [getStartPos, setStartPos] = useState<{ x: number; y: number } | null>(null);\n const [getHasMoved, setHasMoved] = useState(false);\n\n return {\n onStart: (pos: { x: number; y: number }) => {\n setStartPos(pos);\n setHasMoved(false);\n },\n\n onMove: (pos: { x: number; y: number }) => {\n const start = getStartPos();\n if (!start || getHasMoved()) return;\n\n const distance = Math.sqrt(Math.pow(pos.x - start.x, 2) + Math.pow(pos.y - start.y, 2));\n\n if (distance > threshold) {\n setHasMoved(true);\n }\n },\n\n onEnd: (pos: { x: number; y: number }) => {\n const start = getStartPos();\n if (start && !getHasMoved()) {\n const tool = getTool();\n if (tool && 'clickBehavior' in tool && tool.clickBehavior?.enabled) {\n onClickDetected(pos, tool);\n }\n }\n setStartPos(null);\n setHasMoved(false);\n },\n\n hasMoved: getHasMoved,\n reset: () => {\n setStartPos(null);\n setHasMoved(false);\n },\n };\n}\n","import {\n PdfAnnotationSubtype,\n PdfFreeTextAnnoObject,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const freeTextHandlerFactory: HandlerFactory<PdfFreeTextAnnoObject> = {\n annotationType: PdfAnnotationSubtype.FREETEXT,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize, pageIndex } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontColor: tool.defaults.fontColor ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n fontSize: tool.defaults.fontSize ?? 12,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n backgroundColor: tool.defaults.backgroundColor ?? 'transparent',\n textAlign: tool.defaults.textAlign ?? PdfTextAlignment.Left,\n verticalAlign: tool.defaults.verticalAlign ?? PdfVerticalAlignment.Top,\n contents: tool.defaults.contents ?? 'Insert text here',\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfFreeTextAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n // TypeScript knows this is FreeTextClickBehavior\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n\n // Center the text box at click position, but keep within bounds\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n\n // Use defaultContent from clickBehavior if available, otherwise use tool defaults\n const contents = clickConfig.defaultContent ?? defaults.contents;\n\n const anno: PdfFreeTextAnnoObject = {\n ...defaults,\n contents,\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.FREETEXT> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const width = Math.abs(start.x - current.x);\n const height = Math.abs(start.y - current.y);\n\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n\n return {\n type: PdfAnnotationSubtype.FREETEXT,\n bounds: rect,\n data: {\n ...defaults,\n rect,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const minX = Math.min(start.x, clampedPos.x);\n const minY = Math.min(start.y, clampedPos.y);\n const width = Math.abs(start.x - clampedPos.x);\n const height = Math.abs(start.y - clampedPos.y);\n\n // Ignore tiny boxes\n const rect: Rect = {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n\n const anno: PdfFreeTextAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.FREETEXT,\n rect,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { PdfAnnotationLineEnding, Position } from '@embedpdf/models';\n\n/**\n * A handler that encapsulates all logic for a specific line ending type,\n * including SVG path generation, geometric vertex calculation, and rotation logic.\n * This is the single source of truth for each ending.\n */\nexport interface LineEndingHandler {\n /** Returns the SVG `d` attribute string for rendering. */\n getSvgPath: (strokeWidth: number) => string;\n /** Returns the vertices used for calculating the geometric bounding box. */\n getLocalPoints: (strokeWidth: number) => Position[];\n /** Returns the final rotation angle in radians based on the line segment's angle. */\n getRotation: (segmentAngle: number) => number;\n /** True if the shape should be filled, false if only stroked. */\n filled: boolean;\n}\n\n/**\n * Factory to create handlers for arrow-like shapes.\n * @param isClosed - If true, creates a closed (filled) arrowhead.\n */\nfunction createArrowHandler(isClosed: boolean): LineEndingHandler {\n const calculateGeometry = (sw: number) => {\n const len = sw * 9;\n const a = Math.PI / 6; // 30 degrees\n return {\n x: -len * Math.cos(a),\n y: len * Math.sin(a),\n };\n };\n\n return {\n getSvgPath: (sw) => {\n const { x, y } = calculateGeometry(sw);\n return isClosed ? `M 0 0 L ${x} ${y} L ${x} ${-y} Z` : `M ${x} ${y} L 0 0 L ${x} ${-y}`;\n },\n getLocalPoints: (sw) => {\n const { x, y } = calculateGeometry(sw);\n return [\n { x: 0, y: 0 },\n { x, y },\n { x, y: -y },\n ];\n },\n getRotation: (segmentAngle) => segmentAngle,\n filled: isClosed,\n };\n}\n\n/**\n * Factory to create handlers for simple line-based shapes like Butt and Slash.\n * @param lengthFactor - Multiplier for strokeWidth to determine length.\n * @param rotationFn - Function to determine rotation from segment angle.\n */\nfunction createLineHandler(\n lengthFactor: number,\n rotationFn: (angle: number) => number,\n): LineEndingHandler {\n const getHalfLength = (sw: number) => (sw * lengthFactor) / 2;\n\n return {\n getSvgPath: (sw) => {\n const l = getHalfLength(sw);\n return `M ${-l} 0 L ${l} 0`;\n },\n getLocalPoints: (sw) => {\n const l = getHalfLength(sw);\n return [\n { x: -l, y: 0 },\n { x: l, y: 0 },\n ];\n },\n getRotation: rotationFn,\n filled: false,\n };\n}\n\nconst OpenArrowHandler = createArrowHandler(false);\nconst ClosedArrowHandler = createArrowHandler(true);\n\n/**\n * A map containing the authoritative handler for each line ending type.\n */\nexport const LINE_ENDING_HANDLERS: Partial<Record<PdfAnnotationLineEnding, LineEndingHandler>> = {\n [PdfAnnotationLineEnding.OpenArrow]: OpenArrowHandler,\n [PdfAnnotationLineEnding.ClosedArrow]: ClosedArrowHandler,\n [PdfAnnotationLineEnding.ROpenArrow]: {\n ...OpenArrowHandler,\n getRotation: (segmentAngle) => segmentAngle + Math.PI,\n },\n [PdfAnnotationLineEnding.RClosedArrow]: {\n ...ClosedArrowHandler,\n getRotation: (segmentAngle) => segmentAngle + Math.PI,\n },\n [PdfAnnotationLineEnding.Circle]: {\n getSvgPath: (sw) => {\n const r = (sw * 5) / 2;\n return `M ${r} 0 A ${r} ${r} 0 1 1 ${-r} 0 A ${r} ${r} 0 1 1 ${r} 0`;\n },\n getLocalPoints: (sw) => {\n const r = (sw * 5) / 2;\n return [\n { x: -r, y: -r },\n { x: r, y: r },\n ];\n },\n getRotation: () => 0,\n filled: true,\n },\n [PdfAnnotationLineEnding.Square]: {\n getSvgPath: (sw) => {\n const h = (sw * 6) / 2;\n return `M ${-h} ${-h} L ${h} ${-h} L ${h} ${h} L ${-h} ${h} Z`;\n },\n getLocalPoints: (sw) => {\n const h = (sw * 6) / 2;\n return [\n { x: -h, y: -h }, // TL\n { x: h, y: -h }, // TR\n { x: h, y: h }, // BR\n { x: -h, y: h }, // BL\n ];\n },\n getRotation: (segmentAngle) => segmentAngle, // keep your new orientation\n filled: true,\n },\n [PdfAnnotationLineEnding.Diamond]: {\n getSvgPath: (sw) => {\n const h = (sw * 6) / 2;\n return `M 0 ${-h} L ${h} 0 L 0 ${h} L ${-h} 0 Z`;\n },\n getLocalPoints: (sw) => {\n const h = (sw * 6) / 2;\n return [\n { x: 0, y: -h },\n { x: h, y: 0 },\n { x: 0, y: h },\n { x: -h, y: 0 },\n ];\n },\n getRotation: (segmentAngle) => segmentAngle,\n filled: true,\n },\n [PdfAnnotationLineEnding.Butt]: createLineHandler(6, (angle) => angle + Math.PI / 2),\n [PdfAnnotationLineEnding.Slash]: createLineHandler(18, (angle) => angle + Math.PI / 1.5),\n};\n","import {\n Rect,\n Position,\n LineEndings,\n PdfAnnotationLineEnding,\n rotateAndTranslatePoint,\n rectFromPoints,\n expandRect,\n} from '@embedpdf/models';\nimport { LINE_ENDING_HANDLERS } from './line-ending-handlers';\n\nconst EXTRA_PADDING = 1.2;\n\n/**\n * Computes the exact bounding box for a line or polyline, including its endings and stroke width.\n * This function uses the central `LINE_ENDING_HANDLERS` to ensure calculations are\n * perfectly in sync with the rendering logic.\n */\nexport function lineRectWithEndings(\n vertices: Position[],\n strokeWidth: number,\n endings: LineEndings | undefined,\n): Rect {\n if (!vertices || vertices.length === 0) {\n return { origin: { x: 0, y: 0 }, size: { width: 0, height: 0 } };\n }\n\n const allPoints: Position[] = [...vertices];\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const processEnding = (\n endingType: PdfAnnotationLineEnding | undefined,\n tipPos: Position,\n segmentAngle: number,\n ) => {\n if (!endingType) return;\n\n const handler = LINE_ENDING_HANDLERS[endingType];\n if (!handler) return;\n\n const localPts = handler.getLocalPoints(strokeWidth);\n const rotationAngle = handler.getRotation(segmentAngle);\n\n const transformedPts = localPts.map((p) => rotateAndTranslatePoint(p, rotationAngle, tipPos));\n allPoints.push(...transformedPts);\n };\n\n if (vertices.length >= 2) {\n // Process start ending. Angle points from the second vertex INTO the first.\n const startAngle = toAngle(vertices[1], vertices[0]);\n processEnding(endings?.start, vertices[0], startAngle);\n\n // Process end ending. Angle points from the second-to-last vertex INTO the last.\n const lastIdx = vertices.length - 1;\n const endAngle = toAngle(vertices[lastIdx - 1], vertices[lastIdx]);\n processEnding(endings?.end, vertices[lastIdx], endAngle);\n }\n\n if (allPoints.length <= 1) {\n const point = vertices[0] || { x: 0, y: 0 };\n const pad = strokeWidth;\n return {\n origin: { x: point.x - pad, y: point.y - pad },\n size: { width: pad * 2, height: pad * 2 },\n };\n }\n\n const baseRect = rectFromPoints(allPoints);\n const pad = strokeWidth / 2 + EXTRA_PADDING * strokeWidth;\n return expandRect(baseRect, pad);\n}\n","import { PdfAnnotationLineEnding } from '@embedpdf/models';\nimport { LINE_ENDING_HANDLERS } from './line-ending-handlers';\n\nexport interface SvgEnding {\n d: string;\n transform: string;\n filled: boolean;\n}\n\n/**\n * Factory that returns SVG path data and transform attributes for a given line ending.\n * It uses a central handler for each ending type to ensure consistency.\n */\nexport function createEnding(\n ending: PdfAnnotationLineEnding | undefined,\n strokeWidth: number,\n rad: number, // direction angle in radians of the line segment\n px: number, // x-coordinate of the line's endpoint\n py: number, // y-coordinate of the line's endpoint\n): SvgEnding | null {\n if (!ending) return null;\n\n const handler = LINE_ENDING_HANDLERS[ending];\n if (!handler) return null;\n\n const toDeg = (r: number) => (r * 180) / Math.PI;\n const rotationAngle = handler.getRotation(rad);\n\n return {\n d: handler.getSvgPath(strokeWidth),\n transform: `translate(${px} ${py}) rotate(${toDeg(rotationAngle)})`,\n filled: handler.filled,\n };\n}\n","// packages/plugin-annotation/src/lib/patching/patch-registry.ts\n\nimport { PdfAnnotationObject, PdfAnnotationSubtype } from '@embedpdf/models';\n\nexport interface TransformContext<T extends PdfAnnotationObject = PdfAnnotationObject> {\n /** The type of transformation being applied */\n type: 'move' | 'resize' | 'vertex-edit' | 'property-update';\n\n /** The changes being applied - can be any properties of the annotation */\n changes: Partial<T>;\n\n /** Optional metadata about the transformation */\n metadata?: {\n maintainAspectRatio?: boolean;\n [key: string]: any;\n };\n}\n\nexport type PatchFunction<T extends PdfAnnotationObject> = (\n original: T,\n context: TransformContext<T>,\n) => Partial<T>;\n\n/**\n * Registry for annotation-specific patch functions.\n * Each patch function knows how to transform its annotation type.\n */\nexport class PatchRegistry {\n private patches = new Map<PdfAnnotationSubtype, PatchFunction<any>>();\n\n register<T extends PdfAnnotationObject>(type: PdfAnnotationSubtype, patchFn: PatchFunction<T>) {\n this.patches.set(type, patchFn);\n }\n\n /**\n * Transform an annotation based on the context.\n * Returns the transformed properties or just the changes if no patch function exists.\n */\n transform<T extends PdfAnnotationObject>(\n annotation: T,\n context: TransformContext<T>,\n ): Partial<T> {\n const patchFn = this.patches.get(annotation.type);\n\n // If there's a specific patch function, use it\n if (patchFn) {\n return patchFn(annotation, context);\n }\n\n // Default behavior: just return the changes for simple annotations\n return context.changes;\n }\n}\n\nexport const patchRegistry = new PatchRegistry();\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfLineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport * as patching from '../patching';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const lineHandlerFactory: HandlerFactory<PdfLineAnnoObject> = {\n annotationType: PdfAnnotationSubtype.LINE,\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n lineEndings: tool.defaults.lineEndings ?? {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.None,\n },\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfLineAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const angle = clickConfig.defaultAngle ?? 0;\n const length = clickConfig.defaultLength;\n const halfLength = length / 2;\n\n // Calculate start and end points centered at click position\n const startX = pos.x - halfLength * Math.cos(angle);\n const startY = pos.y - halfLength * Math.sin(angle);\n const endX = pos.x + halfLength * Math.cos(angle);\n const endY = pos.y + halfLength * Math.sin(angle);\n\n // Clamp both points to page bounds\n const start = clampToPage({ x: startX, y: startY });\n const end = clampToPage({ x: endX, y: endY });\n\n // If clamping significantly altered the line, we might want to maintain the angle\n // by adjusting the opposite point, but for simplicity we'll just use the clamped points\n\n const rect = patching.lineRectWithEndings(\n [start, end],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n onCommit({\n ...defaults,\n rect,\n linePoints: { start, end },\n pageIndex,\n id: uuidV4(),\n created: new Date(),\n type: PdfAnnotationSubtype.LINE,\n });\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.LINE> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const bounds = patching.lineRectWithEndings(\n [start, current],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n return {\n type: PdfAnnotationSubtype.LINE,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n linePoints: { start, end: current },\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n // Only create if line is long enough\n if (Math.abs(clampedPos.x - start.x) > 2 || Math.abs(clampedPos.y - start.y) > 2) {\n const rect = patching.lineRectWithEndings(\n [start, clampedPos],\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n onCommit({\n ...defaults,\n rect,\n linePoints: { start, end: clampedPos },\n pageIndex,\n id: uuidV4(),\n flags: ['print'],\n created: new Date(),\n type: PdfAnnotationSubtype.LINE,\n });\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { clamp } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfPolylineAnnoObject,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport * as patching from '../patching';\n\nexport const polylineHandlerFactory: HandlerFactory<PdfPolylineAnnoObject> = {\n annotationType: PdfAnnotationSubtype.POLYLINE,\n create(context) {\n const { onCommit, onPreview, getTool, pageSize } = context;\n\n const [getVertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [getCurrent, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n lineEndings: tool.defaults.lineEndings ?? {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.None,\n },\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const commitPolyline = () => {\n const vertices = getVertices();\n if (vertices.length < 2) return; // A polyline needs at least two points.\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const rect = patching.lineRectWithEndings(\n vertices,\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n const anno: PdfPolylineAnnoObject = {\n ...defaults,\n vertices,\n rect,\n type: PdfAnnotationSubtype.POLYLINE,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.POLYLINE> | null => {\n const vertices = getVertices();\n const currentPos = getCurrent();\n if (vertices.length === 0 || !currentPos) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = [...vertices, currentPos];\n const bounds = patching.lineRectWithEndings(\n allPoints,\n defaults.strokeWidth,\n defaults.lineEndings,\n );\n\n return {\n type: PdfAnnotationSubtype.POLYLINE,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n vertices: allPoints,\n currentVertex: currentPos,\n },\n };\n };\n\n return {\n onClick: (pos) => {\n const clampedPos = clampToPage(pos);\n const vertices = getVertices();\n const lastVertex = vertices[vertices.length - 1];\n\n // Don't add duplicate points (prevents double-click issue)\n if (\n lastVertex &&\n Math.abs(lastVertex.x - clampedPos.x) < 1 &&\n Math.abs(lastVertex.y - clampedPos.y) < 1\n ) {\n return;\n }\n\n setVertices([...vertices, clampedPos]);\n setCurrent(clampedPos);\n onPreview(getPreview());\n },\n onDoubleClick: () => {\n commitPolyline();\n },\n onPointerMove: (pos) => {\n if (getVertices().length > 0) {\n const clampedPos = clampToPage(pos);\n setCurrent(clampedPos);\n onPreview(getPreview());\n }\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfPolygonAnnoObject,\n rectFromPoints,\n expandRect,\n uuidV4,\n PdfAnnotationBorderStyle,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\n\nconst HANDLE_SIZE_PX = 14;\n\nexport const polygonHandlerFactory: HandlerFactory<PdfPolygonAnnoObject> = {\n annotationType: PdfAnnotationSubtype.POLYGON,\n create(context) {\n const { onCommit, onPreview, getTool, scale, pageSize } = context;\n\n const [getVertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [getCurrent, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const isInsideStartHandle = (pos: { x: number; y: number }) => {\n const vertices = getVertices();\n if (vertices.length < 2) return false;\n const sizePDF = HANDLE_SIZE_PX / scale;\n const half = sizePDF / 2;\n const v0 = vertices[0];\n return (\n pos.x >= v0.x - half && pos.x <= v0.x + half && pos.y >= v0.y - half && pos.y <= v0.y + half\n );\n };\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const commitPolygon = () => {\n const vertices = getVertices();\n if (vertices.length < 3) return;\n const defaults = getDefaults();\n if (!defaults) return;\n\n const rect = expandRect(rectFromPoints(vertices), defaults.strokeWidth / 2);\n const anno: PdfPolygonAnnoObject = {\n ...defaults,\n vertices,\n rect,\n type: PdfAnnotationSubtype.POLYGON,\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n onCommit(anno);\n\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n };\n\n const getPreview = (): PreviewState<PdfAnnotationSubtype.POLYGON> | null => {\n const vertices = getVertices();\n const currentPos = getCurrent();\n if (vertices.length === 0 || !currentPos) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const allPoints = [...vertices, currentPos];\n const bounds = expandRect(rectFromPoints(allPoints), defaults.strokeWidth / 2);\n\n return {\n type: PdfAnnotationSubtype.POLYGON,\n bounds,\n data: {\n ...defaults,\n rect: bounds,\n vertices: vertices,\n currentVertex: currentPos,\n },\n };\n };\n\n return {\n onClick: (pos) => {\n const clampedPos = clampToPage(pos);\n\n if (isInsideStartHandle(clampedPos) && getVertices().length >= 3) {\n commitPolygon();\n return;\n }\n\n const vertices = getVertices();\n const lastVertex = vertices[vertices.length - 1];\n\n // Don't add duplicate points (prevents double-click issue)\n if (\n lastVertex &&\n Math.abs(lastVertex.x - clampedPos.x) < 1 &&\n Math.abs(lastVertex.y - clampedPos.y) < 1\n ) {\n return;\n }\n\n setVertices([...vertices, clampedPos]);\n setCurrent(clampedPos);\n onPreview(getPreview());\n },\n onDoubleClick: (_) => {\n commitPolygon();\n },\n onPointerMove: (pos) => {\n if (getVertices().length > 0) {\n const clampedPos = clampToPage(pos);\n setCurrent(clampedPos);\n onPreview(getPreview());\n }\n },\n onPointerCancel: (_) => {\n setVertices([]);\n setCurrent(null);\n onPreview(null);\n },\n };\n },\n};\n","import {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfSquareAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { clamp } from '@embedpdf/core';\nimport { useClickDetector } from './click-detector';\n\nexport const squareHandlerFactory: HandlerFactory<PdfSquareAnnoObject> = {\n annotationType: PdfAnnotationSubtype.SQUARE,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n flags: tool.defaults.flags ?? ['print'],\n strokeWidth: tool.defaults.strokeWidth ?? 2,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n };\n };\n\n const clickDetector = useClickDetector<PdfSquareAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n\n // Center at click position, but keep within bounds\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: x - halfStroke, y: y - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n const anno: PdfSquareAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.SQUARE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect,\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.SQUARE> | null => {\n const p1 = getStart();\n if (!p1) return null;\n\n const minX = Math.min(p1.x, current.x);\n const minY = Math.min(p1.y, current.y);\n const width = Math.abs(p1.x - current.x);\n const height = Math.abs(p1.y - current.y);\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n return {\n type: PdfAnnotationSubtype.SQUARE,\n bounds: rect,\n data: {\n rect,\n ...defaults,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const p1 = getStart();\n if (!p1) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const preview = getPreview(clampedPos);\n if (preview) {\n const anno: PdfSquareAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.SQUARE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect: preview.data.rect,\n };\n onCommit(anno);\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationIcon,\n PdfAnnotationSubtype,\n PdfStampAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory } from './types';\nimport { clamp } from '@embedpdf/core';\n\nexport const stampHandlerFactory: HandlerFactory<PdfStampAnnoObject> = {\n annotationType: PdfAnnotationSubtype.STAMP,\n create(context) {\n const { services, onCommit, getTool, pageSize } = context;\n\n return {\n onPointerDown: (pos) => {\n const tool = getTool();\n if (!tool) return;\n\n const { imageSrc, imageSize } = tool.defaults;\n\n const placeStamp = (imageData: ImageData, width: number, height: number) => {\n // Center the stamp at the click position, then clamp origin to stay fully on-page.\n const originX = pos.x - width / 2;\n const originY = pos.y - height / 2;\n const finalX = clamp(originX, 0, pageSize.width - width);\n const finalY = clamp(originY, 0, pageSize.height - height);\n\n const rect: Rect = {\n origin: { x: finalX, y: finalY },\n size: { width, height },\n };\n\n const anno: PdfStampAnnoObject = {\n ...tool.defaults,\n rect,\n type: PdfAnnotationSubtype.STAMP,\n icon: tool.defaults.icon ?? PdfAnnotationIcon.Draft,\n subject: tool.defaults.subject ?? 'Stamp',\n flags: tool.defaults.flags ?? ['print'],\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n onCommit(anno, { imageData });\n };\n\n if (imageSrc) {\n // Pre-defined stamp: process it with page dimensions as constraints\n services.processImage({\n source: imageSrc,\n maxWidth: pageSize.width,\n maxHeight: pageSize.height,\n onComplete: (result) =>\n placeStamp(\n result.imageData,\n imageSize?.width ?? result.width,\n imageSize?.height ?? result.height,\n ),\n });\n } else {\n // Dynamic stamp: let user select a file\n services.requestFile({\n accept: 'image/png,image/jpeg',\n onFile: (file) => {\n // Process the selected file with page dimensions as constraints\n services.processImage({\n source: file,\n maxWidth: pageSize.width,\n maxHeight: pageSize.height,\n onComplete: (result) => placeStamp(result.imageData, result.width, result.height),\n });\n },\n });\n }\n },\n };\n },\n};\n","import { clamp } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfCircleAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory, PreviewState } from './types';\nimport { useState } from '../utils/use-state';\nimport { useClickDetector } from './click-detector';\n\nexport const circleHandlerFactory: HandlerFactory<PdfCircleAnnoObject> = {\n annotationType: PdfAnnotationSubtype.CIRCLE,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeWidth: tool.defaults.strokeWidth ?? 2,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n strokeStyle: tool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID,\n strokeDashArray: tool.defaults.strokeDashArray ?? [],\n color: tool.defaults.color ?? '#000000',\n opacity: tool.defaults.opacity ?? 1,\n flags: tool.defaults.flags ?? ['print'],\n };\n };\n\n const clickDetector = useClickDetector<PdfCircleAnnoObject>({\n threshold: 5,\n getTool,\n onClickDetected: (pos, tool) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clickConfig = tool.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n\n // Center at click position, but keep within bounds\n const x = clamp(pos.x - halfWidth, 0, pageSize.width - width);\n const y = clamp(pos.y - halfHeight, 0, pageSize.height - height);\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: x - halfStroke, y: y - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n const anno: PdfCircleAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.CIRCLE,\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect,\n };\n\n onCommit(anno);\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.CIRCLE> | null => {\n const p1 = getStart();\n if (!p1) return null;\n\n const minX = Math.min(p1.x, current.x);\n const minY = Math.min(p1.y, current.y);\n const width = Math.abs(p1.x - current.x);\n const height = Math.abs(p1.y - current.y);\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const strokeWidth = defaults.strokeWidth;\n const halfStroke = strokeWidth / 2;\n\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: { width: width + strokeWidth, height: height + strokeWidth },\n };\n\n return {\n type: PdfAnnotationSubtype.CIRCLE,\n bounds: rect,\n data: {\n rect,\n ...defaults,\n },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n onPointerUp: (pos, evt) => {\n const p1 = getStart();\n if (!p1) return;\n\n const defaults = getDefaults();\n if (!defaults) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const preview = getPreview(clampedPos);\n if (preview) {\n const anno: PdfCircleAnnoObject = {\n ...defaults,\n type: PdfAnnotationSubtype.CIRCLE,\n flags: ['print'],\n created: new Date(),\n id: uuidV4(),\n pageIndex,\n rect: preview.data.rect,\n };\n onCommit(anno);\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import { expandRect, PdfInkAnnoObject, Rect, rectFromPoints } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\n\nexport const patchInk: PatchFunction<PdfInkAnnoObject> = (original, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // For ink annotations, vertex editing doesn't make much sense\n // Just return the changes as-is\n return ctx.changes;\n\n case 'move':\n // Simple move: just update rect and adjust ink points accordingly\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - original.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - original.rect.origin.y;\n\n const movedInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: p.x + dx,\n y: p.y + dy,\n })),\n }));\n\n return {\n rect: ctx.changes.rect,\n inkList: movedInkList,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = original.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Keep stroke inside rect: map inner-old -> inner-new\n const inset = (r: Rect, pad: number): Rect => ({\n origin: { x: r.origin.x + pad, y: r.origin.y + pad },\n size: {\n width: Math.max(1, r.size.width - pad * 2),\n height: Math.max(1, r.size.height - pad * 2),\n },\n });\n\n // Scale stroke by the limiting axis to avoid overflow\n const strokeScale = Math.min(\n ctx.changes.rect!.size.width / oldRect.size.width,\n ctx.changes.rect!.size.height / oldRect.size.height,\n );\n const newStrokeWidth = Math.max(1, Math.round(original.strokeWidth * strokeScale));\n\n const innerOld = inset(oldRect, original.strokeWidth / 2);\n const innerNew = inset(ctx.changes.rect!, newStrokeWidth / 2);\n\n const sx = innerNew.size.width / Math.max(innerOld.size.width, 1e-6);\n const sy = innerNew.size.height / Math.max(innerOld.size.height, 1e-6);\n\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: innerNew.origin.x + (p.x - innerOld.origin.x) * sx,\n y: innerNew.origin.y + (p.y - innerOld.origin.y) * sy,\n })),\n }));\n\n return {\n rect: ctx.changes.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth changes)\n if (ctx.changes.strokeWidth !== undefined) {\n const merged = { ...original, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const pts = merged.inkList.flatMap((s) => s.points);\n const rect = expandRect(rectFromPoints(pts), merged.strokeWidth / 2);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { PdfLineAnnoObject } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\nimport { lineRectWithEndings } from '../patch-utils';\n\nexport const patchLine: PatchFunction<PdfLineAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Line vertex editing: update line points and recalculate rect\n if (ctx.changes.linePoints) {\n const { start, end } = ctx.changes.linePoints;\n const rect = lineRectWithEndings([start, end], orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start, end },\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate line points\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n\n return {\n rect: ctx.changes.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale line points relative to old rect and apply to new rect\n const newLinePoints = {\n start: {\n x: ctx.changes.rect!.origin.x + (orig.linePoints.start.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (orig.linePoints.start.y - oldRect.origin.y) * scaleY,\n },\n end: {\n x: ctx.changes.rect!.origin.x + (orig.linePoints.end.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (orig.linePoints.end.y - oldRect.origin.y) * scaleY,\n },\n };\n\n return {\n rect: ctx.changes.rect,\n linePoints: newLinePoints,\n };\n }\n return ctx.changes;\n\n case 'property-update':\n // For property updates that might affect the rect\n if (ctx.changes.strokeWidth || ctx.changes.lineEndings) {\n const merged = { ...orig, ...ctx.changes };\n const rect = lineRectWithEndings(\n [merged.linePoints.start, merged.linePoints.end],\n merged.strokeWidth,\n merged.lineEndings,\n );\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { PdfPolylineAnnoObject } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\nimport { lineRectWithEndings } from '../patch-utils';\n\nexport const patchPolyline: PatchFunction<PdfPolylineAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Polyline vertex editing: update vertices and recalculate rect\n if (ctx.changes.vertices && ctx.changes.vertices.length) {\n return {\n rect: lineRectWithEndings(ctx.changes.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.changes.vertices,\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate all vertices\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n\n return {\n rect: ctx.changes.rect,\n vertices: moved,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale vertices relative to old rect and apply to new rect\n const scaledVertices = orig.vertices.map((vertex) => ({\n x: ctx.changes.rect!.origin.x + (vertex.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (vertex.y - oldRect.origin.y) * scaleY,\n }));\n\n return {\n rect: ctx.changes.rect,\n vertices: scaledVertices,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth or lineEndings changes)\n if (ctx.changes.strokeWidth !== undefined || ctx.changes.lineEndings !== undefined) {\n const merged = { ...orig, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const rect = lineRectWithEndings(merged.vertices, merged.strokeWidth, merged.lineEndings);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { expandRect, PdfPolygonAnnoObject, rectFromPoints } from '@embedpdf/models';\n\nimport { PatchFunction } from '../patch-registry';\n\nexport const patchPolygon: PatchFunction<PdfPolygonAnnoObject> = (orig, ctx) => {\n // Handle different transformation types\n switch (ctx.type) {\n case 'vertex-edit':\n // Polygon vertex editing: update vertices and recalculate rect\n if (ctx.changes.vertices && ctx.changes.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.changes.vertices), pad),\n vertices: ctx.changes.vertices,\n };\n }\n return ctx.changes;\n\n case 'move':\n // Simple move: translate all vertices\n if (ctx.changes.rect) {\n const dx = ctx.changes.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.changes.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n\n return {\n rect: ctx.changes.rect,\n vertices: moved,\n };\n }\n return ctx.changes;\n\n case 'resize':\n // Complex resize with scaling\n if (ctx.changes.rect) {\n const oldRect = orig.rect;\n const newRect = ctx.changes.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10;\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.changes.rect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.metadata?.maintainAspectRatio) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n ctx.changes.rect!.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale vertices relative to old rect and apply to new rect\n const scaledVertices = orig.vertices.map((vertex) => ({\n x: ctx.changes.rect!.origin.x + (vertex.x - oldRect.origin.x) * scaleX,\n y: ctx.changes.rect!.origin.y + (vertex.y - oldRect.origin.y) * scaleY,\n }));\n\n return {\n rect: ctx.changes.rect,\n vertices: scaledVertices,\n };\n }\n return ctx.changes;\n case 'property-update':\n // For property updates that might affect the rect (strokeWidth changes)\n if (ctx.changes.strokeWidth !== undefined) {\n const merged = { ...orig, ...ctx.changes };\n // Recalculate rect using the same logic as deriveRect\n const pad = merged.strokeWidth / 2;\n const rect = expandRect(rectFromPoints(merged.vertices), pad);\n return { ...ctx.changes, rect };\n }\n return ctx.changes;\n default:\n // For other property updates or unknown types, just return the changes\n return ctx.changes;\n }\n};\n","import { BasePlugin, createBehaviorEmitter, PluginRegistry, Listener } from '@embedpdf/core';\nimport {\n ignore,\n PdfAnnotationObject,\n PdfDocumentObject,\n PdfErrorReason,\n Task,\n PdfTaskHelper,\n PdfErrorCode,\n AnnotationCreateContext,\n uuidV4,\n PdfAnnotationSubtype,\n} from '@embedpdf/models';\nimport {\n AnnotationCapability,\n AnnotationEvent,\n AnnotationPluginConfig,\n AnnotationState,\n AnnotationDocumentState,\n AnnotationScope,\n AnnotationStateChangeEvent,\n AnnotationActiveToolChangeEvent,\n AnnotationToolsChangeEvent,\n GetPageAnnotationsOptions,\n ImportAnnotationItem,\n RenderAnnotationOptions,\n TrackedAnnotation,\n TransformOptions,\n} from './types';\nimport {\n setAnnotations,\n selectAnnotation,\n deselectAnnotation,\n AnnotationAction,\n addColorPreset,\n createAnnotation,\n patchAnnotation,\n deleteAnnotation,\n commitPendingChanges,\n purgeAnnotation,\n setToolDefaults,\n setActiveToolId,\n addTool,\n initAnnotationState,\n cleanupAnnotationState,\n} from './actions';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { SelectionPlugin, SelectionCapability } from '@embedpdf/plugin-selection';\nimport { HistoryPlugin, HistoryCapability, Command } from '@embedpdf/plugin-history';\nimport { getAnnotationByUid, getSelectedAnnotation } from './selectors';\nimport { initialDocumentState } from './reducer';\nimport { AnnotationTool } from './tools/types';\nimport { AnyPreviewState, HandlerContext, HandlerFactory, HandlerServices } from './handlers/types';\nimport {\n circleHandlerFactory,\n squareHandlerFactory,\n stampHandlerFactory,\n polygonHandlerFactory,\n polylineHandlerFactory,\n lineHandlerFactory,\n inkHandlerFactory,\n freeTextHandlerFactory,\n} from './handlers';\nimport { PatchRegistry, TransformContext } from './patching/patch-registry';\nimport { patchInk, patchLine, patchPolyline, patchPolygon } from './patching/patches';\n\nexport class AnnotationPlugin extends BasePlugin<\n AnnotationPluginConfig,\n AnnotationCapability,\n AnnotationState,\n AnnotationAction\n> {\n static readonly id = 'annotation' as const;\n private readonly ANNOTATION_HISTORY_TOPIC = 'annotations';\n\n public readonly config: AnnotationPluginConfig;\n private readonly state$ = createBehaviorEmitter<AnnotationStateChangeEvent>();\n private readonly interactionManager: InteractionManagerCapability | null;\n private readonly selection: SelectionCapability | null;\n private readonly history: HistoryCapability | null;\n\n // Per-document state\n private pendingContexts = new Map<string, Map<string, unknown>>();\n private isInitialLoadComplete = new Map<string, boolean>();\n private importQueue = new Map<string, ImportAnnotationItem<PdfAnnotationObject>[]>();\n\n private handlerFactories = new Map<PdfAnnotationSubtype, HandlerFactory<any>>();\n private readonly activeTool$ = createBehaviorEmitter<AnnotationActiveToolChangeEvent>();\n private readonly events$ = createBehaviorEmitter<AnnotationEvent>();\n private readonly toolsChange$ = createBehaviorEmitter<AnnotationToolsChangeEvent>();\n private readonly patchRegistry = new PatchRegistry();\n\n constructor(id: string, registry: PluginRegistry, config: AnnotationPluginConfig) {\n super(id, registry);\n this.config = config;\n\n this.selection = registry.getPlugin<SelectionPlugin>('selection')?.provides() ?? null;\n this.history = registry.getPlugin<HistoryPlugin>('history')?.provides() ?? null;\n this.interactionManager =\n registry.getPlugin<InteractionManagerPlugin>('interaction-manager')?.provides() ?? null;\n\n this.registerHandlerFactories();\n this.registerBuiltInPatches();\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize annotation state for this document\n this.dispatch(initAnnotationState(documentId, initialDocumentState()));\n\n // Initialize per-document tracking\n this.pendingContexts.set(documentId, new Map());\n this.isInitialLoadComplete.set(documentId, false);\n this.importQueue.set(documentId, []);\n\n this.logger.debug(\n 'AnnotationPlugin',\n 'DocumentOpened',\n `Initialized annotation state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentLoaded(documentId: string): void {\n // Load all annotations for this document\n const docState = this.getCoreDocument(documentId);\n if (docState?.document) {\n this.getAllAnnotations(documentId, docState.document);\n }\n\n if (this.selection) {\n for (const tool of this.state.tools) {\n if (tool.interaction.textSelection) {\n this.selection.enableForMode(tool.interaction.mode ?? tool.id);\n }\n }\n }\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup annotation state\n this.dispatch(cleanupAnnotationState(documentId));\n\n // Cleanup per-document tracking\n this.pendingContexts.delete(documentId);\n this.isInitialLoadComplete.delete(documentId);\n this.importQueue.delete(documentId);\n\n this.logger.debug(\n 'AnnotationPlugin',\n 'DocumentClosed',\n `Cleaned up annotation state for document: ${documentId}`,\n );\n }\n\n private registerHandlerFactories() {\n this.handlerFactories.set(PdfAnnotationSubtype.CIRCLE, circleHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.SQUARE, squareHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.STAMP, stampHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.POLYGON, polygonHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.POLYLINE, polylineHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.LINE, lineHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.INK, inkHandlerFactory);\n this.handlerFactories.set(PdfAnnotationSubtype.FREETEXT, freeTextHandlerFactory);\n }\n\n private registerBuiltInPatches() {\n this.patchRegistry.register(PdfAnnotationSubtype.INK, patchInk);\n this.patchRegistry.register(PdfAnnotationSubtype.LINE, patchLine);\n this.patchRegistry.register(PdfAnnotationSubtype.POLYLINE, patchPolyline);\n this.patchRegistry.register(PdfAnnotationSubtype.POLYGON, patchPolygon);\n }\n\n async initialize(): Promise<void> {\n // Register interaction modes for all tools defined in the initial state\n this.state.tools.forEach((tool) => this.registerInteractionForTool(tool));\n\n // Listen to history changes for each document\n if (this.history) {\n this.history.onHistoryChange((event) => {\n if (event.topic === this.ANNOTATION_HISTORY_TOPIC && this.config.autoCommit !== false) {\n this.commit(event.documentId);\n }\n });\n }\n\n this.interactionManager?.onModeChange((s) => {\n const newToolId =\n this.state.tools.find((t) => (t.interaction.mode ?? t.id) === s.activeMode)?.id ?? null;\n const currentToolId = this.state.documents[s.documentId]?.activeToolId ?? null;\n if (newToolId !== currentToolId && s.documentId) {\n this.dispatch(setActiveToolId(s.documentId, newToolId));\n }\n });\n\n this.selection?.onEndSelection(({ documentId }) => {\n const activeTool = this.getActiveTool(documentId);\n if (!activeTool || !activeTool.interaction.textSelection) return;\n\n const formattedSelection = this.selection?.getFormattedSelection();\n const selectionText = this.selection?.getSelectedText();\n\n if (!formattedSelection || !selectionText) return;\n\n for (const selection of formattedSelection) {\n selectionText.wait((text) => {\n const annotationId = uuidV4();\n // Create an annotation using the defaults from the active text tool\n this.createAnnotation(\n selection.pageIndex,\n {\n ...activeTool.defaults,\n rect: selection.rect,\n segmentRects: selection.segmentRects,\n pageIndex: selection.pageIndex,\n created: new Date(),\n id: annotationId,\n custom: {\n text: text.join('\\n'),\n },\n } as PdfAnnotationObject,\n undefined,\n documentId,\n );\n\n if (this.getToolBehavior(activeTool, 'deactivateToolAfterCreate')) {\n this.setActiveTool(null, documentId);\n }\n if (this.getToolBehavior(activeTool, 'selectAfterCreate')) {\n this.selectAnnotation(selection.pageIndex, annotationId, documentId);\n }\n }, ignore);\n }\n\n this.selection?.clear();\n });\n }\n\n private registerInteractionForTool(tool: AnnotationTool) {\n this.interactionManager?.registerMode({\n id: tool.interaction.mode ?? tool.id,\n scope: 'page',\n exclusive: tool.interaction.exclusive,\n cursor: tool.interaction.cursor,\n });\n }\n\n protected buildCapability(): AnnotationCapability {\n return {\n // Active document operations\n getActiveTool: () => this.getActiveTool(),\n setActiveTool: (toolId) => this.setActiveTool(toolId),\n getState: () => this.getDocumentState(),\n getPageAnnotations: (options) => this.getPageAnnotations(options),\n getSelectedAnnotation: () => this.getSelectedAnnotation(),\n getAnnotationById: (id) => this.getAnnotationById(id),\n selectAnnotation: (pageIndex, id) => this.selectAnnotation(pageIndex, id),\n deselectAnnotation: () => this.deselectAnnotation(),\n importAnnotations: (items) => this.importAnnotations(items),\n createAnnotation: (pageIndex, anno, ctx) => this.createAnnotation(pageIndex, anno, ctx),\n updateAnnotation: (pageIndex, id, patch) => this.updateAnnotation(pageIndex, id, patch),\n deleteAnnotation: (pageIndex, id) => this.deleteAnnotation(pageIndex, id),\n renderAnnotation: (options) => this.renderAnnotation(options),\n commit: () => this.commit(),\n\n // Document-scoped operations\n forDocument: (documentId) => this.createAnnotationScope(documentId),\n\n // Global operations\n getTools: () => this.state.tools,\n getTool: (toolId) => this.getTool(toolId),\n addTool: (tool) => {\n this.dispatch(addTool(tool));\n this.registerInteractionForTool(tool);\n },\n findToolForAnnotation: (anno) => this.findToolForAnnotation(anno),\n setToolDefaults: (toolId, patch) => this.dispatch(setToolDefaults(toolId, patch)),\n getColorPresets: () => [...this.state.colorPresets],\n addColorPreset: (color) => this.dispatch(addColorPreset(color)),\n transformAnnotation: (annotation, options) => this.transformAnnotation(annotation, options),\n registerPatchFunction: (type, patchFn) => this.registerPatchFunction(type, patchFn),\n\n // Events\n onStateChange: this.state$.on,\n onActiveToolChange: this.activeTool$.on,\n onAnnotationEvent: this.events$.on,\n onToolsChange: this.toolsChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createAnnotationScope(documentId: string): AnnotationScope {\n return {\n getState: () => this.getDocumentState(documentId),\n getPageAnnotations: (options) => this.getPageAnnotations(options, documentId),\n getSelectedAnnotation: () => this.getSelectedAnnotation(documentId),\n getAnnotationById: (id) => this.getAnnotationById(id, documentId),\n selectAnnotation: (pageIndex, id) => this.selectAnnotation(pageIndex, id, documentId),\n deselectAnnotation: () => this.deselectAnnotation(documentId),\n getActiveTool: () => this.getActiveTool(documentId),\n setActiveTool: (toolId) => this.setActiveTool(toolId, documentId),\n findToolForAnnotation: (anno) => this.findToolForAnnotation(anno),\n importAnnotations: (items) => this.importAnnotations(items, documentId),\n createAnnotation: (pageIndex, anno, ctx) =>\n this.createAnnotation(pageIndex, anno, ctx, documentId),\n updateAnnotation: (pageIndex, id, patch) =>\n this.updateAnnotation(pageIndex, id, patch, documentId),\n deleteAnnotation: (pageIndex, id) => this.deleteAnnotation(pageIndex, id, documentId),\n renderAnnotation: (options) => this.renderAnnotation(options, documentId),\n commit: () => this.commit(documentId),\n onStateChange: (listener: Listener<AnnotationDocumentState>) =>\n this.state$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n onAnnotationEvent: (listener: Listener<AnnotationEvent>) =>\n this.events$.on((event) => {\n if (event.documentId === documentId) listener(event);\n }),\n onActiveToolChange: (listener: Listener<AnnotationTool | null>) =>\n this.activeTool$.on((event) => {\n if (event.documentId === documentId) listener(event.tool);\n }),\n };\n }\n\n override onStoreUpdated(prev: AnnotationState, next: AnnotationState): void {\n // Emit state change events for each changed document\n for (const documentId in next.documents) {\n const prevDoc = prev.documents[documentId];\n const nextDoc = next.documents[documentId];\n\n if (prevDoc !== nextDoc) {\n this.state$.emit({\n documentId,\n state: nextDoc,\n });\n\n // Emit active tool change if it changed for this document\n if (prevDoc && prevDoc.activeToolId !== nextDoc.activeToolId) {\n this.activeTool$.emit({\n documentId,\n tool: this.getActiveTool(documentId),\n });\n }\n }\n }\n\n // If the tools array itself changes, emit active tool for all documents and tools change event\n if (prev.tools !== next.tools) {\n for (const documentId in next.documents) {\n this.activeTool$.emit({\n documentId,\n tool: this.getActiveTool(documentId),\n });\n }\n\n // Emit tools change event for UI components that only care about tool defaults\n this.toolsChange$.emit({\n tools: next.tools,\n });\n }\n }\n\n private registerPatchFunction<T extends PdfAnnotationObject>(\n type: PdfAnnotationSubtype,\n patchFn: (original: T, context: TransformContext<T>) => Partial<T>,\n ) {\n this.patchRegistry.register(type, patchFn);\n }\n\n private transformAnnotation<T extends PdfAnnotationObject>(\n annotation: T,\n options: TransformOptions<T>,\n ) {\n const context: TransformContext<T> = {\n type: options.type,\n changes: options.changes,\n metadata: options.metadata,\n };\n\n return this.patchRegistry.transform(annotation, context);\n }\n\n public registerPageHandlers(\n documentId: string,\n pageIndex: number,\n scale: number,\n callbacks: {\n services: HandlerServices;\n onPreview: (toolId: string, state: AnyPreviewState | null) => void;\n },\n ) {\n const docState = this.getCoreDocument(documentId);\n const page = docState?.document?.pages[pageIndex];\n if (!page) return () => {};\n if (!this.interactionManager) return () => {};\n\n const unregisterFns: (() => void)[] = [];\n\n for (const tool of this.state.tools) {\n if (!tool.defaults.type) continue;\n const factory = this.handlerFactories.get(tool.defaults.type);\n if (!factory) continue;\n\n const context: HandlerContext<PdfAnnotationObject> = {\n pageIndex,\n pageSize: page.size,\n scale,\n services: callbacks.services, // Pass through services\n onPreview: (state) => callbacks.onPreview(tool.id, state),\n onCommit: (annotation, ctx) => {\n this.createAnnotation(pageIndex, annotation, ctx, documentId);\n if (this.getToolBehavior(tool, 'deactivateToolAfterCreate')) {\n this.setActiveTool(null, documentId);\n }\n if (this.getToolBehavior(tool, 'selectAfterCreate')) {\n this.selectAnnotation(pageIndex, annotation.id, documentId);\n }\n },\n getTool: () => this.state.tools.find((t) => t.id === tool.id),\n };\n\n const unregister = this.interactionManager.registerHandlers({\n documentId,\n modeId: tool.interaction.mode ?? tool.id,\n handlers: factory.create(context),\n pageIndex,\n });\n\n unregisterFns.push(unregister);\n }\n\n return () => unregisterFns.forEach((fn) => fn());\n }\n\n // ─────────────────────────────────────────────────────────\n // Helper Methods\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): AnnotationDocumentState {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.state.documents[id];\n if (!docState) {\n throw new Error(`Annotation state not found for document: ${id}`);\n }\n return docState;\n }\n\n private getAllAnnotations(documentId: string, doc: PdfDocumentObject) {\n const task = this.engine.getAllAnnotations(doc);\n task.wait((annotations) => {\n this.dispatch(setAnnotations(documentId, annotations));\n\n // Mark initial load as complete\n this.isInitialLoadComplete.set(documentId, true);\n\n // Process any queued imports\n const queue = this.importQueue.get(documentId);\n if (queue && queue.length > 0) {\n this.processImportQueue(documentId);\n }\n\n this.events$.emit({\n type: 'loaded',\n documentId,\n total: Object.values(annotations).reduce(\n (sum, pageAnnotations) => sum + pageAnnotations.length,\n 0,\n ),\n });\n }, ignore);\n }\n\n private getPageAnnotations(\n options: GetPageAnnotationsOptions,\n documentId?: string,\n ): Task<PdfAnnotationObject[], PdfErrorReason> {\n const { pageIndex } = options;\n const id = documentId ?? this.getActiveDocumentId();\n\n const docState = this.getCoreDocument(id);\n const doc = docState?.document;\n if (!doc) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n }\n\n const page = doc.pages.find((p: any) => p.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Page not found' });\n }\n\n return this.engine.getPageAnnotations(doc, page);\n }\n\n private getSelectedAnnotation(documentId?: string): TrackedAnnotation | null {\n return getSelectedAnnotation(this.getDocumentState(documentId));\n }\n\n private getAnnotationById(id: string, documentId?: string): TrackedAnnotation | null {\n const docState = this.getDocumentState(documentId);\n return getAnnotationByUid(docState, id);\n }\n\n private renderAnnotation(\n { pageIndex, annotation, options }: RenderAnnotationOptions,\n documentId?: string,\n ) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getCoreDocument(id);\n const doc = docState?.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n }\n\n const page = doc.pages.find((page: any) => page.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Page not found' });\n }\n\n return this.engine.renderPageAnnotation(doc, page, annotation, options);\n }\n\n private importAnnotations(\n items: ImportAnnotationItem<PdfAnnotationObject>[],\n documentId?: string,\n ) {\n const id = documentId ?? this.getActiveDocumentId();\n\n // If initial load hasn't completed, queue the items\n if (!this.isInitialLoadComplete.get(id)) {\n const queue = this.importQueue.get(id) || [];\n queue.push(...items);\n this.importQueue.set(id, queue);\n return;\n }\n\n // Otherwise, import immediately\n this.processImportItems(id, items);\n }\n\n private processImportQueue(documentId: string) {\n const queue = this.importQueue.get(documentId);\n if (!queue || queue.length === 0) return;\n\n const items = [...queue];\n this.importQueue.set(documentId, []); // Clear the queue\n this.processImportItems(documentId, items);\n }\n\n private processImportItems(\n documentId: string,\n items: ImportAnnotationItem<PdfAnnotationObject>[],\n ) {\n const contexts = this.pendingContexts.get(documentId);\n if (!contexts) return;\n\n for (const item of items) {\n const { annotation, ctx } = item;\n const pageIndex = annotation.pageIndex;\n const id = annotation.id;\n\n this.dispatch(createAnnotation(documentId, pageIndex, annotation));\n if (ctx) contexts.set(id, ctx);\n }\n\n if (this.config.autoCommit !== false) this.commit(documentId);\n }\n\n private createAnnotation<A extends PdfAnnotationObject>(\n pageIndex: number,\n annotation: A,\n ctx?: AnnotationCreateContext<A>,\n documentId?: string,\n ) {\n const id = annotation.id;\n const docId = documentId ?? this.getActiveDocumentId();\n const contexts = this.pendingContexts.get(docId);\n if (!contexts) return;\n\n const newAnnotation = {\n ...annotation,\n author: annotation.author ?? this.config.annotationAuthor,\n };\n const execute = () => {\n this.dispatch(createAnnotation(docId, pageIndex, newAnnotation));\n if (ctx) contexts.set(id, ctx);\n this.events$.emit({\n type: 'create',\n documentId: docId,\n annotation: newAnnotation,\n pageIndex,\n ctx,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit) this.commit(docId);\n return;\n }\n const command: Command = {\n execute,\n undo: () => {\n contexts.delete(id);\n this.dispatch(deselectAnnotation(docId));\n this.dispatch(deleteAnnotation(docId, pageIndex, id));\n this.events$.emit({\n type: 'delete',\n documentId: docId,\n annotation: newAnnotation,\n pageIndex,\n committed: false,\n });\n },\n };\n const historyScope = this.history.forDocument(docId);\n historyScope.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private buildPatch(original: PdfAnnotationObject, patch: Partial<PdfAnnotationObject>) {\n if ('rect' in patch) return patch;\n\n return this.transformAnnotation(original, {\n type: 'property-update',\n changes: patch,\n });\n }\n\n private updateAnnotation(\n pageIndex: number,\n id: string,\n patch: Partial<PdfAnnotationObject>,\n documentId?: string,\n ) {\n const docId = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentState(docId);\n const originalObject = docState.byUid[id].object;\n const finalPatch = this.buildPatch(originalObject, {\n ...patch,\n author: patch.author ?? this.config.annotationAuthor,\n });\n\n const execute = () => {\n this.dispatch(patchAnnotation(docId, pageIndex, id, finalPatch));\n this.events$.emit({\n type: 'update',\n documentId: docId,\n annotation: originalObject,\n pageIndex,\n patch: finalPatch,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit !== false) {\n this.commit(docId);\n }\n return;\n }\n const originalPatch = Object.fromEntries(\n Object.keys(patch).map((key) => [key, originalObject[key as keyof PdfAnnotationObject]]),\n );\n const command: Command = {\n execute,\n undo: () => {\n this.dispatch(patchAnnotation(docId, pageIndex, id, originalPatch));\n this.events$.emit({\n type: 'update',\n documentId: docId,\n annotation: originalObject,\n pageIndex,\n patch: originalPatch,\n committed: false,\n });\n },\n };\n const historyScope = this.history.forDocument(docId);\n historyScope.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private deleteAnnotation(pageIndex: number, id: string, documentId?: string) {\n const docId = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentState(docId);\n const originalAnnotation = docState.byUid[id]?.object;\n if (!originalAnnotation) return;\n\n const execute = () => {\n this.dispatch(deselectAnnotation(docId));\n this.dispatch(deleteAnnotation(docId, pageIndex, id));\n this.events$.emit({\n type: 'delete',\n documentId: docId,\n annotation: originalAnnotation,\n pageIndex,\n committed: false,\n });\n };\n\n if (!this.history) {\n execute();\n if (this.config.autoCommit !== false) this.commit(docId);\n return;\n }\n const command: Command = {\n execute,\n undo: () => {\n this.dispatch(createAnnotation(docId, pageIndex, originalAnnotation));\n this.events$.emit({\n type: 'create',\n documentId: docId,\n annotation: originalAnnotation,\n pageIndex,\n committed: false,\n });\n },\n };\n const historyScope = this.history.forDocument(docId);\n historyScope.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private selectAnnotation(pageIndex: number, id: string, documentId?: string) {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(selectAnnotation(docId, pageIndex, id));\n }\n\n private deselectAnnotation(documentId?: string) {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(deselectAnnotation(docId));\n }\n\n public getActiveTool(documentId?: string): AnnotationTool | null {\n const docState = this.getDocumentState(documentId);\n if (!docState.activeToolId) return null;\n return this.state.tools.find((t) => t.id === docState.activeToolId) ?? null;\n }\n\n public setActiveTool(toolId: string | null, documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentState(docId);\n if (toolId === docState.activeToolId) return;\n\n this.dispatch(setActiveToolId(docId, toolId));\n\n const tool = this.state.tools.find((t) => t.id === toolId);\n if (tool) {\n this.interactionManager?.forDocument(docId).activate(tool.interaction.mode ?? tool.id);\n } else {\n this.interactionManager?.forDocument(docId).activateDefaultMode();\n }\n }\n\n public getTool<T extends AnnotationTool>(toolId: string): T | undefined {\n return this.state.tools.find((t) => t.id === toolId) as T | undefined;\n }\n\n public findToolForAnnotation(annotation: PdfAnnotationObject): AnnotationTool | null {\n let bestTool: AnnotationTool | null = null;\n let bestScore = 0;\n for (const tool of this.state.tools) {\n const score = tool.matchScore(annotation);\n if (score > bestScore) {\n bestScore = score;\n bestTool = tool;\n }\n }\n return bestTool;\n }\n\n private commit(documentId?: string): Task<boolean, PdfErrorReason> {\n const task = new Task<boolean, PdfErrorReason>();\n const docId = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentState(docId);\n\n if (!docState.hasPendingChanges) return PdfTaskHelper.resolve(true);\n\n const coreDocState = this.getCoreDocument(docId);\n const doc = coreDocState?.document;\n if (!doc)\n return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: 'Document not found' });\n\n const contexts = this.pendingContexts.get(docId);\n if (!contexts) return PdfTaskHelper.resolve(true);\n\n const creations: Task<any, PdfErrorReason>[] = [];\n const updates: Task<any, PdfErrorReason>[] = [];\n const deletions: { ta: TrackedAnnotation; uid: string }[] = [];\n\n // 1. Group all pending changes by operation type\n for (const [uid, ta] of Object.entries(docState.byUid)) {\n if (ta.commitState === 'synced') continue;\n\n const page = doc.pages.find((p) => p.index === ta.object.pageIndex);\n if (!page) continue;\n\n switch (ta.commitState) {\n case 'new':\n const ctx = contexts.get(ta.object.id) as AnnotationCreateContext<typeof ta.object>;\n const task = this.engine.createPageAnnotation!(doc, page, ta.object, ctx);\n task.wait(() => {\n this.events$.emit({\n type: 'create',\n documentId: docId,\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n ctx,\n committed: true,\n });\n contexts.delete(ta.object.id);\n }, ignore);\n creations.push(task);\n break;\n case 'dirty':\n const updateTask = this.engine.updatePageAnnotation!(doc, page, ta.object);\n updateTask.wait(() => {\n this.events$.emit({\n type: 'update',\n documentId: docId,\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n patch: ta.object,\n committed: true,\n });\n }, ignore);\n updates.push(updateTask);\n break;\n case 'deleted':\n deletions.push({ ta, uid });\n break;\n }\n }\n\n // 2. Create deletion tasks\n const deletionTasks: Task<any, PdfErrorReason>[] = [];\n for (const { ta, uid } of deletions) {\n const page = doc.pages.find((p) => p.index === ta.object.pageIndex)!;\n // Only delete if it was previously synced (i.e., exists in the PDF)\n if (ta.commitState === 'deleted' && ta.object.id) {\n const task = new Task<any, PdfErrorReason>();\n const removeTask = this.engine.removePageAnnotation!(doc, page, ta.object);\n removeTask.wait(() => {\n this.dispatch(purgeAnnotation(docId, uid));\n this.events$.emit({\n type: 'delete',\n documentId: docId,\n annotation: ta.object,\n pageIndex: ta.object.pageIndex,\n committed: true,\n });\n task.resolve(true);\n }, task.fail);\n deletionTasks.push(task);\n } else {\n // If it was never synced, just remove from state\n this.dispatch(purgeAnnotation(docId, uid));\n }\n }\n\n // 3. Chain the operations: creations/updates -> deletions -> finalize\n const allWriteTasks = [...creations, ...updates, ...deletionTasks];\n\n Task.allSettled(allWriteTasks).wait(() => {\n // 4. Finalize the commit by updating the commitState of all items.\n this.dispatch(commitPendingChanges(docId));\n task.resolve(true);\n }, task.fail);\n\n return task;\n }\n\n /**\n * Gets the effective behavior setting for a tool, checking tool-specific config first,\n * then falling back to plugin config.\n */\n private getToolBehavior(\n tool: AnnotationTool,\n setting: 'deactivateToolAfterCreate' | 'selectAfterCreate',\n ): boolean {\n // Check if tool has specific behavior setting\n if (tool.behavior?.[setting] !== undefined) {\n return tool.behavior[setting];\n }\n\n // Fall back to plugin config\n return this.config[setting] !== false;\n }\n}\n","import { AnnotationTool } from './types';\nimport { defaultTools } from './default-tools';\n\n// Infer the exact union type of all tool objects.\ntype DefaultTool = (typeof defaultTools)[number];\n\n// Create a map from a tool's ID to its specific type.\nexport type ToolMap = {\n [T in DefaultTool as T['id']]: T;\n};\n\n/**\n * A factory that creates a type-safe predicate function for a specific tool ID.\n * This is more reliable for TypeScript's type inference than a single generic function.\n */\nexport function createToolPredicate<K extends keyof ToolMap>(id: K) {\n // This function returns ANOTHER function, which is the actual type predicate.\n return (tool: AnnotationTool<any> | undefined): tool is ToolMap[K] => {\n return tool?.id === id;\n };\n}\n\n// Export the generated predicates for common tools.\nexport const isHighlightTool = createToolPredicate('highlight');\nexport const isSquigglyTool = createToolPredicate('squiggly');\nexport const isUnderlineTool = createToolPredicate('underline');\nexport const isStrikeoutTool = createToolPredicate('strikeout');\nexport const isInkTool = createToolPredicate('ink');\nexport const isInkHighlighterTool = createToolPredicate('inkHighlighter');\nexport const isSquareTool = createToolPredicate('square');\nexport const isCircleTool = createToolPredicate('circle');\nexport const isLineTool = createToolPredicate('line');\nexport const isPolylineTool = createToolPredicate('polyline');\nexport const isPolygonTool = createToolPredicate('polygon');\nexport const isFreeTextTool = createToolPredicate('freeText');\nexport const isStampTool = createToolPredicate('stamp');\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, ANNOTATION_PLUGIN_ID } from './manifest';\nimport { AnnotationPluginConfig, AnnotationState } from './types';\nimport { AnnotationPlugin } from './annotation-plugin';\nimport { initialState, reducer } from './reducer';\nimport { AnnotationAction } from './actions';\n\nexport const AnnotationPluginPackage: PluginPackage<\n AnnotationPlugin,\n AnnotationPluginConfig,\n AnnotationState,\n AnnotationAction\n> = {\n manifest,\n create: (registry, config) => new AnnotationPlugin(ANNOTATION_PLUGIN_ID, registry, config),\n reducer,\n initialState: (_, config) => initialState(config),\n};\n\nexport * from './annotation-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './selectors';\nexport * from './helpers';\nexport * from './handlers/types';\nexport * from './tools/types';\nexport * from './tools/tools-utils';\nexport * as patching from './patching';\nexport { initialState, initialDocumentState } from './reducer';\n"],"names":["pad","patching.lineRectWithEndings","defaults","_a","_b","page","task"],"mappings":"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"}
|