@ai-matrx/office 0.8.50 → 0.8.52
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/CHANGELOG.md +29 -1
- package/dist/pdf-model.cjs +117 -3
- package/dist/pdf-model.cjs.map +1 -1
- package/dist/pdf-model.d.cts +171 -3
- package/dist/pdf-model.d.ts +171 -3
- package/dist/pdf-model.js +117 -3
- package/dist/pdf-model.js.map +1 -1
- package/dist/pdf.cjs +643 -190
- package/dist/pdf.cjs.map +1 -1
- package/dist/pdf.d.cts +171 -3
- package/dist/pdf.d.ts +171 -3
- package/dist/pdf.js +620 -154
- package/dist/pdf.js.map +1 -1
- package/package.json +7 -5
package/dist/pdf.d.cts
CHANGED
|
@@ -2,6 +2,67 @@ import * as react from 'react';
|
|
|
2
2
|
import { ComponentType, ReactNode } from 'react';
|
|
3
3
|
import { ComingSoonEntry } from '@ai-matrx/kit/coming-soon';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* The markup session the workspace drives, as the workspace needs it. The implementation is
|
|
7
|
+
* `@ai-matrx/media/viewers/pdf` `createPdfMarkupEngine` (PDF.js's annotation editors over the
|
|
8
|
+
* windowed pages); this package does not import the PDF engine, so the contract is written here
|
|
9
|
+
* and the host hands media's engine through `PdfViewerState.onMarkupEngine`, where TypeScript
|
|
10
|
+
* checks the two agree. Change one, change the other (media `viewers/pdf/markup/markup-engine.ts`).
|
|
11
|
+
*/
|
|
12
|
+
type PdfMarkupTool = "none" | "highlight" | "freetext" | "ink" | "stamp";
|
|
13
|
+
type PdfMarkupKind = "highlight" | "freetext" | "ink" | "stamp" | "signature";
|
|
14
|
+
interface PdfMarkupStyle {
|
|
15
|
+
/** `#rrggbb`. */
|
|
16
|
+
color: string;
|
|
17
|
+
/** 0-1. */
|
|
18
|
+
opacity: number;
|
|
19
|
+
/** Font size (text box) or stroke width (draw), PDF points. */
|
|
20
|
+
size: number;
|
|
21
|
+
}
|
|
22
|
+
interface PdfMarkupSnapshot {
|
|
23
|
+
tool: PdfMarkupTool;
|
|
24
|
+
pending: number;
|
|
25
|
+
summary: string;
|
|
26
|
+
canUndo: boolean;
|
|
27
|
+
canRedo: boolean;
|
|
28
|
+
selection: {
|
|
29
|
+
kind: PdfMarkupKind;
|
|
30
|
+
rect: {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
style: PdfMarkupStyle;
|
|
37
|
+
comment: string;
|
|
38
|
+
} | null;
|
|
39
|
+
styles: Record<Exclude<PdfMarkupTool, "none">, PdfMarkupStyle>;
|
|
40
|
+
textSelected: boolean;
|
|
41
|
+
}
|
|
42
|
+
type PdfMarkupHistoryEvent = {
|
|
43
|
+
type: "step";
|
|
44
|
+
label: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: "undo" | "redo";
|
|
47
|
+
external: boolean;
|
|
48
|
+
};
|
|
49
|
+
interface PdfMarkupEngine {
|
|
50
|
+
getSnapshot(): PdfMarkupSnapshot;
|
|
51
|
+
subscribe(listener: (snapshot: PdfMarkupSnapshot) => void): () => void;
|
|
52
|
+
onHistory(listener: (event: PdfMarkupHistoryEvent) => void): () => void;
|
|
53
|
+
setTool(tool: PdfMarkupTool): Promise<void>;
|
|
54
|
+
setStyle(patch: Partial<PdfMarkupStyle>): void;
|
|
55
|
+
setComment(text: string): void;
|
|
56
|
+
highlightSelection(): void;
|
|
57
|
+
addImage(image: Blob | string, kind: "stamp" | "signature"): Promise<void>;
|
|
58
|
+
deleteSelected(): void;
|
|
59
|
+
undo(): void;
|
|
60
|
+
redo(): void;
|
|
61
|
+
setCurrentPage(pageNumber: number): void;
|
|
62
|
+
save(): Promise<Uint8Array>;
|
|
63
|
+
destroy(): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
5
66
|
/**
|
|
6
67
|
* The page decisions of one workspace session: which pages are turned, left out, or moved. Pure.
|
|
7
68
|
*
|
|
@@ -68,6 +129,12 @@ interface PdfViewerState {
|
|
|
68
129
|
onDocumentLoad(pageCount: number): void;
|
|
69
130
|
/** A page was measured, in PDF points (crop and fit-page need it). */
|
|
70
131
|
onPageSize(page: number, widthPt: number, heightPt: number): void;
|
|
132
|
+
/**
|
|
133
|
+
* Present only when the host can save markup (`saveMarkup`): the viewer turns on PDF.js's
|
|
134
|
+
* annotation editors and hands their session up here (`null` when the document closes).
|
|
135
|
+
* `@ai-matrx/media/viewers/pdf` takes it as `PdfDocumentViewer.onMarkupEngine`.
|
|
136
|
+
*/
|
|
137
|
+
onMarkupEngine?(engine: PdfMarkupEngine | null): void;
|
|
71
138
|
}
|
|
72
139
|
type PdfRunRequest = {
|
|
73
140
|
tool: "apply-pages";
|
|
@@ -197,6 +264,24 @@ interface PdfWorkspaceHost {
|
|
|
197
264
|
online?: boolean;
|
|
198
265
|
/** Show a failure to the person (the host's toast). Defaults to an inline banner. */
|
|
199
266
|
notify?(message: string, tone: "error" | "info"): void;
|
|
267
|
+
/**
|
|
268
|
+
* Save the file's bytes with markup written in (PDF.js `saveDocument`) as a NEW VERSION of the
|
|
269
|
+
* same file. `summary` is "2 highlights, 1 text box". A markup-only change never re-extracts the
|
|
270
|
+
* text (PDF-PLAN rule R1). Absent: no markup tools.
|
|
271
|
+
*/
|
|
272
|
+
saveMarkup?(bytes: Uint8Array, summary: string): Promise<PdfRunResult>;
|
|
273
|
+
/** The annotations already in the file (Acrobat's, Preview's, ours), for the markup panel's list. */
|
|
274
|
+
existingAnnotations?(): Promise<Array<{
|
|
275
|
+
page: number;
|
|
276
|
+
subtype: string;
|
|
277
|
+
contents: string;
|
|
278
|
+
author: string;
|
|
279
|
+
}>>;
|
|
280
|
+
/** The platform's one signature pad (`@ai-matrx/records-ui` SignaturePad). Absent: no Signature tool. */
|
|
281
|
+
signaturePad?: ComponentType<{
|
|
282
|
+
value: unknown;
|
|
283
|
+
onChange: (value: string | null) => void;
|
|
284
|
+
}>;
|
|
200
285
|
}
|
|
201
286
|
|
|
202
287
|
interface PdfWorkspaceProps {
|
|
@@ -216,7 +301,7 @@ declare function PdfWorkspace({ host, className }: PdfWorkspaceProps): react.JSX
|
|
|
216
301
|
* third state, so no dead button.
|
|
217
302
|
*/
|
|
218
303
|
|
|
219
|
-
type PdfToolId = "browse" | "organize" | "extract-pages" | "split" | "crop" | "redact" | "compress" | "scan" | "sign" | "extract-data" | "edit" | "forms" | "protect" | "ocr" | "convert" | "compare" | "stamp";
|
|
304
|
+
type PdfToolId = "browse" | "markup" | "organize" | "extract-pages" | "split" | "crop" | "redact" | "compress" | "scan" | "sign" | "extract-data" | "edit" | "forms" | "protect" | "ocr" | "convert" | "compare" | "stamp";
|
|
220
305
|
interface PdfToolDef {
|
|
221
306
|
id: PdfToolId;
|
|
222
307
|
label: string;
|
|
@@ -238,15 +323,98 @@ declare const comingSoonIdOf: (id: PdfToolId) => string;
|
|
|
238
323
|
/** One row per unbuilt tool, ready for `registerComingSoon` or the host's registry table. */
|
|
239
324
|
declare const PDF_COMING_SOON: Record<string, ComingSoonEntry>;
|
|
240
325
|
|
|
326
|
+
/**
|
|
327
|
+
* The workspace's markup model (PDF-PLAN U10). Pure: the markup tools as data (which are built,
|
|
328
|
+
* which are coming and why), their keys, the palette, and the ONE session history that holds both
|
|
329
|
+
* page decisions and markup steps, so Undo takes back whichever came last.
|
|
330
|
+
*
|
|
331
|
+
* What is built rides PDF.js's own annotation editors (highlight, text box, draw, image; a
|
|
332
|
+
* signature is an image made on the platform's signature pad; a comment is the note on a piece of
|
|
333
|
+
* markup). What PDF.js's writer cannot make yet is a "Coming soon" row with its reason, never a
|
|
334
|
+
* dead button: underline and strike-out, shapes, a free-standing sticky note, links, editing the
|
|
335
|
+
* page's own text.
|
|
336
|
+
*/
|
|
337
|
+
|
|
338
|
+
type PdfMarkupToolId = "highlight" | "freetext" | "ink" | "image" | "signature" | "underline" | "shapes" | "note" | "links" | "edit-text";
|
|
339
|
+
interface PdfMarkupToolDef {
|
|
340
|
+
id: PdfMarkupToolId;
|
|
341
|
+
label: string;
|
|
342
|
+
/** Single key, while the markup tool is open. */
|
|
343
|
+
key?: string;
|
|
344
|
+
status: "ready" | "soon";
|
|
345
|
+
/** The PDF.js editor a ready tool turns on. */
|
|
346
|
+
engineTool?: Exclude<PdfMarkupTool, "none">;
|
|
347
|
+
/** Ready only when the host brings this port. */
|
|
348
|
+
needs?: "signaturePad";
|
|
349
|
+
/** Why a coming tool is not built (shown under its name, and in its Coming-soon promise). */
|
|
350
|
+
reason?: string;
|
|
351
|
+
}
|
|
352
|
+
declare const PDF_MARKUP_TOOLS: readonly PdfMarkupToolDef[];
|
|
353
|
+
declare const pdfMarkupTool: (id: string) => PdfMarkupToolDef | undefined;
|
|
354
|
+
/** The palette markup offers (Acrobat's comment colors). Literal colors are data: they are written into the PDF. */
|
|
355
|
+
declare const MARKUP_SWATCHES: ReadonlyArray<{
|
|
356
|
+
value: string;
|
|
357
|
+
label: string;
|
|
358
|
+
}>;
|
|
359
|
+
/** Which look controls a kind of markup has (the floating toolbar and the panel show only these). */
|
|
360
|
+
declare const MARKUP_STYLE_FIELDS: Record<PdfMarkupKind, ReadonlyArray<keyof PdfMarkupStyle>>;
|
|
361
|
+
/** Sizes offered: font sizes for a text box, stroke widths for a drawing (PDF points). */
|
|
362
|
+
declare const MARKUP_SIZES: Record<"freetext" | "ink", readonly number[]>;
|
|
363
|
+
declare const MARKUP_KIND_LABEL: Record<PdfMarkupKind, string>;
|
|
364
|
+
declare const markupComingSoonId: (id: PdfMarkupToolId) => string;
|
|
365
|
+
/** One Coming-soon row per markup tool not built yet (merged into `PDF_COMING_SOON`). */
|
|
366
|
+
declare const PDF_MARKUP_COMING_SOON: Record<string, ComingSoonEntry>;
|
|
367
|
+
type StepOrigin = "page" | "markup";
|
|
368
|
+
interface SessionTimeline {
|
|
369
|
+
past: Array<{
|
|
370
|
+
origin: StepOrigin;
|
|
371
|
+
label: string;
|
|
372
|
+
}>;
|
|
373
|
+
future: Array<{
|
|
374
|
+
origin: StepOrigin;
|
|
375
|
+
label: string;
|
|
376
|
+
}>;
|
|
377
|
+
}
|
|
378
|
+
declare const TIMELINE_LIMIT = 100;
|
|
379
|
+
declare const emptyTimeline: () => SessionTimeline;
|
|
380
|
+
declare function recordStep(t: SessionTimeline, origin: StepOrigin, label: string): SessionTimeline;
|
|
381
|
+
/** The step Undo would take back, or null. */
|
|
382
|
+
declare const nextUndo: (t: SessionTimeline) => {
|
|
383
|
+
origin: StepOrigin;
|
|
384
|
+
label: string;
|
|
385
|
+
} | null;
|
|
386
|
+
declare const nextRedo: (t: SessionTimeline) => {
|
|
387
|
+
origin: StepOrigin;
|
|
388
|
+
label: string;
|
|
389
|
+
} | null;
|
|
390
|
+
declare function stepBack(t: SessionTimeline): SessionTimeline;
|
|
391
|
+
declare function stepForward(t: SessionTimeline): SessionTimeline;
|
|
392
|
+
/** PDF.js undid a markup step on its own (its keys, focus outside the workspace): move the newest markup step back. */
|
|
393
|
+
declare function markupUndoneElsewhere(t: SessionTimeline): SessionTimeline;
|
|
394
|
+
declare function markupRedoneElsewhere(t: SessionTimeline): SessionTimeline;
|
|
395
|
+
/** Saving (or discarding) one kind of change ends its steps: the file's versions are the durable undo. */
|
|
396
|
+
declare function dropOrigin(t: SessionTimeline, origin: StepOrigin): SessionTimeline;
|
|
397
|
+
|
|
241
398
|
type PdfActionId = "undo" | "redo" | "find" | "print" | "save" | "zoom-in" | "zoom-out" | "zoom-fit-width" | "zoom-fit-page" | "page-next" | "page-prev" | "page-first" | "page-last" | "rotate-right" | "rotate-left" | "delete-pages" | "select-all-pages" | "toggle-pages" | "toggle-properties" | "read-mode" | "two-up" | "shortcuts" | `tool:${string}`;
|
|
242
399
|
interface PdfShortcut {
|
|
243
400
|
action: PdfActionId;
|
|
244
401
|
label: string;
|
|
245
402
|
/** Display keys: "Mod+Z" shows as Cmd+Z on a Mac and Ctrl+Z elsewhere. */
|
|
246
403
|
keys: string;
|
|
247
|
-
section: "Edit" | "View" | "Pages" | "Tools";
|
|
404
|
+
section: "Edit" | "View" | "Pages" | "Tools" | "Markup";
|
|
248
405
|
}
|
|
249
406
|
declare const PDF_SHORTCUTS: readonly PdfShortcut[];
|
|
407
|
+
/**
|
|
408
|
+
* Keys that work only while "Comment and mark up" is open (they pick a markup tool). Listed in the
|
|
409
|
+
* shortcut map under Markup; Delete, the arrows and Escape act on the selected markup there.
|
|
410
|
+
*/
|
|
411
|
+
declare const PDF_MARKUP_SHORTCUTS: ReadonlyArray<{
|
|
412
|
+
tool: PdfMarkupToolId;
|
|
413
|
+
label: string;
|
|
414
|
+
keys: string;
|
|
415
|
+
}>;
|
|
416
|
+
/** The markup tool a plain key picks while markup is open, or null. */
|
|
417
|
+
declare function matchMarkupKey(e: KeyLike, typing: boolean): PdfMarkupToolId | null;
|
|
250
418
|
interface KeyLike {
|
|
251
419
|
key: string;
|
|
252
420
|
ctrlKey: boolean;
|
|
@@ -290,4 +458,4 @@ declare const canRedo: (h: History<unknown>) => boolean;
|
|
|
290
458
|
declare const undoLabel: (h: History<unknown>) => string;
|
|
291
459
|
declare const redoLabel: (h: History<unknown>) => string;
|
|
292
460
|
|
|
293
|
-
export { HISTORY_LIMIT, type History, type KeyLike, PDF_COMING_SOON, PDF_SHORTCUTS, PDF_TOOLS, type PageDecisions, type PageOp, type PdfActionId, type PdfHostTool, type PdfHostToolContext, type PdfRunRequest, type PdfRunResult, type PdfShortcut, type PdfToolDef, type PdfToolId, type PdfViewerState, PdfWorkspace, type PdfWorkspaceHost, type PdfWorkspaceProps, type Turn, canRedo, canUndo, comingSoonIdOf, compilePageOps, deletePages, formatKeys, freshDecisions, isDirty, keptOrder, matchShortcut, pdfTool, pushStep, redo, redoLabel, reorderPages, restorePages, startHistory, turnPages, undo, undoLabel };
|
|
461
|
+
export { HISTORY_LIMIT, type History, type KeyLike, MARKUP_KIND_LABEL, MARKUP_SIZES, MARKUP_STYLE_FIELDS, MARKUP_SWATCHES, PDF_COMING_SOON, PDF_MARKUP_COMING_SOON, PDF_MARKUP_SHORTCUTS, PDF_MARKUP_TOOLS, PDF_SHORTCUTS, PDF_TOOLS, type PageDecisions, type PageOp, type PdfActionId, type PdfHostTool, type PdfHostToolContext, type PdfMarkupEngine, type PdfMarkupHistoryEvent, type PdfMarkupKind, type PdfMarkupSnapshot, type PdfMarkupStyle, type PdfMarkupTool, type PdfMarkupToolDef, type PdfMarkupToolId, type PdfRunRequest, type PdfRunResult, type PdfShortcut, type PdfToolDef, type PdfToolId, type PdfViewerState, PdfWorkspace, type PdfWorkspaceHost, type PdfWorkspaceProps, type SessionTimeline, type StepOrigin, TIMELINE_LIMIT, type Turn, canRedo, canUndo, comingSoonIdOf, compilePageOps, deletePages, dropOrigin, emptyTimeline, formatKeys, freshDecisions, isDirty, keptOrder, markupComingSoonId, markupRedoneElsewhere, markupUndoneElsewhere, matchMarkupKey, matchShortcut, nextRedo, nextUndo, pdfMarkupTool, pdfTool, pushStep, recordStep, redo, redoLabel, reorderPages, restorePages, startHistory, stepBack, stepForward, turnPages, undo, undoLabel };
|
package/dist/pdf.d.ts
CHANGED
|
@@ -2,6 +2,67 @@ import * as react from 'react';
|
|
|
2
2
|
import { ComponentType, ReactNode } from 'react';
|
|
3
3
|
import { ComingSoonEntry } from '@ai-matrx/kit/coming-soon';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* The markup session the workspace drives, as the workspace needs it. The implementation is
|
|
7
|
+
* `@ai-matrx/media/viewers/pdf` `createPdfMarkupEngine` (PDF.js's annotation editors over the
|
|
8
|
+
* windowed pages); this package does not import the PDF engine, so the contract is written here
|
|
9
|
+
* and the host hands media's engine through `PdfViewerState.onMarkupEngine`, where TypeScript
|
|
10
|
+
* checks the two agree. Change one, change the other (media `viewers/pdf/markup/markup-engine.ts`).
|
|
11
|
+
*/
|
|
12
|
+
type PdfMarkupTool = "none" | "highlight" | "freetext" | "ink" | "stamp";
|
|
13
|
+
type PdfMarkupKind = "highlight" | "freetext" | "ink" | "stamp" | "signature";
|
|
14
|
+
interface PdfMarkupStyle {
|
|
15
|
+
/** `#rrggbb`. */
|
|
16
|
+
color: string;
|
|
17
|
+
/** 0-1. */
|
|
18
|
+
opacity: number;
|
|
19
|
+
/** Font size (text box) or stroke width (draw), PDF points. */
|
|
20
|
+
size: number;
|
|
21
|
+
}
|
|
22
|
+
interface PdfMarkupSnapshot {
|
|
23
|
+
tool: PdfMarkupTool;
|
|
24
|
+
pending: number;
|
|
25
|
+
summary: string;
|
|
26
|
+
canUndo: boolean;
|
|
27
|
+
canRedo: boolean;
|
|
28
|
+
selection: {
|
|
29
|
+
kind: PdfMarkupKind;
|
|
30
|
+
rect: {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
style: PdfMarkupStyle;
|
|
37
|
+
comment: string;
|
|
38
|
+
} | null;
|
|
39
|
+
styles: Record<Exclude<PdfMarkupTool, "none">, PdfMarkupStyle>;
|
|
40
|
+
textSelected: boolean;
|
|
41
|
+
}
|
|
42
|
+
type PdfMarkupHistoryEvent = {
|
|
43
|
+
type: "step";
|
|
44
|
+
label: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: "undo" | "redo";
|
|
47
|
+
external: boolean;
|
|
48
|
+
};
|
|
49
|
+
interface PdfMarkupEngine {
|
|
50
|
+
getSnapshot(): PdfMarkupSnapshot;
|
|
51
|
+
subscribe(listener: (snapshot: PdfMarkupSnapshot) => void): () => void;
|
|
52
|
+
onHistory(listener: (event: PdfMarkupHistoryEvent) => void): () => void;
|
|
53
|
+
setTool(tool: PdfMarkupTool): Promise<void>;
|
|
54
|
+
setStyle(patch: Partial<PdfMarkupStyle>): void;
|
|
55
|
+
setComment(text: string): void;
|
|
56
|
+
highlightSelection(): void;
|
|
57
|
+
addImage(image: Blob | string, kind: "stamp" | "signature"): Promise<void>;
|
|
58
|
+
deleteSelected(): void;
|
|
59
|
+
undo(): void;
|
|
60
|
+
redo(): void;
|
|
61
|
+
setCurrentPage(pageNumber: number): void;
|
|
62
|
+
save(): Promise<Uint8Array>;
|
|
63
|
+
destroy(): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
5
66
|
/**
|
|
6
67
|
* The page decisions of one workspace session: which pages are turned, left out, or moved. Pure.
|
|
7
68
|
*
|
|
@@ -68,6 +129,12 @@ interface PdfViewerState {
|
|
|
68
129
|
onDocumentLoad(pageCount: number): void;
|
|
69
130
|
/** A page was measured, in PDF points (crop and fit-page need it). */
|
|
70
131
|
onPageSize(page: number, widthPt: number, heightPt: number): void;
|
|
132
|
+
/**
|
|
133
|
+
* Present only when the host can save markup (`saveMarkup`): the viewer turns on PDF.js's
|
|
134
|
+
* annotation editors and hands their session up here (`null` when the document closes).
|
|
135
|
+
* `@ai-matrx/media/viewers/pdf` takes it as `PdfDocumentViewer.onMarkupEngine`.
|
|
136
|
+
*/
|
|
137
|
+
onMarkupEngine?(engine: PdfMarkupEngine | null): void;
|
|
71
138
|
}
|
|
72
139
|
type PdfRunRequest = {
|
|
73
140
|
tool: "apply-pages";
|
|
@@ -197,6 +264,24 @@ interface PdfWorkspaceHost {
|
|
|
197
264
|
online?: boolean;
|
|
198
265
|
/** Show a failure to the person (the host's toast). Defaults to an inline banner. */
|
|
199
266
|
notify?(message: string, tone: "error" | "info"): void;
|
|
267
|
+
/**
|
|
268
|
+
* Save the file's bytes with markup written in (PDF.js `saveDocument`) as a NEW VERSION of the
|
|
269
|
+
* same file. `summary` is "2 highlights, 1 text box". A markup-only change never re-extracts the
|
|
270
|
+
* text (PDF-PLAN rule R1). Absent: no markup tools.
|
|
271
|
+
*/
|
|
272
|
+
saveMarkup?(bytes: Uint8Array, summary: string): Promise<PdfRunResult>;
|
|
273
|
+
/** The annotations already in the file (Acrobat's, Preview's, ours), for the markup panel's list. */
|
|
274
|
+
existingAnnotations?(): Promise<Array<{
|
|
275
|
+
page: number;
|
|
276
|
+
subtype: string;
|
|
277
|
+
contents: string;
|
|
278
|
+
author: string;
|
|
279
|
+
}>>;
|
|
280
|
+
/** The platform's one signature pad (`@ai-matrx/records-ui` SignaturePad). Absent: no Signature tool. */
|
|
281
|
+
signaturePad?: ComponentType<{
|
|
282
|
+
value: unknown;
|
|
283
|
+
onChange: (value: string | null) => void;
|
|
284
|
+
}>;
|
|
200
285
|
}
|
|
201
286
|
|
|
202
287
|
interface PdfWorkspaceProps {
|
|
@@ -216,7 +301,7 @@ declare function PdfWorkspace({ host, className }: PdfWorkspaceProps): react.JSX
|
|
|
216
301
|
* third state, so no dead button.
|
|
217
302
|
*/
|
|
218
303
|
|
|
219
|
-
type PdfToolId = "browse" | "organize" | "extract-pages" | "split" | "crop" | "redact" | "compress" | "scan" | "sign" | "extract-data" | "edit" | "forms" | "protect" | "ocr" | "convert" | "compare" | "stamp";
|
|
304
|
+
type PdfToolId = "browse" | "markup" | "organize" | "extract-pages" | "split" | "crop" | "redact" | "compress" | "scan" | "sign" | "extract-data" | "edit" | "forms" | "protect" | "ocr" | "convert" | "compare" | "stamp";
|
|
220
305
|
interface PdfToolDef {
|
|
221
306
|
id: PdfToolId;
|
|
222
307
|
label: string;
|
|
@@ -238,15 +323,98 @@ declare const comingSoonIdOf: (id: PdfToolId) => string;
|
|
|
238
323
|
/** One row per unbuilt tool, ready for `registerComingSoon` or the host's registry table. */
|
|
239
324
|
declare const PDF_COMING_SOON: Record<string, ComingSoonEntry>;
|
|
240
325
|
|
|
326
|
+
/**
|
|
327
|
+
* The workspace's markup model (PDF-PLAN U10). Pure: the markup tools as data (which are built,
|
|
328
|
+
* which are coming and why), their keys, the palette, and the ONE session history that holds both
|
|
329
|
+
* page decisions and markup steps, so Undo takes back whichever came last.
|
|
330
|
+
*
|
|
331
|
+
* What is built rides PDF.js's own annotation editors (highlight, text box, draw, image; a
|
|
332
|
+
* signature is an image made on the platform's signature pad; a comment is the note on a piece of
|
|
333
|
+
* markup). What PDF.js's writer cannot make yet is a "Coming soon" row with its reason, never a
|
|
334
|
+
* dead button: underline and strike-out, shapes, a free-standing sticky note, links, editing the
|
|
335
|
+
* page's own text.
|
|
336
|
+
*/
|
|
337
|
+
|
|
338
|
+
type PdfMarkupToolId = "highlight" | "freetext" | "ink" | "image" | "signature" | "underline" | "shapes" | "note" | "links" | "edit-text";
|
|
339
|
+
interface PdfMarkupToolDef {
|
|
340
|
+
id: PdfMarkupToolId;
|
|
341
|
+
label: string;
|
|
342
|
+
/** Single key, while the markup tool is open. */
|
|
343
|
+
key?: string;
|
|
344
|
+
status: "ready" | "soon";
|
|
345
|
+
/** The PDF.js editor a ready tool turns on. */
|
|
346
|
+
engineTool?: Exclude<PdfMarkupTool, "none">;
|
|
347
|
+
/** Ready only when the host brings this port. */
|
|
348
|
+
needs?: "signaturePad";
|
|
349
|
+
/** Why a coming tool is not built (shown under its name, and in its Coming-soon promise). */
|
|
350
|
+
reason?: string;
|
|
351
|
+
}
|
|
352
|
+
declare const PDF_MARKUP_TOOLS: readonly PdfMarkupToolDef[];
|
|
353
|
+
declare const pdfMarkupTool: (id: string) => PdfMarkupToolDef | undefined;
|
|
354
|
+
/** The palette markup offers (Acrobat's comment colors). Literal colors are data: they are written into the PDF. */
|
|
355
|
+
declare const MARKUP_SWATCHES: ReadonlyArray<{
|
|
356
|
+
value: string;
|
|
357
|
+
label: string;
|
|
358
|
+
}>;
|
|
359
|
+
/** Which look controls a kind of markup has (the floating toolbar and the panel show only these). */
|
|
360
|
+
declare const MARKUP_STYLE_FIELDS: Record<PdfMarkupKind, ReadonlyArray<keyof PdfMarkupStyle>>;
|
|
361
|
+
/** Sizes offered: font sizes for a text box, stroke widths for a drawing (PDF points). */
|
|
362
|
+
declare const MARKUP_SIZES: Record<"freetext" | "ink", readonly number[]>;
|
|
363
|
+
declare const MARKUP_KIND_LABEL: Record<PdfMarkupKind, string>;
|
|
364
|
+
declare const markupComingSoonId: (id: PdfMarkupToolId) => string;
|
|
365
|
+
/** One Coming-soon row per markup tool not built yet (merged into `PDF_COMING_SOON`). */
|
|
366
|
+
declare const PDF_MARKUP_COMING_SOON: Record<string, ComingSoonEntry>;
|
|
367
|
+
type StepOrigin = "page" | "markup";
|
|
368
|
+
interface SessionTimeline {
|
|
369
|
+
past: Array<{
|
|
370
|
+
origin: StepOrigin;
|
|
371
|
+
label: string;
|
|
372
|
+
}>;
|
|
373
|
+
future: Array<{
|
|
374
|
+
origin: StepOrigin;
|
|
375
|
+
label: string;
|
|
376
|
+
}>;
|
|
377
|
+
}
|
|
378
|
+
declare const TIMELINE_LIMIT = 100;
|
|
379
|
+
declare const emptyTimeline: () => SessionTimeline;
|
|
380
|
+
declare function recordStep(t: SessionTimeline, origin: StepOrigin, label: string): SessionTimeline;
|
|
381
|
+
/** The step Undo would take back, or null. */
|
|
382
|
+
declare const nextUndo: (t: SessionTimeline) => {
|
|
383
|
+
origin: StepOrigin;
|
|
384
|
+
label: string;
|
|
385
|
+
} | null;
|
|
386
|
+
declare const nextRedo: (t: SessionTimeline) => {
|
|
387
|
+
origin: StepOrigin;
|
|
388
|
+
label: string;
|
|
389
|
+
} | null;
|
|
390
|
+
declare function stepBack(t: SessionTimeline): SessionTimeline;
|
|
391
|
+
declare function stepForward(t: SessionTimeline): SessionTimeline;
|
|
392
|
+
/** PDF.js undid a markup step on its own (its keys, focus outside the workspace): move the newest markup step back. */
|
|
393
|
+
declare function markupUndoneElsewhere(t: SessionTimeline): SessionTimeline;
|
|
394
|
+
declare function markupRedoneElsewhere(t: SessionTimeline): SessionTimeline;
|
|
395
|
+
/** Saving (or discarding) one kind of change ends its steps: the file's versions are the durable undo. */
|
|
396
|
+
declare function dropOrigin(t: SessionTimeline, origin: StepOrigin): SessionTimeline;
|
|
397
|
+
|
|
241
398
|
type PdfActionId = "undo" | "redo" | "find" | "print" | "save" | "zoom-in" | "zoom-out" | "zoom-fit-width" | "zoom-fit-page" | "page-next" | "page-prev" | "page-first" | "page-last" | "rotate-right" | "rotate-left" | "delete-pages" | "select-all-pages" | "toggle-pages" | "toggle-properties" | "read-mode" | "two-up" | "shortcuts" | `tool:${string}`;
|
|
242
399
|
interface PdfShortcut {
|
|
243
400
|
action: PdfActionId;
|
|
244
401
|
label: string;
|
|
245
402
|
/** Display keys: "Mod+Z" shows as Cmd+Z on a Mac and Ctrl+Z elsewhere. */
|
|
246
403
|
keys: string;
|
|
247
|
-
section: "Edit" | "View" | "Pages" | "Tools";
|
|
404
|
+
section: "Edit" | "View" | "Pages" | "Tools" | "Markup";
|
|
248
405
|
}
|
|
249
406
|
declare const PDF_SHORTCUTS: readonly PdfShortcut[];
|
|
407
|
+
/**
|
|
408
|
+
* Keys that work only while "Comment and mark up" is open (they pick a markup tool). Listed in the
|
|
409
|
+
* shortcut map under Markup; Delete, the arrows and Escape act on the selected markup there.
|
|
410
|
+
*/
|
|
411
|
+
declare const PDF_MARKUP_SHORTCUTS: ReadonlyArray<{
|
|
412
|
+
tool: PdfMarkupToolId;
|
|
413
|
+
label: string;
|
|
414
|
+
keys: string;
|
|
415
|
+
}>;
|
|
416
|
+
/** The markup tool a plain key picks while markup is open, or null. */
|
|
417
|
+
declare function matchMarkupKey(e: KeyLike, typing: boolean): PdfMarkupToolId | null;
|
|
250
418
|
interface KeyLike {
|
|
251
419
|
key: string;
|
|
252
420
|
ctrlKey: boolean;
|
|
@@ -290,4 +458,4 @@ declare const canRedo: (h: History<unknown>) => boolean;
|
|
|
290
458
|
declare const undoLabel: (h: History<unknown>) => string;
|
|
291
459
|
declare const redoLabel: (h: History<unknown>) => string;
|
|
292
460
|
|
|
293
|
-
export { HISTORY_LIMIT, type History, type KeyLike, PDF_COMING_SOON, PDF_SHORTCUTS, PDF_TOOLS, type PageDecisions, type PageOp, type PdfActionId, type PdfHostTool, type PdfHostToolContext, type PdfRunRequest, type PdfRunResult, type PdfShortcut, type PdfToolDef, type PdfToolId, type PdfViewerState, PdfWorkspace, type PdfWorkspaceHost, type PdfWorkspaceProps, type Turn, canRedo, canUndo, comingSoonIdOf, compilePageOps, deletePages, formatKeys, freshDecisions, isDirty, keptOrder, matchShortcut, pdfTool, pushStep, redo, redoLabel, reorderPages, restorePages, startHistory, turnPages, undo, undoLabel };
|
|
461
|
+
export { HISTORY_LIMIT, type History, type KeyLike, MARKUP_KIND_LABEL, MARKUP_SIZES, MARKUP_STYLE_FIELDS, MARKUP_SWATCHES, PDF_COMING_SOON, PDF_MARKUP_COMING_SOON, PDF_MARKUP_SHORTCUTS, PDF_MARKUP_TOOLS, PDF_SHORTCUTS, PDF_TOOLS, type PageDecisions, type PageOp, type PdfActionId, type PdfHostTool, type PdfHostToolContext, type PdfMarkupEngine, type PdfMarkupHistoryEvent, type PdfMarkupKind, type PdfMarkupSnapshot, type PdfMarkupStyle, type PdfMarkupTool, type PdfMarkupToolDef, type PdfMarkupToolId, type PdfRunRequest, type PdfRunResult, type PdfShortcut, type PdfToolDef, type PdfToolId, type PdfViewerState, PdfWorkspace, type PdfWorkspaceHost, type PdfWorkspaceProps, type SessionTimeline, type StepOrigin, TIMELINE_LIMIT, type Turn, canRedo, canUndo, comingSoonIdOf, compilePageOps, deletePages, dropOrigin, emptyTimeline, formatKeys, freshDecisions, isDirty, keptOrder, markupComingSoonId, markupRedoneElsewhere, markupUndoneElsewhere, matchMarkupKey, matchShortcut, nextRedo, nextUndo, pdfMarkupTool, pdfTool, pushStep, recordStep, redo, redoLabel, reorderPages, restorePages, startHistory, stepBack, stepForward, turnPages, undo, undoLabel };
|