@embedpdf/plugin-annotation 1.0.14 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -351,6 +351,9 @@ function isTextMarkup(a) {
351
351
  function isFreeText(a) {
352
352
  return a.object.type === PdfAnnotationSubtype.FREETEXT;
353
353
  }
354
+ function isStamp(a) {
355
+ return a.object.type === PdfAnnotationSubtype.STAMP;
356
+ }
354
357
  function isHighlightDefaults(defaults) {
355
358
  return defaults.subtype === PdfAnnotationSubtype.HIGHLIGHT;
356
359
  }
@@ -373,6 +376,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
373
376
  this.state$ = createBehaviorEmitter();
374
377
  this.modeByVariant = /* @__PURE__ */ new Map();
375
378
  this.variantByMode = /* @__PURE__ */ new Map();
379
+ this.pendingContexts = /* @__PURE__ */ new Map();
376
380
  this.activeVariantChange$ = createBehaviorEmitter();
377
381
  this.activeTool$ = createBehaviorEmitter({
378
382
  variantKey: null,
@@ -405,7 +409,6 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
405
409
  });
406
410
  (_b = this.interactionManager) == null ? void 0 : _b.onModeChange((s) => {
407
411
  const newVariant = this.variantByMode.get(s.activeMode) ?? null;
408
- console.log(newVariant, this.state.activeVariant);
409
412
  if (newVariant !== this.state.activeVariant) {
410
413
  this.dispatch(setActiveVariant(newVariant));
411
414
  this.activeVariantChange$.emit(newVariant);
@@ -504,7 +507,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
504
507
  },
505
508
  getColorPresets: () => [...this.state.colorPresets],
506
509
  addColorPreset: (color) => this.dispatch(addColorPreset(color)),
507
- createAnnotation: (pageIndex, annotation) => this.createAnnotation(pageIndex, annotation),
510
+ createAnnotation: (pageIndex, annotation, ctx) => this.createAnnotation(pageIndex, annotation, ctx),
508
511
  updateAnnotation: (pageIndex, localId, patch) => this.updateAnnotation(pageIndex, localId, patch),
509
512
  deleteAnnotation: (pageIndex, localId) => this.deleteAnnotation(pageIndex, localId),
510
513
  renderAnnotation: (options) => this.renderAnnotation(options),
@@ -577,9 +580,12 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
577
580
  selectAnnotation(pageIndex, annotationId) {
578
581
  this.dispatch(selectAnnotation(pageIndex, annotationId));
579
582
  }
580
- createAnnotation(pageIndex, annotation) {
583
+ createAnnotation(pageIndex, annotation, ctx) {
581
584
  const localId = annotation.id;
582
- const execute = () => this.dispatch(createAnnotation(pageIndex, localId, annotation));
585
+ const execute = () => {
586
+ this.dispatch(createAnnotation(pageIndex, localId, annotation));
587
+ if (ctx) this.pendingContexts.set(localId, ctx);
588
+ };
583
589
  if (!this.history) {
584
590
  execute();
585
591
  if (this.config.autoCommit) this.commit();
@@ -588,6 +594,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
588
594
  const command = {
589
595
  execute,
590
596
  undo: () => {
597
+ this.pendingContexts.delete(localId);
591
598
  this.dispatch(deselectAnnotation());
592
599
  this.dispatch(deleteAnnotation(pageIndex, localId));
593
600
  }
@@ -655,8 +662,12 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
655
662
  affectedPages.add(pageIndex);
656
663
  switch (ta.commitState) {
657
664
  case "new":
658
- const task2 = this.engine.createPageAnnotation(doc, page, ta.object);
659
- task2.wait((annoId) => this.dispatch(storePdfId(uid, annoId)), ignore);
665
+ const ctx = this.pendingContexts.get(ta.localId);
666
+ const task2 = this.engine.createPageAnnotation(doc, page, ta.object, ctx);
667
+ task2.wait((annoId) => {
668
+ this.dispatch(storePdfId(uid, annoId));
669
+ this.pendingContexts.delete(ta.localId);
670
+ }, ignore);
660
671
  creations.push(task2);
661
672
  break;
662
673
  case "dirty":
@@ -873,6 +884,11 @@ const initialState = (cfg) => ({
873
884
  textAlign: PdfTextAlignment.Left,
874
885
  verticalAlign: PdfVerticalAlignment.Top
875
886
  },
887
+ [makeVariantKey(PdfAnnotationSubtype.STAMP)]: {
888
+ name: "Photo",
889
+ subtype: PdfAnnotationSubtype.STAMP,
890
+ interaction: { mode: "stamp", exclusive: true, cursor: "crosshair" }
891
+ },
876
892
  ...cfg.toolDefaults
877
893
  },
878
894
  colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,
@@ -1035,6 +1051,7 @@ export {
1035
1051
  isSquare,
1036
1052
  isSquiggly,
1037
1053
  isSquigglyDefaults,
1054
+ isStamp,
1038
1055
  isStrikeout,
1039
1056
  isStrikeoutDefaults,
1040
1057
  isTextMarkup,
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/utils.ts","../src/lib/variant-key.ts","../src/lib/selectors.ts","../src/lib/patching/line-ending-handlers.ts","../src/lib/patching/patch-utils.ts","../src/lib/patching/derived-rect.ts","../src/lib/patching/line-endings.ts","../src/lib/helpers.ts","../src/lib/annotation-plugin.ts","../src/lib/reducer.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 },\n};\n","import { Action } from '@embedpdf/core';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationDefaults, ToolDefaultsByMode } from './types';\n\n/* ─────────── action constants ─────────── */\nexport const SET_ANNOTATIONS = 'ANNOTATION/SET_ANNOTATIONS';\nexport const REINDEX_PAGE_ANNOTATIONS = 'ANNOTATION/REINDEX_PAGE';\nexport const SELECT_ANNOTATION = 'ANNOTATION/SELECT_ANNOTATION';\nexport const DESELECT_ANNOTATION = 'ANNOTATION/DESELECT_ANNOTATION';\nexport const UPDATE_TOOL_DEFAULTS = 'ANNOTATION/UPDATE_TOOL_DEFAULTS';\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 STORE_PDF_ID = 'ANNOTATION/STORE_PDF_ID';\nexport const PURGE_ANNOTATION = 'ANNOTATION/PURGE_ANNOTATION';\nexport const SET_ACTIVE_VARIANT = 'ANNOTATION/SET_ACTIVE_VARIANT';\n\n/* ─────────── action interfaces ─────────── */\nexport interface SetAnnotationsAction extends Action {\n type: typeof SET_ANNOTATIONS;\n payload: Record<number, PdfAnnotationObject[]>;\n}\nexport interface ReindexPageAnnotationsAction extends Action {\n type: typeof REINDEX_PAGE_ANNOTATIONS;\n payload: { pageIndex: number };\n}\nexport interface SelectAnnotationAction extends Action {\n type: typeof SELECT_ANNOTATION;\n payload: { pageIndex: number; localId: number };\n}\nexport interface DeselectAnnotationAction extends Action {\n type: typeof DESELECT_ANNOTATION;\n}\n\nexport interface UpdateToolDefaultsAction extends Action {\n type: typeof UPDATE_TOOL_DEFAULTS;\n payload: { variantKey: string; patch: Partial<AnnotationDefaults> };\n}\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; localId: number; annotation: PdfAnnotationObject };\n}\nexport interface PatchAnnotationAction extends Action {\n type: typeof PATCH_ANNOTATION;\n payload: { pageIndex: number; localId: number; patch: Partial<PdfAnnotationObject> };\n}\nexport interface DeleteAnnotationAction extends Action {\n type: typeof DELETE_ANNOTATION;\n payload: { pageIndex: number; localId: number };\n}\nexport interface CommitAction extends Action {\n type: typeof COMMIT_PENDING_CHANGES;\n}\n\nexport interface StorePdfIdAction extends Action {\n type: typeof STORE_PDF_ID;\n payload: { uid: string; pdfId: number };\n}\n\nexport interface PurgeAnnotationAction extends Action {\n type: typeof PURGE_ANNOTATION;\n payload: { uid: string };\n}\n\nexport interface SetActiveVariantAction extends Action {\n type: typeof SET_ACTIVE_VARIANT;\n payload: string | null;\n}\n\nexport type AnnotationAction =\n | SetAnnotationsAction\n | ReindexPageAnnotationsAction\n | SelectAnnotationAction\n | DeselectAnnotationAction\n | UpdateToolDefaultsAction\n | AddColorPresetAction\n | CreateAnnotationAction\n | PatchAnnotationAction\n | DeleteAnnotationAction\n | CommitAction\n | StorePdfIdAction\n | PurgeAnnotationAction\n | SetActiveVariantAction;\n\n/* ─────────── action creators ─────────── */\nexport const setAnnotations = (p: Record<number, PdfAnnotationObject[]>): SetAnnotationsAction => ({\n type: SET_ANNOTATIONS,\n payload: p,\n});\n\nexport const reindexPageAnnotations = (pageIndex: number): ReindexPageAnnotationsAction => ({\n type: REINDEX_PAGE_ANNOTATIONS,\n payload: { pageIndex },\n});\n\nexport const selectAnnotation = (pageIndex: number, localId: number): SelectAnnotationAction => ({\n type: SELECT_ANNOTATION,\n payload: { pageIndex, localId },\n});\n\nexport const deselectAnnotation = (): DeselectAnnotationAction => ({ type: DESELECT_ANNOTATION });\n\nexport const updateToolDefaults = (\n variantKey: string,\n patch: Partial<AnnotationDefaults>,\n): UpdateToolDefaultsAction => ({ type: UPDATE_TOOL_DEFAULTS, payload: { variantKey, patch } });\n\nexport const addColorPreset = (c: string): AddColorPresetAction => ({\n type: ADD_COLOR_PRESET,\n payload: c,\n});\n\nexport const createAnnotation = (\n pageIndex: number,\n localId: number,\n annotation: PdfAnnotationObject,\n): CreateAnnotationAction => ({\n type: CREATE_ANNOTATION,\n payload: { pageIndex, localId, annotation },\n});\n\nexport const patchAnnotation = (\n pageIndex: number,\n localId: number,\n patch: Partial<PdfAnnotationObject>,\n): PatchAnnotationAction => ({\n type: PATCH_ANNOTATION,\n payload: { pageIndex, localId, patch },\n});\n\nexport const deleteAnnotation = (pageIndex: number, localId: number): DeleteAnnotationAction => ({\n type: DELETE_ANNOTATION,\n payload: { pageIndex, localId },\n});\n\nexport const commitPendingChanges = (): CommitAction => ({ type: COMMIT_PENDING_CHANGES });\n\nexport const storePdfId = (uid: string, pdfId: number): StorePdfIdAction => ({\n type: STORE_PDF_ID,\n payload: { uid, pdfId },\n});\n\nexport const purgeAnnotation = (uid: string): PurgeAnnotationAction => ({\n type: PURGE_ANNOTATION,\n payload: { uid },\n});\n\nexport const setActiveVariant = (k: string | null): SetActiveVariantAction => ({\n type: SET_ACTIVE_VARIANT,\n payload: k,\n});\n","/**\n * Creates a stable, document-wide unique ID from a page index and a stable local ID.\n */\nexport const makeUid = (pageIndex: number, localId: number): string => `p${pageIndex}#${localId}`;\n\n/**\n * Parses a UID string back into its constituent page index and stable local ID.\n */\nexport const parseUid = (uid: string): { pageIndex: number; localId: number } => {\n const [pg, rest] = uid.slice(1).split('#');\n return { pageIndex: Number(pg), localId: Number(rest) };\n};\n","import { PdfAnnotationSubtype, PdfAnnotationObject } from '@embedpdf/models';\n\nexport type VariantKey = string;\n\nexport const makeVariantKey = (\n subtype: PdfAnnotationSubtype,\n intent?: string | null | undefined,\n): VariantKey => (intent ? `${subtype}#${intent}` : `${subtype}`);\n\nexport const parseVariantKey = (\n key: VariantKey,\n): { subtype: PdfAnnotationSubtype; intent?: string } => {\n const [subStr, intent] = key.split('#');\n return { subtype: Number(subStr) as PdfAnnotationSubtype, intent };\n};\n\nexport const variantKeyFromAnnotation = (a: PdfAnnotationObject): VariantKey =>\n makeVariantKey(a.type, a.intent);\n","import { AnnotationDefaults, AnnotationState, SelectedAnnotation } from './types';\nimport { parseUid } from './utils';\nimport { makeVariantKey } from './variant-key';\n\n/* helper – mirrors the one in reducer */\nconst makeUid = (page: number, id: number) => `p${page}#${id}`;\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 getSelectedAnnotationWithPageIndex = (\n s: AnnotationState,\n): SelectedAnnotation | null => {\n if (!s.selectedUid) return null;\n const { pageIndex, localId } = parseUid(s.selectedUid);\n return { pageIndex, localId, annotation: s.byUid[s.selectedUid].object };\n};\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\nexport const isInAnnotationVariant = (s: AnnotationState) => s.activeVariant !== null;\nexport const getSelectedAnnotationVariant = (s: AnnotationState) => s.activeVariant;\n\n/** Check if a given anno on a page is the current selection. */\nexport const isAnnotationSelected = (s: AnnotationState, page: number, id: number) =>\n s.selectedUid === makeUid(page, id);\n\n/**\n * Return the tool-defaults for a given subtype and (optionally) intent.\n * If the exact variant (subtype + intent) is not present, it gracefully\n * falls back to the plain subtype variant.\n *\n * The return type is inferred so that you always get the concrete default\n * interface for the supplied subtype (e.g. `InkDefaults` for `INK`,\n * `CircleDefaults` for `CIRCLE`, …).\n */\nexport function getToolDefaultsBySubtypeAndIntent<\n S extends AnnotationState,\n TSub extends AnnotationDefaults['subtype'],\n>(state: S, subtype: TSub, intent?: string | null): Extract<AnnotationDefaults, { subtype: TSub }> {\n // Build keys\n const variantKey = makeVariantKey(subtype, intent ?? undefined);\n const fallbackKey = makeVariantKey(subtype);\n\n // Try exact match first, otherwise fall back to plain subtype\n const defaults = state.toolDefaults[variantKey] ?? state.toolDefaults[fallbackKey];\n\n if (!defaults) {\n throw new Error(\n `No tool defaults found for subtype ${subtype}${intent ? ` and intent ${intent}` : ''}`,\n );\n }\n\n // Cast is safe because we narrow the union by subtype\n return defaults as Extract<AnnotationDefaults, { subtype: TSub }>;\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 {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\n\nimport { lineRectWithEndings } from './patch-utils';\n\n/* ---------- helpers ---------- */\n\n/** Bounding box for arbitrary vertices (+ stroke). */\nconst vertsRect = (verts: Position[], sw: number): Rect =>\n expandRect(rectFromPoints(verts), sw / 2);\n\n/* ---------- dispatcher ---------- */\n\nexport function deriveRect(a: PdfAnnotationObject): Rect {\n switch (a.type) {\n /* mark‑ups already carry their real rect */\n case PdfAnnotationSubtype.HIGHLIGHT:\n case PdfAnnotationSubtype.UNDERLINE:\n case PdfAnnotationSubtype.STRIKEOUT:\n case PdfAnnotationSubtype.SQUIGGLY:\n case PdfAnnotationSubtype.SQUARE:\n case PdfAnnotationSubtype.CIRCLE:\n return a.rect;\n\n /* ink */\n case PdfAnnotationSubtype.INK: {\n const pts = a.inkList.flatMap((s) => s.points);\n return vertsRect(pts, a.strokeWidth);\n }\n\n /* one‑segment */\n case PdfAnnotationSubtype.LINE:\n return lineRectWithEndings(\n [a.linePoints.start, a.linePoints.end],\n a.strokeWidth,\n a.lineEndings,\n );\n\n /* multi‑segment */\n case PdfAnnotationSubtype.POLYLINE:\n return lineRectWithEndings(a.vertices, a.strokeWidth, a.lineEndings);\n\n case PdfAnnotationSubtype.POLYGON:\n return vertsRect(a.vertices, a.strokeWidth);\n\n default:\n return a.rect; // fallback – unchanged\n }\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","import { PdfAnnotationSubtype, PdfAnnotationObject } from '@embedpdf/models';\nimport {\n TrackedAnnotation,\n AnnotationDefaults,\n ToolDefaultsByMode,\n HighlightDefaults,\n UnderlineDefaults,\n StrikeoutDefaults,\n SquigglyDefaults,\n} from './types';\n\n/* ------------------------------------------------------------------ */\n/* 1. Generic “subtype‑to‑object” mapper */\n/* ------------------------------------------------------------------ */\n\nexport type AnnoOf<S extends PdfAnnotationSubtype> = Extract<PdfAnnotationObject, { type: S }>;\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<\n AnnoOf<\n | PdfAnnotationSubtype.HIGHLIGHT\n | PdfAnnotationSubtype.UNDERLINE\n | PdfAnnotationSubtype.STRIKEOUT\n | PdfAnnotationSubtype.SQUIGGLY\n >\n> {\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\n/* ------------------------------------------------------------------ */\n/* 3. Helpers for defaults and tool defaults */\n/* ------------------------------------------------------------------ */\n\nexport function isHighlightDefaults(defaults: AnnotationDefaults): defaults is HighlightDefaults {\n return defaults.subtype === PdfAnnotationSubtype.HIGHLIGHT;\n}\n\nexport function isUnderlineDefaults(defaults: AnnotationDefaults): defaults is UnderlineDefaults {\n return defaults.subtype === PdfAnnotationSubtype.UNDERLINE;\n}\n\nexport function isStrikeoutDefaults(defaults: AnnotationDefaults): defaults is StrikeoutDefaults {\n return defaults.subtype === PdfAnnotationSubtype.STRIKEOUT;\n}\n\nexport function isSquigglyDefaults(defaults: AnnotationDefaults): defaults is SquigglyDefaults {\n return defaults.subtype === PdfAnnotationSubtype.SQUIGGLY;\n}\n\nexport function isTextMarkupDefaults(\n defaults: AnnotationDefaults,\n): defaults is HighlightDefaults | UnderlineDefaults | StrikeoutDefaults | SquigglyDefaults {\n return (\n isHighlightDefaults(defaults) ||\n isUnderlineDefaults(defaults) ||\n isStrikeoutDefaults(defaults) ||\n isSquigglyDefaults(defaults)\n );\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n enumEntries,\n PluginRegistry,\n SET_DOCUMENT,\n} from '@embedpdf/core';\nimport {\n ignore,\n PdfAnnotationObject,\n PdfDocumentObject,\n PdfEngine,\n PdfErrorReason,\n Task,\n PdfAnnotationSubtype,\n PdfTaskHelper,\n PdfErrorCode,\n PdfTask,\n Rotation,\n AppearanceMode,\n PdfBlendMode,\n} from '@embedpdf/models';\nimport {\n ActiveTool,\n AnnotationCapability,\n AnnotationPluginConfig,\n AnnotationState,\n BaseAnnotationDefaults,\n GetPageAnnotationsOptions,\n RenderAnnotationOptions,\n ToolDefaultsByMode,\n TrackedAnnotation,\n} from './types';\nimport {\n setAnnotations,\n selectAnnotation,\n deselectAnnotation,\n AnnotationAction,\n updateToolDefaults,\n addColorPreset,\n createAnnotation,\n patchAnnotation,\n deleteAnnotation,\n commitPendingChanges,\n storePdfId,\n purgeAnnotation,\n reindexPageAnnotations,\n setActiveVariant,\n} from './actions';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n InteractionMode,\n} from '@embedpdf/plugin-interaction-manager';\nimport { SelectionPlugin, SelectionCapability } from '@embedpdf/plugin-selection';\nimport { HistoryPlugin, HistoryCapability, Command } from '@embedpdf/plugin-history';\nimport { getSelectedAnnotation, getToolDefaultsBySubtypeAndIntent } from './selectors';\nimport { makeUid, parseUid } from './utils';\nimport { makeVariantKey, parseVariantKey } from './variant-key';\nimport { deriveRect } from './patching';\nimport { isTextMarkupDefaults } from './helpers';\n\nexport class AnnotationPlugin extends BasePlugin<\n AnnotationPluginConfig,\n AnnotationCapability,\n AnnotationState,\n AnnotationAction\n> {\n static readonly id = 'annotation' as const;\n\n private readonly ANNOTATION_HISTORY_TOPIC = 'annotations';\n\n private readonly config: AnnotationPluginConfig;\n\n private engine: PdfEngine;\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 readonly modeByVariant = new Map<string, string>();\n private readonly variantByMode = new Map<string, string>();\n\n private readonly activeVariantChange$ = createBehaviorEmitter<string | null>();\n private readonly activeTool$ = createBehaviorEmitter<ActiveTool>({\n variantKey: null,\n defaults: null,\n });\n\n constructor(\n id: string,\n registry: PluginRegistry,\n engine: PdfEngine,\n config: AnnotationPluginConfig,\n ) {\n super(id, registry);\n this.engine = engine;\n this.config = config;\n\n const selection = registry.getPlugin<SelectionPlugin>('selection');\n this.selection = selection?.provides() ?? null;\n\n const history = registry.getPlugin<HistoryPlugin>('history');\n this.history = history?.provides() ?? null;\n\n const interactionManager = registry.getPlugin<InteractionManagerPlugin>('interaction-manager');\n this.interactionManager = interactionManager?.provides() ?? null;\n\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const doc = state.core.document;\n if (doc) {\n this.getAllAnnotations(doc);\n }\n });\n }\n\n async initialize(): Promise<void> {\n for (const [variantKey, defaults] of Object.entries(this.state.toolDefaults)) {\n this.registerTool(variantKey, defaults);\n }\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 newVariant = this.variantByMode.get(s.activeMode) ?? null;\n console.log(newVariant, this.state.activeVariant);\n if (newVariant !== this.state.activeVariant) {\n this.dispatch(setActiveVariant(newVariant));\n this.activeVariantChange$.emit(newVariant);\n }\n });\n\n this.selection?.onEndSelection(() => {\n if (!this.state.activeVariant) return;\n const defaults = this.state.toolDefaults[this.state.activeVariant];\n if (!defaults || !isTextMarkupDefaults(defaults)) return;\n\n const formattedSelection = this.selection?.getFormattedSelection();\n if (!formattedSelection) return;\n\n for (const selection of formattedSelection) {\n const rect = selection.rect;\n const segmentRects = selection.segmentRects;\n const subtype = defaults.subtype;\n const color = defaults.color;\n const opacity = defaults.opacity;\n const blendMode = defaults.blendMode ?? PdfBlendMode.Normal;\n\n this.createAnnotation(selection.pageIndex, {\n type: subtype,\n rect,\n segmentRects,\n color,\n opacity,\n blendMode,\n pageIndex: selection.pageIndex,\n id: Date.now() + Math.random(),\n });\n }\n\n this.selection?.clear();\n });\n }\n\n private registerTool(variantKey: string, defaults: BaseAnnotationDefaults) {\n const modeId = defaults.interaction.mode;\n const interactionMode: InteractionMode = {\n id: modeId,\n scope: 'page',\n exclusive: defaults.interaction.exclusive,\n cursor: defaults.interaction.cursor,\n };\n\n this.interactionManager?.registerMode(interactionMode);\n\n if (defaults.textSelection) {\n this.selection?.enableForMode(modeId);\n }\n\n this.modeByVariant.set(variantKey, modeId);\n this.variantByMode.set(modeId, variantKey);\n }\n\n protected buildCapability(): AnnotationCapability {\n return {\n getPageAnnotations: (options: GetPageAnnotationsOptions) => {\n return this.getPageAnnotations(options);\n },\n getSelectedAnnotation: () => {\n return getSelectedAnnotation(this.state);\n },\n selectAnnotation: (pageIndex: number, annotationId: number) => {\n this.selectAnnotation(pageIndex, annotationId);\n },\n deselectAnnotation: () => {\n this.dispatch(deselectAnnotation());\n },\n getActiveVariant: () => {\n return this.state.activeVariant;\n },\n setActiveVariant: (variantKey: string | null) => {\n if (variantKey === this.state.activeVariant) return;\n if (variantKey) {\n const mode = this.modeByVariant.get(variantKey);\n if (!mode) throw new Error(`Mode missing for variant ${variantKey}`);\n this.interactionManager?.activate(mode);\n } else {\n this.interactionManager?.activate('default');\n }\n },\n getSubtypeAndIntentByVariant: (variantKey) => {\n return parseVariantKey(variantKey);\n },\n getToolDefaults: (variantKey) => {\n const defaults = this.state.toolDefaults[variantKey];\n if (!defaults) {\n throw new Error(`No defaults found for variant: ${variantKey}`);\n }\n return defaults;\n },\n getToolDefaultsBySubtypeAndIntent: (subtype, intent) => {\n return getToolDefaultsBySubtypeAndIntent(this.state, subtype, intent);\n },\n getToolDefaultsBySubtype: (subtype) => {\n return getToolDefaultsBySubtypeAndIntent(this.state, subtype);\n },\n setToolDefaults: (variantKey, patch) => {\n this.dispatch(updateToolDefaults(variantKey, patch));\n },\n getColorPresets: () => [...this.state.colorPresets],\n addColorPreset: (color) => this.dispatch(addColorPreset(color)),\n createAnnotation: (pageIndex: number, annotation: PdfAnnotationObject) =>\n this.createAnnotation(pageIndex, annotation),\n updateAnnotation: (pageIndex: number, localId: number, patch: Partial<PdfAnnotationObject>) =>\n this.updateAnnotation(pageIndex, localId, patch),\n deleteAnnotation: (pageIndex: number, localId: number) =>\n this.deleteAnnotation(pageIndex, localId),\n renderAnnotation: (options: RenderAnnotationOptions) => this.renderAnnotation(options),\n onStateChange: this.state$.on,\n onActiveVariantChange: this.activeVariantChange$.on,\n onActiveToolChange: this.activeTool$.on,\n commit: () => this.commit(),\n };\n }\n\n private createActiveTool(mode: string | null, toolDefaults: ToolDefaultsByMode): ActiveTool {\n if (mode === null) {\n return { variantKey: null, defaults: null };\n }\n return { variantKey: mode, defaults: toolDefaults[mode] } as ActiveTool;\n }\n\n private emitActiveTool(state: AnnotationState) {\n const activeTool = this.createActiveTool(state.activeVariant, state.toolDefaults);\n this.activeTool$.emit(activeTool);\n }\n\n override onStoreUpdated(prev: AnnotationState, next: AnnotationState): void {\n this.state$.emit(next);\n if (\n prev.activeVariant !== next.activeVariant ||\n prev.toolDefaults[prev.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT] !==\n next.toolDefaults[next.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT]\n ) {\n this.emitActiveTool(next);\n }\n }\n\n private getAllAnnotations(doc: PdfDocumentObject) {\n const task = this.engine.getAllAnnotations(doc);\n task.wait((annotations) => this.dispatch(setAnnotations(annotations)), 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({\n pageIndex,\n annotation,\n scaleFactor = 1,\n rotation = Rotation.Degree0,\n dpr = 1,\n mode = AppearanceMode.Normal,\n imageType = 'image/webp',\n }: RenderAnnotationOptions) {\n const coreState = this.coreState.core;\n\n if (!coreState.document) {\n throw new Error('document does not open');\n }\n\n const page = coreState.document.pages.find((page) => page.index === pageIndex);\n if (!page) {\n throw new Error('page does not exist');\n }\n\n return this.engine.renderAnnotation(\n coreState.document,\n page,\n annotation,\n scaleFactor,\n rotation,\n dpr,\n mode,\n imageType,\n );\n }\n\n private selectAnnotation(pageIndex: number, annotationId: number) {\n this.dispatch(selectAnnotation(pageIndex, annotationId));\n }\n\n private createAnnotation(pageIndex: number, annotation: PdfAnnotationObject) {\n const localId = annotation.id;\n const execute = () => this.dispatch(createAnnotation(pageIndex, localId, annotation));\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.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\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 const merged = { ...original, ...patch } as PdfAnnotationObject;\n return { ...patch, rect: deriveRect(merged) };\n }\n\n private updateAnnotation(\n pageIndex: number,\n localId: number,\n patch: Partial<PdfAnnotationObject>,\n ) {\n const originalObject = this.state.byUid[makeUid(pageIndex, localId)].object;\n const finalPatch = this.buildPatch(originalObject, patch);\n\n if (!this.history) {\n this.dispatch(patchAnnotation(pageIndex, localId, finalPatch));\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: () => this.dispatch(patchAnnotation(pageIndex, localId, finalPatch)),\n undo: () => this.dispatch(patchAnnotation(pageIndex, localId, originalPatch)),\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private deleteAnnotation(pageIndex: number, localId: number) {\n if (!this.history) {\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\n if (this.config.autoCommit !== false) {\n this.commit();\n }\n return;\n }\n const originalAnnotation = this.state.byUid[makeUid(pageIndex, localId)].object;\n const command: Command = {\n execute: () => {\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\n },\n undo: () => this.dispatch(createAnnotation(pageIndex, localId, originalAnnotation)),\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\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 deletionsByPage = new Map<number, { ta: TrackedAnnotation; uid: string }[]>();\n const affectedPages = new Set<number>();\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 { pageIndex } = parseUid(uid);\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) continue;\n\n affectedPages.add(pageIndex);\n\n switch (ta.commitState) {\n case 'new':\n const task = this.engine.createPageAnnotation!(doc, page, ta.object);\n task.wait((annoId) => this.dispatch(storePdfId(uid, annoId)), ignore);\n creations.push(task);\n break;\n case 'dirty':\n updates.push(\n this.engine.updatePageAnnotation!(doc, page, { ...ta.object, id: ta.pdfId! }),\n );\n break;\n case 'deleted':\n if (!deletionsByPage.has(pageIndex)) {\n deletionsByPage.set(pageIndex, []);\n }\n deletionsByPage.get(pageIndex)!.push({ ta, uid });\n break;\n }\n }\n\n // 2. Create deletion tasks, sorted by ID descending\n const deletionTasks: Task<any, PdfErrorReason>[] = [];\n for (const [pageIndex, deletions] of deletionsByPage.entries()) {\n const page = doc.pages.find((p) => p.index === pageIndex)!;\n\n deletions.sort((a, b) => (b.ta.pdfId ?? -1) - (a.ta.pdfId ?? -1));\n\n for (const { ta, uid } of deletions) {\n if (ta.pdfId !== undefined) {\n const task = new Task<any, PdfErrorReason>();\n const removeTask = this.engine.removePageAnnotation!(doc, page, {\n ...ta.object,\n id: ta.pdfId!,\n });\n removeTask.wait(() => {\n this.dispatch(purgeAnnotation(uid));\n task.resolve(true);\n }, task.fail);\n deletionTasks.push(task);\n } else {\n this.dispatch(purgeAnnotation(uid));\n }\n }\n }\n\n // 3. Chain the operations: creations/updates -> deletions -> re-sync\n const allWriteTasks = [...creations, ...updates, ...deletionTasks];\n\n Task.allSettled(allWriteTasks).wait(() => {\n // 4. Client-Side Re-indexing\n // After all engine operations are done, tell the reducer to re-index each affected page.\n for (const pageIndex of affectedPages) {\n this.dispatch(reindexPageAnnotations(pageIndex));\n }\n\n // 5. 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","import { Reducer } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n} from '@embedpdf/models';\nimport {\n ADD_COLOR_PRESET,\n COMMIT_PENDING_CHANGES,\n CREATE_ANNOTATION,\n DESELECT_ANNOTATION,\n PATCH_ANNOTATION,\n DELETE_ANNOTATION,\n SELECT_ANNOTATION,\n SET_ANNOTATIONS,\n UPDATE_TOOL_DEFAULTS,\n AnnotationAction,\n PURGE_ANNOTATION,\n STORE_PDF_ID,\n REINDEX_PAGE_ANNOTATIONS,\n SET_ACTIVE_VARIANT,\n} from './actions';\nimport {\n AnnotationDefaults,\n AnnotationPluginConfig,\n AnnotationState,\n TrackedAnnotation,\n} from './types';\nimport { makeUid } from './utils';\nimport { makeVariantKey } from './variant-key';\n\n/* ─────────── util helpers ─────────── */\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/* helper to immutably replace one annotation (preserving pdfId) */\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\n/* ─────────── initialState ─────────── */\nexport const initialState = (cfg: AnnotationPluginConfig): AnnotationState => ({\n pages: {},\n byUid: {},\n selectedUid: null,\n activeVariant: null,\n\n toolDefaults: {\n [makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT)]: {\n name: 'Highlight',\n subtype: PdfAnnotationSubtype.HIGHLIGHT,\n interaction: { mode: 'highlight', exclusive: false },\n textSelection: true,\n color: '#FFCD45',\n opacity: 1,\n blendMode: PdfBlendMode.Multiply,\n },\n [makeVariantKey(PdfAnnotationSubtype.UNDERLINE)]: {\n name: 'Underline',\n subtype: PdfAnnotationSubtype.UNDERLINE,\n interaction: { mode: 'underline', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.STRIKEOUT)]: {\n name: 'Strikeout',\n subtype: PdfAnnotationSubtype.STRIKEOUT,\n interaction: { mode: 'strikeout', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.SQUIGGLY)]: {\n name: 'Squiggly',\n subtype: PdfAnnotationSubtype.SQUIGGLY,\n interaction: { mode: 'squiggly', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.INK)]: {\n name: 'Ink',\n subtype: PdfAnnotationSubtype.INK,\n interaction: { mode: 'ink', exclusive: true, cursor: 'crosshair' },\n color: '#E44234',\n opacity: 1,\n strokeWidth: 11,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.INK, 'InkHighlight')]: {\n name: 'Ink Highlight',\n subtype: PdfAnnotationSubtype.INK,\n intent: 'InkHighlight',\n interaction: { mode: 'inkHighlight', exclusive: true, cursor: 'crosshair' },\n color: '#E44234',\n opacity: 1,\n strokeWidth: 11,\n blendMode: PdfBlendMode.Multiply,\n },\n [makeVariantKey(PdfAnnotationSubtype.CIRCLE)]: {\n name: 'Circle',\n subtype: PdfAnnotationSubtype.CIRCLE,\n interaction: { mode: 'circle', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.SQUARE)]: {\n name: 'Square',\n subtype: PdfAnnotationSubtype.SQUARE,\n interaction: { mode: 'square', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.LINE)]: {\n name: 'Line',\n subtype: PdfAnnotationSubtype.LINE,\n interaction: { mode: 'line', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.LINE, 'LineArrow')]: {\n name: 'Line Arrow',\n subtype: PdfAnnotationSubtype.LINE,\n interaction: { mode: 'lineArrow', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n intent: 'LineArrow',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n lineEndings: {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.OpenArrow,\n },\n },\n [makeVariantKey(PdfAnnotationSubtype.POLYLINE)]: {\n name: 'Polyline',\n subtype: PdfAnnotationSubtype.POLYLINE,\n interaction: { mode: 'polyline', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.POLYGON)]: {\n name: 'Polygon',\n subtype: PdfAnnotationSubtype.POLYGON,\n interaction: { mode: 'polygon', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.FREETEXT)]: {\n name: 'Free Text',\n subtype: PdfAnnotationSubtype.FREETEXT,\n interaction: { mode: 'freeText', exclusive: true, cursor: 'crosshair' },\n backgroundColor: 'transparent',\n opacity: 1,\n fontSize: 14,\n fontColor: '#E44234',\n content: 'Insert text here',\n fontFamily: PdfStandardFont.Helvetica,\n textAlign: PdfTextAlignment.Left,\n verticalAlign: PdfVerticalAlignment.Top,\n },\n ...cfg.toolDefaults,\n },\n colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,\n hasPendingChanges: false,\n});\n\n/* ─────────── reducer ─────────── */\nexport const reducer: Reducer<AnnotationState, AnnotationAction> = (state, action) => {\n switch (action.type) {\n /* ───── bulk load from engine ───── */\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, index) => {\n const localId = Date.now() + Math.random() + index;\n const uid = makeUid(pageIndex, localId);\n newByUid[uid] = { localId, pdfId: a.id, commitState: 'synced', object: a };\n return uid;\n });\n newPages[pageIndex] = newUidsOnPage;\n }\n return { ...state, pages: newPages, byUid: newByUid };\n }\n\n /* ───── GUI bits ───── */\n case SET_ACTIVE_VARIANT:\n return { ...state, activeVariant: action.payload };\n case SELECT_ANNOTATION:\n return {\n ...state,\n selectedUid: makeUid(action.payload.pageIndex, action.payload.localId),\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 UPDATE_TOOL_DEFAULTS: {\n const { variantKey, patch } = action.payload;\n const prev = state.toolDefaults[variantKey];\n if (!prev) return state;\n return {\n ...state,\n toolDefaults: {\n ...state.toolDefaults,\n [variantKey]: { ...prev, ...patch } as AnnotationDefaults,\n },\n };\n }\n\n /* ───── create ───── */\n case CREATE_ANNOTATION: {\n const { pageIndex, localId, annotation } = action.payload;\n const uid = makeUid(pageIndex, localId);\n\n return {\n ...state,\n pages: { ...state.pages, [pageIndex]: [...(state.pages[pageIndex] ?? []), uid] },\n byUid: {\n ...state.byUid,\n [uid]: { localId, pdfId: undefined, commitState: 'new', object: annotation },\n },\n hasPendingChanges: true,\n };\n }\n\n /* ───── delete ───── */\n case DELETE_ANNOTATION: {\n const { pageIndex, localId } = action.payload;\n const uid = makeUid(pageIndex, localId);\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 /* ───── field edits ───── */\n case PATCH_ANNOTATION: {\n const uid = makeUid(action.payload.pageIndex, action.payload.localId);\n return patchAnno(state, uid, action.payload.patch);\n }\n\n /* ───── commit bookkeeping ───── */\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 REINDEX_PAGE_ANNOTATIONS: {\n const { pageIndex } = action.payload;\n const newByUid = { ...state.byUid };\n\n const uidsOnPage = state.pages[pageIndex] || [];\n const annosOnPage = uidsOnPage\n .map((uid) => state.byUid[uid])\n .filter((ta) => ta && ta.commitState !== 'deleted'); // Filter out annotations pending deletion\n\n // CORRECTED: Sort by the existing pdfId to maintain relative order.\n annosOnPage.sort((a, b) => (a.pdfId ?? Infinity) - (b.pdfId ?? Infinity));\n\n // Update the pdfId for each annotation based on its new sorted index\n annosOnPage.forEach((ta, newPdfId) => {\n const uid = makeUid(pageIndex, ta.localId);\n newByUid[uid] = { ...newByUid[uid], pdfId: newPdfId };\n });\n\n return { ...state, byUid: newByUid };\n }\n\n case STORE_PDF_ID: {\n const { uid, pdfId } = action.payload;\n\n const ta = state.byUid[uid];\n if (!ta) return state;\n return {\n ...state,\n byUid: {\n ...state.byUid,\n [uid]: { ...ta, pdfId, commitState: 'synced' },\n },\n };\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 { 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, engine, config) =>\n new AnnotationPlugin(ANNOTATION_PLUGIN_ID, registry, engine, 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 './variant-key';\nexport * from './helpers';\nexport * as patching from './patching';\n"],"names":["makeUid","pad","_a","_b","page","task","index"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/utils.ts","../src/lib/variant-key.ts","../src/lib/selectors.ts","../src/lib/patching/line-ending-handlers.ts","../src/lib/patching/patch-utils.ts","../src/lib/patching/derived-rect.ts","../src/lib/patching/line-endings.ts","../src/lib/helpers.ts","../src/lib/annotation-plugin.ts","../src/lib/reducer.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 },\n};\n","import { Action } from '@embedpdf/core';\nimport { PdfAnnotationObject } from '@embedpdf/models';\nimport { AnnotationDefaults, ToolDefaultsByMode } from './types';\n\n/* ─────────── action constants ─────────── */\nexport const SET_ANNOTATIONS = 'ANNOTATION/SET_ANNOTATIONS';\nexport const REINDEX_PAGE_ANNOTATIONS = 'ANNOTATION/REINDEX_PAGE';\nexport const SELECT_ANNOTATION = 'ANNOTATION/SELECT_ANNOTATION';\nexport const DESELECT_ANNOTATION = 'ANNOTATION/DESELECT_ANNOTATION';\nexport const UPDATE_TOOL_DEFAULTS = 'ANNOTATION/UPDATE_TOOL_DEFAULTS';\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 STORE_PDF_ID = 'ANNOTATION/STORE_PDF_ID';\nexport const PURGE_ANNOTATION = 'ANNOTATION/PURGE_ANNOTATION';\nexport const SET_ACTIVE_VARIANT = 'ANNOTATION/SET_ACTIVE_VARIANT';\n\n/* ─────────── action interfaces ─────────── */\nexport interface SetAnnotationsAction extends Action {\n type: typeof SET_ANNOTATIONS;\n payload: Record<number, PdfAnnotationObject[]>;\n}\nexport interface ReindexPageAnnotationsAction extends Action {\n type: typeof REINDEX_PAGE_ANNOTATIONS;\n payload: { pageIndex: number };\n}\nexport interface SelectAnnotationAction extends Action {\n type: typeof SELECT_ANNOTATION;\n payload: { pageIndex: number; localId: number };\n}\nexport interface DeselectAnnotationAction extends Action {\n type: typeof DESELECT_ANNOTATION;\n}\n\nexport interface UpdateToolDefaultsAction extends Action {\n type: typeof UPDATE_TOOL_DEFAULTS;\n payload: { variantKey: string; patch: Partial<AnnotationDefaults> };\n}\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; localId: number; annotation: PdfAnnotationObject };\n}\nexport interface PatchAnnotationAction extends Action {\n type: typeof PATCH_ANNOTATION;\n payload: { pageIndex: number; localId: number; patch: Partial<PdfAnnotationObject> };\n}\nexport interface DeleteAnnotationAction extends Action {\n type: typeof DELETE_ANNOTATION;\n payload: { pageIndex: number; localId: number };\n}\nexport interface CommitAction extends Action {\n type: typeof COMMIT_PENDING_CHANGES;\n}\n\nexport interface StorePdfIdAction extends Action {\n type: typeof STORE_PDF_ID;\n payload: { uid: string; pdfId: number };\n}\n\nexport interface PurgeAnnotationAction extends Action {\n type: typeof PURGE_ANNOTATION;\n payload: { uid: string };\n}\n\nexport interface SetActiveVariantAction extends Action {\n type: typeof SET_ACTIVE_VARIANT;\n payload: string | null;\n}\n\nexport type AnnotationAction =\n | SetAnnotationsAction\n | ReindexPageAnnotationsAction\n | SelectAnnotationAction\n | DeselectAnnotationAction\n | UpdateToolDefaultsAction\n | AddColorPresetAction\n | CreateAnnotationAction\n | PatchAnnotationAction\n | DeleteAnnotationAction\n | CommitAction\n | StorePdfIdAction\n | PurgeAnnotationAction\n | SetActiveVariantAction;\n\n/* ─────────── action creators ─────────── */\nexport const setAnnotations = (p: Record<number, PdfAnnotationObject[]>): SetAnnotationsAction => ({\n type: SET_ANNOTATIONS,\n payload: p,\n});\n\nexport const reindexPageAnnotations = (pageIndex: number): ReindexPageAnnotationsAction => ({\n type: REINDEX_PAGE_ANNOTATIONS,\n payload: { pageIndex },\n});\n\nexport const selectAnnotation = (pageIndex: number, localId: number): SelectAnnotationAction => ({\n type: SELECT_ANNOTATION,\n payload: { pageIndex, localId },\n});\n\nexport const deselectAnnotation = (): DeselectAnnotationAction => ({ type: DESELECT_ANNOTATION });\n\nexport const updateToolDefaults = (\n variantKey: string,\n patch: Partial<AnnotationDefaults>,\n): UpdateToolDefaultsAction => ({ type: UPDATE_TOOL_DEFAULTS, payload: { variantKey, patch } });\n\nexport const addColorPreset = (c: string): AddColorPresetAction => ({\n type: ADD_COLOR_PRESET,\n payload: c,\n});\n\nexport const createAnnotation = (\n pageIndex: number,\n localId: number,\n annotation: PdfAnnotationObject,\n): CreateAnnotationAction => ({\n type: CREATE_ANNOTATION,\n payload: { pageIndex, localId, annotation },\n});\n\nexport const patchAnnotation = (\n pageIndex: number,\n localId: number,\n patch: Partial<PdfAnnotationObject>,\n): PatchAnnotationAction => ({\n type: PATCH_ANNOTATION,\n payload: { pageIndex, localId, patch },\n});\n\nexport const deleteAnnotation = (pageIndex: number, localId: number): DeleteAnnotationAction => ({\n type: DELETE_ANNOTATION,\n payload: { pageIndex, localId },\n});\n\nexport const commitPendingChanges = (): CommitAction => ({ type: COMMIT_PENDING_CHANGES });\n\nexport const storePdfId = (uid: string, pdfId: number): StorePdfIdAction => ({\n type: STORE_PDF_ID,\n payload: { uid, pdfId },\n});\n\nexport const purgeAnnotation = (uid: string): PurgeAnnotationAction => ({\n type: PURGE_ANNOTATION,\n payload: { uid },\n});\n\nexport const setActiveVariant = (k: string | null): SetActiveVariantAction => ({\n type: SET_ACTIVE_VARIANT,\n payload: k,\n});\n","/**\n * Creates a stable, document-wide unique ID from a page index and a stable local ID.\n */\nexport const makeUid = (pageIndex: number, localId: number): string => `p${pageIndex}#${localId}`;\n\n/**\n * Parses a UID string back into its constituent page index and stable local ID.\n */\nexport const parseUid = (uid: string): { pageIndex: number; localId: number } => {\n const [pg, rest] = uid.slice(1).split('#');\n return { pageIndex: Number(pg), localId: Number(rest) };\n};\n","import { PdfAnnotationSubtype, PdfAnnotationObject } from '@embedpdf/models';\n\nexport type VariantKey = string;\n\nexport const makeVariantKey = (\n subtype: PdfAnnotationSubtype,\n intent?: string | null | undefined,\n): VariantKey => (intent ? `${subtype}#${intent}` : `${subtype}`);\n\nexport const parseVariantKey = (\n key: VariantKey,\n): { subtype: PdfAnnotationSubtype; intent?: string } => {\n const [subStr, intent] = key.split('#');\n return { subtype: Number(subStr) as PdfAnnotationSubtype, intent };\n};\n\nexport const variantKeyFromAnnotation = (a: PdfAnnotationObject): VariantKey =>\n makeVariantKey(a.type, a.intent);\n","import { AnnotationDefaults, AnnotationState, SelectedAnnotation } from './types';\nimport { parseUid } from './utils';\nimport { makeVariantKey } from './variant-key';\n\n/* helper – mirrors the one in reducer */\nconst makeUid = (page: number, id: number) => `p${page}#${id}`;\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 getSelectedAnnotationWithPageIndex = (\n s: AnnotationState,\n): SelectedAnnotation | null => {\n if (!s.selectedUid) return null;\n const { pageIndex, localId } = parseUid(s.selectedUid);\n return { pageIndex, localId, annotation: s.byUid[s.selectedUid].object };\n};\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\nexport const isInAnnotationVariant = (s: AnnotationState) => s.activeVariant !== null;\nexport const getSelectedAnnotationVariant = (s: AnnotationState) => s.activeVariant;\n\n/** Check if a given anno on a page is the current selection. */\nexport const isAnnotationSelected = (s: AnnotationState, page: number, id: number) =>\n s.selectedUid === makeUid(page, id);\n\n/**\n * Return the tool-defaults for a given subtype and (optionally) intent.\n * If the exact variant (subtype + intent) is not present, it gracefully\n * falls back to the plain subtype variant.\n *\n * The return type is inferred so that you always get the concrete default\n * interface for the supplied subtype (e.g. `InkDefaults` for `INK`,\n * `CircleDefaults` for `CIRCLE`, …).\n */\nexport function getToolDefaultsBySubtypeAndIntent<\n S extends AnnotationState,\n TSub extends AnnotationDefaults['subtype'],\n>(state: S, subtype: TSub, intent?: string | null): Extract<AnnotationDefaults, { subtype: TSub }> {\n // Build keys\n const variantKey = makeVariantKey(subtype, intent ?? undefined);\n const fallbackKey = makeVariantKey(subtype);\n\n // Try exact match first, otherwise fall back to plain subtype\n const defaults = state.toolDefaults[variantKey] ?? state.toolDefaults[fallbackKey];\n\n if (!defaults) {\n throw new Error(\n `No tool defaults found for subtype ${subtype}${intent ? ` and intent ${intent}` : ''}`,\n );\n }\n\n // Cast is safe because we narrow the union by subtype\n return defaults as Extract<AnnotationDefaults, { subtype: TSub }>;\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 {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\n\nimport { lineRectWithEndings } from './patch-utils';\n\n/* ---------- helpers ---------- */\n\n/** Bounding box for arbitrary vertices (+ stroke). */\nconst vertsRect = (verts: Position[], sw: number): Rect =>\n expandRect(rectFromPoints(verts), sw / 2);\n\n/* ---------- dispatcher ---------- */\n\nexport function deriveRect(a: PdfAnnotationObject): Rect {\n switch (a.type) {\n /* mark‑ups already carry their real rect */\n case PdfAnnotationSubtype.HIGHLIGHT:\n case PdfAnnotationSubtype.UNDERLINE:\n case PdfAnnotationSubtype.STRIKEOUT:\n case PdfAnnotationSubtype.SQUIGGLY:\n case PdfAnnotationSubtype.SQUARE:\n case PdfAnnotationSubtype.CIRCLE:\n return a.rect;\n\n /* ink */\n case PdfAnnotationSubtype.INK: {\n const pts = a.inkList.flatMap((s) => s.points);\n return vertsRect(pts, a.strokeWidth);\n }\n\n /* one‑segment */\n case PdfAnnotationSubtype.LINE:\n return lineRectWithEndings(\n [a.linePoints.start, a.linePoints.end],\n a.strokeWidth,\n a.lineEndings,\n );\n\n /* multi‑segment */\n case PdfAnnotationSubtype.POLYLINE:\n return lineRectWithEndings(a.vertices, a.strokeWidth, a.lineEndings);\n\n case PdfAnnotationSubtype.POLYGON:\n return vertsRect(a.vertices, a.strokeWidth);\n\n default:\n return a.rect; // fallback – unchanged\n }\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","import { PdfAnnotationSubtype, PdfAnnotationObject } from '@embedpdf/models';\nimport {\n TrackedAnnotation,\n AnnotationDefaults,\n ToolDefaultsByMode,\n HighlightDefaults,\n UnderlineDefaults,\n StrikeoutDefaults,\n SquigglyDefaults,\n} from './types';\n\n/* ------------------------------------------------------------------ */\n/* 1. Generic “subtype‑to‑object” mapper */\n/* ------------------------------------------------------------------ */\n\nexport type AnnoOf<S extends PdfAnnotationSubtype> = Extract<PdfAnnotationObject, { type: S }>;\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<\n AnnoOf<\n | PdfAnnotationSubtype.HIGHLIGHT\n | PdfAnnotationSubtype.UNDERLINE\n | PdfAnnotationSubtype.STRIKEOUT\n | PdfAnnotationSubtype.SQUIGGLY\n >\n> {\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\n/* ------------------------------------------------------------------ */\n/* 3. Helpers for defaults and tool defaults */\n/* ------------------------------------------------------------------ */\n\nexport function isHighlightDefaults(defaults: AnnotationDefaults): defaults is HighlightDefaults {\n return defaults.subtype === PdfAnnotationSubtype.HIGHLIGHT;\n}\n\nexport function isUnderlineDefaults(defaults: AnnotationDefaults): defaults is UnderlineDefaults {\n return defaults.subtype === PdfAnnotationSubtype.UNDERLINE;\n}\n\nexport function isStrikeoutDefaults(defaults: AnnotationDefaults): defaults is StrikeoutDefaults {\n return defaults.subtype === PdfAnnotationSubtype.STRIKEOUT;\n}\n\nexport function isSquigglyDefaults(defaults: AnnotationDefaults): defaults is SquigglyDefaults {\n return defaults.subtype === PdfAnnotationSubtype.SQUIGGLY;\n}\n\nexport function isTextMarkupDefaults(\n defaults: AnnotationDefaults,\n): defaults is HighlightDefaults | UnderlineDefaults | StrikeoutDefaults | SquigglyDefaults {\n return (\n isHighlightDefaults(defaults) ||\n isUnderlineDefaults(defaults) ||\n isStrikeoutDefaults(defaults) ||\n isSquigglyDefaults(defaults)\n );\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n enumEntries,\n PluginRegistry,\n SET_DOCUMENT,\n} from '@embedpdf/core';\nimport {\n ignore,\n PdfAnnotationObject,\n PdfDocumentObject,\n PdfEngine,\n PdfErrorReason,\n Task,\n PdfAnnotationSubtype,\n PdfTaskHelper,\n PdfErrorCode,\n PdfTask,\n Rotation,\n AppearanceMode,\n PdfBlendMode,\n AnnotationCreateContext,\n} from '@embedpdf/models';\nimport {\n ActiveTool,\n AnnotationCapability,\n AnnotationPluginConfig,\n AnnotationState,\n BaseAnnotationDefaults,\n GetPageAnnotationsOptions,\n RenderAnnotationOptions,\n ToolDefaultsByMode,\n TrackedAnnotation,\n} from './types';\nimport {\n setAnnotations,\n selectAnnotation,\n deselectAnnotation,\n AnnotationAction,\n updateToolDefaults,\n addColorPreset,\n createAnnotation,\n patchAnnotation,\n deleteAnnotation,\n commitPendingChanges,\n storePdfId,\n purgeAnnotation,\n reindexPageAnnotations,\n setActiveVariant,\n} from './actions';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n InteractionMode,\n} from '@embedpdf/plugin-interaction-manager';\nimport { SelectionPlugin, SelectionCapability } from '@embedpdf/plugin-selection';\nimport { HistoryPlugin, HistoryCapability, Command } from '@embedpdf/plugin-history';\nimport { getSelectedAnnotation, getToolDefaultsBySubtypeAndIntent } from './selectors';\nimport { makeUid, parseUid } from './utils';\nimport { makeVariantKey, parseVariantKey } from './variant-key';\nimport { deriveRect } from './patching';\nimport { isTextMarkupDefaults } from './helpers';\n\nexport class AnnotationPlugin extends BasePlugin<\n AnnotationPluginConfig,\n AnnotationCapability,\n AnnotationState,\n AnnotationAction\n> {\n static readonly id = 'annotation' as const;\n\n private readonly ANNOTATION_HISTORY_TOPIC = 'annotations';\n\n private readonly config: AnnotationPluginConfig;\n\n private engine: PdfEngine;\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 readonly modeByVariant = new Map<string, string>();\n private readonly variantByMode = new Map<string, string>();\n private pendingContexts = new Map<number, unknown>();\n\n private readonly activeVariantChange$ = createBehaviorEmitter<string | null>();\n private readonly activeTool$ = createBehaviorEmitter<ActiveTool>({\n variantKey: null,\n defaults: null,\n });\n\n constructor(\n id: string,\n registry: PluginRegistry,\n engine: PdfEngine,\n config: AnnotationPluginConfig,\n ) {\n super(id, registry);\n this.engine = engine;\n this.config = config;\n\n const selection = registry.getPlugin<SelectionPlugin>('selection');\n this.selection = selection?.provides() ?? null;\n\n const history = registry.getPlugin<HistoryPlugin>('history');\n this.history = history?.provides() ?? null;\n\n const interactionManager = registry.getPlugin<InteractionManagerPlugin>('interaction-manager');\n this.interactionManager = interactionManager?.provides() ?? null;\n\n this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {\n const doc = state.core.document;\n if (doc) {\n this.getAllAnnotations(doc);\n }\n });\n }\n\n async initialize(): Promise<void> {\n for (const [variantKey, defaults] of Object.entries(this.state.toolDefaults)) {\n this.registerTool(variantKey, defaults);\n }\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 newVariant = this.variantByMode.get(s.activeMode) ?? null;\n if (newVariant !== this.state.activeVariant) {\n this.dispatch(setActiveVariant(newVariant));\n this.activeVariantChange$.emit(newVariant);\n }\n });\n\n this.selection?.onEndSelection(() => {\n if (!this.state.activeVariant) return;\n const defaults = this.state.toolDefaults[this.state.activeVariant];\n if (!defaults || !isTextMarkupDefaults(defaults)) return;\n\n const formattedSelection = this.selection?.getFormattedSelection();\n if (!formattedSelection) return;\n\n for (const selection of formattedSelection) {\n const rect = selection.rect;\n const segmentRects = selection.segmentRects;\n const subtype = defaults.subtype;\n const color = defaults.color;\n const opacity = defaults.opacity;\n const blendMode = defaults.blendMode ?? PdfBlendMode.Normal;\n\n this.createAnnotation(selection.pageIndex, {\n type: subtype,\n rect,\n segmentRects,\n color,\n opacity,\n blendMode,\n pageIndex: selection.pageIndex,\n id: Date.now() + Math.random(),\n });\n }\n\n this.selection?.clear();\n });\n }\n\n private registerTool(variantKey: string, defaults: BaseAnnotationDefaults) {\n const modeId = defaults.interaction.mode;\n const interactionMode: InteractionMode = {\n id: modeId,\n scope: 'page',\n exclusive: defaults.interaction.exclusive,\n cursor: defaults.interaction.cursor,\n };\n\n this.interactionManager?.registerMode(interactionMode);\n\n if (defaults.textSelection) {\n this.selection?.enableForMode(modeId);\n }\n\n this.modeByVariant.set(variantKey, modeId);\n this.variantByMode.set(modeId, variantKey);\n }\n\n protected buildCapability(): AnnotationCapability {\n return {\n getPageAnnotations: (options: GetPageAnnotationsOptions) => {\n return this.getPageAnnotations(options);\n },\n getSelectedAnnotation: () => {\n return getSelectedAnnotation(this.state);\n },\n selectAnnotation: (pageIndex: number, annotationId: number) => {\n this.selectAnnotation(pageIndex, annotationId);\n },\n deselectAnnotation: () => {\n this.dispatch(deselectAnnotation());\n },\n getActiveVariant: () => {\n return this.state.activeVariant;\n },\n setActiveVariant: (variantKey: string | null) => {\n if (variantKey === this.state.activeVariant) return;\n if (variantKey) {\n const mode = this.modeByVariant.get(variantKey);\n if (!mode) throw new Error(`Mode missing for variant ${variantKey}`);\n this.interactionManager?.activate(mode);\n } else {\n this.interactionManager?.activate('default');\n }\n },\n getSubtypeAndIntentByVariant: (variantKey) => {\n return parseVariantKey(variantKey);\n },\n getToolDefaults: (variantKey) => {\n const defaults = this.state.toolDefaults[variantKey];\n if (!defaults) {\n throw new Error(`No defaults found for variant: ${variantKey}`);\n }\n return defaults;\n },\n getToolDefaultsBySubtypeAndIntent: (subtype, intent) => {\n return getToolDefaultsBySubtypeAndIntent(this.state, subtype, intent);\n },\n getToolDefaultsBySubtype: (subtype) => {\n return getToolDefaultsBySubtypeAndIntent(this.state, subtype);\n },\n setToolDefaults: (variantKey, patch) => {\n this.dispatch(updateToolDefaults(variantKey, patch));\n },\n getColorPresets: () => [...this.state.colorPresets],\n addColorPreset: (color) => this.dispatch(addColorPreset(color)),\n createAnnotation: <A extends PdfAnnotationObject>(\n pageIndex: number,\n annotation: A,\n ctx?: AnnotationCreateContext<A>,\n ) => this.createAnnotation(pageIndex, annotation, ctx),\n updateAnnotation: (pageIndex: number, localId: number, patch: Partial<PdfAnnotationObject>) =>\n this.updateAnnotation(pageIndex, localId, patch),\n deleteAnnotation: (pageIndex: number, localId: number) =>\n this.deleteAnnotation(pageIndex, localId),\n renderAnnotation: (options: RenderAnnotationOptions) => this.renderAnnotation(options),\n onStateChange: this.state$.on,\n onActiveVariantChange: this.activeVariantChange$.on,\n onActiveToolChange: this.activeTool$.on,\n commit: () => this.commit(),\n };\n }\n\n private createActiveTool(mode: string | null, toolDefaults: ToolDefaultsByMode): ActiveTool {\n if (mode === null) {\n return { variantKey: null, defaults: null };\n }\n return { variantKey: mode, defaults: toolDefaults[mode] } as ActiveTool;\n }\n\n private emitActiveTool(state: AnnotationState) {\n const activeTool = this.createActiveTool(state.activeVariant, state.toolDefaults);\n this.activeTool$.emit(activeTool);\n }\n\n override onStoreUpdated(prev: AnnotationState, next: AnnotationState): void {\n this.state$.emit(next);\n if (\n prev.activeVariant !== next.activeVariant ||\n prev.toolDefaults[prev.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT] !==\n next.toolDefaults[next.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT]\n ) {\n this.emitActiveTool(next);\n }\n }\n\n private getAllAnnotations(doc: PdfDocumentObject) {\n const task = this.engine.getAllAnnotations(doc);\n task.wait((annotations) => this.dispatch(setAnnotations(annotations)), 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({\n pageIndex,\n annotation,\n scaleFactor = 1,\n rotation = Rotation.Degree0,\n dpr = 1,\n mode = AppearanceMode.Normal,\n imageType = 'image/webp',\n }: RenderAnnotationOptions) {\n const coreState = this.coreState.core;\n\n if (!coreState.document) {\n throw new Error('document does not open');\n }\n\n const page = coreState.document.pages.find((page) => page.index === pageIndex);\n if (!page) {\n throw new Error('page does not exist');\n }\n\n return this.engine.renderAnnotation(\n coreState.document,\n page,\n annotation,\n scaleFactor,\n rotation,\n dpr,\n mode,\n imageType,\n );\n }\n\n private selectAnnotation(pageIndex: number, annotationId: number) {\n this.dispatch(selectAnnotation(pageIndex, annotationId));\n }\n\n private createAnnotation<A extends PdfAnnotationObject>(\n pageIndex: number,\n annotation: A,\n ctx?: AnnotationCreateContext<A>,\n ) {\n const localId = annotation.id;\n const execute = () => {\n this.dispatch(createAnnotation(pageIndex, localId, annotation));\n if (ctx) this.pendingContexts.set(localId, ctx);\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(localId);\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\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 const merged = { ...original, ...patch } as PdfAnnotationObject;\n return { ...patch, rect: deriveRect(merged) };\n }\n\n private updateAnnotation(\n pageIndex: number,\n localId: number,\n patch: Partial<PdfAnnotationObject>,\n ) {\n const originalObject = this.state.byUid[makeUid(pageIndex, localId)].object;\n const finalPatch = this.buildPatch(originalObject, patch);\n\n if (!this.history) {\n this.dispatch(patchAnnotation(pageIndex, localId, finalPatch));\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: () => this.dispatch(patchAnnotation(pageIndex, localId, finalPatch)),\n undo: () => this.dispatch(patchAnnotation(pageIndex, localId, originalPatch)),\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\n }\n\n private deleteAnnotation(pageIndex: number, localId: number) {\n if (!this.history) {\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\n if (this.config.autoCommit !== false) {\n this.commit();\n }\n return;\n }\n const originalAnnotation = this.state.byUid[makeUid(pageIndex, localId)].object;\n const command: Command = {\n execute: () => {\n this.dispatch(deselectAnnotation());\n this.dispatch(deleteAnnotation(pageIndex, localId));\n },\n undo: () => this.dispatch(createAnnotation(pageIndex, localId, originalAnnotation)),\n };\n this.history.register(command, this.ANNOTATION_HISTORY_TOPIC);\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 deletionsByPage = new Map<number, { ta: TrackedAnnotation; uid: string }[]>();\n const affectedPages = new Set<number>();\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 { pageIndex } = parseUid(uid);\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) continue;\n\n affectedPages.add(pageIndex);\n\n switch (ta.commitState) {\n case 'new':\n const ctx = this.pendingContexts.get(ta.localId) as AnnotationCreateContext<\n typeof ta.object\n >;\n const task = this.engine.createPageAnnotation!(doc, page, ta.object, ctx);\n task.wait((annoId) => {\n this.dispatch(storePdfId(uid, annoId));\n this.pendingContexts.delete(ta.localId);\n }, ignore);\n creations.push(task);\n break;\n case 'dirty':\n updates.push(\n this.engine.updatePageAnnotation!(doc, page, { ...ta.object, id: ta.pdfId! }),\n );\n break;\n case 'deleted':\n if (!deletionsByPage.has(pageIndex)) {\n deletionsByPage.set(pageIndex, []);\n }\n deletionsByPage.get(pageIndex)!.push({ ta, uid });\n break;\n }\n }\n\n // 2. Create deletion tasks, sorted by ID descending\n const deletionTasks: Task<any, PdfErrorReason>[] = [];\n for (const [pageIndex, deletions] of deletionsByPage.entries()) {\n const page = doc.pages.find((p) => p.index === pageIndex)!;\n\n deletions.sort((a, b) => (b.ta.pdfId ?? -1) - (a.ta.pdfId ?? -1));\n\n for (const { ta, uid } of deletions) {\n if (ta.pdfId !== undefined) {\n const task = new Task<any, PdfErrorReason>();\n const removeTask = this.engine.removePageAnnotation!(doc, page, {\n ...ta.object,\n id: ta.pdfId!,\n });\n removeTask.wait(() => {\n this.dispatch(purgeAnnotation(uid));\n task.resolve(true);\n }, task.fail);\n deletionTasks.push(task);\n } else {\n this.dispatch(purgeAnnotation(uid));\n }\n }\n }\n\n // 3. Chain the operations: creations/updates -> deletions -> re-sync\n const allWriteTasks = [...creations, ...updates, ...deletionTasks];\n\n Task.allSettled(allWriteTasks).wait(() => {\n // 4. Client-Side Re-indexing\n // After all engine operations are done, tell the reducer to re-index each affected page.\n for (const pageIndex of affectedPages) {\n this.dispatch(reindexPageAnnotations(pageIndex));\n }\n\n // 5. 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","import { Reducer } from '@embedpdf/core';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationLineEnding,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfStandardFont,\n PdfTextAlignment,\n PdfVerticalAlignment,\n} from '@embedpdf/models';\nimport {\n ADD_COLOR_PRESET,\n COMMIT_PENDING_CHANGES,\n CREATE_ANNOTATION,\n DESELECT_ANNOTATION,\n PATCH_ANNOTATION,\n DELETE_ANNOTATION,\n SELECT_ANNOTATION,\n SET_ANNOTATIONS,\n UPDATE_TOOL_DEFAULTS,\n AnnotationAction,\n PURGE_ANNOTATION,\n STORE_PDF_ID,\n REINDEX_PAGE_ANNOTATIONS,\n SET_ACTIVE_VARIANT,\n} from './actions';\nimport {\n AnnotationDefaults,\n AnnotationPluginConfig,\n AnnotationState,\n TrackedAnnotation,\n} from './types';\nimport { makeUid } from './utils';\nimport { makeVariantKey } from './variant-key';\n\n/* ─────────── util helpers ─────────── */\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/* helper to immutably replace one annotation (preserving pdfId) */\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\n/* ─────────── initialState ─────────── */\nexport const initialState = (cfg: AnnotationPluginConfig): AnnotationState => ({\n pages: {},\n byUid: {},\n selectedUid: null,\n activeVariant: null,\n\n toolDefaults: {\n [makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT)]: {\n name: 'Highlight',\n subtype: PdfAnnotationSubtype.HIGHLIGHT,\n interaction: { mode: 'highlight', exclusive: false },\n textSelection: true,\n color: '#FFCD45',\n opacity: 1,\n blendMode: PdfBlendMode.Multiply,\n },\n [makeVariantKey(PdfAnnotationSubtype.UNDERLINE)]: {\n name: 'Underline',\n subtype: PdfAnnotationSubtype.UNDERLINE,\n interaction: { mode: 'underline', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.STRIKEOUT)]: {\n name: 'Strikeout',\n subtype: PdfAnnotationSubtype.STRIKEOUT,\n interaction: { mode: 'strikeout', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.SQUIGGLY)]: {\n name: 'Squiggly',\n subtype: PdfAnnotationSubtype.SQUIGGLY,\n interaction: { mode: 'squiggly', exclusive: false },\n textSelection: true,\n color: '#E44234',\n opacity: 1,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.INK)]: {\n name: 'Ink',\n subtype: PdfAnnotationSubtype.INK,\n interaction: { mode: 'ink', exclusive: true, cursor: 'crosshair' },\n color: '#E44234',\n opacity: 1,\n strokeWidth: 11,\n blendMode: PdfBlendMode.Normal,\n },\n [makeVariantKey(PdfAnnotationSubtype.INK, 'InkHighlight')]: {\n name: 'Ink Highlight',\n subtype: PdfAnnotationSubtype.INK,\n intent: 'InkHighlight',\n interaction: { mode: 'inkHighlight', exclusive: true, cursor: 'crosshair' },\n color: '#E44234',\n opacity: 1,\n strokeWidth: 11,\n blendMode: PdfBlendMode.Multiply,\n },\n [makeVariantKey(PdfAnnotationSubtype.CIRCLE)]: {\n name: 'Circle',\n subtype: PdfAnnotationSubtype.CIRCLE,\n interaction: { mode: 'circle', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.SQUARE)]: {\n name: 'Square',\n subtype: PdfAnnotationSubtype.SQUARE,\n interaction: { mode: 'square', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.LINE)]: {\n name: 'Line',\n subtype: PdfAnnotationSubtype.LINE,\n interaction: { mode: 'line', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.LINE, 'LineArrow')]: {\n name: 'Line Arrow',\n subtype: PdfAnnotationSubtype.LINE,\n interaction: { mode: 'lineArrow', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n intent: 'LineArrow',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n lineEndings: {\n start: PdfAnnotationLineEnding.None,\n end: PdfAnnotationLineEnding.OpenArrow,\n },\n },\n [makeVariantKey(PdfAnnotationSubtype.POLYLINE)]: {\n name: 'Polyline',\n subtype: PdfAnnotationSubtype.POLYLINE,\n interaction: { mode: 'polyline', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.POLYGON)]: {\n name: 'Polygon',\n subtype: PdfAnnotationSubtype.POLYGON,\n interaction: { mode: 'polygon', exclusive: true, cursor: 'crosshair' },\n color: 'transparent',\n opacity: 1,\n strokeWidth: 4,\n strokeColor: '#E44234',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n [makeVariantKey(PdfAnnotationSubtype.FREETEXT)]: {\n name: 'Free Text',\n subtype: PdfAnnotationSubtype.FREETEXT,\n interaction: { mode: 'freeText', exclusive: true, cursor: 'crosshair' },\n backgroundColor: 'transparent',\n opacity: 1,\n fontSize: 14,\n fontColor: '#E44234',\n content: 'Insert text here',\n fontFamily: PdfStandardFont.Helvetica,\n textAlign: PdfTextAlignment.Left,\n verticalAlign: PdfVerticalAlignment.Top,\n },\n [makeVariantKey(PdfAnnotationSubtype.STAMP)]: {\n name: 'Photo',\n subtype: PdfAnnotationSubtype.STAMP,\n interaction: { mode: 'stamp', exclusive: true, cursor: 'crosshair' },\n },\n ...cfg.toolDefaults,\n },\n colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,\n hasPendingChanges: false,\n});\n\n/* ─────────── reducer ─────────── */\nexport const reducer: Reducer<AnnotationState, AnnotationAction> = (state, action) => {\n switch (action.type) {\n /* ───── bulk load from engine ───── */\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, index) => {\n const localId = Date.now() + Math.random() + index;\n const uid = makeUid(pageIndex, localId);\n newByUid[uid] = { localId, pdfId: a.id, commitState: 'synced', object: a };\n return uid;\n });\n newPages[pageIndex] = newUidsOnPage;\n }\n return { ...state, pages: newPages, byUid: newByUid };\n }\n\n /* ───── GUI bits ───── */\n case SET_ACTIVE_VARIANT:\n return { ...state, activeVariant: action.payload };\n case SELECT_ANNOTATION:\n return {\n ...state,\n selectedUid: makeUid(action.payload.pageIndex, action.payload.localId),\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 UPDATE_TOOL_DEFAULTS: {\n const { variantKey, patch } = action.payload;\n const prev = state.toolDefaults[variantKey];\n if (!prev) return state;\n return {\n ...state,\n toolDefaults: {\n ...state.toolDefaults,\n [variantKey]: { ...prev, ...patch } as AnnotationDefaults,\n },\n };\n }\n\n /* ───── create ───── */\n case CREATE_ANNOTATION: {\n const { pageIndex, localId, annotation } = action.payload;\n const uid = makeUid(pageIndex, localId);\n\n return {\n ...state,\n pages: { ...state.pages, [pageIndex]: [...(state.pages[pageIndex] ?? []), uid] },\n byUid: {\n ...state.byUid,\n [uid]: { localId, pdfId: undefined, commitState: 'new', object: annotation },\n },\n hasPendingChanges: true,\n };\n }\n\n /* ───── delete ───── */\n case DELETE_ANNOTATION: {\n const { pageIndex, localId } = action.payload;\n const uid = makeUid(pageIndex, localId);\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 /* ───── field edits ───── */\n case PATCH_ANNOTATION: {\n const uid = makeUid(action.payload.pageIndex, action.payload.localId);\n return patchAnno(state, uid, action.payload.patch);\n }\n\n /* ───── commit bookkeeping ───── */\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 REINDEX_PAGE_ANNOTATIONS: {\n const { pageIndex } = action.payload;\n const newByUid = { ...state.byUid };\n\n const uidsOnPage = state.pages[pageIndex] || [];\n const annosOnPage = uidsOnPage\n .map((uid) => state.byUid[uid])\n .filter((ta) => ta && ta.commitState !== 'deleted'); // Filter out annotations pending deletion\n\n // CORRECTED: Sort by the existing pdfId to maintain relative order.\n annosOnPage.sort((a, b) => (a.pdfId ?? Infinity) - (b.pdfId ?? Infinity));\n\n // Update the pdfId for each annotation based on its new sorted index\n annosOnPage.forEach((ta, newPdfId) => {\n const uid = makeUid(pageIndex, ta.localId);\n newByUid[uid] = { ...newByUid[uid], pdfId: newPdfId };\n });\n\n return { ...state, byUid: newByUid };\n }\n\n case STORE_PDF_ID: {\n const { uid, pdfId } = action.payload;\n\n const ta = state.byUid[uid];\n if (!ta) return state;\n return {\n ...state,\n byUid: {\n ...state.byUid,\n [uid]: { ...ta, pdfId, commitState: 'synced' },\n },\n };\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 { 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, engine, config) =>\n new AnnotationPlugin(ANNOTATION_PLUGIN_ID, registry, engine, 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 './variant-key';\nexport * from './helpers';\nexport * as patching from './patching';\n"],"names":["makeUid","pad","_a","_b","page","task","index"],"mappings":"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"}
@@ -13,6 +13,7 @@ export declare class AnnotationPlugin extends BasePlugin<AnnotationPluginConfig,
13
13
  private readonly history;
14
14
  private readonly modeByVariant;
15
15
  private readonly variantByMode;
16
+ private pendingContexts;
16
17
  private readonly activeVariantChange$;
17
18
  private readonly activeTool$;
18
19
  constructor(id: string, registry: PluginRegistry, engine: PdfEngine, config: AnnotationPluginConfig);
@@ -17,6 +17,7 @@ export declare function isStrikeout(a: TrackedAnnotation): a is TrackedAnnotatio
17
17
  export declare function isSquiggly(a: TrackedAnnotation): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.SQUIGGLY>>;
18
18
  export declare function isTextMarkup(a: TrackedAnnotation): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.HIGHLIGHT | PdfAnnotationSubtype.UNDERLINE | PdfAnnotationSubtype.STRIKEOUT | PdfAnnotationSubtype.SQUIGGLY>>;
19
19
  export declare function isFreeText(a: TrackedAnnotation): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.FREETEXT>>;
20
+ export declare function isStamp(a: TrackedAnnotation): a is TrackedAnnotation<AnnoOf<PdfAnnotationSubtype.STAMP>>;
20
21
  export declare function isHighlightDefaults(defaults: AnnotationDefaults): defaults is HighlightDefaults;
21
22
  export declare function isUnderlineDefaults(defaults: AnnotationDefaults): defaults is UnderlineDefaults;
22
23
  export declare function isStrikeoutDefaults(defaults: AnnotationDefaults): defaults is StrikeoutDefaults;
@@ -1,5 +1,5 @@
1
1
  import { BasePluginConfig, EventHook } from '@embedpdf/core';
2
- import { PdfAnnotationObject, PdfErrorReason, Task, PdfAnnotationSubtype, WebAlphaColor, Rotation, ImageConversionTypes, AppearanceMode, PdfBlendMode, PdfAnnotationBorderStyle, LineEndings, PdfStandardFont, PdfTextAlignment, PdfVerticalAlignment } from '@embedpdf/models';
2
+ import { PdfAnnotationObject, PdfErrorReason, Task, PdfAnnotationSubtype, WebAlphaColor, Rotation, ImageConversionTypes, AppearanceMode, PdfBlendMode, PdfAnnotationBorderStyle, LineEndings, PdfStandardFont, PdfTextAlignment, PdfVerticalAlignment, AnnotationCreateContext } from '@embedpdf/models';
3
3
  export type CommitState = 'new' | 'dirty' | 'deleted' | 'synced' | 'ignored';
4
4
  export interface TrackedAnnotation<T extends PdfAnnotationObject = PdfAnnotationObject> {
5
5
  /** A stable, client-side unique identifier for history and state management. */
@@ -125,7 +125,10 @@ export interface PolygonDefaults extends BaseAnnotationDefaults {
125
125
  color: string;
126
126
  opacity: number;
127
127
  }
128
- export type AnnotationDefaults = HighlightDefaults | UnderlineDefaults | StrikeoutDefaults | SquigglyDefaults | InkDefaults | TextDefaults | CircleDefaults | SquareDefaults | LineDefaults | PolylineDefaults | PolygonDefaults;
128
+ export interface PhotoDefaults extends BaseAnnotationDefaults {
129
+ subtype: PdfAnnotationSubtype.STAMP;
130
+ }
131
+ export type AnnotationDefaults = HighlightDefaults | UnderlineDefaults | StrikeoutDefaults | SquigglyDefaults | InkDefaults | TextDefaults | CircleDefaults | SquareDefaults | LineDefaults | PolylineDefaults | PolygonDefaults | PhotoDefaults;
129
132
  export type ToolDefaultsByMode = {
130
133
  [K in string]: AnnotationDefaults;
131
134
  };
@@ -182,7 +185,7 @@ export interface AnnotationCapability {
182
185
  getColorPresets: () => string[];
183
186
  /** append a swatch (deduped by RGBA) */
184
187
  addColorPreset: (color: string) => void;
185
- createAnnotation: (pageIndex: number, annotation: PdfAnnotationObject) => void;
188
+ createAnnotation: <A extends PdfAnnotationObject>(pageIndex: number, annotation: A, ctx?: AnnotationCreateContext<A>) => void;
186
189
  updateAnnotation: (pageIndex: number, annotationId: number, patch: Partial<PdfAnnotationObject>) => void;
187
190
  deleteAnnotation: (pageIndex: number, annotationId: number) => void;
188
191
  renderAnnotation: (options: RenderAnnotationOptions) => Task<Blob, PdfErrorReason>;
@@ -6,6 +6,7 @@ export type CSSProperties = import('preact').JSX.CSSProperties;
6
6
  export type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<T extends EventTarget ? T : never>;
7
7
  export type MouseEvent<T = Element> = JSX.TargetedMouseEvent<T extends EventTarget ? T : never>;
8
8
  export type PointerEvent<T = Element> = JSX.TargetedPointerEvent<T extends EventTarget ? T : never>;
9
+ export type ChangeEvent<T = Element> = JSX.TargetedInputEvent<T extends EventTarget ? T : never>;
9
10
  export declare const mapDoubleClick: (handler: any) => {
10
11
  onDblClick: any;
11
12
  } | {