@embedpdf/plugin-annotation 1.0.11 → 1.0.12

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.
Files changed (71) hide show
  1. package/dist/index.cjs +2 -693
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -266
  4. package/dist/index.js +180 -158
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +104 -0
  7. package/dist/lib/annotation-plugin.d.ts +33 -0
  8. package/dist/lib/index.d.ts +10 -0
  9. package/dist/lib/manifest.d.ts +4 -0
  10. package/dist/lib/reducer.d.ts +5 -0
  11. package/dist/lib/selectors.d.ts +13 -0
  12. package/dist/lib/types.d.ts +121 -0
  13. package/dist/lib/utils.d.ts +11 -0
  14. package/dist/lib/variant-key.d.ts +8 -0
  15. package/dist/preact/adapter.d.ts +8 -0
  16. package/dist/preact/core.d.ts +1 -0
  17. package/dist/preact/index.cjs +2 -1038
  18. package/dist/preact/index.cjs.map +1 -1
  19. package/dist/preact/index.d.ts +1 -28
  20. package/dist/preact/index.js +126 -156
  21. package/dist/preact/index.js.map +1 -1
  22. package/dist/preact/interaction-manager.d.ts +1 -0
  23. package/dist/preact/selection.d.ts +1 -0
  24. package/dist/react/adapter.d.ts +2 -0
  25. package/dist/react/core.d.ts +1 -0
  26. package/dist/react/index.cjs +2 -0
  27. package/dist/react/index.cjs.map +1 -0
  28. package/dist/react/index.d.ts +1 -0
  29. package/dist/react/index.js +983 -0
  30. package/dist/react/index.js.map +1 -0
  31. package/dist/react/interaction-manager.d.ts +1 -0
  32. package/dist/react/selection.d.ts +1 -0
  33. package/dist/shared-preact/components/annotation-container.d.ts +19 -0
  34. package/dist/shared-preact/components/annotation-layer.d.ts +11 -0
  35. package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
  36. package/dist/shared-preact/components/annotations/ink-paint.d.ts +17 -0
  37. package/dist/shared-preact/components/annotations/ink.d.ts +23 -0
  38. package/dist/shared-preact/components/annotations.d.ts +7 -0
  39. package/dist/shared-preact/components/index.d.ts +1 -0
  40. package/dist/shared-preact/components/render-annotation.d.ts +11 -0
  41. package/dist/shared-preact/components/text-markup/highlight.d.ts +13 -0
  42. package/dist/shared-preact/components/text-markup/squiggly.d.ts +13 -0
  43. package/dist/shared-preact/components/text-markup/strikeout.d.ts +13 -0
  44. package/dist/shared-preact/components/text-markup/underline.d.ts +13 -0
  45. package/dist/shared-preact/components/text-markup.d.ts +6 -0
  46. package/dist/shared-preact/hooks/index.d.ts +1 -0
  47. package/dist/shared-preact/hooks/use-annotation.d.ts +11 -0
  48. package/dist/shared-preact/index.d.ts +2 -0
  49. package/dist/shared-preact/resize-ink.d.ts +17 -0
  50. package/dist/shared-preact/types.d.ts +1 -0
  51. package/dist/shared-react/components/annotation-container.d.ts +19 -0
  52. package/dist/shared-react/components/annotation-layer.d.ts +11 -0
  53. package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
  54. package/dist/shared-react/components/annotations/ink-paint.d.ts +17 -0
  55. package/dist/shared-react/components/annotations/ink.d.ts +23 -0
  56. package/dist/shared-react/components/annotations.d.ts +7 -0
  57. package/dist/shared-react/components/index.d.ts +1 -0
  58. package/dist/shared-react/components/render-annotation.d.ts +11 -0
  59. package/dist/shared-react/components/text-markup/highlight.d.ts +13 -0
  60. package/dist/shared-react/components/text-markup/squiggly.d.ts +13 -0
  61. package/dist/shared-react/components/text-markup/strikeout.d.ts +13 -0
  62. package/dist/shared-react/components/text-markup/underline.d.ts +13 -0
  63. package/dist/shared-react/components/text-markup.d.ts +6 -0
  64. package/dist/shared-react/hooks/index.d.ts +1 -0
  65. package/dist/shared-react/hooks/use-annotation.d.ts +11 -0
  66. package/dist/shared-react/index.d.ts +2 -0
  67. package/dist/shared-react/resize-ink.d.ts +17 -0
  68. package/dist/shared-react/types.d.ts +1 -0
  69. package/package.json +17 -15
  70. package/dist/index.d.cts +0 -266
  71. package/dist/preact/index.d.cts +0 -28
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- // src/lib/manifest.ts
2
- var ANNOTATION_PLUGIN_ID = "annotation";
3
- var manifest = {
1
+ import { BasePlugin, createBehaviorEmitter, SET_DOCUMENT } from "@embedpdf/core";
2
+ import { PdfAnnotationSubtype, PdfBlendMode, ignore, PdfTaskHelper, PdfErrorCode, Rotation, AppearanceMode, Task } from "@embedpdf/models";
3
+ const ANNOTATION_PLUGIN_ID = "annotation";
4
+ const manifest = {
4
5
  id: ANNOTATION_PLUGIN_ID,
5
6
  name: "Annotation Plugin",
6
7
  version: "1.0.0",
@@ -12,104 +13,81 @@ var manifest = {
12
13
  autoCommit: true
13
14
  }
14
15
  };
15
-
16
- // src/lib/annotation-plugin.ts
17
- import {
18
- BasePlugin,
19
- createBehaviorEmitter,
20
- enumEntries,
21
- SET_DOCUMENT
22
- } from "@embedpdf/core";
23
- import {
24
- ignore,
25
- Task,
26
- PdfAnnotationSubtype,
27
- PdfTaskHelper,
28
- PdfErrorCode,
29
- Rotation,
30
- AppearanceMode
31
- } from "@embedpdf/models";
32
-
33
- // src/lib/actions.ts
34
- var SET_ANNOTATIONS = "ANNOTATION/SET_ANNOTATIONS";
35
- var REINDEX_PAGE_ANNOTATIONS = "ANNOTATION/REINDEX_PAGE";
36
- var SELECT_ANNOTATION = "ANNOTATION/SELECT_ANNOTATION";
37
- var DESELECT_ANNOTATION = "ANNOTATION/DESELECT_ANNOTATION";
38
- var SET_ANNOTATION_MODE = "ANNOTATION/SET_ANNOTATION_MODE";
39
- var UPDATE_TOOL_DEFAULTS = "ANNOTATION/UPDATE_TOOL_DEFAULTS";
40
- var ADD_COLOR_PRESET = "ANNOTATION/ADD_COLOR_PRESET";
41
- var CREATE_ANNOTATION = "ANNOTATION/CREATE_ANNOTATION";
42
- var PATCH_ANNOTATION = "ANNOTATION/PATCH_ANNOTATION";
43
- var DELETE_ANNOTATION = "ANNOTATION/DELETE_ANNOTATION";
44
- var COMMIT_PENDING_CHANGES = "ANNOTATION/COMMIT";
45
- var STORE_PDF_ID = "ANNOTATION/STORE_PDF_ID";
46
- var PURGE_ANNOTATION = "ANNOTATION/PURGE_ANNOTATION";
47
- var setAnnotations = (p) => ({
16
+ const SET_ANNOTATIONS = "ANNOTATION/SET_ANNOTATIONS";
17
+ const REINDEX_PAGE_ANNOTATIONS = "ANNOTATION/REINDEX_PAGE";
18
+ const SELECT_ANNOTATION = "ANNOTATION/SELECT_ANNOTATION";
19
+ const DESELECT_ANNOTATION = "ANNOTATION/DESELECT_ANNOTATION";
20
+ const UPDATE_TOOL_DEFAULTS = "ANNOTATION/UPDATE_TOOL_DEFAULTS";
21
+ const ADD_COLOR_PRESET = "ANNOTATION/ADD_COLOR_PRESET";
22
+ const CREATE_ANNOTATION = "ANNOTATION/CREATE_ANNOTATION";
23
+ const PATCH_ANNOTATION = "ANNOTATION/PATCH_ANNOTATION";
24
+ const DELETE_ANNOTATION = "ANNOTATION/DELETE_ANNOTATION";
25
+ const COMMIT_PENDING_CHANGES = "ANNOTATION/COMMIT";
26
+ const STORE_PDF_ID = "ANNOTATION/STORE_PDF_ID";
27
+ const PURGE_ANNOTATION = "ANNOTATION/PURGE_ANNOTATION";
28
+ const SET_ACTIVE_VARIANT = "ANNOTATION/SET_ACTIVE_VARIANT";
29
+ const setAnnotations = (p) => ({
48
30
  type: SET_ANNOTATIONS,
49
31
  payload: p
50
32
  });
51
- var reindexPageAnnotations = (pageIndex) => ({
33
+ const reindexPageAnnotations = (pageIndex) => ({
52
34
  type: REINDEX_PAGE_ANNOTATIONS,
53
35
  payload: { pageIndex }
54
36
  });
55
- var selectAnnotation = (pageIndex, localId) => ({
37
+ const selectAnnotation = (pageIndex, localId) => ({
56
38
  type: SELECT_ANNOTATION,
57
39
  payload: { pageIndex, localId }
58
40
  });
59
- var deselectAnnotation = () => ({ type: DESELECT_ANNOTATION });
60
- var setAnnotationMode = (m) => ({
61
- type: SET_ANNOTATION_MODE,
62
- payload: m
63
- });
64
- var updateToolDefaults = (subtype, patch) => ({ type: UPDATE_TOOL_DEFAULTS, payload: { subtype, patch } });
65
- var addColorPreset = (c) => ({
41
+ const deselectAnnotation = () => ({ type: DESELECT_ANNOTATION });
42
+ const updateToolDefaults = (variantKey, patch) => ({ type: UPDATE_TOOL_DEFAULTS, payload: { variantKey, patch } });
43
+ const addColorPreset = (c) => ({
66
44
  type: ADD_COLOR_PRESET,
67
45
  payload: c
68
46
  });
69
- var createAnnotation = (pageIndex, localId, annotation) => ({
47
+ const createAnnotation = (pageIndex, localId, annotation) => ({
70
48
  type: CREATE_ANNOTATION,
71
49
  payload: { pageIndex, localId, annotation }
72
50
  });
73
- var patchAnnotation = (pageIndex, localId, patch) => ({
51
+ const patchAnnotation = (pageIndex, localId, patch) => ({
74
52
  type: PATCH_ANNOTATION,
75
53
  payload: { pageIndex, localId, patch }
76
54
  });
77
- var deleteAnnotation = (pageIndex, localId) => ({
55
+ const deleteAnnotation = (pageIndex, localId) => ({
78
56
  type: DELETE_ANNOTATION,
79
57
  payload: { pageIndex, localId }
80
58
  });
81
- var commitPendingChanges = () => ({ type: COMMIT_PENDING_CHANGES });
82
- var storePdfId = (uid, pdfId) => ({
59
+ const commitPendingChanges = () => ({ type: COMMIT_PENDING_CHANGES });
60
+ const storePdfId = (uid, pdfId) => ({
83
61
  type: STORE_PDF_ID,
84
62
  payload: { uid, pdfId }
85
63
  });
86
- var purgeAnnotation = (uid) => ({
64
+ const purgeAnnotation = (uid) => ({
87
65
  type: PURGE_ANNOTATION,
88
66
  payload: { uid }
89
67
  });
90
-
91
- // src/lib/utils.ts
92
- var makeUid = (pageIndex, localId) => `p${pageIndex}#${localId}`;
93
- var parseUid = (uid) => {
68
+ const setActiveVariant = (k) => ({
69
+ type: SET_ACTIVE_VARIANT,
70
+ payload: k
71
+ });
72
+ const makeUid$1 = (pageIndex, localId) => `p${pageIndex}#${localId}`;
73
+ const parseUid = (uid) => {
94
74
  const [pg, rest] = uid.slice(1).split("#");
95
75
  return { pageIndex: Number(pg), localId: Number(rest) };
96
76
  };
97
-
98
- // src/lib/selectors.ts
99
- var makeUid2 = (page, id) => `p${page}#${id}`;
100
- var getAnnotationsByPageIndex = (s, page) => (s.pages[page] ?? []).map((uid) => s.byUid[uid]);
101
- var getAnnotations = (s) => {
77
+ const makeUid = (page, id) => `p${page}#${id}`;
78
+ const getAnnotationsByPageIndex = (s, page) => (s.pages[page] ?? []).map((uid) => s.byUid[uid]);
79
+ const getAnnotations = (s) => {
102
80
  const out = {};
103
81
  for (const p of Object.keys(s.pages).map(Number)) out[p] = getAnnotationsByPageIndex(s, p);
104
82
  return out;
105
83
  };
106
- var getSelectedAnnotation = (s) => s.selectedUid ? s.byUid[s.selectedUid] : null;
107
- var getSelectedAnnotationWithPageIndex = (s) => {
84
+ const getSelectedAnnotation = (s) => s.selectedUid ? s.byUid[s.selectedUid] : null;
85
+ const getSelectedAnnotationWithPageIndex = (s) => {
108
86
  if (!s.selectedUid) return null;
109
87
  const { pageIndex, localId } = parseUid(s.selectedUid);
110
88
  return { pageIndex, localId, annotation: s.byUid[s.selectedUid].object };
111
89
  };
112
- var getSelectedAnnotationByPageIndex = (s, pageIndex) => {
90
+ const getSelectedAnnotationByPageIndex = (s, pageIndex) => {
113
91
  if (!s.selectedUid) return null;
114
92
  const pageUids = s.pages[pageIndex] ?? [];
115
93
  if (pageUids.includes(s.selectedUid)) {
@@ -117,33 +95,35 @@ var getSelectedAnnotationByPageIndex = (s, pageIndex) => {
117
95
  }
118
96
  return null;
119
97
  };
120
- var isInAnnotationMode = (s) => s.annotationMode !== null;
121
- var getSelectedAnnotationMode = (s) => s.annotationMode;
122
- var isAnnotationSelected = (s, page, id) => s.selectedUid === makeUid2(page, id);
123
-
124
- // src/lib/annotation-plugin.ts
125
- var AnnotationPlugin = class extends BasePlugin {
98
+ const isInAnnotationVariant = (s) => s.activeVariant !== null;
99
+ const getSelectedAnnotationVariant = (s) => s.activeVariant;
100
+ const isAnnotationSelected = (s, page, id) => s.selectedUid === makeUid(page, id);
101
+ const makeVariantKey = (subtype, intent) => intent ? `${subtype}#${intent}` : `${subtype}`;
102
+ const parseVariantKey = (key) => {
103
+ const [subStr, intent] = key.split("#");
104
+ return { subtype: Number(subStr), intent };
105
+ };
106
+ const variantKeyFromAnnotation = (a) => makeVariantKey(a.type, a.intent);
107
+ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
126
108
  constructor(id, registry, engine, config) {
127
109
  super(id, registry);
128
110
  this.ANNOTATION_HISTORY_TOPIC = "annotations";
129
111
  this.state$ = createBehaviorEmitter();
130
- /** Map <subtype> <modeId>. Filled once in `initialize()`. */
131
- this.modeBySubtype = /* @__PURE__ */ new Map();
132
- /** The inverse map for quick lookup in onModeChange(). */
133
- this.subtypeByMode = /* @__PURE__ */ new Map();
134
- this.modeChange$ = createBehaviorEmitter();
112
+ this.modeByVariant = /* @__PURE__ */ new Map();
113
+ this.variantByMode = /* @__PURE__ */ new Map();
114
+ this.activeVariantChange$ = createBehaviorEmitter();
135
115
  this.activeTool$ = createBehaviorEmitter({
136
- mode: null,
116
+ variantKey: null,
137
117
  defaults: null
138
118
  });
139
119
  this.engine = engine;
140
120
  this.config = config;
141
121
  const selection = registry.getPlugin("selection");
142
- this.selection = selection?.provides() ?? null;
122
+ this.selection = (selection == null ? void 0 : selection.provides()) ?? null;
143
123
  const history = registry.getPlugin("history");
144
- this.history = history?.provides() ?? null;
124
+ this.history = (history == null ? void 0 : history.provides()) ?? null;
145
125
  const interactionManager = registry.getPlugin("interaction-manager");
146
- this.interactionManager = interactionManager?.provides() ?? null;
126
+ this.interactionManager = (interactionManager == null ? void 0 : interactionManager.provides()) ?? null;
147
127
  this.coreStore.onAction(SET_DOCUMENT, (_action, state) => {
148
128
  const doc = state.core.document;
149
129
  if (doc) {
@@ -152,48 +132,55 @@ var AnnotationPlugin = class extends BasePlugin {
152
132
  });
153
133
  }
154
134
  async initialize() {
155
- for (const [subtype, defaults] of enumEntries(this.state.toolDefaults)) {
156
- this.registerTool(subtype, defaults);
135
+ var _a, _b, _c;
136
+ for (const [variantKey, defaults] of Object.entries(this.state.toolDefaults)) {
137
+ this.registerTool(variantKey, defaults);
157
138
  }
158
- this.history?.onHistoryChange((topic) => {
139
+ (_a = this.history) == null ? void 0 : _a.onHistoryChange((topic) => {
159
140
  if (topic === this.ANNOTATION_HISTORY_TOPIC && this.config.autoCommit !== false) {
160
141
  this.commit();
161
142
  }
162
143
  });
163
- this.interactionManager?.onModeChange((s) => {
164
- const newSubtype = this.subtypeByMode.get(s.activeMode) ?? null;
165
- if (newSubtype !== this.state.annotationMode) {
166
- this.dispatch(setAnnotationMode(newSubtype));
167
- this.modeChange$.emit(newSubtype);
144
+ (_b = this.interactionManager) == null ? void 0 : _b.onModeChange((s) => {
145
+ const newVariant = this.variantByMode.get(s.activeMode) ?? null;
146
+ console.log(newVariant, this.state.activeVariant);
147
+ if (newVariant !== this.state.activeVariant) {
148
+ this.dispatch(setActiveVariant(newVariant));
149
+ this.activeVariantChange$.emit(newVariant);
168
150
  }
169
151
  });
170
- this.selection?.onEndSelection(() => {
171
- if (!this.state.annotationMode) return;
172
- if (!(this.state.annotationMode === PdfAnnotationSubtype.HIGHLIGHT || this.state.annotationMode === PdfAnnotationSubtype.UNDERLINE || this.state.annotationMode === PdfAnnotationSubtype.STRIKEOUT || this.state.annotationMode === PdfAnnotationSubtype.SQUIGGLY)) {
152
+ (_c = this.selection) == null ? void 0 : _c.onEndSelection(() => {
153
+ var _a2, _b2;
154
+ if (!this.state.activeVariant) return;
155
+ if (!(this.state.activeVariant === makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT) || this.state.activeVariant === makeVariantKey(PdfAnnotationSubtype.UNDERLINE) || this.state.activeVariant === makeVariantKey(PdfAnnotationSubtype.STRIKEOUT) || this.state.activeVariant === makeVariantKey(PdfAnnotationSubtype.SQUIGGLY))) {
173
156
  return;
174
157
  }
175
- const formattedSelection = this.selection?.getFormattedSelection();
158
+ const formattedSelection = (_a2 = this.selection) == null ? void 0 : _a2.getFormattedSelection();
176
159
  if (!formattedSelection) return;
177
160
  for (const selection of formattedSelection) {
178
161
  const rect = selection.rect;
179
162
  const segmentRects = selection.segmentRects;
180
- const type = this.state.annotationMode;
163
+ const type = this.state.activeVariant;
164
+ const subtype = this.state.toolDefaults[type].subtype;
181
165
  const color = this.state.toolDefaults[type].color;
182
166
  const opacity = this.state.toolDefaults[type].opacity;
167
+ const blendMode = this.state.toolDefaults[type].blendMode ?? PdfBlendMode.Normal;
183
168
  this.createAnnotation(selection.pageIndex, {
184
- type,
169
+ type: subtype,
185
170
  rect,
186
171
  segmentRects,
187
172
  color,
188
173
  opacity,
174
+ blendMode,
189
175
  pageIndex: selection.pageIndex,
190
176
  id: Date.now() + Math.random()
191
177
  });
192
178
  }
193
- this.selection?.clear();
179
+ (_b2 = this.selection) == null ? void 0 : _b2.clear();
194
180
  });
195
181
  }
196
- registerTool(subtype, defaults) {
182
+ registerTool(variantKey, defaults) {
183
+ var _a, _b;
197
184
  const modeId = defaults.interaction.mode;
198
185
  const interactionMode = {
199
186
  id: modeId,
@@ -201,12 +188,12 @@ var AnnotationPlugin = class extends BasePlugin {
201
188
  exclusive: defaults.interaction.exclusive,
202
189
  cursor: defaults.interaction.cursor
203
190
  };
204
- this.interactionManager?.registerMode(interactionMode);
191
+ (_a = this.interactionManager) == null ? void 0 : _a.registerMode(interactionMode);
205
192
  if (defaults.textSelection) {
206
- this.selection?.enableForMode(modeId);
193
+ (_b = this.selection) == null ? void 0 : _b.enableForMode(modeId);
207
194
  }
208
- this.modeBySubtype.set(subtype, modeId);
209
- this.subtypeByMode.set(modeId, subtype);
195
+ this.modeByVariant.set(variantKey, modeId);
196
+ this.variantByMode.set(modeId, variantKey);
210
197
  }
211
198
  buildCapability() {
212
199
  return {
@@ -222,28 +209,44 @@ var AnnotationPlugin = class extends BasePlugin {
222
209
  deselectAnnotation: () => {
223
210
  this.dispatch(deselectAnnotation());
224
211
  },
225
- getAnnotationMode: () => {
226
- return this.state.annotationMode;
212
+ getActiveVariant: () => {
213
+ return this.state.activeVariant;
227
214
  },
228
- setAnnotationMode: (subtype) => {
229
- if (subtype === this.state.annotationMode) return;
230
- if (subtype) {
231
- const mode = this.modeBySubtype.get(subtype);
232
- if (!mode) throw new Error(`Mode missing for subtype ${subtype}`);
233
- this.interactionManager?.activate(mode);
215
+ setActiveVariant: (variantKey) => {
216
+ var _a, _b;
217
+ if (variantKey === this.state.activeVariant) return;
218
+ if (variantKey) {
219
+ const mode = this.modeByVariant.get(variantKey);
220
+ if (!mode) throw new Error(`Mode missing for variant ${variantKey}`);
221
+ (_a = this.interactionManager) == null ? void 0 : _a.activate(mode);
234
222
  } else {
235
- this.interactionManager?.activate("default");
223
+ (_b = this.interactionManager) == null ? void 0 : _b.activate("default");
236
224
  }
237
225
  },
238
- getToolDefaults: (subtype) => {
226
+ getToolDefaults: (variantKey) => {
227
+ const defaults = this.state.toolDefaults[variantKey];
228
+ if (!defaults) {
229
+ throw new Error(`No defaults found for variant: ${variantKey}`);
230
+ }
231
+ return defaults;
232
+ },
233
+ getToolDefaultsBySubtypeAndIntent: (subtype, intent) => {
234
+ const variantKey = makeVariantKey(subtype, intent);
235
+ const defaults = this.state.toolDefaults[variantKey];
236
+ if (!defaults) {
237
+ throw new Error(`No defaults found for variant: ${variantKey}`);
238
+ }
239
+ return defaults;
240
+ },
241
+ getToolDefaultsBySubtype: (subtype) => {
239
242
  const defaults = this.state.toolDefaults[subtype];
240
243
  if (!defaults) {
241
244
  throw new Error(`No defaults found for subtype: ${subtype}`);
242
245
  }
243
246
  return defaults;
244
247
  },
245
- setToolDefaults: (subtype, patch) => {
246
- this.dispatch(updateToolDefaults(subtype, patch));
248
+ setToolDefaults: (variantKey, patch) => {
249
+ this.dispatch(updateToolDefaults(variantKey, patch));
247
250
  },
248
251
  getColorPresets: () => [...this.state.colorPresets],
249
252
  addColorPreset: (color) => this.dispatch(addColorPreset(color)),
@@ -252,24 +255,24 @@ var AnnotationPlugin = class extends BasePlugin {
252
255
  deleteAnnotation: (pageIndex, localId) => this.deleteAnnotation(pageIndex, localId),
253
256
  renderAnnotation: (options) => this.renderAnnotation(options),
254
257
  onStateChange: this.state$.on,
255
- onModeChange: this.modeChange$.on,
258
+ onActiveVariantChange: this.activeVariantChange$.on,
256
259
  onActiveToolChange: this.activeTool$.on,
257
260
  commit: () => this.commit()
258
261
  };
259
262
  }
260
263
  createActiveTool(mode, toolDefaults) {
261
264
  if (mode === null) {
262
- return { mode: null, defaults: null };
265
+ return { variantKey: null, defaults: null };
263
266
  }
264
- return { mode, defaults: toolDefaults[mode] };
267
+ return { variantKey: mode, defaults: toolDefaults[mode] };
265
268
  }
266
269
  emitActiveTool(state) {
267
- const activeTool = this.createActiveTool(state.annotationMode, state.toolDefaults);
270
+ const activeTool = this.createActiveTool(state.activeVariant, state.toolDefaults);
268
271
  this.activeTool$.emit(activeTool);
269
272
  }
270
273
  onStoreUpdated(prev, next) {
271
274
  this.state$.emit(next);
272
- if (prev.annotationMode !== next.annotationMode || prev.toolDefaults[prev.annotationMode ?? PdfAnnotationSubtype.HIGHLIGHT] !== next.toolDefaults[next.annotationMode ?? PdfAnnotationSubtype.HIGHLIGHT]) {
275
+ if (prev.activeVariant !== next.activeVariant || prev.toolDefaults[prev.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT] !== next.toolDefaults[next.activeVariant ?? PdfAnnotationSubtype.HIGHLIGHT]) {
273
276
  this.emitActiveTool(next);
274
277
  }
275
278
  }
@@ -345,7 +348,7 @@ var AnnotationPlugin = class extends BasePlugin {
345
348
  }
346
349
  return;
347
350
  }
348
- const originalObject = this.state.byUid[makeUid(pageIndex, localId)].object;
351
+ const originalObject = this.state.byUid[makeUid$1(pageIndex, localId)].object;
349
352
  const originalPatch = Object.fromEntries(
350
353
  Object.keys(patch).map((key) => [key, originalObject[key]])
351
354
  );
@@ -364,7 +367,7 @@ var AnnotationPlugin = class extends BasePlugin {
364
367
  }
365
368
  return;
366
369
  }
367
- const originalAnnotation = this.state.byUid[makeUid(pageIndex, localId)].object;
370
+ const originalAnnotation = this.state.byUid[makeUid$1(pageIndex, localId)].object;
368
371
  const command = {
369
372
  execute: () => {
370
373
  this.dispatch(deselectAnnotation());
@@ -441,11 +444,9 @@ var AnnotationPlugin = class extends BasePlugin {
441
444
  return task;
442
445
  }
443
446
  };
444
- AnnotationPlugin.id = "annotation";
445
-
446
- // src/lib/reducer.ts
447
- import { PdfAnnotationSubtype as PdfAnnotationSubtype2 } from "@embedpdf/models";
448
- var DEFAULT_COLORS = [
447
+ _AnnotationPlugin.id = "annotation";
448
+ let AnnotationPlugin = _AnnotationPlugin;
449
+ const DEFAULT_COLORS = [
449
450
  "#E44234",
450
451
  "#FF8D00",
451
452
  "#FFCD45",
@@ -455,7 +456,7 @@ var DEFAULT_COLORS = [
455
456
  "#C544CE",
456
457
  "#7D2E25"
457
458
  ];
458
- var patchAnno = (state, uid, patch) => {
459
+ const patchAnno = (state, uid, patch) => {
459
460
  const prev = state.byUid[uid];
460
461
  if (!prev) return state;
461
462
  return {
@@ -471,54 +472,72 @@ var patchAnno = (state, uid, patch) => {
471
472
  hasPendingChanges: true
472
473
  };
473
474
  };
474
- var initialState = (cfg) => ({
475
+ const initialState = (cfg) => ({
475
476
  pages: {},
476
477
  byUid: {},
477
478
  selectedUid: null,
478
- annotationMode: null,
479
+ activeVariant: null,
479
480
  toolDefaults: {
480
- [PdfAnnotationSubtype2.HIGHLIGHT]: {
481
+ [makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT)]: {
481
482
  name: "Highlight",
483
+ subtype: PdfAnnotationSubtype.HIGHLIGHT,
484
+ interaction: { mode: "highlight", exclusive: false },
485
+ textSelection: true,
482
486
  color: "#FFCD45",
483
487
  opacity: 1,
484
- interaction: { mode: "highlight", exclusive: false },
485
- textSelection: true
488
+ blendMode: PdfBlendMode.Multiply
486
489
  },
487
- [PdfAnnotationSubtype2.UNDERLINE]: {
490
+ [makeVariantKey(PdfAnnotationSubtype.UNDERLINE)]: {
488
491
  name: "Underline",
492
+ subtype: PdfAnnotationSubtype.UNDERLINE,
493
+ interaction: { mode: "underline", exclusive: false },
494
+ textSelection: true,
489
495
  color: "#E44234",
490
496
  opacity: 1,
491
- interaction: { mode: "underline", exclusive: false },
492
- textSelection: true
497
+ blendMode: PdfBlendMode.Normal
493
498
  },
494
- [PdfAnnotationSubtype2.STRIKEOUT]: {
499
+ [makeVariantKey(PdfAnnotationSubtype.STRIKEOUT)]: {
495
500
  name: "Strikeout",
501
+ subtype: PdfAnnotationSubtype.STRIKEOUT,
502
+ interaction: { mode: "strikeout", exclusive: false },
503
+ textSelection: true,
496
504
  color: "#E44234",
497
505
  opacity: 1,
498
- interaction: { mode: "strikeout", exclusive: false },
499
- textSelection: true
506
+ blendMode: PdfBlendMode.Normal
500
507
  },
501
- [PdfAnnotationSubtype2.SQUIGGLY]: {
508
+ [makeVariantKey(PdfAnnotationSubtype.SQUIGGLY)]: {
502
509
  name: "Squiggly",
510
+ subtype: PdfAnnotationSubtype.SQUIGGLY,
511
+ interaction: { mode: "squiggly", exclusive: false },
512
+ textSelection: true,
503
513
  color: "#E44234",
504
514
  opacity: 1,
505
- interaction: { mode: "squiggly", exclusive: false },
506
- textSelection: true
515
+ blendMode: PdfBlendMode.Normal
507
516
  },
508
- [PdfAnnotationSubtype2.INK]: {
517
+ [makeVariantKey(PdfAnnotationSubtype.INK)]: {
509
518
  name: "Ink",
519
+ subtype: PdfAnnotationSubtype.INK,
520
+ interaction: { mode: "ink", exclusive: true, cursor: "crosshair" },
510
521
  color: "#E44234",
511
522
  opacity: 1,
512
523
  strokeWidth: 11,
513
- interaction: { mode: "ink", exclusive: true, cursor: "crosshair" },
514
- textSelection: false
524
+ blendMode: PdfBlendMode.Normal
525
+ },
526
+ [makeVariantKey(PdfAnnotationSubtype.INK, "InkHighlight")]: {
527
+ name: "Ink Highlight",
528
+ subtype: PdfAnnotationSubtype.INK,
529
+ interaction: { mode: "inkHighlight", exclusive: true, cursor: "crosshair" },
530
+ color: "#E44234",
531
+ opacity: 1,
532
+ strokeWidth: 11,
533
+ blendMode: PdfBlendMode.Multiply
515
534
  },
516
535
  ...cfg.toolDefaults
517
536
  },
518
537
  colorPresets: cfg.colorPresets ?? DEFAULT_COLORS,
519
538
  hasPendingChanges: false
520
539
  });
521
- var reducer = (state, action) => {
540
+ const reducer = (state, action) => {
522
541
  switch (action.type) {
523
542
  /* ───── bulk load from engine ───── */
524
543
  case SET_ANNOTATIONS: {
@@ -532,7 +551,7 @@ var reducer = (state, action) => {
532
551
  }
533
552
  const newUidsOnPage = list.map((a, index) => {
534
553
  const localId = Date.now() + Math.random() + index;
535
- const uid = makeUid(pageIndex, localId);
554
+ const uid = makeUid$1(pageIndex, localId);
536
555
  newByUid[uid] = { localId, pdfId: a.id, commitState: "synced", object: a };
537
556
  return uid;
538
557
  });
@@ -541,31 +560,33 @@ var reducer = (state, action) => {
541
560
  return { ...state, pages: newPages, byUid: newByUid };
542
561
  }
543
562
  /* ───── GUI bits ───── */
544
- case SET_ANNOTATION_MODE:
545
- return { ...state, annotationMode: action.payload };
563
+ case SET_ACTIVE_VARIANT:
564
+ return { ...state, activeVariant: action.payload };
546
565
  case SELECT_ANNOTATION:
547
566
  return {
548
567
  ...state,
549
- selectedUid: makeUid(action.payload.pageIndex, action.payload.localId)
568
+ selectedUid: makeUid$1(action.payload.pageIndex, action.payload.localId)
550
569
  };
551
570
  case DESELECT_ANNOTATION:
552
571
  return { ...state, selectedUid: null };
553
572
  case ADD_COLOR_PRESET:
554
573
  return state.colorPresets.includes(action.payload) ? state : { ...state, colorPresets: [...state.colorPresets, action.payload] };
555
574
  case UPDATE_TOOL_DEFAULTS: {
556
- const { subtype, patch } = action.payload;
575
+ const { variantKey, patch } = action.payload;
576
+ const prev = state.toolDefaults[variantKey];
577
+ if (!prev) return state;
557
578
  return {
558
579
  ...state,
559
580
  toolDefaults: {
560
581
  ...state.toolDefaults,
561
- [subtype]: { ...state.toolDefaults[subtype], ...patch }
582
+ [variantKey]: { ...prev, ...patch }
562
583
  }
563
584
  };
564
585
  }
565
586
  /* ───── create ───── */
566
587
  case CREATE_ANNOTATION: {
567
588
  const { pageIndex, localId, annotation } = action.payload;
568
- const uid = makeUid(pageIndex, localId);
589
+ const uid = makeUid$1(pageIndex, localId);
569
590
  return {
570
591
  ...state,
571
592
  pages: { ...state.pages, [pageIndex]: [...state.pages[pageIndex] ?? [], uid] },
@@ -579,7 +600,7 @@ var reducer = (state, action) => {
579
600
  /* ───── delete ───── */
580
601
  case DELETE_ANNOTATION: {
581
602
  const { pageIndex, localId } = action.payload;
582
- const uid = makeUid(pageIndex, localId);
603
+ const uid = makeUid$1(pageIndex, localId);
583
604
  if (!state.byUid[uid]) return state;
584
605
  return {
585
606
  ...state,
@@ -596,7 +617,7 @@ var reducer = (state, action) => {
596
617
  }
597
618
  /* ───── field edits ───── */
598
619
  case PATCH_ANNOTATION: {
599
- const uid = makeUid(action.payload.pageIndex, action.payload.localId);
620
+ const uid = makeUid$1(action.payload.pageIndex, action.payload.localId);
600
621
  return patchAnno(state, uid, action.payload.patch);
601
622
  }
602
623
  /* ───── commit bookkeeping ───── */
@@ -617,7 +638,7 @@ var reducer = (state, action) => {
617
638
  const annosOnPage = uidsOnPage.map((uid) => state.byUid[uid]).filter((ta) => ta && ta.commitState !== "deleted");
618
639
  annosOnPage.sort((a, b) => (a.pdfId ?? Infinity) - (b.pdfId ?? Infinity));
619
640
  annosOnPage.forEach((ta, newPdfId) => {
620
- const uid = makeUid(pageIndex, ta.localId);
641
+ const uid = makeUid$1(pageIndex, ta.localId);
621
642
  newByUid[uid] = { ...newByUid[uid], pdfId: newPdfId };
622
643
  });
623
644
  return { ...state, byUid: newByUid };
@@ -643,9 +664,7 @@ var reducer = (state, action) => {
643
664
  return state;
644
665
  }
645
666
  };
646
-
647
- // src/lib/index.ts
648
- var AnnotationPluginPackage = {
667
+ const AnnotationPluginPackage = {
649
668
  manifest,
650
669
  create: (registry, engine, config) => new AnnotationPlugin(ANNOTATION_PLUGIN_ID, registry, engine, config),
651
670
  reducer,
@@ -659,10 +678,13 @@ export {
659
678
  getAnnotationsByPageIndex,
660
679
  getSelectedAnnotation,
661
680
  getSelectedAnnotationByPageIndex,
662
- getSelectedAnnotationMode,
681
+ getSelectedAnnotationVariant,
663
682
  getSelectedAnnotationWithPageIndex,
664
683
  isAnnotationSelected,
665
- isInAnnotationMode,
666
- manifest
684
+ isInAnnotationVariant,
685
+ makeVariantKey,
686
+ manifest,
687
+ parseVariantKey,
688
+ variantKeyFromAnnotation
667
689
  };
668
- //# sourceMappingURL=index.js.map
690
+ //# sourceMappingURL=index.js.map