@embedpdf/plugin-signature 2.15.1 → 3.0.0-next.13
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/LICENSE +192 -21
- package/README.md +38 -0
- package/dist/contract-BvHa9Zl_.d.cts +176 -0
- package/dist/contract-C3nQtwGf.js +14 -0
- package/dist/contract-C3nQtwGf.js.map +1 -0
- package/dist/contract-CojqGdMH.cjs +43 -0
- package/dist/contract-CojqGdMH.cjs.map +1 -0
- package/dist/contract-Dg50puf7.d.ts +176 -0
- package/dist/contract.cjs +7 -0
- package/dist/contract.d.cts +2 -0
- package/dist/contract.d.ts +2 -0
- package/dist/contract.js +2 -0
- package/dist/index.cjs +498 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -1
- package/dist/index.js +450 -511
- package/dist/index.js.map +1 -1
- package/package.json +28 -58
- package/dist/lib/actions.d.ts +0 -14
- package/dist/lib/handlers/signature-ink.handler.d.ts +0 -4
- package/dist/lib/handlers/signature-stamp.handler.d.ts +0 -4
- package/dist/lib/index.d.ts +0 -12
- package/dist/lib/manifest.d.ts +0 -4
- package/dist/lib/reducer.d.ts +0 -5
- package/dist/lib/serialization.d.ts +0 -30
- package/dist/lib/signature-plugin.d.ts +0 -27
- package/dist/lib/tools.d.ts +0 -113
- package/dist/lib/types.d.ts +0 -114
- package/dist/preact/adapter.d.ts +0 -5
- package/dist/preact/annotation.d.ts +0 -1
- package/dist/preact/core.d.ts +0 -1
- package/dist/preact/index.cjs +0 -2
- package/dist/preact/index.cjs.map +0 -1
- package/dist/preact/index.d.ts +0 -1
- package/dist/preact/index.js +0 -464
- package/dist/preact/index.js.map +0 -1
- package/dist/react/adapter.d.ts +0 -2
- package/dist/react/annotation.d.ts +0 -1
- package/dist/react/core.d.ts +0 -1
- package/dist/react/index.cjs +0 -2
- package/dist/react/index.cjs.map +0 -1
- package/dist/react/index.d.ts +0 -1
- package/dist/react/index.js +0 -463
- package/dist/react/index.js.map +0 -1
- package/dist/shared/components/crop-canvas.d.ts +0 -14
- package/dist/shared/components/index.d.ts +0 -2
- package/dist/shared/components/signature-draw-pad.d.ts +0 -12
- package/dist/shared/components/signature-type-pad.d.ts +0 -14
- package/dist/shared/hooks/index.d.ts +0 -2
- package/dist/shared/hooks/use-signature-upload.d.ts +0 -21
- package/dist/shared/hooks/use-signature.d.ts +0 -16
- package/dist/shared/index.d.ts +0 -4
- package/dist/shared-preact/components/crop-canvas.d.ts +0 -14
- package/dist/shared-preact/components/index.d.ts +0 -2
- package/dist/shared-preact/components/signature-draw-pad.d.ts +0 -12
- package/dist/shared-preact/components/signature-type-pad.d.ts +0 -14
- package/dist/shared-preact/hooks/index.d.ts +0 -2
- package/dist/shared-preact/hooks/use-signature-upload.d.ts +0 -21
- package/dist/shared-preact/hooks/use-signature.d.ts +0 -16
- package/dist/shared-preact/index.d.ts +0 -4
- package/dist/shared-react/components/crop-canvas.d.ts +0 -14
- package/dist/shared-react/components/index.d.ts +0 -2
- package/dist/shared-react/components/signature-draw-pad.d.ts +0 -12
- package/dist/shared-react/components/signature-type-pad.d.ts +0 -14
- package/dist/shared-react/hooks/index.d.ts +0 -2
- package/dist/shared-react/hooks/use-signature-upload.d.ts +0 -21
- package/dist/shared-react/hooks/use-signature.d.ts +0 -16
- package/dist/shared-react/index.d.ts +0 -4
- package/dist/shared-vue/components/crop-canvas.d.ts +0 -14
- package/dist/svelte/components/SignatureDrawPad.svelte.d.ts +0 -12
- package/dist/svelte/components/SignatureTypePad.svelte.d.ts +0 -14
- package/dist/svelte/components/index.d.ts +0 -2
- package/dist/svelte/hooks/index.d.ts +0 -2
- package/dist/svelte/hooks/use-signature-upload.svelte.d.ts +0 -21
- package/dist/svelte/hooks/use-signature.svelte.d.ts +0 -17
- package/dist/svelte/index.cjs +0 -2
- package/dist/svelte/index.cjs.map +0 -1
- package/dist/svelte/index.d.ts +0 -4
- package/dist/svelte/index.js +0 -415
- package/dist/svelte/index.js.map +0 -1
- package/dist/vue/components/SignatureDrawPad.vue.d.ts +0 -15
- package/dist/vue/components/SignatureTypePad.vue.d.ts +0 -19
- package/dist/vue/components/index.d.ts +0 -2
- package/dist/vue/hooks/index.d.ts +0 -2
- package/dist/vue/hooks/use-signature-upload.d.ts +0 -20
- package/dist/vue/hooks/use-signature.d.ts +0 -176
- package/dist/vue/index.cjs +0 -2
- package/dist/vue/index.cjs.map +0 -1
- package/dist/vue/index.d.ts +0 -4
- package/dist/vue/index.js +0 -453
- package/dist/vue/index.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/types.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/handlers/signature-stamp.handler.ts","../src/lib/handlers/signature-ink.handler.ts","../src/lib/tools.ts","../src/lib/signature-plugin.ts","../src/lib/reducer.ts","../src/lib/serialization.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePluginConfig, EventHook } from '@embedpdf/core';\n\n// ---------------------------------------------------------------------------\n// Enums\n// ---------------------------------------------------------------------------\n\nexport enum SignatureMode {\n SignatureOnly = 'signature-only',\n SignatureAndInitials = 'signature-and-initials',\n}\n\nexport enum SignatureCreationType {\n Draw = 'draw',\n Type = 'type',\n Upload = 'upload',\n}\n\nexport enum SignatureFieldKind {\n Signature = 'signature',\n Initials = 'initials',\n}\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\nexport interface SignatureInkData {\n inkList: Array<{ points: Array<{ x: number; y: number }> }>;\n strokeWidth: number;\n strokeColor: string;\n size: { width: number; height: number };\n}\n\ninterface SignatureFieldBase {\n label?: string;\n previewDataUrl: string;\n}\n\nexport interface SignatureInkFieldDefinition extends SignatureFieldBase {\n creationType: SignatureCreationType.Draw;\n inkData: SignatureInkData;\n}\n\nexport interface SignatureStampFieldDefinition extends SignatureFieldBase {\n creationType: SignatureCreationType.Type | SignatureCreationType.Upload;\n imageMimeType?: string;\n imageSize?: { width: number; height: number };\n imageData?: ArrayBuffer;\n}\n\nexport type SignatureFieldDefinition = SignatureInkFieldDefinition | SignatureStampFieldDefinition;\n\nexport interface SignatureEntry {\n id: string;\n createdAt: number;\n signature: SignatureFieldDefinition;\n initials?: SignatureFieldDefinition;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin config\n// ---------------------------------------------------------------------------\n\nexport interface SignaturePluginConfig extends BasePluginConfig {\n mode: SignatureMode;\n defaultSize?: { width: number; height: number };\n}\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\nexport interface SignatureState {\n entryIds: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Tool context types (declaration-merged into ToolContextMap)\n// ---------------------------------------------------------------------------\n\nexport interface SignatureStampToolContext {\n imageData: ArrayBuffer;\n ghostUrl: string;\n targetSize: { width: number; height: number };\n entryId: string;\n kind: SignatureFieldKind;\n}\n\nexport interface SignatureInkToolContext {\n inkData: SignatureInkData;\n targetSize: { width: number; height: number };\n entryId: string;\n kind: SignatureFieldKind;\n}\n\ndeclare module '@embedpdf/plugin-annotation' {\n interface ToolContextMap {\n signatureStamp: SignatureStampToolContext;\n signatureInk: SignatureInkToolContext;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Capability / Scope\n// ---------------------------------------------------------------------------\n\nexport interface ActivePlacementInfo {\n entryId: string;\n kind: SignatureFieldKind;\n}\n\nexport interface ActivePlacementChangeEvent {\n documentId: string;\n activePlacement: ActivePlacementInfo | null;\n}\n\nexport interface SignatureScope {\n activateSignaturePlacement(entryId: string): void;\n activateInitialsPlacement(entryId: string): void;\n deactivatePlacement(): void;\n getActivePlacement(): ActivePlacementInfo | null;\n onActivePlacementChange: EventHook<ActivePlacementInfo | null>;\n}\n\nexport interface SignatureCapability {\n readonly mode: SignatureMode;\n getEntries(): SignatureEntry[];\n addEntry(entry: Omit<SignatureEntry, 'id' | 'createdAt'>): string;\n removeEntry(id: string): void;\n loadEntries(entries: SignatureEntry[]): void;\n exportEntries(): SignatureEntry[];\n onEntriesChange: EventHook<SignatureEntry[]>;\n forDocument(documentId: string): SignatureScope;\n onActivePlacementChange: EventHook<ActivePlacementChangeEvent>;\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SignatureMode, SignaturePluginConfig } from './types';\n\nexport const SIGNATURE_PLUGIN_ID = 'signature';\n\nexport const manifest: PluginManifest<SignaturePluginConfig> = {\n id: SIGNATURE_PLUGIN_ID,\n name: 'Signature Plugin',\n version: '1.0.0',\n provides: ['signature'],\n requires: ['annotation'],\n optional: [],\n defaultConfig: {\n mode: SignatureMode.SignatureOnly,\n },\n};\n","import { Action } from '@embedpdf/core';\n\nexport const ADD_SIGNATURE_ENTRY = 'SIGNATURE/ADD_ENTRY';\nexport const REMOVE_SIGNATURE_ENTRY = 'SIGNATURE/REMOVE_ENTRY';\n\nexport interface AddSignatureEntryAction extends Action {\n type: typeof ADD_SIGNATURE_ENTRY;\n payload: string;\n}\n\nexport interface RemoveSignatureEntryAction extends Action {\n type: typeof REMOVE_SIGNATURE_ENTRY;\n payload: string;\n}\n\nexport type SignatureAction = AddSignatureEntryAction | RemoveSignatureEntryAction;\n\nexport function addSignatureEntry(id: string): AddSignatureEntryAction {\n return { type: ADD_SIGNATURE_ENTRY, payload: id };\n}\n\nexport function removeSignatureEntry(id: string): RemoveSignatureEntryAction {\n return { type: REMOVE_SIGNATURE_ENTRY, payload: id };\n}\n","import {\n PdfAnnotationName,\n PdfAnnotationSubtype,\n PdfStampAnnoObject,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport { HandlerFactory } from '@embedpdf/plugin-annotation';\nimport { applyInsertUpright, clampAnnotationToPage } from '@embedpdf/plugin-annotation';\nimport { SIGNATURE_STAMP_TOOL_ID } from '../tools';\nimport { SignatureFieldKind } from '../types';\n\nexport const signatureStampHandlerFactory: HandlerFactory<\n PdfStampAnnoObject,\n typeof SIGNATURE_STAMP_TOOL_ID\n> = {\n annotationType: PdfAnnotationSubtype.STAMP,\n create(context) {\n const { onPreview, onCommit, getTool, pageSize, pageRotation, getToolContext } = context;\n\n return {\n onPointerMove: (pos) => {\n const ctx = getToolContext();\n if (!ctx?.targetSize) return;\n const { width, height } = ctx.targetSize;\n onPreview({\n type: PdfAnnotationSubtype.STAMP,\n bounds: {\n origin: { x: pos.x - width / 2, y: pos.y - height / 2 },\n size: { width, height },\n },\n data: {\n rect: {\n origin: { x: pos.x - width / 2, y: pos.y - height / 2 },\n size: { width, height },\n },\n ghostUrl: ctx.ghostUrl,\n pageRotation,\n },\n });\n },\n\n onPointerDown: (pos) => {\n const tool = getTool();\n const ctx = getToolContext();\n if (!tool || !ctx?.targetSize) return;\n\n const { width, height } = ctx.targetSize;\n const rect: Rect = {\n origin: { x: pos.x - width / 2, y: pos.y - height / 2 },\n size: { width, height },\n };\n\n let anno: PdfStampAnnoObject = {\n ...tool.defaults,\n rect,\n type: PdfAnnotationSubtype.STAMP,\n name: PdfAnnotationName.Custom,\n subject: 'Signature',\n flags: tool.defaults.flags ?? ['print'],\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n if (tool.behavior?.insertUpright) {\n anno = applyInsertUpright(anno, pageRotation, false);\n }\n anno = clampAnnotationToPage(anno, pageSize);\n\n onCommit(anno, { data: ctx.imageData });\n onPreview(null);\n },\n\n onPointerLeave: () => {\n onPreview(null);\n },\n };\n },\n};\n","import { PdfAnnotationSubtype, PdfInkAnnoObject, Rect, expandRect, uuidV4 } from '@embedpdf/models';\nimport { HandlerFactory } from '@embedpdf/plugin-annotation';\nimport { clampAnnotationToPage } from '@embedpdf/plugin-annotation';\nimport { SIGNATURE_INK_TOOL_ID } from '../tools';\nimport { SignatureFieldKind, SignatureInkData } from '../types';\n\nfunction translateAndScaleInk(\n inkData: SignatureInkData,\n targetSize: { width: number; height: number },\n centerPos: { x: number; y: number },\n): { inkList: Array<{ points: Array<{ x: number; y: number }> }>; strokeWidth: number } {\n const scaleX = targetSize.width / inkData.size.width;\n const scaleY = targetSize.height / inkData.size.height;\n const scale = Math.min(scaleX, scaleY);\n const scaledW = inkData.size.width * scale;\n const scaledH = inkData.size.height * scale;\n const offsetX = centerPos.x - scaledW / 2;\n const offsetY = centerPos.y - scaledH / 2;\n\n const inkList = inkData.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: p.x * scale + offsetX,\n y: p.y * scale + offsetY,\n })),\n }));\n\n return { inkList, strokeWidth: Math.round(inkData.strokeWidth * scale * 10) / 10 };\n}\n\nexport const signatureInkHandlerFactory: HandlerFactory<\n PdfInkAnnoObject,\n typeof SIGNATURE_INK_TOOL_ID\n> = {\n annotationType: PdfAnnotationSubtype.INK,\n create(context) {\n const { onPreview, onCommit, getTool, pageSize, getToolContext } = context;\n\n return {\n onPointerMove: (pos) => {\n const ctx = getToolContext();\n if (!ctx?.inkData || !ctx?.targetSize) return;\n\n const { inkList, strokeWidth } = translateAndScaleInk(ctx.inkData, ctx.targetSize, pos);\n\n const allPoints = inkList.flatMap((s) => s.points);\n if (allPoints.length === 0) return;\n\n const rect = expandRect(\n {\n origin: {\n x: Math.min(...allPoints.map((p) => p.x)),\n y: Math.min(...allPoints.map((p) => p.y)),\n },\n size: {\n width:\n Math.max(...allPoints.map((p) => p.x)) - Math.min(...allPoints.map((p) => p.x)),\n height:\n Math.max(...allPoints.map((p) => p.y)) - Math.min(...allPoints.map((p) => p.y)),\n },\n },\n strokeWidth / 2,\n );\n\n onPreview({\n type: PdfAnnotationSubtype.INK,\n bounds: rect,\n data: {\n rect,\n inkList,\n strokeWidth,\n strokeColor: ctx.inkData.strokeColor,\n opacity: 0.5,\n },\n });\n },\n\n onPointerDown: (pos) => {\n const tool = getTool();\n const ctx = getToolContext();\n if (!tool || !ctx?.inkData || !ctx?.targetSize) return;\n\n const { inkList, strokeWidth } = translateAndScaleInk(ctx.inkData, ctx.targetSize, pos);\n\n const allPoints = inkList.flatMap((s) => s.points);\n if (allPoints.length === 0) return;\n\n const rect = expandRect(\n {\n origin: {\n x: Math.min(...allPoints.map((p) => p.x)),\n y: Math.min(...allPoints.map((p) => p.y)),\n },\n size: {\n width:\n Math.max(...allPoints.map((p) => p.x)) - Math.min(...allPoints.map((p) => p.x)),\n height:\n Math.max(...allPoints.map((p) => p.y)) - Math.min(...allPoints.map((p) => p.y)),\n },\n },\n strokeWidth / 2,\n );\n\n let anno: PdfInkAnnoObject = {\n ...tool.defaults,\n inkList,\n rect,\n strokeWidth,\n strokeColor: ctx.inkData.strokeColor,\n opacity: 1,\n type: PdfAnnotationSubtype.INK,\n subject: 'Signature',\n flags: tool.defaults.flags ?? ['print'],\n pageIndex: context.pageIndex,\n id: uuidV4(),\n created: new Date(),\n };\n\n const unclamped = anno.rect;\n anno = clampAnnotationToPage(anno, pageSize);\n const dx = anno.rect.origin.x - unclamped.origin.x;\n const dy = anno.rect.origin.y - unclamped.origin.y;\n if (dx !== 0 || dy !== 0) {\n anno = {\n ...anno,\n inkList: anno.inkList.map((s) => ({\n points: s.points.map((p) => ({ x: p.x + dx, y: p.y + dy })),\n })),\n };\n }\n\n onCommit(anno);\n onPreview(null);\n },\n\n onPointerLeave: () => {\n onPreview(null);\n },\n };\n },\n};\n","import { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { defineAnnotationTool, patching } from '@embedpdf/plugin-annotation';\nimport { signatureStampHandlerFactory } from './handlers/signature-stamp.handler';\nimport { signatureInkHandlerFactory } from './handlers/signature-ink.handler';\n\nexport const SIGNATURE_STAMP_TOOL_ID = 'signatureStamp' as const;\nexport const SIGNATURE_INK_TOOL_ID = 'signatureInk' as const;\n\nexport const signatureStampTool = defineAnnotationTool({\n id: SIGNATURE_STAMP_TOOL_ID,\n name: 'Signature Stamp',\n labelKey: 'signature.stamp',\n categories: ['annotation', 'signature', 'insert'],\n matchScore: () => 0,\n interaction: {\n exclusive: true,\n cursor: 'copy',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n lockAspectRatio: true,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.STAMP,\n },\n behavior: {\n deactivateToolAfterCreate: true,\n selectAfterCreate: true,\n insertUpright: true,\n useAppearanceStream: true,\n },\n pointerHandler: signatureStampHandlerFactory,\n});\n\nexport const signatureInkTool = defineAnnotationTool({\n id: SIGNATURE_INK_TOOL_ID,\n name: 'Signature Ink',\n labelKey: 'signature.ink',\n categories: ['annotation', 'signature', 'insert'],\n matchScore: (a) => (a.type === PdfAnnotationSubtype.INK && a.subject === 'Signature' ? 20 : 0),\n interaction: {\n exclusive: true,\n cursor: 'copy',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n lockAspectRatio: true,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.INK,\n },\n behavior: {\n deactivateToolAfterCreate: true,\n selectAfterCreate: true,\n },\n transform: patching.patchInk,\n pointerHandler: signatureInkHandlerFactory,\n});\n\nexport const signatureTools = [signatureStampTool, signatureInkTool];\n","import { BasePlugin, createEmitter, createScopedEmitter, PluginRegistry } from '@embedpdf/core';\nimport { uuidV4 } from '@embedpdf/models';\nimport { AnnotationCapability, AnnotationPlugin } from '@embedpdf/plugin-annotation';\nimport {\n SignatureCapability,\n SignatureScope,\n SignatureEntry,\n SignatureFieldKind,\n SignatureCreationType,\n SignaturePluginConfig,\n SignatureState,\n ActivePlacementInfo,\n ActivePlacementChangeEvent,\n} from './types';\nimport { addSignatureEntry, removeSignatureEntry, SignatureAction } from './actions';\nimport { SIGNATURE_PLUGIN_ID } from './manifest';\nimport { SIGNATURE_STAMP_TOOL_ID, SIGNATURE_INK_TOOL_ID, signatureTools } from './tools';\n\nexport class SignaturePlugin extends BasePlugin<\n SignaturePluginConfig,\n SignatureCapability,\n SignatureState,\n SignatureAction\n> {\n static readonly id = SIGNATURE_PLUGIN_ID;\n\n private readonly entries = new Map<string, SignatureEntry>();\n private readonly entriesChange$ = createEmitter<SignatureEntry[]>();\n private readonly activePlacement$ = createScopedEmitter<\n ActivePlacementInfo | null,\n ActivePlacementChangeEvent,\n string\n >((documentId, activePlacement) => ({ documentId, activePlacement }));\n\n private annotation: AnnotationCapability | null = null;\n private toolChangeUnsubscribe: (() => void) | null = null;\n private currentGhostUrl: string | null = null;\n\n constructor(\n id: string,\n registry: PluginRegistry,\n private config: SignaturePluginConfig,\n ) {\n super(id, registry);\n\n this.annotation = registry.getPlugin<AnnotationPlugin>('annotation')?.provides() ?? null;\n if (this.annotation) {\n for (const tool of signatureTools) {\n this.annotation.addTool(tool);\n }\n this.toolChangeUnsubscribe = this.annotation.onActiveToolChange(({ documentId, tool }) => {\n if (tool?.id !== SIGNATURE_STAMP_TOOL_ID && tool?.id !== SIGNATURE_INK_TOOL_ID) {\n this.revokeGhostUrl();\n this.activePlacement$.emit(documentId, null);\n }\n });\n }\n }\n\n async initialize(): Promise<void> {}\n\n protected buildCapability(): SignatureCapability {\n return {\n mode: this.config.mode,\n getEntries: () => this.getEntries(),\n addEntry: (entry) => this.addEntry(entry),\n removeEntry: (id) => this.removeEntry(id),\n loadEntries: (entries) => this.loadEntries(entries),\n exportEntries: () => this.exportEntries(),\n onEntriesChange: this.entriesChange$.on,\n forDocument: (documentId) => this.createSignatureScope(documentId),\n onActivePlacementChange: this.activePlacement$.onGlobal,\n };\n }\n\n getEntries(): SignatureEntry[] {\n return Array.from(this.entries.values());\n }\n\n addEntry(entry: Omit<SignatureEntry, 'id' | 'createdAt'>): string {\n const id = uuidV4();\n const fullEntry: SignatureEntry = {\n ...entry,\n id,\n createdAt: Date.now(),\n };\n\n this.entries.set(id, fullEntry);\n this.dispatch(addSignatureEntry(id));\n this.emitEntriesChange();\n\n return id;\n }\n\n removeEntry(id: string): void {\n if (!this.entries.has(id)) return;\n\n this.entries.delete(id);\n this.dispatch(removeSignatureEntry(id));\n this.emitEntriesChange();\n }\n\n loadEntries(entries: SignatureEntry[]): void {\n for (const entry of entries) {\n this.entries.set(entry.id, entry);\n this.dispatch(addSignatureEntry(entry.id));\n }\n\n this.emitEntriesChange();\n }\n\n exportEntries(): SignatureEntry[] {\n return this.getEntries();\n }\n\n private createSignatureScope(documentId: string): SignatureScope {\n return {\n activateSignaturePlacement: (entryId) =>\n this.activatePlacement(documentId, entryId, SignatureFieldKind.Signature),\n activateInitialsPlacement: (entryId) =>\n this.activatePlacement(documentId, entryId, SignatureFieldKind.Initials),\n deactivatePlacement: () => this.deactivatePlacement(documentId),\n getActivePlacement: () => this.activePlacement$.getValue(documentId) ?? null,\n onActivePlacementChange: this.activePlacement$.forScope(documentId),\n };\n }\n\n private activatePlacement(documentId: string, entryId: string, kind: SignatureFieldKind): void {\n const entry = this.entries.get(entryId);\n if (!entry || !this.annotation) return;\n\n const field = kind === SignatureFieldKind.Initials ? entry.initials : entry.signature;\n if (!field) return;\n\n this.revokeGhostUrl();\n\n if (field.creationType === SignatureCreationType.Draw) {\n if (entry.signature.creationType !== SignatureCreationType.Draw) return;\n const defaultSize = this.config.defaultSize ?? { width: 150, height: 50 };\n const referenceSize = entry.signature.inkData.size;\n const scale = Math.min(\n defaultSize.width / referenceSize.width,\n defaultSize.height / referenceSize.height,\n );\n const targetSize = {\n width: field.inkData.size.width * scale,\n height: field.inkData.size.height * scale,\n };\n\n this.annotation.setActiveTool(SIGNATURE_INK_TOOL_ID, {\n inkData: field.inkData,\n targetSize,\n entryId,\n kind,\n });\n } else {\n if (!field.imageData) return;\n\n const ghostUrl = URL.createObjectURL(\n new Blob([field.imageData], { type: field.imageMimeType ?? 'image/png' }),\n );\n this.currentGhostUrl = ghostUrl;\n\n const defaultSize = this.config.defaultSize ?? { width: 150, height: 50 };\n let targetSize = defaultSize;\n if (field.imageSize) {\n const referenceSize =\n entry.signature.creationType !== SignatureCreationType.Draw\n ? (entry.signature.imageSize ?? field.imageSize)\n : field.imageSize;\n const scale = Math.min(\n defaultSize.width / referenceSize.width,\n defaultSize.height / referenceSize.height,\n );\n targetSize = {\n width: field.imageSize.width * scale,\n height: field.imageSize.height * scale,\n };\n }\n\n this.annotation.setActiveTool(SIGNATURE_STAMP_TOOL_ID, {\n imageData: field.imageData,\n ghostUrl,\n targetSize,\n entryId,\n kind,\n });\n }\n\n this.activePlacement$.emit(documentId, { entryId, kind });\n }\n\n private deactivatePlacement(documentId: string): void {\n if (!this.annotation) return;\n this.annotation.setActiveTool(null);\n this.revokeGhostUrl();\n this.activePlacement$.emit(documentId, null);\n }\n\n private revokeGhostUrl(): void {\n if (this.currentGhostUrl) {\n URL.revokeObjectURL(this.currentGhostUrl);\n this.currentGhostUrl = null;\n }\n }\n\n private emitEntriesChange(): void {\n this.entriesChange$.emit(this.getEntries());\n }\n\n override async destroy(): Promise<void> {\n this.revokeGhostUrl();\n this.toolChangeUnsubscribe?.();\n this.entries.clear();\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { SignatureAction, ADD_SIGNATURE_ENTRY, REMOVE_SIGNATURE_ENTRY } from './actions';\nimport { SignatureState } from './types';\n\nexport const initialState: SignatureState = {\n entryIds: [],\n};\n\nexport const signatureReducer: Reducer<SignatureState, SignatureAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case ADD_SIGNATURE_ENTRY:\n return {\n ...state,\n entryIds: [...state.entryIds, action.payload],\n };\n\n case REMOVE_SIGNATURE_ENTRY:\n return {\n ...state,\n entryIds: state.entryIds.filter((id) => id !== action.payload),\n };\n\n default:\n return state;\n }\n};\n","import {\n SignatureEntry,\n SignatureFieldDefinition,\n SignatureCreationType,\n SignatureStampFieldDefinition,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Serialized types (JSON-safe — ArrayBuffer replaced with base64 strings)\n// ---------------------------------------------------------------------------\n\nexport interface SerializedSignatureStampField {\n creationType: SignatureCreationType.Type | SignatureCreationType.Upload;\n label?: string;\n previewDataUrl: string;\n imageMimeType?: string;\n imageSize?: { width: number; height: number };\n imageData?: string;\n}\n\nexport type SerializedSignatureFieldDefinition =\n | import('./types').SignatureInkFieldDefinition\n | SerializedSignatureStampField;\n\nexport interface SerializedSignatureEntry {\n id: string;\n createdAt: number;\n signature: SerializedSignatureFieldDefinition;\n initials?: SerializedSignatureFieldDefinition;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nfunction serializeField(field: SignatureFieldDefinition): SerializedSignatureFieldDefinition {\n if (field.creationType === SignatureCreationType.Draw) {\n return field;\n }\n const { imageData, ...rest } = field;\n return {\n ...rest,\n imageData: imageData ? arrayBufferToBase64(imageData) : undefined,\n };\n}\n\nfunction deserializeField(field: SerializedSignatureFieldDefinition): SignatureFieldDefinition {\n if (field.creationType === SignatureCreationType.Draw) {\n return field;\n }\n const { imageData, ...rest } = field;\n return {\n ...rest,\n imageData: imageData ? base64ToArrayBuffer(imageData) : undefined,\n } as SignatureStampFieldDefinition;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Converts signature entries into a JSON-safe format by encoding\n * ArrayBuffer fields as base64 strings. Use with `JSON.stringify`\n * for persistence (e.g. localStorage, IndexedDB, or a backend API).\n */\nexport function serializeEntries(entries: SignatureEntry[]): SerializedSignatureEntry[] {\n return entries.map((entry) => ({\n id: entry.id,\n createdAt: entry.createdAt,\n signature: serializeField(entry.signature),\n ...(entry.initials && { initials: serializeField(entry.initials) }),\n }));\n}\n\n/**\n * Restores signature entries from the JSON-safe format produced by\n * `serializeEntries`, converting base64 strings back to ArrayBuffers.\n */\nexport function deserializeEntries(data: SerializedSignatureEntry[]): SignatureEntry[] {\n return data.map((entry) => ({\n id: entry.id,\n createdAt: entry.createdAt,\n signature: deserializeField(entry.signature),\n ...(entry.initials && { initials: deserializeField(entry.initials) }),\n }));\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, SIGNATURE_PLUGIN_ID } from './manifest';\nimport { SignaturePluginConfig, SignatureState } from './types';\nimport { SignaturePlugin } from './signature-plugin';\nimport { signatureReducer, initialState } from './reducer';\nimport { SignatureAction } from './actions';\n\nexport const SignaturePluginPackage: PluginPackage<\n SignaturePlugin,\n SignaturePluginConfig,\n SignatureState,\n SignatureAction\n> = {\n manifest,\n create: (registry, config) => new SignaturePlugin(SIGNATURE_PLUGIN_ID, registry, config),\n reducer: signatureReducer,\n initialState,\n};\n\nexport * from './signature-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\nexport { SIGNATURE_STAMP_TOOL_ID, SIGNATURE_INK_TOOL_ID } from './tools';\nexport * from './serialization';\n"],"names":["SignatureMode","SignatureCreationType","SignatureFieldKind","SIGNATURE_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","mode","SignatureOnly","ADD_SIGNATURE_ENTRY","REMOVE_SIGNATURE_ENTRY","addSignatureEntry","type","payload","removeSignatureEntry","signatureStampHandlerFactory","annotationType","PdfAnnotationSubtype","STAMP","create","context","onPreview","onCommit","getTool","pageSize","pageRotation","getToolContext","onPointerMove","pos","ctx","targetSize","width","height","bounds","origin","x","y","size","data","rect","ghostUrl","onPointerDown","tool","anno","defaults","PdfAnnotationName","Custom","subject","flags","pageIndex","uuidV4","created","Date","_a","behavior","insertUpright","applyInsertUpright","clampAnnotationToPage","imageData","onPointerLeave","translateAndScaleInk","inkData","centerPos","scaleX","scaleY","scale","Math","min","scaledW","scaledH","offsetX","offsetY","inkList","map","stroke","points","p","strokeWidth","round","signatureInkHandlerFactory","INK","allPoints","flatMap","s","length","expandRect","max","strokeColor","opacity","unclamped","dx","dy","SIGNATURE_STAMP_TOOL_ID","SIGNATURE_INK_TOOL_ID","signatureTools","defineAnnotationTool","labelKey","categories","matchScore","interaction","exclusive","cursor","isDraggable","isResizable","isRotatable","lockAspectRatio","isGroupDraggable","isGroupResizable","isGroupRotatable","deactivateToolAfterCreate","selectAfterCreate","useAppearanceStream","pointerHandler","a","transform","patching","patchInk","_SignaturePlugin","BasePlugin","constructor","registry","config","super","this","entries","Map","entriesChange$","createEmitter","activePlacement$","createScopedEmitter","documentId","activePlacement","annotation","toolChangeUnsubscribe","currentGhostUrl","getPlugin","addTool","onActiveToolChange","revokeGhostUrl","emit","initialize","buildCapability","getEntries","addEntry","entry","removeEntry","loadEntries","exportEntries","onEntriesChange","on","forDocument","createSignatureScope","onActivePlacementChange","onGlobal","Array","from","values","fullEntry","createdAt","now","set","dispatch","emitEntriesChange","has","delete","activateSignaturePlacement","entryId","activatePlacement","Signature","activateInitialsPlacement","Initials","deactivatePlacement","getActivePlacement","getValue","forScope","kind","get","field","initials","signature","creationType","Draw","defaultSize","referenceSize","setActiveTool","URL","createObjectURL","Blob","imageMimeType","imageSize","revokeObjectURL","destroy","call","clear","SignaturePlugin","initialState","entryIds","signatureReducer","state","action","filter","arrayBufferToBase64","buffer","bytes","Uint8Array","binary","i","String","fromCharCode","btoa","base64ToArrayBuffer","base64","atob","charCodeAt","serializeField","rest","deserializeField","SignaturePluginPackage","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["FormToken","StampToken","AnnotationToken","ANNOTATION_EDIT_PRIORITY","ARMED_STAMP_TOOL_ID","SignatureToken","FormToken","InteractionToken","StampToken","AnnotationToken"],"sources":["../src/blank-page.ts","../src/capability.ts","../src/handler.ts","../src/reducer.ts","../src/signature.plugin.ts"],"sourcesContent":["/** A one-page blank PDF: the appearance that clears a visual fill. */\n// A content stream that draws NOTHING but is not empty (`q Q`): the engine\n// turns the page into a form XObject, and a page with no content at all has\n// nothing to turn — it refuses; a saved/restored state passes and paints\n// nothing.\nconst CONTENT = 'q Q';\nconst OBJECTS = [\n '<< /Type /Catalog /Pages 2 0 R >>',\n '<< /Type /Pages /Kids [3 0 R] /Count 1 >>',\n '<< /Type /Page /Parent 2 0 R /MediaBox [0 0 200 60] /Contents 4 0 R /Resources << >> >>',\n `<< /Length ${CONTENT.length} >>\\nstream\\n${CONTENT}\\nendstream`,\n];\n\nlet cached: Uint8Array | null = null;\n\nexport function blankPagePdf(): Uint8Array {\n if (cached) return new Uint8Array(cached);\n let body = '%PDF-1.7\\n';\n const offsets: number[] = [];\n OBJECTS.forEach((object, index) => {\n offsets.push(body.length);\n body += `${index + 1} 0 obj\\n${object}\\nendobj\\n`;\n });\n const xref = body.length;\n body += `xref\\n0 ${OBJECTS.length + 1}\\n0000000000 65535 f \\n`;\n for (const offset of offsets) body += `${String(offset).padStart(10, '0')} 00000 n \\n`;\n body += `trailer\\n<< /Size ${OBJECTS.length + 1} /Root 1 0 R >>\\nstartxref\\n${xref}\\n%%EOF\\n`;\n cached = new TextEncoder().encode(body);\n return new Uint8Array(cached);\n}\n","import { createEventHook, type PluginContext } from '@embedpdf/core';\nimport {\n certificateCommonName,\n sign,\n validateSignatures,\n type SignatureVerdict,\n type SignerPort,\n type ValidationTime,\n} from '@embedpdf/core-signature';\nimport {\n resolveBinarySource,\n type AnalyzeInput,\n type BinarySource,\n type ChangeAnalysis,\n type DocumentEvent,\n type DocumentProtection,\n type FormFieldRef,\n type SignatureCompleteResult,\n type SignatureDTO,\n type SignatureSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { AnnotationToken, type StampPlacement } from '@embedpdf/plugin-annotation/contract';\nimport { FormToken } from '@embedpdf/plugin-form/contract';\nimport { StampToken } from '@embedpdf/plugin-stamp/contract';\n\nimport { blankPagePdf } from './blank-page';\nimport type {\n Mark,\n SignatureAction,\n SignatureCapability,\n SignatureChange,\n SignatureConfig,\n SignatureMode,\n SignatureState,\n SignFieldInput,\n} from './types';\n\nconst sameRef = (a: FormFieldRef, b: FormFieldRef): boolean =>\n a.kind === 'objectNumber' && b.kind === 'objectNumber'\n ? a.fieldObjectNumber === b.fieldObjectNumber\n : a.kind === 'fqn' && b.kind === 'fqn'\n ? a.name === b.name\n : false;\n\nconst sameProtection = (a: DocumentProtection | null, b: DocumentProtection | null): boolean =>\n JSON.stringify(a) === JSON.stringify(b);\n\nexport function createSignatureCapability(\n ctx: PluginContext<SignatureState, SignatureAction>,\n config: SignatureConfig = {},\n): SignatureCapability {\n const form = ctx.get(FormToken);\n const changed = createEventHook<SignatureChange>((error) =>\n globalThis.console?.error('[signature] listener failed:', error),\n );\n ctx.cleanup(() => changed.dispose());\n\n const state = () => ctx.getState();\n const requireDoc = () => {\n const doc = ctx.doc;\n if (!doc) throw new Error('[signature] no document bound');\n return doc;\n };\n const requireSignatures = () => {\n const doc = requireDoc();\n if (!doc.signatures) throw new Error('[signature] this engine does not implement signatures');\n return { doc, signatures: doc.signatures };\n };\n const stamp = () => ctx.tryGet(StampToken);\n const documentId = () => {\n const id = ctx.documentId;\n if (!id) throw new Error('[signature] no document id');\n return id;\n };\n\n // ── mode and signer ─────────────────────────────────────────────────────\n const mode = (): SignatureMode => config.mode ?? (config.signer ? 'sign' : 'visual');\n const resolveSigner = async (): Promise<SignerPort> => {\n const signer = config.signer;\n if (!signer) throw new Error('[signature] no signer configured (mode \"sign\" needs one)');\n return typeof signer === 'function' ? signer() : signer;\n };\n const allows = (cap: 'doc.sign' | 'doc.sign.certify' | 'doc.forms.fill'): boolean =>\n ctx.doc?.security.allows(cap) ?? false;\n\n // ── snapshot + verdicts ─────────────────────────────────────────────────\n const refresh = async (): Promise<SignatureSnapshot | null> => {\n const doc = ctx.doc;\n if (!doc?.signatures) {\n ctx.dispatch({ type: 'SNAPSHOT', snapshot: null });\n return null;\n }\n const before = state().snapshot?.protection ?? null;\n const snapshot = await doc.signatures.list();\n ctx.dispatch({ type: 'SNAPSHOT', snapshot });\n if (!sameProtection(before, snapshot.protection)) {\n changed.emit({ type: 'protectionChanged', protection: snapshot.protection });\n }\n return snapshot;\n };\n\n const validate = async (opts?: {\n at?: ValidationTime;\n until?: 'persisted' | 'working-copy';\n }): Promise<SignatureVerdict[]> => {\n const doc = ctx.doc;\n if (!doc?.signatures) return [];\n const verdicts = await validateSignatures(doc, {\n trust: config.trust ?? null,\n at: opts?.at,\n until: opts?.until ?? 'working-copy',\n });\n const before = state().verdicts;\n ctx.dispatch({ type: 'VERDICTS', verdicts });\n changed.emit({ type: 'validated', verdicts });\n // Acrobat's warning, after the fact and only on the edge: a signature that\n // held (or was never judged) now reads invalid because of unsaved edits.\n for (const v of verdicts) {\n if (v.modifications.basis !== 'working-copy' || v.summary !== 'invalid') continue;\n const was = before?.find((b) => b.signature.index === v.signature.index);\n if (was && was.summary === 'invalid') continue;\n changed.emit({\n type: 'invalidating',\n field: v.signature.field,\n detail: v.modifications.detail ?? '',\n });\n }\n return verdicts;\n };\n\n // Every edit that could count as a modification re-judges the working copy.\n // Coalesced: a pen stroke is many events, one analysis.\n let revalidateTimer: ReturnType<typeof setTimeout> | null = null;\n const revalidateSoon = (): void => {\n if (!state().snapshot?.signatures.some((s) => s.signed)) return;\n if (revalidateTimer) clearTimeout(revalidateTimer);\n revalidateTimer = setTimeout(() => {\n revalidateTimer = null;\n void validate().catch((error) =>\n globalThis.console?.error('[signature] re-validation failed:', error),\n );\n }, 300);\n };\n ctx.cleanup(() => {\n if (revalidateTimer) clearTimeout(revalidateTimer);\n });\n\n const analyze = (input: AnalyzeInput): Promise<ChangeAnalysis> =>\n requireSignatures().signatures.analyze(input);\n\n const signatureOf = (\n field: FormFieldRef | { annotObjectNumber: number },\n ): SignatureDTO | null => {\n const snapshot = state().snapshot;\n if (!snapshot) return null;\n if ('annotObjectNumber' in field) {\n const byWidget = snapshot.signatures.find(\n (s) => s.widget?.annotObjectNumber === field.annotObjectNumber,\n );\n if (byWidget) return byWidget;\n const owner = form.fieldForWidget(field.annotObjectNumber);\n return owner ? signatureOf(owner.ref) : null;\n }\n return (\n snapshot.signatures.find((s) =>\n field.kind === 'fqn' ? s.fieldName === field.name : sameRef(s.field, field),\n ) ?? null\n );\n };\n const verdictOf = (\n field: FormFieldRef | { annotObjectNumber: number },\n ): SignatureVerdict | null => {\n const signature = signatureOf(field);\n if (!signature) return null;\n return state().verdicts?.find((v) => v.signature.index === signature.index) ?? null;\n };\n\n // ── marks → bytes ───────────────────────────────────────────────────────\n const bytesOf = async (source: BinarySource): Promise<Uint8Array> =>\n new Uint8Array((await resolveBinarySource(source)).bytes);\n const markBytes = async (mark: Mark): Promise<Uint8Array> => {\n if ('assetId' in mark) {\n const bytes = stamp()?.assetBytes(mark.assetId);\n if (!bytes) throw new Error(`[signature] unknown mark '${mark.assetId}'`);\n return bytes;\n }\n return bytesOf(mark.source);\n };\n\n const withBusy = async <T>(work: () => Promise<T>): Promise<T> => {\n ctx.dispatch({ type: 'BUSY', busy: true });\n try {\n return await work();\n } finally {\n ctx.dispatch({ type: 'BUSY', busy: false });\n }\n };\n\n // ── the act ─────────────────────────────────────────────────────────────\n const signField = (input: SignFieldInput): Promise<SignatureCompleteResult> =>\n withBusy(async () => {\n const { doc } = requireSignatures();\n const signer = await resolveSigner();\n // The certificate's subject is the default /Name; the caller's facts win.\n const subject =\n signer.kind === 'raw' && signer.certificateChain[0]\n ? certificateCommonName(signer.certificateChain[0])\n : null;\n const attribution = { ...(subject ? { name: subject } : {}), ...input.attribution };\n // The appearance IS the mark: its page is drawn into the widget by the engine.\n const appearance = input.appearance\n ? await bytesOf(input.appearance)\n : await markBytes(input.mark);\n const result = await sign(doc, {\n field: input.field,\n signer,\n attribution,\n certify: input.certify,\n lock: input.lock,\n appearance: { pdf: appearance, pageIndex: 0 },\n });\n if (state().target && sameRef(state().target!, input.field)) setTarget(null);\n await refresh();\n void validate().catch((error) =>\n globalThis.console?.error('[signature] validation after signing failed:', error),\n );\n changed.emit({ type: 'signed', field: input.field, result });\n return result;\n });\n\n const setAppearance = async (field: FormFieldRef, pdf: Uint8Array): Promise<void> => {\n const doc = requireDoc();\n if (!doc.forms.setSignatureAppearance) {\n throw new Error('[signature] this engine cannot draw into a signature field');\n }\n const signature = signatureOf(field);\n if (signature?.signed) throw new Error(`[signature] '${signature.fieldName}' is signed`);\n await doc.forms.setSignatureAppearance(field, { pdf, pageIndex: 0 });\n await form.refresh();\n };\n\n const fillField = (field: FormFieldRef, mark: Mark): Promise<void> =>\n withBusy(async () => {\n await setAppearance(field, await markBytes(mark));\n if (state().target && sameRef(state().target!, field)) setTarget(null);\n changed.emit({ type: 'filled', field });\n });\n\n const clearField = (field: FormFieldRef): Promise<void> =>\n withBusy(async () => {\n await setAppearance(field, blankPagePdf());\n changed.emit({ type: 'cleared', field });\n });\n\n const placeMark = async (\n mark: Mark,\n target: { field: FormFieldRef } | StampPlacement,\n ): Promise<void> => {\n if (!('field' in target)) {\n // Free placement: a stamp, as in Preview — one placement law, the stamp plugin's.\n if ('assetId' in mark) {\n const library = stamp();\n if (!library) throw new Error('[signature] no stamp plugin to place an asset');\n await library.placeAsset(documentId(), mark.assetId, target);\n } else {\n await ctx.get(AnnotationToken).placeStamp({ source: mark.source }, target);\n }\n return;\n }\n switch (mode()) {\n case 'sign':\n // The first signature is the one that can certify: when the config\n // allows a certification, let the chrome offer the choice (its sign\n // dialog) instead of sealing a plain approval on the spot.\n if (config.allowCertify && !state().snapshot?.signatures.some((s) => s.signed)) {\n changed.emit({ type: 'ask', field: target.field, mark });\n return;\n }\n await signField({ field: target.field, mark });\n return;\n case 'visual':\n await fillField(target.field, mark);\n return;\n case 'ask':\n changed.emit({ type: 'ask', field: target.field, mark });\n return;\n }\n };\n\n const setTarget = (field: FormFieldRef | null): void => {\n const current = state().target;\n if (current === field || (current && field && sameRef(current, field))) return;\n ctx.dispatch({ type: 'TARGET', field });\n changed.emit({ type: 'target', field });\n };\n\n // ── live: pendings, versions, remote signings ───────────────────────────\n const doc = ctx.doc;\n if (doc) {\n const unsubscribe = doc.events.subscribe((event: DocumentEvent) => {\n switch (event.type) {\n case 'signature.prepared':\n ctx.dispatch({\n type: 'PENDING',\n pending: { signingId: event.signingId, field: event.field },\n });\n return;\n case 'signature.aborted':\n ctx.dispatch({ type: 'PENDING', pending: null });\n return;\n case 'signature.completed':\n ctx.dispatch({ type: 'PENDING', pending: null });\n return;\n case 'document.versioned':\n case 'stream.desynced':\n // Byte-level facts moved: re-read them and re-judge.\n void refresh()\n .then(() => validate())\n .catch((error) => globalThis.console?.error('[signature] refresh failed:', error));\n return;\n case 'form.fieldCreated':\n case 'form.fieldDeleted':\n case 'form.widgetAttached':\n case 'form.widgetDetached':\n case 'form.imported':\n case 'form.repaired':\n // The field set changed (a signature field authored or removed, here\n // or remotely): the snapshot lists fields, so re-read it — and the\n // change is a modification of the working copy, so re-judge.\n void refresh()\n .then(() => revalidateSoon())\n .catch((error) => globalThis.console?.error('[signature] refresh failed:', error));\n return;\n case 'annotation.created':\n case 'annotation.updated':\n case 'annotation.deleted':\n case 'annotation.moved':\n case 'form.valueChanged':\n case 'form.fieldUpdated':\n case 'form.effectsApplied':\n // An edit of the working copy: what a save would write changed, so\n // what a validator would say about it may have too.\n revalidateSoon();\n return;\n default:\n return;\n }\n });\n ctx.cleanup(unsubscribe);\n }\n\n return {\n snapshot: () => state().snapshot,\n verdicts: () => state().verdicts,\n protection: () => state().snapshot?.protection ?? null,\n pending: () => state().pending,\n target: () => state().target,\n busy: () => state().busy,\n mode,\n signatureOf,\n verdictOf,\n canSign: () => allows('doc.sign') && config.signer != null,\n canFill: () => allows('doc.forms.fill') && ctx.doc?.forms.setSignatureAppearance != null,\n canCertify: () => config.allowCertify === true && allows('doc.sign.certify'),\n signField,\n fillField,\n clearField,\n placeMark,\n setTarget,\n inspect: (field) => changed.emit({ type: 'inspect', field }),\n refresh,\n validate,\n analyze,\n revisionBytes: (revisionIndex) => requireSignatures().signatures.revisionBytes(revisionIndex),\n onChanged: changed.on,\n };\n}\n","import type { InteractionHandler } from '@embedpdf/plugin-interaction/contract';\nimport {\n ANNOTATION_EDIT_PRIORITY,\n ARMED_STAMP_TOOL_ID,\n} from '@embedpdf/plugin-annotation/contract';\nimport type { FormCapability } from '@embedpdf/plugin-form/contract';\nimport type { StampCapability } from '@embedpdf/plugin-stamp/contract';\n\nimport { SIGNATURES_LIBRARY_KIND, type SignatureCapability } from './types';\n\n/**\n * The armed mark over a field. The annotation plugin places an armed stamp\n * on click (`annotation-place`, priority 95) and selects an existing\n * annotation under the pointer before that (`annotation-edit`, 100 — a\n * widget is an annotation). This handler sits above BOTH, enabled for the\n * armed stamp's tool only, and captures exactly when the armed asset is a\n * person's mark (a library of kind `signatures`) and the pointer is over a\n * signature field: then the destination decides — the mark goes INTO the\n * field (`placeMark` by mode) instead of onto the page. Everywhere else it\n * declines and the click stays a stamp placement, as in Preview.\n */\nexport function createArmedMarkHandler(\n documentId: string,\n signature: SignatureCapability,\n form: FormCapability,\n stamp: StampCapability,\n): InteractionHandler {\n return {\n id: 'signature:armed-mark-on-field',\n priority: ANNOTATION_EDIT_PRIORITY + 1,\n enabledFor: (tool) => tool.id === ARMED_STAMP_TOOL_ID,\n onDown: (sample) => {\n if (!sample.page) return false;\n const armed = stamp.armedAsset(documentId);\n if (!armed || stamp.library(armed.libraryId)?.kind !== SIGNATURES_LIBRARY_KIND) return false;\n const hit = form.widgetAt(sample.page.pon, sample.page.point);\n if (!hit || hit.field.family !== 'signature') return false;\n // A signed field is final: consume the click (no stamp lands on it) and do nothing.\n if (signature.signatureOf(hit.field.ref)?.signed || hit.field.valueEntry.kind !== 'none') {\n return true;\n }\n stamp.disarm(documentId);\n void signature\n .placeMark({ assetId: armed.id }, { field: hit.field.ref })\n .catch((error) => globalThis.console?.error('[signature] placing the mark failed:', error));\n return true;\n },\n };\n}\n","import type { SignatureAction, SignatureState } from './types';\n\nexport const initialSignatureState = (): SignatureState => ({\n snapshot: null,\n verdicts: null,\n target: null,\n pending: null,\n busy: false,\n});\n\nexport function signatureReducer(state: SignatureState, action: SignatureAction): SignatureState {\n switch (action.type) {\n case 'SNAPSHOT':\n return { ...state, snapshot: action.snapshot };\n case 'VERDICTS':\n return { ...state, verdicts: action.verdicts };\n case 'TARGET':\n return { ...state, target: action.field };\n case 'PENDING':\n return { ...state, pending: action.pending };\n case 'BUSY':\n return { ...state, busy: action.busy };\n default:\n return state;\n }\n}\n","import { definePlugin } from '@embedpdf/core';\nimport { FormToken } from '@embedpdf/plugin-form/contract';\nimport { InteractionToken } from '@embedpdf/plugin-interaction/contract';\nimport { StampToken } from '@embedpdf/plugin-stamp/contract';\nimport { AnnotationToken } from '@embedpdf/plugin-annotation/contract';\n\nimport { createSignatureCapability } from './capability';\nimport { createArmedMarkHandler } from './handler';\nimport { initialSignatureState, signatureReducer } from './reducer';\nimport { SignatureToken } from './types';\nimport type {\n SignatureAction,\n SignatureCapability,\n SignatureConfig,\n SignatureState,\n} from './types';\n\n/**\n * The signature plugin — the ACT of signing, document-scoped. It owns no\n * mark: marks are stamp-library assets (or bytes the embedder brings), and\n * the mark IS the appearance the engine draws into the field. Signing goes\n * through `@embedpdf/core-signature` with the configured signer port; the\n * engine seals; on the cloud the server publishes the new version.\n *\n * With the interaction hub and the stamp plugin present, an armed mark from\n * a `signatures` library dropped over an unsigned signature field goes into\n * the field (sign / visual fill / ask, by mode) instead of onto the page.\n */\nexport const signaturePlugin = (config: SignatureConfig = {}) =>\n definePlugin<SignatureState, SignatureAction, SignatureCapability>({\n id: 'signature',\n token: SignatureToken,\n scope: 'document',\n requires: [FormToken],\n optional: [InteractionToken, StampToken, AnnotationToken],\n initialState: initialSignatureState,\n reduce: signatureReducer,\n capability: (ctx) => createSignatureCapability(ctx, config),\n init: (ctx) => {\n const signature = ctx.get(SignatureToken);\n void signature\n .refresh()\n .then((snapshot) =>\n snapshot?.signatures.some((s) => s.signed) ? signature.validate() : null,\n )\n .catch((error) => globalThis.console?.error('[signature] initial read failed:', error));\n const interaction = ctx.tryGet(InteractionToken);\n const stamp = ctx.tryGet(StampToken);\n if (interaction && stamp && ctx.documentId) {\n ctx.cleanup(\n interaction.registerHandler(\n createArmedMarkHandler(ctx.documentId, signature, ctx.get(FormToken), stamp),\n ),\n );\n }\n },\n });\n"],"mappings":"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"}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { C as SignatureConfig, D as SignatureToken, E as SignatureState, O as markRoleOf, S as SignatureChange, T as SignaturePending, _ as SIGNATURES_LIBRARY_KIND, a as FieldLockSpec, b as SignatureAction, c as SignatureDTO, d as SignerPort, f as TrustPort, g as MarkRole, h as Mark, i as DocumentProtection, l as SignatureSnapshot, m as INITIALS_MARK_NAME, n as ChangeAnalysis, o as FormFieldRef, p as ValidationTime, r as DocMdpPermission, s as SignatureCompleteResult, t as AnalyzeInput, u as SignatureVerdict, v as SIGNATURE_MARK_NAME, w as SignatureMode, x as SignatureCapability, y as SignFieldInput } from "./contract-BvHa9Zl_.cjs";
|
|
2
|
+
import { PersonalKeyStore, PersonalSigner, TestSigner, createTestSigner, indexedDbKeyStore, memoryKeyStore, personalSigner, remoteSigner, webCryptoSigner } from "@embedpdf/core-signature";
|
|
3
|
+
import { StampCapability } from "@embedpdf/plugin-stamp/contract";
|
|
4
|
+
import { InteractionHandler } from "@embedpdf/plugin-interaction/contract";
|
|
5
|
+
import { FormCapability } from "@embedpdf/plugin-form/contract";
|
|
6
|
+
//#region src/signature.plugin.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* The signature plugin — the ACT of signing, document-scoped. It owns no
|
|
9
|
+
* mark: marks are stamp-library assets (or bytes the embedder brings), and
|
|
10
|
+
* the mark IS the appearance the engine draws into the field. Signing goes
|
|
11
|
+
* through `@embedpdf/core-signature` with the configured signer port; the
|
|
12
|
+
* engine seals; on the cloud the server publishes the new version.
|
|
13
|
+
*
|
|
14
|
+
* With the interaction hub and the stamp plugin present, an armed mark from
|
|
15
|
+
* a `signatures` library dropped over an unsigned signature field goes into
|
|
16
|
+
* the field (sign / visual fill / ask, by mode) instead of onto the page.
|
|
17
|
+
*/
|
|
18
|
+
declare const signaturePlugin: (config?: SignatureConfig) => import("@embedpdf/core").PluginDef<SignatureState, SignatureAction, SignatureCapability>;
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/handler.d.ts
|
|
21
|
+
/**
|
|
22
|
+
* The armed mark over a field. The annotation plugin places an armed stamp
|
|
23
|
+
* on click (`annotation-place`, priority 95) and selects an existing
|
|
24
|
+
* annotation under the pointer before that (`annotation-edit`, 100 — a
|
|
25
|
+
* widget is an annotation). This handler sits above BOTH, enabled for the
|
|
26
|
+
* armed stamp's tool only, and captures exactly when the armed asset is a
|
|
27
|
+
* person's mark (a library of kind `signatures`) and the pointer is over a
|
|
28
|
+
* signature field: then the destination decides — the mark goes INTO the
|
|
29
|
+
* field (`placeMark` by mode) instead of onto the page. Everywhere else it
|
|
30
|
+
* declines and the click stays a stamp placement, as in Preview.
|
|
31
|
+
*/
|
|
32
|
+
declare function createArmedMarkHandler(documentId: string, signature: SignatureCapability, form: FormCapability, stamp: StampCapability): InteractionHandler;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { type AnalyzeInput, type ChangeAnalysis, type DocMdpPermission, type DocumentProtection, type FieldLockSpec, type FormFieldRef, INITIALS_MARK_NAME, type Mark, type MarkRole, type PersonalKeyStore, type PersonalSigner, SIGNATURES_LIBRARY_KIND, SIGNATURE_MARK_NAME, type SignFieldInput, type SignatureAction, type SignatureCapability, type SignatureChange, type SignatureCompleteResult, type SignatureConfig, type SignatureDTO, type SignatureMode, type SignaturePending, type SignatureSnapshot, type SignatureState, SignatureToken, type SignatureVerdict, type SignerPort, type TestSigner, type TrustPort, type ValidationTime, createArmedMarkHandler, createTestSigner, indexedDbKeyStore, markRoleOf, memoryKeyStore, personalSigner, remoteSigner, signaturePlugin, webCryptoSigner };
|
|
35
|
+
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
import { C as SignatureConfig, D as SignatureToken, E as SignatureState, O as markRoleOf, S as SignatureChange, T as SignaturePending, _ as SIGNATURES_LIBRARY_KIND, a as FieldLockSpec, b as SignatureAction, c as SignatureDTO, d as SignerPort, f as TrustPort, g as MarkRole, h as Mark, i as DocumentProtection, l as SignatureSnapshot, m as INITIALS_MARK_NAME, n as ChangeAnalysis, o as FormFieldRef, p as ValidationTime, r as DocMdpPermission, s as SignatureCompleteResult, t as AnalyzeInput, u as SignatureVerdict, v as SIGNATURE_MARK_NAME, w as SignatureMode, x as SignatureCapability, y as SignFieldInput } from "./contract-Dg50puf7.js";
|
|
2
|
+
import { FormCapability } from "@embedpdf/plugin-form/contract";
|
|
3
|
+
import { InteractionHandler } from "@embedpdf/plugin-interaction/contract";
|
|
4
|
+
import { StampCapability } from "@embedpdf/plugin-stamp/contract";
|
|
5
|
+
import { PersonalKeyStore, PersonalSigner, TestSigner, createTestSigner, indexedDbKeyStore, memoryKeyStore, personalSigner, remoteSigner, webCryptoSigner } from "@embedpdf/core-signature";
|
|
6
|
+
//#region src/signature.plugin.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* The signature plugin — the ACT of signing, document-scoped. It owns no
|
|
9
|
+
* mark: marks are stamp-library assets (or bytes the embedder brings), and
|
|
10
|
+
* the mark IS the appearance the engine draws into the field. Signing goes
|
|
11
|
+
* through `@embedpdf/core-signature` with the configured signer port; the
|
|
12
|
+
* engine seals; on the cloud the server publishes the new version.
|
|
13
|
+
*
|
|
14
|
+
* With the interaction hub and the stamp plugin present, an armed mark from
|
|
15
|
+
* a `signatures` library dropped over an unsigned signature field goes into
|
|
16
|
+
* the field (sign / visual fill / ask, by mode) instead of onto the page.
|
|
17
|
+
*/
|
|
18
|
+
declare const signaturePlugin: (config?: SignatureConfig) => import("@embedpdf/core").PluginDef<SignatureState, SignatureAction, SignatureCapability>;
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/handler.d.ts
|
|
21
|
+
/**
|
|
22
|
+
* The armed mark over a field. The annotation plugin places an armed stamp
|
|
23
|
+
* on click (`annotation-place`, priority 95) and selects an existing
|
|
24
|
+
* annotation under the pointer before that (`annotation-edit`, 100 — a
|
|
25
|
+
* widget is an annotation). This handler sits above BOTH, enabled for the
|
|
26
|
+
* armed stamp's tool only, and captures exactly when the armed asset is a
|
|
27
|
+
* person's mark (a library of kind `signatures`) and the pointer is over a
|
|
28
|
+
* signature field: then the destination decides — the mark goes INTO the
|
|
29
|
+
* field (`placeMark` by mode) instead of onto the page. Everywhere else it
|
|
30
|
+
* declines and the click stays a stamp placement, as in Preview.
|
|
31
|
+
*/
|
|
32
|
+
declare function createArmedMarkHandler(documentId: string, signature: SignatureCapability, form: FormCapability, stamp: StampCapability): InteractionHandler;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { type AnalyzeInput, type ChangeAnalysis, type DocMdpPermission, type DocumentProtection, type FieldLockSpec, type FormFieldRef, INITIALS_MARK_NAME, type Mark, type MarkRole, type PersonalKeyStore, type PersonalSigner, SIGNATURES_LIBRARY_KIND, SIGNATURE_MARK_NAME, type SignFieldInput, type SignatureAction, type SignatureCapability, type SignatureChange, type SignatureCompleteResult, type SignatureConfig, type SignatureDTO, type SignatureMode, type SignaturePending, type SignatureSnapshot, type SignatureState, SignatureToken, type SignatureVerdict, type SignerPort, type TestSigner, type TrustPort, type ValidationTime, createArmedMarkHandler, createTestSigner, indexedDbKeyStore, markRoleOf, memoryKeyStore, personalSigner, remoteSigner, signaturePlugin, webCryptoSigner };
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|