@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.
- package/dist/index.cjs +2 -693
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -266
- package/dist/index.js +180 -158
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +104 -0
- package/dist/lib/annotation-plugin.d.ts +33 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/manifest.d.ts +4 -0
- package/dist/lib/reducer.d.ts +5 -0
- package/dist/lib/selectors.d.ts +13 -0
- package/dist/lib/types.d.ts +121 -0
- package/dist/lib/utils.d.ts +11 -0
- package/dist/lib/variant-key.d.ts +8 -0
- package/dist/preact/adapter.d.ts +8 -0
- package/dist/preact/core.d.ts +1 -0
- package/dist/preact/index.cjs +2 -1038
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.d.ts +1 -28
- package/dist/preact/index.js +126 -156
- package/dist/preact/index.js.map +1 -1
- package/dist/preact/interaction-manager.d.ts +1 -0
- package/dist/preact/selection.d.ts +1 -0
- package/dist/react/adapter.d.ts +2 -0
- package/dist/react/core.d.ts +1 -0
- package/dist/react/index.cjs +2 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +983 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/interaction-manager.d.ts +1 -0
- package/dist/react/selection.d.ts +1 -0
- package/dist/shared-preact/components/annotation-container.d.ts +19 -0
- package/dist/shared-preact/components/annotation-layer.d.ts +11 -0
- package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-preact/components/annotations/ink-paint.d.ts +17 -0
- package/dist/shared-preact/components/annotations/ink.d.ts +23 -0
- package/dist/shared-preact/components/annotations.d.ts +7 -0
- package/dist/shared-preact/components/index.d.ts +1 -0
- package/dist/shared-preact/components/render-annotation.d.ts +11 -0
- package/dist/shared-preact/components/text-markup/highlight.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/squiggly.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/strikeout.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/underline.d.ts +13 -0
- package/dist/shared-preact/components/text-markup.d.ts +6 -0
- package/dist/shared-preact/hooks/index.d.ts +1 -0
- package/dist/shared-preact/hooks/use-annotation.d.ts +11 -0
- package/dist/shared-preact/index.d.ts +2 -0
- package/dist/shared-preact/resize-ink.d.ts +17 -0
- package/dist/shared-preact/types.d.ts +1 -0
- package/dist/shared-react/components/annotation-container.d.ts +19 -0
- package/dist/shared-react/components/annotation-layer.d.ts +11 -0
- package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-react/components/annotations/ink-paint.d.ts +17 -0
- package/dist/shared-react/components/annotations/ink.d.ts +23 -0
- package/dist/shared-react/components/annotations.d.ts +7 -0
- package/dist/shared-react/components/index.d.ts +1 -0
- package/dist/shared-react/components/render-annotation.d.ts +11 -0
- package/dist/shared-react/components/text-markup/highlight.d.ts +13 -0
- package/dist/shared-react/components/text-markup/squiggly.d.ts +13 -0
- package/dist/shared-react/components/text-markup/strikeout.d.ts +13 -0
- package/dist/shared-react/components/text-markup/underline.d.ts +13 -0
- package/dist/shared-react/components/text-markup.d.ts +6 -0
- package/dist/shared-react/hooks/index.d.ts +1 -0
- package/dist/shared-react/hooks/use-annotation.d.ts +11 -0
- package/dist/shared-react/index.d.ts +2 -0
- package/dist/shared-react/resize-ink.d.ts +17 -0
- package/dist/shared-react/types.d.ts +1 -0
- package/package.json +17 -15
- package/dist/index.d.cts +0 -266
- package/dist/preact/index.d.cts +0 -28
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
33
|
+
const reindexPageAnnotations = (pageIndex) => ({
|
|
52
34
|
type: REINDEX_PAGE_ANNOTATIONS,
|
|
53
35
|
payload: { pageIndex }
|
|
54
36
|
});
|
|
55
|
-
|
|
37
|
+
const selectAnnotation = (pageIndex, localId) => ({
|
|
56
38
|
type: SELECT_ANNOTATION,
|
|
57
39
|
payload: { pageIndex, localId }
|
|
58
40
|
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
47
|
+
const createAnnotation = (pageIndex, localId, annotation) => ({
|
|
70
48
|
type: CREATE_ANNOTATION,
|
|
71
49
|
payload: { pageIndex, localId, annotation }
|
|
72
50
|
});
|
|
73
|
-
|
|
51
|
+
const patchAnnotation = (pageIndex, localId, patch) => ({
|
|
74
52
|
type: PATCH_ANNOTATION,
|
|
75
53
|
payload: { pageIndex, localId, patch }
|
|
76
54
|
});
|
|
77
|
-
|
|
55
|
+
const deleteAnnotation = (pageIndex, localId) => ({
|
|
78
56
|
type: DELETE_ANNOTATION,
|
|
79
57
|
payload: { pageIndex, localId }
|
|
80
58
|
});
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
64
|
+
const purgeAnnotation = (uid) => ({
|
|
87
65
|
type: PURGE_ANNOTATION,
|
|
88
66
|
payload: { uid }
|
|
89
67
|
});
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
131
|
-
this.
|
|
132
|
-
|
|
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
|
-
|
|
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
|
|
122
|
+
this.selection = (selection == null ? void 0 : selection.provides()) ?? null;
|
|
143
123
|
const history = registry.getPlugin("history");
|
|
144
|
-
this.history = history
|
|
124
|
+
this.history = (history == null ? void 0 : history.provides()) ?? null;
|
|
145
125
|
const interactionManager = registry.getPlugin("interaction-manager");
|
|
146
|
-
this.interactionManager = interactionManager
|
|
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
|
-
|
|
156
|
-
|
|
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
|
|
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
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
this.
|
|
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
|
|
171
|
-
|
|
172
|
-
if (!
|
|
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
|
|
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.
|
|
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
|
|
179
|
+
(_b2 = this.selection) == null ? void 0 : _b2.clear();
|
|
194
180
|
});
|
|
195
181
|
}
|
|
196
|
-
registerTool(
|
|
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
|
|
191
|
+
(_a = this.interactionManager) == null ? void 0 : _a.registerMode(interactionMode);
|
|
205
192
|
if (defaults.textSelection) {
|
|
206
|
-
this.selection
|
|
193
|
+
(_b = this.selection) == null ? void 0 : _b.enableForMode(modeId);
|
|
207
194
|
}
|
|
208
|
-
this.
|
|
209
|
-
this.
|
|
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
|
-
|
|
226
|
-
return this.state.
|
|
212
|
+
getActiveVariant: () => {
|
|
213
|
+
return this.state.activeVariant;
|
|
227
214
|
},
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
|
223
|
+
(_b = this.interactionManager) == null ? void 0 : _b.activate("default");
|
|
236
224
|
}
|
|
237
225
|
},
|
|
238
|
-
getToolDefaults: (
|
|
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: (
|
|
246
|
-
this.dispatch(updateToolDefaults(
|
|
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
|
-
|
|
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 {
|
|
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.
|
|
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.
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
-
|
|
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
|
-
|
|
475
|
+
const initialState = (cfg) => ({
|
|
475
476
|
pages: {},
|
|
476
477
|
byUid: {},
|
|
477
478
|
selectedUid: null,
|
|
478
|
-
|
|
479
|
+
activeVariant: null,
|
|
479
480
|
toolDefaults: {
|
|
480
|
-
[
|
|
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
|
-
|
|
485
|
-
textSelection: true
|
|
488
|
+
blendMode: PdfBlendMode.Multiply
|
|
486
489
|
},
|
|
487
|
-
[
|
|
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
|
-
|
|
492
|
-
textSelection: true
|
|
497
|
+
blendMode: PdfBlendMode.Normal
|
|
493
498
|
},
|
|
494
|
-
[
|
|
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
|
-
|
|
499
|
-
textSelection: true
|
|
506
|
+
blendMode: PdfBlendMode.Normal
|
|
500
507
|
},
|
|
501
|
-
[
|
|
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
|
-
|
|
506
|
-
textSelection: true
|
|
515
|
+
blendMode: PdfBlendMode.Normal
|
|
507
516
|
},
|
|
508
|
-
[
|
|
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
|
-
|
|
514
|
-
|
|
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
|
-
|
|
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
|
|
545
|
-
return { ...state,
|
|
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 {
|
|
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
|
-
[
|
|
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
|
-
|
|
681
|
+
getSelectedAnnotationVariant,
|
|
663
682
|
getSelectedAnnotationWithPageIndex,
|
|
664
683
|
isAnnotationSelected,
|
|
665
|
-
|
|
666
|
-
|
|
684
|
+
isInAnnotationVariant,
|
|
685
|
+
makeVariantKey,
|
|
686
|
+
manifest,
|
|
687
|
+
parseVariantKey,
|
|
688
|
+
variantKeyFromAnnotation
|
|
667
689
|
};
|
|
668
|
-
//# sourceMappingURL=index.js.map
|
|
690
|
+
//# sourceMappingURL=index.js.map
|