@embedpdf/viewer-chrome 3.0.0-next.13 → 3.0.0-next.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.
Files changed (157) hide show
  1. package/README.md +175 -132
  2. package/dist/annotation-fonts-BqoLZ4Mp.js +80 -0
  3. package/dist/annotation-fonts-BqoLZ4Mp.js.map +1 -0
  4. package/dist/annotation-fonts-Dt0IQXhz.cjs +91 -0
  5. package/dist/annotation-fonts-Dt0IQXhz.cjs.map +1 -0
  6. package/dist/annotation-style--rPIZsuP.js +879 -0
  7. package/dist/annotation-style--rPIZsuP.js.map +1 -0
  8. package/dist/annotation-style-Bzvvp8-N.cjs +879 -0
  9. package/dist/annotation-style-Bzvvp8-N.cjs.map +1 -0
  10. package/dist/ar-D9XKAmDx.js +567 -0
  11. package/dist/ar-D9XKAmDx.js.map +1 -0
  12. package/dist/ar-DnEj5vbP.cjs +567 -0
  13. package/dist/ar-DnEj5vbP.cjs.map +1 -0
  14. package/dist/chrome.cjs +378 -221
  15. package/dist/chrome.cjs.map +1 -1
  16. package/dist/chrome.d.cts +5 -34
  17. package/dist/chrome.d.ts +5 -34
  18. package/dist/chrome.js +377 -218
  19. package/dist/chrome.js.map +1 -1
  20. package/dist/commands-BmgxhJ8B.js +953 -0
  21. package/dist/commands-BmgxhJ8B.js.map +1 -0
  22. package/dist/commands-CYt4SFUX.cjs +1060 -0
  23. package/dist/commands-CYt4SFUX.cjs.map +1 -0
  24. package/dist/commands.cjs +12 -595
  25. package/dist/commands.d.cts +29 -4
  26. package/dist/commands.d.ts +29 -4
  27. package/dist/commands.js +2 -593
  28. package/dist/comments-panel-MUVgLCBI.js +514 -0
  29. package/dist/comments-panel-MUVgLCBI.js.map +1 -0
  30. package/dist/comments-panel-pEcQg4Vs.cjs +514 -0
  31. package/dist/comments-panel-pEcQg4Vs.cjs.map +1 -0
  32. package/dist/de-Bdr4aWzm.js +566 -0
  33. package/dist/de-Bdr4aWzm.js.map +1 -0
  34. package/dist/de-Dv6zvbnd.cjs +566 -0
  35. package/dist/de-Dv6zvbnd.cjs.map +1 -0
  36. package/dist/dialog-B5GBisKv.js +55 -0
  37. package/dist/dialog-B5GBisKv.js.map +1 -0
  38. package/dist/dialog-t8F13BL_.cjs +60 -0
  39. package/dist/dialog-t8F13BL_.cjs.map +1 -0
  40. package/dist/es-BP09DR9w.cjs +566 -0
  41. package/dist/es-BP09DR9w.cjs.map +1 -0
  42. package/dist/es-BSXz5tBv.js +566 -0
  43. package/dist/es-BSXz5tBv.js.map +1 -0
  44. package/dist/form-design-panel-B5MXTZ96.cjs +418 -0
  45. package/dist/form-design-panel-B5MXTZ96.cjs.map +1 -0
  46. package/dist/form-design-panel-vWWU9uB-.js +418 -0
  47. package/dist/form-design-panel-vWWU9uB-.js.map +1 -0
  48. package/dist/fr-BBQQn7tJ.cjs +566 -0
  49. package/dist/fr-BBQQn7tJ.cjs.map +1 -0
  50. package/dist/fr-Ckn3K9v1.js +566 -0
  51. package/dist/fr-Ckn3K9v1.js.map +1 -0
  52. package/dist/he-DRsG7bH7.cjs +567 -0
  53. package/dist/he-DRsG7bH7.cjs.map +1 -0
  54. package/dist/he-wdGU5PkU.js +567 -0
  55. package/dist/he-wdGU5PkU.js.map +1 -0
  56. package/dist/icons-BrK5iVL8.js +856 -0
  57. package/dist/icons-BrK5iVL8.js.map +1 -0
  58. package/dist/icons-x0Tc05bs.cjs +1010 -0
  59. package/dist/icons-x0Tc05bs.cjs.map +1 -0
  60. package/dist/index.cjs +3162 -5106
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts +636 -143
  63. package/dist/index.d.ts +636 -143
  64. package/dist/index.js +3083 -4975
  65. package/dist/index.js.map +1 -1
  66. package/dist/it-BuP4o0xQ.cjs +566 -0
  67. package/dist/it-BuP4o0xQ.cjs.map +1 -0
  68. package/dist/it-Us-VmvIu.js +566 -0
  69. package/dist/it-Us-VmvIu.js.map +1 -0
  70. package/dist/ja-Cizj0-5O.js +566 -0
  71. package/dist/ja-Cizj0-5O.js.map +1 -0
  72. package/dist/ja-DovEd6ts.cjs +566 -0
  73. package/dist/ja-DovEd6ts.cjs.map +1 -0
  74. package/dist/ko-B-qJEol2.cjs +566 -0
  75. package/dist/ko-B-qJEol2.cjs.map +1 -0
  76. package/dist/ko-DlrXliE1.js +566 -0
  77. package/dist/ko-DlrXliE1.js.map +1 -0
  78. package/dist/labels-BiM9wp9K.cjs +21 -0
  79. package/dist/labels-BiM9wp9K.cjs.map +1 -0
  80. package/dist/labels-C6_i87Oj.js +16 -0
  81. package/dist/labels-C6_i87Oj.js.map +1 -0
  82. package/dist/link-editor-CSjqPnj1.cjs +125 -0
  83. package/dist/link-editor-CSjqPnj1.cjs.map +1 -0
  84. package/dist/link-editor-SxM1nnJU.js +125 -0
  85. package/dist/link-editor-SxM1nnJU.js.map +1 -0
  86. package/dist/measurement-Bs61XWbJ.js +325 -0
  87. package/dist/measurement-Bs61XWbJ.js.map +1 -0
  88. package/dist/measurement-CcCsHPOX.cjs +326 -0
  89. package/dist/measurement-CcCsHPOX.cjs.map +1 -0
  90. package/dist/nl-0aF7M_0h.js +566 -0
  91. package/dist/nl-0aF7M_0h.js.map +1 -0
  92. package/dist/nl-D3KZDDiJ.cjs +566 -0
  93. package/dist/nl-D3KZDDiJ.cjs.map +1 -0
  94. package/dist/pl-BW--AaCI.js +566 -0
  95. package/dist/pl-BW--AaCI.js.map +1 -0
  96. package/dist/pl-DSFhAUqx.cjs +566 -0
  97. package/dist/pl-DSFhAUqx.cjs.map +1 -0
  98. package/dist/pt-C5S-8MC5.cjs +566 -0
  99. package/dist/pt-C5S-8MC5.cjs.map +1 -0
  100. package/dist/pt-DIhpU5pT.js +566 -0
  101. package/dist/pt-DIhpU5pT.js.map +1 -0
  102. package/dist/redact-confirm-B6j36TPw.js +83 -0
  103. package/dist/redact-confirm-B6j36TPw.js.map +1 -0
  104. package/dist/redact-confirm-CX_SY2ZN.cjs +83 -0
  105. package/dist/redact-confirm-CX_SY2ZN.cjs.map +1 -0
  106. package/dist/redaction-panel-BmoIl-Ll.cjs +96 -0
  107. package/dist/redaction-panel-BmoIl-Ll.cjs.map +1 -0
  108. package/dist/redaction-panel-IJDshSJI.js +96 -0
  109. package/dist/redaction-panel-IJDshSJI.js.map +1 -0
  110. package/dist/search-panel-HfIhJm1M.js +249 -0
  111. package/dist/search-panel-HfIhJm1M.js.map +1 -0
  112. package/dist/search-panel-s9IoiOtv.cjs +249 -0
  113. package/dist/search-panel-s9IoiOtv.cjs.map +1 -0
  114. package/dist/sheet-BDsa_Sup.cjs +442 -0
  115. package/dist/sheet-BDsa_Sup.cjs.map +1 -0
  116. package/dist/sheet-R6XDgyEf.js +365 -0
  117. package/dist/sheet-R6XDgyEf.js.map +1 -0
  118. package/dist/sign-dialog-CgnR7akj.cjs +155 -0
  119. package/dist/sign-dialog-CgnR7akj.cjs.map +1 -0
  120. package/dist/sign-dialog-GDqCoQhA.js +155 -0
  121. package/dist/sign-dialog-GDqCoQhA.js.map +1 -0
  122. package/dist/signature-inspector-DyO313Qf.cjs +166 -0
  123. package/dist/signature-inspector-DyO313Qf.cjs.map +1 -0
  124. package/dist/signature-inspector-okFz8do6.js +166 -0
  125. package/dist/signature-inspector-okFz8do6.js.map +1 -0
  126. package/dist/signature-maker-BhCmYyHD.js +393 -0
  127. package/dist/signature-maker-BhCmYyHD.js.map +1 -0
  128. package/dist/signature-maker-BoYa8vgA.cjs +393 -0
  129. package/dist/signature-maker-BoYa8vgA.cjs.map +1 -0
  130. package/dist/signatures-panel-B56PC6d9.cjs +300 -0
  131. package/dist/signatures-panel-B56PC6d9.cjs.map +1 -0
  132. package/dist/signatures-panel-CgnFfhFm.js +300 -0
  133. package/dist/signatures-panel-CgnFfhFm.js.map +1 -0
  134. package/dist/stamp-store-BHvRs-Do.cjs +147 -0
  135. package/dist/stamp-store-BHvRs-Do.cjs.map +1 -0
  136. package/dist/stamp-store-WuF-L3Jj.js +112 -0
  137. package/dist/stamp-store-WuF-L3Jj.js.map +1 -0
  138. package/dist/stamps-panel-B9NYGayn.cjs +231 -0
  139. package/dist/stamps-panel-B9NYGayn.cjs.map +1 -0
  140. package/dist/stamps-panel-CDO0FPyK.js +231 -0
  141. package/dist/stamps-panel-CDO0FPyK.js.map +1 -0
  142. package/dist/toolbar-CJu2wKTU.cjs +1659 -0
  143. package/dist/toolbar-CJu2wKTU.cjs.map +1 -0
  144. package/dist/toolbar-z9od3tKl.js +1564 -0
  145. package/dist/toolbar-z9od3tKl.js.map +1 -0
  146. package/dist/zh-cn-3tmMeHqv.cjs +566 -0
  147. package/dist/zh-cn-3tmMeHqv.cjs.map +1 -0
  148. package/dist/zh-cn-CxkUUBct.js +566 -0
  149. package/dist/zh-cn-CxkUUBct.js.map +1 -0
  150. package/package.json +6 -4
  151. package/src/styles.css +153 -89
  152. package/dist/commands.cjs.map +0 -1
  153. package/dist/commands.js.map +0 -1
  154. package/dist/es-DYwzfxyt.cjs +0 -293
  155. package/dist/es-DYwzfxyt.cjs.map +0 -1
  156. package/dist/es-sN6uqBgD.js +0 -293
  157. package/dist/es-sN6uqBgD.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ const require_icons = require("./icons-x0Tc05bs.cjs");
2
+ const require_dialog = require("./dialog-t8F13BL_.cjs");
3
+ let react = require("react");
4
+ let _embedpdf_react_runtime = require("@embedpdf/react/runtime");
5
+ let _embedpdf_react_stamp = require("@embedpdf/react/stamp");
6
+ let _embedpdf_react_signature = require("@embedpdf/react/signature");
7
+ let _embedpdf_react_i18n = require("@embedpdf/react/i18n");
8
+ let _embedpdf_react_shell = require("@embedpdf/react/shell");
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ let _embedpdf_default_signature_fonts_library = require("@embedpdf/default-signature-fonts/library");
11
+ //#region src/ui/signature-fonts.ts
12
+ /**
13
+ * The fonts a typed signature is drawn in: `plugins.signature.fonts`, or three handwriting fonts
14
+ * (`@embedpdf/default-signature-fonts`, each a lazy chunk of your build). A font's file is read
15
+ * the first time the signature maker needs it and registered on the engine once, under its key,
16
+ * which a typed mark's `fontFamily` names; saving embeds the characters the mark uses.
17
+ */
18
+ const DEFAULT_FONTS = _embedpdf_default_signature_fonts_library.DEFAULT_SIGNATURE_FONTS.map((font) => ({
19
+ key: font.key,
20
+ label: font.label,
21
+ bytes: () => (0, _embedpdf_default_signature_fonts_library.loadSignatureFont)(font.key)
22
+ }));
23
+ /** The bytes of an app's font: its `data`, or its `url` fetched. */
24
+ const bytesOf = (font) => async () => {
25
+ if (font.data) return new Uint8Array(font.data);
26
+ if (!font.url) throw new Error(`[embedpdf] signature font "${font.key}" has no url or data`);
27
+ const response = await fetch(font.url);
28
+ if (!response.ok) throw new Error(`${font.url}: HTTP ${response.status}`);
29
+ return new Uint8Array(await response.arrayBuffer());
30
+ };
31
+ /** The fonts the maker offers: the app's, which replace the default ones, or the default ones. */
32
+ const markFontsOf = (fonts) => fonts ? fonts.map((font) => ({
33
+ key: font.key,
34
+ label: font.label,
35
+ bytes: bytesOf(font)
36
+ })) : DEFAULT_FONTS;
37
+ /** Each engine's registrations, by font key: one read and one registration per font. */
38
+ const registrations = /* @__PURE__ */ new WeakMap();
39
+ /**
40
+ * Register `font` on `engine`, unless it already is: what a typed mark in it needs. Engines that
41
+ * aren't local take no fonts from the browser, so nothing happens there. A failed read is tried
42
+ * again next time.
43
+ */
44
+ function registerMarkFont(engine, font) {
45
+ if (!(0, _embedpdf_react_runtime.isLocalEngine)(engine)) return Promise.resolve();
46
+ let byKey = registrations.get(engine);
47
+ if (!byKey) registrations.set(engine, byKey = /* @__PURE__ */ new Map());
48
+ const known = byKey.get(font.key);
49
+ if (known) return known;
50
+ const registering = font.bytes().then((data) => engine.fonts.register({
51
+ key: font.key,
52
+ data
53
+ })).then(() => void 0);
54
+ byKey.set(font.key, registering);
55
+ registering.catch(() => byKey.delete(font.key));
56
+ return registering;
57
+ }
58
+ //#endregion
59
+ //#region src/ui/signature-maker.tsx
60
+ /**
61
+ * The mark maker (`signature-maker` modal surface): a person's signature and
62
+ * initials, drawn, typed, or uploaded, saved as one library of kind
63
+ * `signatures` — the file is the person (Preview's model). Chrome code over
64
+ * the stamp plugin's generic calls: `createLibrary` + `createAsset({ mark })`;
65
+ * rename/export/delete are the library verbs. Opened on an existing library
66
+ * (`props.libraryId`) it only adds the missing initials. Escape cancels,
67
+ * unless it's saving.
68
+ */
69
+ const PAD = {
70
+ width: 360,
71
+ height: 120
72
+ };
73
+ /** One pad: draw / type / upload, producing a `MarkSource` or null. */
74
+ function MarkPad({ value, onChange, fonts, registerFont }) {
75
+ const t = (0, _embedpdf_react_i18n.useT)();
76
+ const [tab, setTab] = (0, react.useState)("draw");
77
+ const [strokes, setStrokes] = (0, react.useState)([]);
78
+ const [text, setText] = (0, react.useState)("");
79
+ const [font, setFont] = (0, react.useState)(fonts[0]?.key ?? "");
80
+ const [fileName, setFileName] = (0, react.useState)(null);
81
+ const canvas = (0, react.useRef)(null);
82
+ const drawing = (0, react.useRef)(null);
83
+ (0, react.useEffect)(() => {
84
+ const element = canvas.current;
85
+ if (!element) return;
86
+ const dpr = window.devicePixelRatio || 1;
87
+ element.width = PAD.width * dpr;
88
+ element.height = PAD.height * dpr;
89
+ const ctx = element.getContext("2d");
90
+ if (!ctx) return;
91
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
92
+ ctx.clearRect(0, 0, PAD.width, PAD.height);
93
+ ctx.lineCap = "round";
94
+ ctx.lineJoin = "round";
95
+ ctx.lineWidth = 2.5;
96
+ ctx.strokeStyle = getComputedStyle(element).color || "#000";
97
+ for (const stroke of strokes) {
98
+ ctx.beginPath();
99
+ stroke.forEach((vertex, i) => i === 0 ? ctx.moveTo(vertex.x, vertex.y) : ctx.lineTo(vertex.x, vertex.y));
100
+ ctx.stroke();
101
+ }
102
+ }, [strokes, tab]);
103
+ const point = (event) => {
104
+ const rect = event.currentTarget.getBoundingClientRect();
105
+ return {
106
+ x: event.clientX - rect.left,
107
+ y: event.clientY - rect.top
108
+ };
109
+ };
110
+ const commitStrokes = (next) => {
111
+ setStrokes(next);
112
+ onChange(next.length ? {
113
+ kind: "ink",
114
+ strokes: next,
115
+ color: "#000000",
116
+ strokeWidth: 2.5
117
+ } : null);
118
+ };
119
+ const commitText = async (next, key) => {
120
+ setText(next);
121
+ setFont(key);
122
+ if (!next.trim()) {
123
+ onChange(null);
124
+ return;
125
+ }
126
+ await registerFont(key);
127
+ onChange({
128
+ kind: "text",
129
+ text: next.trim(),
130
+ fontFamily: key,
131
+ color: "#000000",
132
+ fontSize: 36
133
+ });
134
+ };
135
+ const pickFile = (file) => {
136
+ setFileName(file.name);
137
+ onChange(file.type === "application/pdf" ? {
138
+ kind: "pdf",
139
+ source: file,
140
+ pageIndex: 0
141
+ } : {
142
+ kind: "image",
143
+ source: file
144
+ });
145
+ };
146
+ const tabClass = (id) => `rounded px-2 py-1 text-xs font-medium ${tab === id ? "bg-accent text-on-accent" : "text-fg-muted hover:bg-hover"}`;
147
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
148
+ className: "flex flex-col gap-2",
149
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
150
+ className: "flex items-center gap-1",
151
+ children: [
152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
153
+ type: "button",
154
+ className: tabClass("draw"),
155
+ onClick: () => setTab("draw"),
156
+ children: t("demo.makerDraw")
157
+ }),
158
+ fonts.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
159
+ type: "button",
160
+ className: tabClass("type"),
161
+ onClick: () => {
162
+ setTab("type");
163
+ registerFont(font).catch((error) => console.error("[embedpdf] loading the signature font failed:", error));
164
+ },
165
+ children: t("demo.makerType")
166
+ }) : null,
167
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
168
+ type: "button",
169
+ className: tabClass("upload"),
170
+ onClick: () => setTab("upload"),
171
+ children: t("demo.makerUpload")
172
+ }),
173
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "flex-1" }),
174
+ value ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
175
+ type: "button",
176
+ onClick: () => {
177
+ commitStrokes([]);
178
+ setText("");
179
+ setFileName(null);
180
+ onChange(null);
181
+ },
182
+ className: "text-fg-muted hover:text-fg text-xs",
183
+ children: t("demo.makerClear")
184
+ }) : null
185
+ ]
186
+ }), tab === "draw" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("canvas", {
187
+ ref: canvas,
188
+ style: {
189
+ width: PAD.width,
190
+ height: PAD.height,
191
+ touchAction: "none"
192
+ },
193
+ className: "border-border-subtle bg-surface text-fg rounded-md border",
194
+ onPointerDown: (event) => {
195
+ event.currentTarget.setPointerCapture(event.pointerId);
196
+ drawing.current = [point(event)];
197
+ setStrokes((previous) => [...previous, drawing.current]);
198
+ },
199
+ onPointerMove: (event) => {
200
+ if (!drawing.current) return;
201
+ drawing.current.push(point(event));
202
+ setStrokes((previous) => [...previous.slice(0, -1), [...drawing.current]]);
203
+ },
204
+ onPointerUp: () => {
205
+ if (!drawing.current) return;
206
+ const done = drawing.current;
207
+ drawing.current = null;
208
+ setStrokes((previous) => {
209
+ const next = [...previous.slice(0, -1), done];
210
+ commitStrokes(next);
211
+ return next;
212
+ });
213
+ }
214
+ }) : tab === "type" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
215
+ className: "flex flex-col gap-2",
216
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
217
+ value: text,
218
+ placeholder: t("demo.makerTypePlaceholder"),
219
+ onChange: (event) => void commitText(event.target.value, font),
220
+ className: "border-border bg-surface text-fg w-full rounded border px-2 py-1.5 text-sm"
221
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
222
+ className: "text-fg-muted flex items-center gap-2 text-xs",
223
+ children: [t("demo.makerFont"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
224
+ value: font,
225
+ onChange: (event) => void commitText(text, event.target.value),
226
+ className: "border-border bg-surface text-fg rounded border px-2 py-1 text-xs",
227
+ children: fonts.map((fontOption) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
228
+ value: fontOption.key,
229
+ children: fontOption.label
230
+ }, fontOption.key))
231
+ })]
232
+ })]
233
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
234
+ className: "border-border-subtle text-fg-muted hover:bg-hover flex h-24 cursor-pointer items-center justify-center rounded-md border border-dashed text-sm",
235
+ children: [fileName ?? t("demo.makerUploadHint"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
236
+ type: "file",
237
+ accept: "image/png,image/jpeg,application/pdf",
238
+ className: "hidden",
239
+ onChange: (event) => {
240
+ const file = event.currentTarget.files?.[0];
241
+ event.currentTarget.value = "";
242
+ if (file) pickFile(file);
243
+ }
244
+ })]
245
+ })]
246
+ });
247
+ }
248
+ function SignatureMakerModal() {
249
+ const t = (0, _embedpdf_react_i18n.useT)();
250
+ const surface = (0, _embedpdf_react_shell.useSurface)("signature-maker");
251
+ const stamp = (0, _embedpdf_react_stamp.useStamp)();
252
+ const kernel = (0, _embedpdf_react_runtime.useKernel)();
253
+ const config = require_icons.useSignatureSettings();
254
+ const [name, setName] = (0, react.useState)("");
255
+ const [signatureMark, setSignatureMark] = (0, react.useState)(null);
256
+ const [initialsMark, setInitialsMark] = (0, react.useState)(null);
257
+ const [busy, setBusy] = (0, react.useState)(false);
258
+ const [error, setError] = (0, react.useState)(null);
259
+ const titleId = (0, react.useId)();
260
+ const existingId = surface.props?.libraryId;
261
+ const existing = existingId ? stamp.getLibrary(existingId) : null;
262
+ const wantsInitials = (config.kinds ?? ["signature", "initials"]).includes("initials");
263
+ const [fonts] = (0, react.useState)(() => markFontsOf(config.fonts));
264
+ const registerFont = async (key) => {
265
+ const font = fonts.find((each) => each.key === key);
266
+ if (font) await registerMarkFont(kernel.engine, font);
267
+ };
268
+ if (!surface.isOpen) return null;
269
+ const canSave = existing ? initialsMark != null : name.trim().length > 0 && signatureMark != null;
270
+ const save = async () => {
271
+ setBusy(true);
272
+ setError(null);
273
+ try {
274
+ if (existing) await stamp.createAsset({
275
+ libraryId: existing.id,
276
+ name: _embedpdf_react_signature.INITIALS_MARK_NAME,
277
+ label: t("demo.initialsLabel"),
278
+ mark: initialsMark
279
+ });
280
+ else {
281
+ const { library } = await stamp.createLibrary(name.trim(), { kind: _embedpdf_react_signature.SIGNATURES_LIBRARY_KIND });
282
+ const libraryId = library.id;
283
+ await stamp.createAsset({
284
+ libraryId,
285
+ name: _embedpdf_react_signature.SIGNATURE_MARK_NAME,
286
+ label: t("demo.signatureLabel"),
287
+ mark: signatureMark
288
+ });
289
+ if (initialsMark) await stamp.createAsset({
290
+ libraryId,
291
+ name: _embedpdf_react_signature.INITIALS_MARK_NAME,
292
+ label: t("demo.initialsLabel"),
293
+ mark: initialsMark
294
+ });
295
+ }
296
+ setName("");
297
+ setSignatureMark(null);
298
+ setInitialsMark(null);
299
+ surface.close();
300
+ } catch (error) {
301
+ console.error("[embedpdf] saving the signature failed:", error);
302
+ setError(t("demo.makerError"));
303
+ } finally {
304
+ setBusy(false);
305
+ }
306
+ };
307
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dialog.Dialog, {
308
+ labelledBy: titleId,
309
+ onClose: () => {
310
+ if (!busy) surface.close();
311
+ },
312
+ className: "border-border bg-surface w-[26rem] rounded-lg border p-4 shadow-xl",
313
+ children: [
314
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
315
+ className: "flex items-center justify-between",
316
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
317
+ id: titleId,
318
+ className: "text-fg text-base font-semibold",
319
+ children: existing ? t("demo.signaturesAddInitials") : t("demo.makerTitle")
320
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
321
+ type: "button",
322
+ onClick: surface.close,
323
+ className: "text-fg-muted hover:bg-hover grid h-7 w-7 place-items-center rounded-md",
324
+ "aria-label": t("demo.cancel"),
325
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.Icon, {
326
+ name: "x",
327
+ size: 16
328
+ })
329
+ })]
330
+ }),
331
+ existing ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
332
+ className: "text-fg-muted mt-3 block text-xs",
333
+ children: [t("demo.makerName"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
334
+ value: name,
335
+ placeholder: t("demo.makerNamePlaceholder"),
336
+ onChange: (event) => setName(event.target.value),
337
+ className: "border-border bg-surface text-fg mt-1 w-full rounded border px-2 py-1.5 text-sm"
338
+ })]
339
+ }),
340
+ existing ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
341
+ className: "mt-3",
342
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
343
+ className: "text-fg mb-1 text-xs font-semibold uppercase tracking-wide",
344
+ children: t("demo.signatureLabel")
345
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkPad, {
346
+ value: signatureMark,
347
+ onChange: setSignatureMark,
348
+ fonts,
349
+ registerFont
350
+ })]
351
+ }),
352
+ wantsInitials ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
353
+ className: "mt-3",
354
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
355
+ className: "text-fg mb-1 text-xs font-semibold uppercase tracking-wide",
356
+ children: [t("demo.initialsLabel"), existing ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
357
+ className: "text-fg-muted ms-1 font-normal normal-case tracking-normal",
358
+ children: t("demo.makerOptional")
359
+ })]
360
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkPad, {
361
+ value: initialsMark,
362
+ onChange: setInitialsMark,
363
+ fonts,
364
+ registerFont
365
+ })]
366
+ }) : null,
367
+ error ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
368
+ className: "mt-2 text-sm text-red-600",
369
+ children: error
370
+ }) : null,
371
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
372
+ className: "mt-4 flex justify-end gap-2",
373
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
374
+ type: "button",
375
+ disabled: busy,
376
+ onClick: surface.close,
377
+ className: "border-border text-fg hover:bg-hover rounded-md border px-3 py-1.5 text-sm",
378
+ children: t("demo.cancel")
379
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
380
+ type: "button",
381
+ disabled: busy || !canSave,
382
+ onClick: () => void save(),
383
+ className: "bg-accent text-on-accent rounded-md px-3 py-1.5 text-sm disabled:opacity-60",
384
+ children: busy ? t("demo.makerSaving") : t("demo.makerSave")
385
+ })]
386
+ })
387
+ ]
388
+ });
389
+ }
390
+ //#endregion
391
+ exports.SignatureMakerModal = SignatureMakerModal;
392
+
393
+ //# sourceMappingURL=signature-maker-BoYa8vgA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-maker-BoYa8vgA.cjs","names":["DEFAULT_SIGNATURE_FONTS","useSignatureSettings","INITIALS_MARK_NAME","SIGNATURES_LIBRARY_KIND","SIGNATURE_MARK_NAME","Dialog","Icon"],"sources":["../src/ui/signature-fonts.ts","../src/ui/signature-maker.tsx"],"sourcesContent":["/**\n * The fonts a typed signature is drawn in: `plugins.signature.fonts`, or three handwriting fonts\n * (`@embedpdf/default-signature-fonts`, each a lazy chunk of your build). A font's file is read\n * the first time the signature maker needs it and registered on the engine once, under its key,\n * which a typed mark's `fontFamily` names; saving embeds the characters the mark uses.\n */\nimport {\n DEFAULT_SIGNATURE_FONTS,\n loadSignatureFont,\n} from '@embedpdf/default-signature-fonts/library';\nimport { isLocalEngine, type Engine } from '@embedpdf/react/runtime';\n\nimport type { SignatureFont } from '../plugin-settings';\n\n/** A font the maker offers: its key, what the picker shows, and how its bytes are read. */\nexport interface MarkFont {\n readonly key: string;\n readonly label: string;\n readonly bytes: () => Promise<Uint8Array>;\n}\n\nconst DEFAULT_FONTS: readonly MarkFont[] = DEFAULT_SIGNATURE_FONTS.map((font) => ({\n key: font.key,\n label: font.label,\n bytes: () => loadSignatureFont(font.key),\n}));\n\n/** The bytes of an app's font: its `data`, or its `url` fetched. */\nconst bytesOf = (font: SignatureFont) => async (): Promise<Uint8Array> => {\n if (font.data) return new Uint8Array(font.data);\n if (!font.url) throw new Error(`[embedpdf] signature font \"${font.key}\" has no url or data`);\n const response = await fetch(font.url);\n if (!response.ok) throw new Error(`${font.url}: HTTP ${response.status}`);\n return new Uint8Array(await response.arrayBuffer());\n};\n\n/** The fonts the maker offers: the app's, which replace the default ones, or the default ones. */\nexport const markFontsOf = (fonts: readonly SignatureFont[] | undefined): readonly MarkFont[] =>\n fonts\n ? fonts.map((font) => ({ key: font.key, label: font.label, bytes: bytesOf(font) }))\n : DEFAULT_FONTS;\n\n/** Each engine's registrations, by font key: one read and one registration per font. */\nconst registrations = new WeakMap<Engine, Map<string, Promise<void>>>();\n\n/**\n * Register `font` on `engine`, unless it already is: what a typed mark in it needs. Engines that\n * aren't local take no fonts from the browser, so nothing happens there. A failed read is tried\n * again next time.\n */\nexport function registerMarkFont(engine: Engine, font: MarkFont): Promise<void> {\n if (!isLocalEngine(engine)) return Promise.resolve();\n let byKey = registrations.get(engine);\n if (!byKey) registrations.set(engine, (byKey = new Map()));\n const known = byKey.get(font.key);\n if (known) return known;\n const registering = font\n .bytes()\n .then((data) => engine.fonts.register({ key: font.key, data }))\n .then(() => undefined);\n byKey.set(font.key, registering);\n registering.catch(() => byKey.delete(font.key));\n return registering;\n}\n","/**\n * The mark maker (`signature-maker` modal surface): a person's signature and\n * initials, drawn, typed, or uploaded, saved as one library of kind\n * `signatures` — the file is the person (Preview's model). Chrome code over\n * the stamp plugin's generic calls: `createLibrary` + `createAsset({ mark })`;\n * rename/export/delete are the library verbs. Opened on an existing library\n * (`props.libraryId`) it only adds the missing initials. Escape cancels,\n * unless it's saving.\n */\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { useKernel } from '@embedpdf/react/runtime';\nimport { useSurface } from '@embedpdf/react/shell';\nimport { useT } from '@embedpdf/react/i18n';\nimport { useStamp, type MarkSource } from '@embedpdf/react/stamp';\nimport {\n INITIALS_MARK_NAME,\n SIGNATURE_MARK_NAME,\n SIGNATURES_LIBRARY_KIND,\n} from '@embedpdf/react/signature';\nimport { useSignatureSettings } from '../config-context';\nimport { Dialog } from './dialog';\nimport { Icon } from './icons';\nimport { markFontsOf, registerMarkFont, type MarkFont } from './signature-fonts';\n\ntype Tab = 'draw' | 'type' | 'upload';\ntype Stroke = Array<{ x: number; y: number }>;\n\nconst PAD = { width: 360, height: 120 };\n\n/** One pad: draw / type / upload, producing a `MarkSource` or null. */\nfunction MarkPad({\n value,\n onChange,\n fonts,\n registerFont,\n}: {\n value: MarkSource | null;\n onChange: (mark: MarkSource | null) => void;\n fonts: readonly MarkFont[];\n registerFont: (key: string) => Promise<void>;\n}) {\n const t = useT();\n const [tab, setTab] = useState<Tab>('draw');\n const [strokes, setStrokes] = useState<Stroke[]>([]);\n const [text, setText] = useState('');\n const [font, setFont] = useState(fonts[0]?.key ?? '');\n const [fileName, setFileName] = useState<string | null>(null);\n const canvas = useRef<HTMLCanvasElement>(null);\n const drawing = useRef<Stroke | null>(null);\n\n // Paint the strokes (device-pixel sharp).\n useEffect(() => {\n const element = canvas.current;\n if (!element) return;\n const dpr = window.devicePixelRatio || 1;\n element.width = PAD.width * dpr;\n element.height = PAD.height * dpr;\n const ctx = element.getContext('2d');\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, PAD.width, PAD.height);\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.lineWidth = 2.5;\n ctx.strokeStyle = getComputedStyle(element).color || '#000';\n for (const stroke of strokes) {\n ctx.beginPath();\n stroke.forEach((vertex, i) =>\n i === 0 ? ctx.moveTo(vertex.x, vertex.y) : ctx.lineTo(vertex.x, vertex.y),\n );\n ctx.stroke();\n }\n }, [strokes, tab]);\n\n const point = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n const commitStrokes = (next: Stroke[]) => {\n setStrokes(next);\n // A mark's strokes go down the page, as the pad's do.\n onChange(\n next.length ? { kind: 'ink', strokes: next, color: '#000000', strokeWidth: 2.5 } : null,\n );\n };\n const commitText = async (next: string, key: string) => {\n setText(next);\n setFont(key);\n if (!next.trim()) {\n onChange(null);\n return;\n }\n await registerFont(key);\n onChange({ kind: 'text', text: next.trim(), fontFamily: key, color: '#000000', fontSize: 36 });\n };\n const pickFile = (file: File) => {\n setFileName(file.name);\n onChange(\n file.type === 'application/pdf'\n ? { kind: 'pdf', source: file, pageIndex: 0 }\n : { kind: 'image', source: file },\n );\n };\n\n const tabClass = (id: Tab) =>\n `rounded px-2 py-1 text-xs font-medium ${tab === id ? 'bg-accent text-on-accent' : 'text-fg-muted hover:bg-hover'}`;\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-1\">\n <button type=\"button\" className={tabClass('draw')} onClick={() => setTab('draw')}>\n {t('demo.makerDraw')}\n </button>\n {fonts.length > 0 ? (\n <button\n type=\"button\"\n className={tabClass('type')}\n onClick={() => {\n setTab('type');\n // The font is read while the name is typed, so the mark is ready when it is.\n registerFont(font).catch((error: unknown) =>\n console.error('[embedpdf] loading the signature font failed:', error),\n );\n }}\n >\n {t('demo.makerType')}\n </button>\n ) : null}\n <button type=\"button\" className={tabClass('upload')} onClick={() => setTab('upload')}>\n {t('demo.makerUpload')}\n </button>\n <div className=\"flex-1\" />\n {value ? (\n <button\n type=\"button\"\n onClick={() => {\n commitStrokes([]);\n setText('');\n setFileName(null);\n onChange(null);\n }}\n className=\"text-fg-muted hover:text-fg text-xs\"\n >\n {t('demo.makerClear')}\n </button>\n ) : null}\n </div>\n {tab === 'draw' ? (\n <canvas\n ref={canvas}\n style={{ width: PAD.width, height: PAD.height, touchAction: 'none' }}\n className=\"border-border-subtle bg-surface text-fg rounded-md border\"\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n drawing.current = [point(event)];\n setStrokes((previous) => [...previous, drawing.current!]);\n }}\n onPointerMove={(event) => {\n if (!drawing.current) return;\n drawing.current.push(point(event));\n setStrokes((previous) => [...previous.slice(0, -1), [...drawing.current!]]);\n }}\n onPointerUp={() => {\n if (!drawing.current) return;\n const done = drawing.current;\n drawing.current = null;\n setStrokes((previous) => {\n const next = [...previous.slice(0, -1), done];\n commitStrokes(next);\n return next;\n });\n }}\n />\n ) : tab === 'type' ? (\n <div className=\"flex flex-col gap-2\">\n <input\n value={text}\n placeholder={t('demo.makerTypePlaceholder')}\n onChange={(event) => void commitText(event.target.value, font)}\n className=\"border-border bg-surface text-fg w-full rounded border px-2 py-1.5 text-sm\"\n />\n <label className=\"text-fg-muted flex items-center gap-2 text-xs\">\n {t('demo.makerFont')}\n <select\n value={font}\n onChange={(event) => void commitText(text, event.target.value)}\n className=\"border-border bg-surface text-fg rounded border px-2 py-1 text-xs\"\n >\n {fonts.map((fontOption) => (\n <option key={fontOption.key} value={fontOption.key}>\n {fontOption.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n ) : (\n <label className=\"border-border-subtle text-fg-muted hover:bg-hover flex h-24 cursor-pointer items-center justify-center rounded-md border border-dashed text-sm\">\n {fileName ?? t('demo.makerUploadHint')}\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,application/pdf\"\n className=\"hidden\"\n onChange={(event) => {\n const file = event.currentTarget.files?.[0];\n event.currentTarget.value = '';\n if (file) pickFile(file);\n }}\n />\n </label>\n )}\n </div>\n );\n}\n\nexport function SignatureMakerModal() {\n const t = useT();\n const surface = useSurface('signature-maker');\n const stamp = useStamp();\n const kernel = useKernel();\n const config = useSignatureSettings();\n const [name, setName] = useState('');\n const [signatureMark, setSignatureMark] = useState<MarkSource | null>(null);\n const [initialsMark, setInitialsMark] = useState<MarkSource | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const titleId = useId();\n\n const existingId = surface.props?.libraryId as string | undefined;\n const existing = existingId ? stamp.getLibrary(existingId) : null;\n const wantsInitials = (config.kinds ?? ['signature', 'initials']).includes('initials');\n const [fonts] = useState(() => markFontsOf(config.fonts));\n // A font is registered on the engine the stamp plugin authors with (the viewer's own) the\n // first time the Type tab opens on it, or a typed mark uses it.\n const registerFont = async (key: string) => {\n const font = fonts.find((each) => each.key === key);\n if (font) await registerMarkFont(kernel.engine, font);\n };\n\n if (!surface.isOpen) return null;\n\n const canSave = existing ? initialsMark != null : name.trim().length > 0 && signatureMark != null;\n const save = async () => {\n setBusy(true);\n setError(null);\n try {\n if (existing) {\n await stamp.createAsset({\n libraryId: existing.id,\n name: INITIALS_MARK_NAME,\n label: t('demo.initialsLabel'),\n mark: initialsMark!,\n });\n } else {\n const { library } = await stamp.createLibrary(name.trim(), {\n kind: SIGNATURES_LIBRARY_KIND,\n });\n const libraryId = library.id;\n await stamp.createAsset({\n libraryId,\n name: SIGNATURE_MARK_NAME,\n label: t('demo.signatureLabel'),\n mark: signatureMark!,\n });\n if (initialsMark) {\n await stamp.createAsset({\n libraryId,\n name: INITIALS_MARK_NAME,\n label: t('demo.initialsLabel'),\n mark: initialsMark,\n });\n }\n }\n setName('');\n setSignatureMark(null);\n setInitialsMark(null);\n surface.close();\n } catch (error) {\n console.error('[embedpdf] saving the signature failed:', error);\n setError(t('demo.makerError'));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog\n labelledBy={titleId}\n onClose={() => {\n if (!busy) surface.close();\n }}\n className=\"border-border bg-surface w-[26rem] rounded-lg border p-4 shadow-xl\"\n >\n <div className=\"flex items-center justify-between\">\n <h2 id={titleId} className=\"text-fg text-base font-semibold\">\n {existing ? t('demo.signaturesAddInitials') : t('demo.makerTitle')}\n </h2>\n <button\n type=\"button\"\n onClick={surface.close}\n className=\"text-fg-muted hover:bg-hover grid h-7 w-7 place-items-center rounded-md\"\n aria-label={t('demo.cancel')}\n >\n <Icon name=\"x\" size={16} />\n </button>\n </div>\n {existing ? null : (\n <label className=\"text-fg-muted mt-3 block text-xs\">\n {t('demo.makerName')}\n <input\n value={name}\n placeholder={t('demo.makerNamePlaceholder')}\n onChange={(event) => setName(event.target.value)}\n className=\"border-border bg-surface text-fg mt-1 w-full rounded border px-2 py-1.5 text-sm\"\n />\n </label>\n )}\n {existing ? null : (\n <div className=\"mt-3\">\n <p className=\"text-fg mb-1 text-xs font-semibold uppercase tracking-wide\">\n {t('demo.signatureLabel')}\n </p>\n <MarkPad\n value={signatureMark}\n onChange={setSignatureMark}\n fonts={fonts}\n registerFont={registerFont}\n />\n </div>\n )}\n {wantsInitials ? (\n <div className=\"mt-3\">\n <p className=\"text-fg mb-1 text-xs font-semibold uppercase tracking-wide\">\n {t('demo.initialsLabel')}\n {existing ? null : (\n <span className=\"text-fg-muted ms-1 font-normal normal-case tracking-normal\">\n {t('demo.makerOptional')}\n </span>\n )}\n </p>\n <MarkPad\n value={initialsMark}\n onChange={setInitialsMark}\n fonts={fonts}\n registerFont={registerFont}\n />\n </div>\n ) : null}\n {error ? <p className=\"mt-2 text-sm text-red-600\">{error}</p> : null}\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={surface.close}\n className=\"border-border text-fg hover:bg-hover rounded-md border px-3 py-1.5 text-sm\"\n >\n {t('demo.cancel')}\n </button>\n <button\n type=\"button\"\n disabled={busy || !canSave}\n onClick={() => void save()}\n className=\"bg-accent text-on-accent rounded-md px-3 py-1.5 text-sm disabled:opacity-60\"\n >\n {busy ? t('demo.makerSaving') : t('demo.makerSave')}\n </button>\n </div>\n </Dialog>\n );\n}\n"],"mappings":"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"}