@embedpdf/plugin-signature 2.13.0

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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.cjs +2 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +516 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/actions.d.ts +14 -0
  8. package/dist/lib/handlers/signature-ink.handler.d.ts +4 -0
  9. package/dist/lib/handlers/signature-stamp.handler.d.ts +4 -0
  10. package/dist/lib/index.d.ts +12 -0
  11. package/dist/lib/manifest.d.ts +4 -0
  12. package/dist/lib/reducer.d.ts +5 -0
  13. package/dist/lib/serialization.d.ts +30 -0
  14. package/dist/lib/signature-plugin.d.ts +27 -0
  15. package/dist/lib/tools.d.ts +113 -0
  16. package/dist/lib/types.d.ts +114 -0
  17. package/dist/preact/adapter.d.ts +5 -0
  18. package/dist/preact/annotation.d.ts +1 -0
  19. package/dist/preact/core.d.ts +1 -0
  20. package/dist/preact/index.cjs +2 -0
  21. package/dist/preact/index.cjs.map +1 -0
  22. package/dist/preact/index.d.ts +1 -0
  23. package/dist/preact/index.js +464 -0
  24. package/dist/preact/index.js.map +1 -0
  25. package/dist/react/adapter.d.ts +2 -0
  26. package/dist/react/annotation.d.ts +1 -0
  27. package/dist/react/core.d.ts +1 -0
  28. package/dist/react/index.cjs +2 -0
  29. package/dist/react/index.cjs.map +1 -0
  30. package/dist/react/index.d.ts +1 -0
  31. package/dist/react/index.js +463 -0
  32. package/dist/react/index.js.map +1 -0
  33. package/dist/shared/components/crop-canvas.d.ts +14 -0
  34. package/dist/shared/components/index.d.ts +2 -0
  35. package/dist/shared/components/signature-draw-pad.d.ts +12 -0
  36. package/dist/shared/components/signature-type-pad.d.ts +14 -0
  37. package/dist/shared/hooks/index.d.ts +2 -0
  38. package/dist/shared/hooks/use-signature-upload.d.ts +21 -0
  39. package/dist/shared/hooks/use-signature.d.ts +16 -0
  40. package/dist/shared/index.d.ts +4 -0
  41. package/dist/shared-preact/components/crop-canvas.d.ts +14 -0
  42. package/dist/shared-preact/components/index.d.ts +2 -0
  43. package/dist/shared-preact/components/signature-draw-pad.d.ts +12 -0
  44. package/dist/shared-preact/components/signature-type-pad.d.ts +14 -0
  45. package/dist/shared-preact/hooks/index.d.ts +2 -0
  46. package/dist/shared-preact/hooks/use-signature-upload.d.ts +21 -0
  47. package/dist/shared-preact/hooks/use-signature.d.ts +16 -0
  48. package/dist/shared-preact/index.d.ts +4 -0
  49. package/dist/shared-react/components/crop-canvas.d.ts +14 -0
  50. package/dist/shared-react/components/index.d.ts +2 -0
  51. package/dist/shared-react/components/signature-draw-pad.d.ts +12 -0
  52. package/dist/shared-react/components/signature-type-pad.d.ts +14 -0
  53. package/dist/shared-react/hooks/index.d.ts +2 -0
  54. package/dist/shared-react/hooks/use-signature-upload.d.ts +21 -0
  55. package/dist/shared-react/hooks/use-signature.d.ts +16 -0
  56. package/dist/shared-react/index.d.ts +4 -0
  57. package/dist/shared-vue/components/crop-canvas.d.ts +14 -0
  58. package/dist/svelte/components/SignatureDrawPad.svelte.d.ts +12 -0
  59. package/dist/svelte/components/SignatureTypePad.svelte.d.ts +14 -0
  60. package/dist/svelte/components/index.d.ts +2 -0
  61. package/dist/svelte/hooks/index.d.ts +2 -0
  62. package/dist/svelte/hooks/use-signature-upload.svelte.d.ts +21 -0
  63. package/dist/svelte/hooks/use-signature.svelte.d.ts +17 -0
  64. package/dist/svelte/index.cjs +2 -0
  65. package/dist/svelte/index.cjs.map +1 -0
  66. package/dist/svelte/index.d.ts +4 -0
  67. package/dist/svelte/index.js +415 -0
  68. package/dist/svelte/index.js.map +1 -0
  69. package/dist/vue/components/SignatureDrawPad.vue.d.ts +15 -0
  70. package/dist/vue/components/SignatureTypePad.vue.d.ts +19 -0
  71. package/dist/vue/components/index.d.ts +2 -0
  72. package/dist/vue/hooks/index.d.ts +2 -0
  73. package/dist/vue/hooks/use-signature-upload.d.ts +20 -0
  74. package/dist/vue/hooks/use-signature.d.ts +176 -0
  75. package/dist/vue/index.cjs +2 -0
  76. package/dist/vue/index.cjs.map +1 -0
  77. package/dist/vue/index.d.ts +4 -0
  78. package/dist/vue/index.js +453 -0
  79. package/dist/vue/index.js.map +1 -0
  80. package/package.json +82 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","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"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Action } from '@embedpdf/core';
2
+ export declare const ADD_SIGNATURE_ENTRY = "SIGNATURE/ADD_ENTRY";
3
+ export declare const REMOVE_SIGNATURE_ENTRY = "SIGNATURE/REMOVE_ENTRY";
4
+ export interface AddSignatureEntryAction extends Action {
5
+ type: typeof ADD_SIGNATURE_ENTRY;
6
+ payload: string;
7
+ }
8
+ export interface RemoveSignatureEntryAction extends Action {
9
+ type: typeof REMOVE_SIGNATURE_ENTRY;
10
+ payload: string;
11
+ }
12
+ export type SignatureAction = AddSignatureEntryAction | RemoveSignatureEntryAction;
13
+ export declare function addSignatureEntry(id: string): AddSignatureEntryAction;
14
+ export declare function removeSignatureEntry(id: string): RemoveSignatureEntryAction;
@@ -0,0 +1,4 @@
1
+ import { PdfInkAnnoObject } from '@embedpdf/models';
2
+ import { HandlerFactory } from '@embedpdf/plugin-annotation';
3
+ import { SIGNATURE_INK_TOOL_ID } from '../tools';
4
+ export declare const signatureInkHandlerFactory: HandlerFactory<PdfInkAnnoObject, typeof SIGNATURE_INK_TOOL_ID>;
@@ -0,0 +1,4 @@
1
+ import { PdfStampAnnoObject } from '@embedpdf/models';
2
+ import { HandlerFactory } from '@embedpdf/plugin-annotation';
3
+ import { SIGNATURE_STAMP_TOOL_ID } from '../tools';
4
+ export declare const signatureStampHandlerFactory: HandlerFactory<PdfStampAnnoObject, typeof SIGNATURE_STAMP_TOOL_ID>;
@@ -0,0 +1,12 @@
1
+ import { PluginPackage } from '@embedpdf/core';
2
+ import { SignaturePluginConfig, SignatureState } from './types';
3
+ import { SignaturePlugin } from './signature-plugin';
4
+ import { SignatureAction } from './actions';
5
+ export declare const SignaturePluginPackage: PluginPackage<SignaturePlugin, SignaturePluginConfig, SignatureState, SignatureAction>;
6
+ export * from './signature-plugin';
7
+ export * from './types';
8
+ export * from './manifest';
9
+ export * from './actions';
10
+ export * from './reducer';
11
+ export { SIGNATURE_STAMP_TOOL_ID, SIGNATURE_INK_TOOL_ID } from './tools';
12
+ export * from './serialization';
@@ -0,0 +1,4 @@
1
+ import { PluginManifest } from '@embedpdf/core';
2
+ import { SignaturePluginConfig } from './types';
3
+ export declare const SIGNATURE_PLUGIN_ID = "signature";
4
+ export declare const manifest: PluginManifest<SignaturePluginConfig>;
@@ -0,0 +1,5 @@
1
+ import { Reducer } from '@embedpdf/core';
2
+ import { SignatureAction } from './actions';
3
+ import { SignatureState } from './types';
4
+ export declare const initialState: SignatureState;
5
+ export declare const signatureReducer: Reducer<SignatureState, SignatureAction>;
@@ -0,0 +1,30 @@
1
+ import { SignatureEntry, SignatureCreationType } from './types';
2
+ export interface SerializedSignatureStampField {
3
+ creationType: SignatureCreationType.Type | SignatureCreationType.Upload;
4
+ label?: string;
5
+ previewDataUrl: string;
6
+ imageMimeType?: string;
7
+ imageSize?: {
8
+ width: number;
9
+ height: number;
10
+ };
11
+ imageData?: string;
12
+ }
13
+ export type SerializedSignatureFieldDefinition = import('./types').SignatureInkFieldDefinition | SerializedSignatureStampField;
14
+ export interface SerializedSignatureEntry {
15
+ id: string;
16
+ createdAt: number;
17
+ signature: SerializedSignatureFieldDefinition;
18
+ initials?: SerializedSignatureFieldDefinition;
19
+ }
20
+ /**
21
+ * Converts signature entries into a JSON-safe format by encoding
22
+ * ArrayBuffer fields as base64 strings. Use with `JSON.stringify`
23
+ * for persistence (e.g. localStorage, IndexedDB, or a backend API).
24
+ */
25
+ export declare function serializeEntries(entries: SignatureEntry[]): SerializedSignatureEntry[];
26
+ /**
27
+ * Restores signature entries from the JSON-safe format produced by
28
+ * `serializeEntries`, converting base64 strings back to ArrayBuffers.
29
+ */
30
+ export declare function deserializeEntries(data: SerializedSignatureEntry[]): SignatureEntry[];
@@ -0,0 +1,27 @@
1
+ import { BasePlugin, PluginRegistry } from '@embedpdf/core';
2
+ import { SignatureCapability, SignatureEntry, SignaturePluginConfig, SignatureState } from './types';
3
+ import { SignatureAction } from './actions';
4
+ export declare class SignaturePlugin extends BasePlugin<SignaturePluginConfig, SignatureCapability, SignatureState, SignatureAction> {
5
+ private config;
6
+ static readonly id = "signature";
7
+ private readonly entries;
8
+ private readonly entriesChange$;
9
+ private readonly activePlacement$;
10
+ private annotation;
11
+ private toolChangeUnsubscribe;
12
+ private currentGhostUrl;
13
+ constructor(id: string, registry: PluginRegistry, config: SignaturePluginConfig);
14
+ initialize(): Promise<void>;
15
+ protected buildCapability(): SignatureCapability;
16
+ getEntries(): SignatureEntry[];
17
+ addEntry(entry: Omit<SignatureEntry, 'id' | 'createdAt'>): string;
18
+ removeEntry(id: string): void;
19
+ loadEntries(entries: SignatureEntry[]): void;
20
+ exportEntries(): SignatureEntry[];
21
+ private createSignatureScope;
22
+ private activatePlacement;
23
+ private deactivatePlacement;
24
+ private revokeGhostUrl;
25
+ private emitEntriesChange;
26
+ destroy(): Promise<void>;
27
+ }
@@ -0,0 +1,113 @@
1
+ import { PdfAnnotationSubtype } from '@embedpdf/models';
2
+ import { patching } from '@embedpdf/plugin-annotation';
3
+ export declare const SIGNATURE_STAMP_TOOL_ID: "signatureStamp";
4
+ export declare const SIGNATURE_INK_TOOL_ID: "signatureInk";
5
+ export declare const signatureStampTool: {
6
+ readonly id: "signatureStamp";
7
+ readonly name: "Signature Stamp";
8
+ readonly labelKey: "signature.stamp";
9
+ readonly categories: ["annotation", "signature", "insert"];
10
+ readonly matchScore: () => number;
11
+ readonly interaction: {
12
+ readonly exclusive: true;
13
+ readonly cursor: "copy";
14
+ readonly isDraggable: true;
15
+ readonly isResizable: true;
16
+ readonly isRotatable: false;
17
+ readonly lockAspectRatio: true;
18
+ readonly isGroupDraggable: true;
19
+ readonly isGroupResizable: false;
20
+ readonly isGroupRotatable: false;
21
+ };
22
+ readonly defaults: {
23
+ readonly type: PdfAnnotationSubtype.STAMP;
24
+ };
25
+ readonly behavior: {
26
+ readonly deactivateToolAfterCreate: true;
27
+ readonly selectAfterCreate: true;
28
+ readonly insertUpright: true;
29
+ readonly useAppearanceStream: true;
30
+ };
31
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfStampAnnoObject, "signatureStamp">;
32
+ };
33
+ export declare const signatureInkTool: {
34
+ readonly id: "signatureInk";
35
+ readonly name: "Signature Ink";
36
+ readonly labelKey: "signature.ink";
37
+ readonly categories: ["annotation", "signature", "insert"];
38
+ readonly matchScore: (a: import('@embedpdf/models').PdfAnnotationObject) => 0 | 20;
39
+ readonly interaction: {
40
+ readonly exclusive: true;
41
+ readonly cursor: "copy";
42
+ readonly isDraggable: true;
43
+ readonly isResizable: true;
44
+ readonly isRotatable: false;
45
+ readonly lockAspectRatio: true;
46
+ readonly isGroupDraggable: true;
47
+ readonly isGroupResizable: false;
48
+ readonly isGroupRotatable: false;
49
+ };
50
+ readonly defaults: {
51
+ readonly type: PdfAnnotationSubtype.INK;
52
+ };
53
+ readonly behavior: {
54
+ readonly deactivateToolAfterCreate: true;
55
+ readonly selectAfterCreate: true;
56
+ };
57
+ readonly transform: patching.PatchFunction<import('@embedpdf/models').PdfInkAnnoObject>;
58
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfInkAnnoObject, "signatureInk">;
59
+ };
60
+ export declare const signatureTools: ({
61
+ readonly id: "signatureStamp";
62
+ readonly name: "Signature Stamp";
63
+ readonly labelKey: "signature.stamp";
64
+ readonly categories: ["annotation", "signature", "insert"];
65
+ readonly matchScore: () => number;
66
+ readonly interaction: {
67
+ readonly exclusive: true;
68
+ readonly cursor: "copy";
69
+ readonly isDraggable: true;
70
+ readonly isResizable: true;
71
+ readonly isRotatable: false;
72
+ readonly lockAspectRatio: true;
73
+ readonly isGroupDraggable: true;
74
+ readonly isGroupResizable: false;
75
+ readonly isGroupRotatable: false;
76
+ };
77
+ readonly defaults: {
78
+ readonly type: PdfAnnotationSubtype.STAMP;
79
+ };
80
+ readonly behavior: {
81
+ readonly deactivateToolAfterCreate: true;
82
+ readonly selectAfterCreate: true;
83
+ readonly insertUpright: true;
84
+ readonly useAppearanceStream: true;
85
+ };
86
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfStampAnnoObject, "signatureStamp">;
87
+ } | {
88
+ readonly id: "signatureInk";
89
+ readonly name: "Signature Ink";
90
+ readonly labelKey: "signature.ink";
91
+ readonly categories: ["annotation", "signature", "insert"];
92
+ readonly matchScore: (a: import('@embedpdf/models').PdfAnnotationObject) => 0 | 20;
93
+ readonly interaction: {
94
+ readonly exclusive: true;
95
+ readonly cursor: "copy";
96
+ readonly isDraggable: true;
97
+ readonly isResizable: true;
98
+ readonly isRotatable: false;
99
+ readonly lockAspectRatio: true;
100
+ readonly isGroupDraggable: true;
101
+ readonly isGroupResizable: false;
102
+ readonly isGroupRotatable: false;
103
+ };
104
+ readonly defaults: {
105
+ readonly type: PdfAnnotationSubtype.INK;
106
+ };
107
+ readonly behavior: {
108
+ readonly deactivateToolAfterCreate: true;
109
+ readonly selectAfterCreate: true;
110
+ };
111
+ readonly transform: patching.PatchFunction<import('@embedpdf/models').PdfInkAnnoObject>;
112
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfInkAnnoObject, "signatureInk">;
113
+ })[];
@@ -0,0 +1,114 @@
1
+ import { BasePluginConfig, EventHook } from '@embedpdf/core';
2
+ export declare enum SignatureMode {
3
+ SignatureOnly = "signature-only",
4
+ SignatureAndInitials = "signature-and-initials"
5
+ }
6
+ export declare enum SignatureCreationType {
7
+ Draw = "draw",
8
+ Type = "type",
9
+ Upload = "upload"
10
+ }
11
+ export declare enum SignatureFieldKind {
12
+ Signature = "signature",
13
+ Initials = "initials"
14
+ }
15
+ export interface SignatureInkData {
16
+ inkList: Array<{
17
+ points: Array<{
18
+ x: number;
19
+ y: number;
20
+ }>;
21
+ }>;
22
+ strokeWidth: number;
23
+ strokeColor: string;
24
+ size: {
25
+ width: number;
26
+ height: number;
27
+ };
28
+ }
29
+ interface SignatureFieldBase {
30
+ label?: string;
31
+ previewDataUrl: string;
32
+ }
33
+ export interface SignatureInkFieldDefinition extends SignatureFieldBase {
34
+ creationType: SignatureCreationType.Draw;
35
+ inkData: SignatureInkData;
36
+ }
37
+ export interface SignatureStampFieldDefinition extends SignatureFieldBase {
38
+ creationType: SignatureCreationType.Type | SignatureCreationType.Upload;
39
+ imageMimeType?: string;
40
+ imageSize?: {
41
+ width: number;
42
+ height: number;
43
+ };
44
+ imageData?: ArrayBuffer;
45
+ }
46
+ export type SignatureFieldDefinition = SignatureInkFieldDefinition | SignatureStampFieldDefinition;
47
+ export interface SignatureEntry {
48
+ id: string;
49
+ createdAt: number;
50
+ signature: SignatureFieldDefinition;
51
+ initials?: SignatureFieldDefinition;
52
+ }
53
+ export interface SignaturePluginConfig extends BasePluginConfig {
54
+ mode: SignatureMode;
55
+ defaultSize?: {
56
+ width: number;
57
+ height: number;
58
+ };
59
+ }
60
+ export interface SignatureState {
61
+ entryIds: string[];
62
+ }
63
+ export interface SignatureStampToolContext {
64
+ imageData: ArrayBuffer;
65
+ ghostUrl: string;
66
+ targetSize: {
67
+ width: number;
68
+ height: number;
69
+ };
70
+ entryId: string;
71
+ kind: SignatureFieldKind;
72
+ }
73
+ export interface SignatureInkToolContext {
74
+ inkData: SignatureInkData;
75
+ targetSize: {
76
+ width: number;
77
+ height: number;
78
+ };
79
+ entryId: string;
80
+ kind: SignatureFieldKind;
81
+ }
82
+ declare module '@embedpdf/plugin-annotation' {
83
+ interface ToolContextMap {
84
+ signatureStamp: SignatureStampToolContext;
85
+ signatureInk: SignatureInkToolContext;
86
+ }
87
+ }
88
+ export interface ActivePlacementInfo {
89
+ entryId: string;
90
+ kind: SignatureFieldKind;
91
+ }
92
+ export interface ActivePlacementChangeEvent {
93
+ documentId: string;
94
+ activePlacement: ActivePlacementInfo | null;
95
+ }
96
+ export interface SignatureScope {
97
+ activateSignaturePlacement(entryId: string): void;
98
+ activateInitialsPlacement(entryId: string): void;
99
+ deactivatePlacement(): void;
100
+ getActivePlacement(): ActivePlacementInfo | null;
101
+ onActivePlacementChange: EventHook<ActivePlacementInfo | null>;
102
+ }
103
+ export interface SignatureCapability {
104
+ readonly mode: SignatureMode;
105
+ getEntries(): SignatureEntry[];
106
+ addEntry(entry: Omit<SignatureEntry, 'id' | 'createdAt'>): string;
107
+ removeEntry(id: string): void;
108
+ loadEntries(entries: SignatureEntry[]): void;
109
+ exportEntries(): SignatureEntry[];
110
+ onEntriesChange: EventHook<SignatureEntry[]>;
111
+ forDocument(documentId: string): SignatureScope;
112
+ onActivePlacementChange: EventHook<ActivePlacementChangeEvent>;
113
+ }
114
+ export {};
@@ -0,0 +1,5 @@
1
+ export { Fragment } from 'preact';
2
+ export { useEffect, useRef, useState, useCallback, useMemo } from 'preact/hooks';
3
+ export type { ComponentChildren as ReactNode } from 'preact';
4
+ export type CSSProperties = import('preact').JSX.CSSProperties;
5
+ export type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<T extends EventTarget ? T : never>;
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/plugin-annotation/preact';
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/core/preact';
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t=require("@embedpdf/plugin-signature"),n=require("@embedpdf/core/preact");require("preact");const r=require("preact/hooks"),i=require("preact/jsx-runtime"),a=()=>n.useCapability(t.SignaturePlugin.id);function o(e,t=4){const n=e.getContext("2d");if(!n)return null;const{width:r,height:i}=e;if(0===r||0===i)return null;const a=n.getImageData(0,0,r,i),{data:o}=a;let l=r,u=i,s=0,c=0;for(let m=0;m<i;m++)for(let e=0;e<r;e++){o[4*(m*r+e)+3]>0&&(e<l&&(l=e),e>s&&(s=e),m<u&&(u=m),m>c&&(c=m))}if(s<l||c<u)return null;const d=Math.max(0,l-t),h=Math.max(0,u-t),g=Math.min(r,s+t+1)-d,p=Math.min(i,c+t+1)-h,f=document.createElement("canvas");f.width=g,f.height=p;const v=f.getContext("2d");return v?(v.drawImage(e,d,h,g,p,0,0,g,p),{canvas:f,bounds:{x:d,y:h,width:g,height:p}}):null}const l=e.createPluginPackage(t.SignaturePluginPackage).build();exports.SignatureDrawPad=function({onResult:e,padRef:n,strokeColor:a="#000000",strokeWidth:l=4,className:u}){const s=r.useRef(null),[c,d]=r.useState([]),h=r.useRef(!1),g=r.useRef({width:0,height:0}),p=r.useRef(c);p.current=c;const f="undefined"!=typeof window&&window.devicePixelRatio||1,v=r.useCallback(e=>{const t=s.current;if(!t)return{x:0,y:0};const n=t.getBoundingClientRect();return{x:(e.clientX-n.left)*(t.width/f/n.width),y:(e.clientY-n.top)*(t.height/f/n.height)}},[f]),m=r.useCallback(e=>{const t=s.current;if(!t)return;const n=t.getContext("2d");if(n){n.clearRect(0,0,t.width,t.height),n.save(),n.scale(f,f),n.strokeStyle=a,n.lineWidth=l,n.lineCap="round",n.lineJoin="round";for(const t of e)if(0!==t.points.length){n.beginPath(),n.moveTo(t.points[0].x,t.points[0].y);for(let e=1;e<t.points.length;e++)n.lineTo(t.points[e].x,t.points[e].y);n.stroke()}n.restore()}},[f,a,l]),b=r.useRef(m);b.current=m;const w=r.useCallback(n=>{if(0===n.length||n.every(e=>e.points.length<2))return void e(null);const r=s.current;if(!r)return;const i=o(r,Math.ceil(l*f));if(!i)return void e(null);const u=i.bounds.x/f,c=i.bounds.y/f,d=Math.round(i.bounds.width/f),h=Math.round(i.bounds.height/f),g={creationType:t.SignatureCreationType.Draw,inkData:{inkList:n.filter(e=>e.points.length>=2).map(e=>({points:e.points.map(e=>({x:e.x-u,y:e.y-c}))})),strokeWidth:l,strokeColor:a,size:{width:d,height:h}},previewDataUrl:i.canvas.toDataURL("image/png")};e(g)},[e,l,a,f]);r.useEffect(()=>{const e=s.current;if(!e)return;const t=new ResizeObserver(t=>{const{width:n,height:r}=t[0].contentRect;n>0&&r>0&&(g.current={width:Math.round(n),height:Math.round(r)},e.width=Math.round(n)*f,e.height=Math.round(r)*f,b.current(p.current))});return t.observe(e),()=>t.disconnect()},[f]),r.useEffect(()=>{m(c),c.length>0&&c.some(e=>e.points.length>=2)&&w(c)},[a,l]);const y=r.useCallback(()=>{d([]),m([]),e(null)},[m,e]);r.useEffect(()=>(null==n||n({clear:y}),()=>null==n?void 0:n(null)),[n,y]);const x=r.useCallback(e=>{var t,n;h.current=!0;const r=v(e),i=[...c,{points:[r]}];d(i),m(i),null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},[c,v,m]),R=r.useCallback(e=>{if(!h.current)return;const t=v(e),n=[...c],r=n[n.length-1];r&&(r.points.push(t),d(n),m(n))},[c,v,m]),k=r.useCallback(e=>{var t,n;h.current=!1,null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId),w(c)},[c,w]);return i.jsx("canvas",{ref:s,className:u,style:{touchAction:"none",width:"100%",height:"100%",display:"block"},onPointerDown:x,onPointerMove:R,onPointerUp:k})},exports.SignaturePluginPackage=l,exports.SignatureTypePad=function({onResult:e,padRef:n,fontFamily:a="'Dancing Script', cursive",fontSize:l=48,color:u="#000000",className:s,placeholder:c="Type your signature..."}){const d=r.useRef(null),h=r.useRef(null),g=r.useRef(`sig-type-${Math.random().toString(36).slice(2,8)}`).current,p=r.useRef({width:0,height:0}),[f,v]=r.useState(""),m="undefined"!=typeof window&&window.devicePixelRatio||1,b=r.useCallback(n=>{const r=d.current;if(!r)return;const{width:i,height:s}=p.current;if(0===i||0===s)return;r.width=i*m,r.height=s*m;const c=r.getContext("2d");if(!c)return;if(c.clearRect(0,0,r.width,r.height),!n.trim())return void e(null);c.scale(m,m),c.fillStyle=u,c.font=`${l}px ${a}`,c.textBaseline="middle",c.textAlign="center",c.fillText(n,i/2,s/2,i-20);const h=o(r,Math.ceil(4*m));if(!h)return void e(null);const g=Math.round(h.bounds.width/m),f=Math.round(h.bounds.height/m);h.canvas.toBlob(r=>{r&&r.arrayBuffer().then(r=>{const i={creationType:t.SignatureCreationType.Type,label:n,imageMimeType:"image/png",imageSize:{width:g,height:f},previewDataUrl:h.canvas.toDataURL("image/png"),imageData:r};e(i)})},"image/png")},[e,u,l,a,m]),w=r.useRef(b);w.current=b;const y=r.useRef(f);y.current=f,r.useEffect(()=>{const e=h.current;if(!e)return;const t=new ResizeObserver(e=>{const{width:t,height:n}=e[0].contentRect;t>0&&n>0&&(p.current={width:Math.round(t),height:Math.round(n)},w.current(y.current))});return t.observe(e),()=>t.disconnect()},[]),r.useEffect(()=>{b(f)},[f,a,b]);const x=r.useCallback(()=>{v(""),e(null)},[e]);r.useEffect(()=>(null==n||n({clear:x}),()=>null==n?void 0:n(null)),[n,x]);const R=r.useCallback(e=>{v(e.target.value)},[]);return i.jsxs("div",{ref:h,className:s,style:{width:"100%",height:"100%"},children:[i.jsx("style",{children:`#${g}::placeholder { color: ${u}; opacity: 0.5; }`}),i.jsx("input",{id:g,type:"text",value:f,onInput:R,placeholder:c,style:{fontFamily:a,fontSize:`${Math.min(l,32)}px`,color:u,width:"100%",height:"100%",border:"none",outline:"none",background:"transparent",textIndent:"8px"}}),i.jsx("canvas",{ref:d,style:{display:"none"}})]})},exports.useActivePlacement=e=>{const{provides:t}=a(),[n,i]=r.useState(null);return r.useEffect(()=>{if(!t)return;const n=t.forDocument(e);return i(n.getActivePlacement()),n.onActivePlacementChange(i)},[t,e]),n},exports.useSignatureCapability=a,exports.useSignatureEntries=()=>{const{provides:e}=a(),[t,n]=r.useState((null==e?void 0:e.getEntries())??[]);return r.useEffect(()=>{if(e)return n(e.getEntries()),e.onEntriesChange(e=>{n(e)})},[e]),{entries:t,provides:e}},exports.useSignaturePlugin=()=>n.usePlugin(t.SignaturePlugin.id),exports.useSignatureUpload=function({accept:e="image/png,image/jpeg,image/svg+xml",onResult:n}){const i=r.useRef(null),[a,o]=r.useState(null),[l,u]=r.useState(!1),s=r.useCallback(e=>{const r=new FileReader;r.onload=()=>{const i=r.result,a=new Blob([i],{type:e.type}),l=URL.createObjectURL(a);o(e=>(e&&URL.revokeObjectURL(e),l));const u=new Image;u.onload=()=>{const r=document.createElement("canvas");r.width=u.width,r.height=u.height;const a=r.getContext("2d");a&&a.drawImage(u,0,0);const o={creationType:t.SignatureCreationType.Upload,imageMimeType:e.type,imageSize:{width:u.width,height:u.height},previewDataUrl:r.toDataURL("image/png"),imageData:i};n(o)},u.src=l},r.readAsArrayBuffer(e)},[n]),c=r.useCallback(e=>{const t=e.target.files;t&&t[0]&&s(t[0])},[s]),d=r.useCallback(e=>{var t;e.preventDefault(),u(!1);const n=null==(t=e.dataTransfer)?void 0:t.files;n&&n[0]&&s(n[0])},[s]),h=r.useCallback(e=>{e.preventDefault(),u(!0)},[]),g=r.useCallback(()=>{u(!1)},[]),p=r.useCallback(()=>{var e;null==(e=i.current)||e.click()},[]),f=r.useCallback(()=>{o(e=>(e&&URL.revokeObjectURL(e),null)),n(null),i.current&&(i.current.value="")},[n]);return{inputRef:i,openFilePicker:p,processFile:s,handleFileInputChange:c,handleDrop:d,handleDragOver:h,handleDragLeave:g,previewUrl:a,isDragging:l,clear:f,accept:e}},Object.keys(t).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-signature.ts","../../src/shared/components/crop-canvas.ts","../../src/shared/index.ts","../../src/shared/components/signature-draw-pad.tsx","../../src/shared/components/signature-type-pad.tsx","../../src/shared/hooks/use-signature-upload.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { SignaturePlugin, SignatureEntry, ActivePlacementInfo } from '@embedpdf/plugin-signature';\nimport { useState, useEffect } from '@framework';\n\nexport const useSignaturePlugin = () => usePlugin<SignaturePlugin>(SignaturePlugin.id);\nexport const useSignatureCapability = () => useCapability<SignaturePlugin>(SignaturePlugin.id);\n\nexport const useSignatureEntries = () => {\n const { provides } = useSignatureCapability();\n const [entries, setEntries] = useState<SignatureEntry[]>(provides?.getEntries() ?? []);\n\n useEffect(() => {\n if (!provides) return;\n setEntries(provides.getEntries());\n return provides.onEntriesChange((updated) => {\n setEntries(updated);\n });\n }, [provides]);\n\n return { entries, provides };\n};\n\nexport const useActivePlacement = (documentId: string) => {\n const { provides } = useSignatureCapability();\n const [activePlacement, setActivePlacement] = useState<ActivePlacementInfo | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n setActivePlacement(scope.getActivePlacement());\n return scope.onActivePlacementChange(setActivePlacement);\n }, [provides, documentId]);\n\n return activePlacement;\n};\n","export interface CropResult {\n canvas: HTMLCanvasElement;\n bounds: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Scans a canvas for non-transparent pixels and returns a tightly cropped copy.\n * Returns null if the canvas has no visible content.\n */\nexport function cropCanvas(source: HTMLCanvasElement, padding = 4): CropResult | null {\n const ctx = source.getContext('2d');\n if (!ctx) return null;\n\n const { width, height } = source;\n if (width === 0 || height === 0) return null;\n\n const imageData = ctx.getImageData(0, 0, width, height);\n const { data } = imageData;\n\n let minX = width;\n let minY = height;\n let maxX = 0;\n let maxY = 0;\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alpha = data[(y * width + x) * 4 + 3];\n if (alpha > 0) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n if (maxX < minX || maxY < minY) return null;\n\n const cropX = Math.max(0, minX - padding);\n const cropY = Math.max(0, minY - padding);\n const cropW = Math.min(width, maxX + padding + 1) - cropX;\n const cropH = Math.min(height, maxY + padding + 1) - cropY;\n\n const cropped = document.createElement('canvas');\n cropped.width = cropW;\n cropped.height = cropH;\n\n const croppedCtx = cropped.getContext('2d');\n if (!croppedCtx) return null;\n\n croppedCtx.drawImage(source, cropX, cropY, cropW, cropH, 0, 0, cropW, cropH);\n\n return {\n canvas: cropped,\n bounds: { x: cropX, y: cropY, width: cropW, height: cropH },\n };\n}\n","import { createPluginPackage } from '@embedpdf/core';\nimport { SignaturePluginPackage as BaseSignaturePackage } from '@embedpdf/plugin-signature';\n\nexport * from './hooks';\nexport * from './components';\nexport * from '@embedpdf/plugin-signature';\n\nexport const SignaturePluginPackage = createPluginPackage(BaseSignaturePackage).build();\n","import { useEffect, useRef, useState, useCallback } from '@framework';\nimport { SignatureInkFieldDefinition, SignatureCreationType } from '@embedpdf/plugin-signature';\nimport { cropCanvas } from './crop-canvas';\n\nexport interface SignatureDrawPadHandle {\n clear(): void;\n}\n\nexport interface SignatureDrawPadProps {\n onResult: (result: SignatureInkFieldDefinition | null) => void;\n padRef?: (handle: SignatureDrawPadHandle | null) => void;\n strokeColor?: string;\n strokeWidth?: number;\n className?: string;\n}\n\nexport function SignatureDrawPad({\n onResult,\n padRef,\n strokeColor = '#000000',\n strokeWidth = 4,\n className,\n}: SignatureDrawPadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [strokes, setStrokes] = useState<Array<{ points: Array<{ x: number; y: number }> }>>([]);\n const isDrawingRef = useRef(false);\n const sizeRef = useRef({ width: 0, height: 0 });\n const strokesRef = useRef(strokes);\n strokesRef.current = strokes;\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n\n const getCanvasPos = useCallback(\n (e: PointerEvent): { x: number; y: number } => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n return {\n x: (e.clientX - rect.left) * (canvas.width / dpr / rect.width),\n y: (e.clientY - rect.top) * (canvas.height / dpr / rect.height),\n };\n },\n [dpr],\n );\n\n const redraw = useCallback(\n (currentStrokes: Array<{ points: Array<{ x: number; y: number }> }>) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n for (const stroke of currentStrokes) {\n if (stroke.points.length === 0) continue;\n ctx.beginPath();\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n for (let i = 1; i < stroke.points.length; i++) {\n ctx.lineTo(stroke.points[i].x, stroke.points[i].y);\n }\n ctx.stroke();\n }\n ctx.restore();\n },\n [dpr, strokeColor, strokeWidth],\n );\n\n const redrawRef = useRef(redraw);\n redrawRef.current = redraw;\n\n const emitResult = useCallback(\n (currentStrokes: Array<{ points: Array<{ x: number; y: number }> }>) => {\n if (currentStrokes.length === 0 || currentStrokes.every((s) => s.points.length < 2)) {\n onResult(null);\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const cropped = cropCanvas(canvas, Math.ceil(strokeWidth * dpr));\n if (!cropped) {\n onResult(null);\n return;\n }\n\n const offsetX = cropped.bounds.x / dpr;\n const offsetY = cropped.bounds.y / dpr;\n const croppedWidth = Math.round(cropped.bounds.width / dpr);\n const croppedHeight = Math.round(cropped.bounds.height / dpr);\n\n const result: SignatureInkFieldDefinition = {\n creationType: SignatureCreationType.Draw,\n inkData: {\n inkList: currentStrokes\n .filter((s) => s.points.length >= 2)\n .map((s) => ({\n points: s.points.map((p) => ({\n x: p.x - offsetX,\n y: p.y - offsetY,\n })),\n })),\n strokeWidth,\n strokeColor,\n size: { width: croppedWidth, height: croppedHeight },\n },\n previewDataUrl: cropped.canvas.toDataURL('image/png'),\n };\n\n onResult(result);\n },\n [onResult, strokeWidth, strokeColor, dpr],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const observer = new ResizeObserver((entries) => {\n const { width: w, height: h } = entries[0].contentRect;\n if (w > 0 && h > 0) {\n sizeRef.current = { width: Math.round(w), height: Math.round(h) };\n canvas.width = Math.round(w) * dpr;\n canvas.height = Math.round(h) * dpr;\n redrawRef.current(strokesRef.current);\n }\n });\n observer.observe(canvas);\n return () => observer.disconnect();\n }, [dpr]);\n\n useEffect(() => {\n redraw(strokes);\n if (strokes.length > 0 && strokes.some((s) => s.points.length >= 2)) {\n emitResult(strokes);\n }\n }, [strokeColor, strokeWidth]);\n\n const handleClear = useCallback(() => {\n setStrokes([]);\n redraw([]);\n onResult(null);\n }, [redraw, onResult]);\n\n useEffect(() => {\n padRef?.({ clear: handleClear });\n return () => padRef?.(null);\n }, [padRef, handleClear]);\n\n const handlePointerDown = useCallback(\n (e: PointerEvent) => {\n isDrawingRef.current = true;\n const pos = getCanvasPos(e);\n const newStrokes = [...strokes, { points: [pos] }];\n setStrokes(newStrokes);\n redraw(newStrokes);\n (e.target as HTMLElement)?.setPointerCapture?.(e.pointerId);\n },\n [strokes, getCanvasPos, redraw],\n );\n\n const handlePointerMove = useCallback(\n (e: PointerEvent) => {\n if (!isDrawingRef.current) return;\n const pos = getCanvasPos(e);\n const newStrokes = [...strokes];\n const last = newStrokes[newStrokes.length - 1];\n if (last) {\n last.points.push(pos);\n setStrokes(newStrokes);\n redraw(newStrokes);\n }\n },\n [strokes, getCanvasPos, redraw],\n );\n\n const handlePointerUp = useCallback(\n (e: PointerEvent) => {\n isDrawingRef.current = false;\n (e.target as HTMLElement)?.releasePointerCapture?.(e.pointerId);\n emitResult(strokes);\n },\n [strokes, emitResult],\n );\n\n return (\n <canvas\n ref={canvasRef}\n className={className}\n style={{ touchAction: 'none', width: '100%', height: '100%', display: 'block' }}\n onPointerDown={handlePointerDown as any}\n onPointerMove={handlePointerMove as any}\n onPointerUp={handlePointerUp as any}\n />\n );\n}\n","import { useEffect, useRef, useState, useCallback } from '@framework';\nimport { SignatureStampFieldDefinition, SignatureCreationType } from '@embedpdf/plugin-signature';\nimport { cropCanvas } from './crop-canvas';\n\nexport interface SignatureTypePadHandle {\n clear(): void;\n}\n\nexport interface SignatureTypePadProps {\n onResult: (result: SignatureStampFieldDefinition | null) => void;\n padRef?: (handle: SignatureTypePadHandle | null) => void;\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n className?: string;\n placeholder?: string;\n}\n\nexport function SignatureTypePad({\n onResult,\n padRef,\n fontFamily = \"'Dancing Script', cursive\",\n fontSize = 48,\n color = '#000000',\n className,\n placeholder = 'Type your signature...',\n}: SignatureTypePadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputId = useRef(`sig-type-${Math.random().toString(36).slice(2, 8)}`).current;\n const sizeRef = useRef({ width: 0, height: 0 });\n const [text, setText] = useState('');\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n\n const renderText = useCallback(\n (currentText: string) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const { width, height } = sizeRef.current;\n if (width === 0 || height === 0) return;\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (!currentText.trim()) {\n onResult(null);\n return;\n }\n\n ctx.scale(dpr, dpr);\n ctx.fillStyle = color;\n ctx.font = `${fontSize}px ${fontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText(currentText, width / 2, height / 2, width - 20);\n\n const cropped = cropCanvas(canvas, Math.ceil(4 * dpr));\n if (!cropped) {\n onResult(null);\n return;\n }\n\n const croppedWidth = Math.round(cropped.bounds.width / dpr);\n const croppedHeight = Math.round(cropped.bounds.height / dpr);\n\n cropped.canvas.toBlob((blob) => {\n if (!blob) return;\n blob.arrayBuffer().then((imageData) => {\n const result: SignatureStampFieldDefinition = {\n creationType: SignatureCreationType.Type,\n label: currentText,\n imageMimeType: 'image/png',\n imageSize: { width: croppedWidth, height: croppedHeight },\n previewDataUrl: cropped.canvas.toDataURL('image/png'),\n imageData,\n };\n onResult(result);\n });\n }, 'image/png');\n },\n [onResult, color, fontSize, fontFamily, dpr],\n );\n\n const renderTextRef = useRef(renderText);\n renderTextRef.current = renderText;\n const textRef = useRef(text);\n textRef.current = text;\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n if (!wrapper) return;\n const observer = new ResizeObserver((entries) => {\n const { width: w, height: h } = entries[0].contentRect;\n if (w > 0 && h > 0) {\n sizeRef.current = { width: Math.round(w), height: Math.round(h) };\n renderTextRef.current(textRef.current);\n }\n });\n observer.observe(wrapper);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n renderText(text);\n }, [text, fontFamily, renderText]);\n\n const handleClear = useCallback(() => {\n setText('');\n onResult(null);\n }, [onResult]);\n\n useEffect(() => {\n padRef?.({ clear: handleClear });\n return () => padRef?.(null);\n }, [padRef, handleClear]);\n\n const handleTextChange = useCallback((e: Event) => {\n setText((e.target as HTMLInputElement).value);\n }, []);\n\n return (\n <div ref={wrapperRef} className={className} style={{ width: '100%', height: '100%' }}>\n <style>{`#${inputId}::placeholder { color: ${color}; opacity: 0.5; }`}</style>\n <input\n id={inputId}\n type=\"text\"\n value={text}\n onInput={handleTextChange as any}\n placeholder={placeholder}\n style={{\n fontFamily,\n fontSize: `${Math.min(fontSize, 32)}px`,\n color,\n width: '100%',\n height: '100%',\n border: 'none',\n outline: 'none',\n background: 'transparent',\n textIndent: '8px',\n }}\n />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n </div>\n );\n}\n","import { useRef, useState, useCallback } from '@framework';\nimport { SignatureStampFieldDefinition, SignatureCreationType } from '@embedpdf/plugin-signature';\n\nexport interface UseSignatureUploadOptions {\n accept?: string;\n onResult: (result: SignatureStampFieldDefinition | null) => void;\n}\n\nexport interface UseSignatureUploadReturn {\n inputRef: { current: HTMLInputElement | null };\n openFilePicker: () => void;\n processFile: (file: File) => void;\n handleFileInputChange: (e: Event) => void;\n handleDrop: (e: DragEvent) => void;\n handleDragOver: (e: DragEvent) => void;\n handleDragLeave: () => void;\n previewUrl: string | null;\n isDragging: boolean;\n clear: () => void;\n accept: string;\n}\n\nexport function useSignatureUpload({\n accept = 'image/png,image/jpeg,image/svg+xml',\n onResult,\n}: UseSignatureUploadOptions): UseSignatureUploadReturn {\n const inputRef = useRef<HTMLInputElement>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const processFile = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = () => {\n const arrayBuffer = reader.result as ArrayBuffer;\n const blob = new Blob([arrayBuffer], { type: file.type });\n const dataUrl = URL.createObjectURL(blob);\n\n setPreviewUrl((prev) => {\n if (prev) URL.revokeObjectURL(prev);\n return dataUrl;\n });\n\n const img = new Image();\n img.onload = () => {\n const previewCanvas = document.createElement('canvas');\n previewCanvas.width = img.width;\n previewCanvas.height = img.height;\n const ctx = previewCanvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(img, 0, 0);\n }\n\n const result: SignatureStampFieldDefinition = {\n creationType: SignatureCreationType.Upload,\n imageMimeType: file.type,\n imageSize: { width: img.width, height: img.height },\n previewDataUrl: previewCanvas.toDataURL('image/png'),\n imageData: arrayBuffer,\n };\n onResult(result);\n };\n img.src = dataUrl;\n };\n reader.readAsArrayBuffer(file);\n },\n [onResult],\n );\n\n const handleFileInputChange = useCallback(\n (e: Event) => {\n const files = (e.target as HTMLInputElement).files;\n if (files && files[0]) {\n processFile(files[0]);\n }\n },\n [processFile],\n );\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n const files = e.dataTransfer?.files;\n if (files && files[0]) {\n processFile(files[0]);\n }\n },\n [processFile],\n );\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const openFilePicker = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const clear = useCallback(() => {\n setPreviewUrl((prev) => {\n if (prev) URL.revokeObjectURL(prev);\n return null;\n });\n onResult(null);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }, [onResult]);\n\n return {\n inputRef,\n openFilePicker,\n processFile,\n handleFileInputChange,\n handleDrop,\n handleDragOver,\n handleDragLeave,\n previewUrl,\n isDragging,\n clear,\n accept,\n };\n}\n"],"names":["useSignatureCapability","useCapability","SignaturePlugin","id","cropCanvas","source","padding","ctx","getContext","width","height","imageData","getImageData","data","minX","minY","maxX","maxY","y","x","cropX","Math","max","cropY","cropW","min","cropH","cropped","document","createElement","croppedCtx","drawImage","canvas","bounds","SignaturePluginPackage","createPluginPackage","BaseSignaturePackage","build","onResult","padRef","strokeColor","strokeWidth","className","canvasRef","useRef","strokes","setStrokes","useState","isDrawingRef","sizeRef","strokesRef","current","dpr","window","devicePixelRatio","getCanvasPos","useCallback","e","rect","getBoundingClientRect","clientX","left","clientY","top","redraw","currentStrokes","clearRect","save","scale","strokeStyle","lineWidth","lineCap","lineJoin","stroke","points","length","beginPath","moveTo","i","lineTo","restore","redrawRef","emitResult","every","s","ceil","offsetX","offsetY","croppedWidth","round","croppedHeight","result","creationType","SignatureCreationType","Draw","inkData","inkList","filter","map","p","size","previewDataUrl","toDataURL","useEffect","observer","ResizeObserver","entries","w","h","contentRect","observe","disconnect","some","handleClear","clear","handlePointerDown","pos","newStrokes","_b","_a","target","setPointerCapture","call","pointerId","handlePointerMove","last","push","handlePointerUp","releasePointerCapture","jsx","ref","style","touchAction","display","onPointerDown","onPointerMove","onPointerUp","fontFamily","fontSize","color","placeholder","wrapperRef","inputId","random","toString","slice","text","setText","renderText","currentText","trim","fillStyle","font","textBaseline","textAlign","fillText","toBlob","blob","arrayBuffer","then","Type","label","imageMimeType","imageSize","renderTextRef","textRef","wrapper","handleTextChange","value","jsxs","children","type","onInput","border","outline","background","textIndent","documentId","provides","activePlacement","setActivePlacement","scope","forDocument","getActivePlacement","onActivePlacementChange","setEntries","getEntries","onEntriesChange","updated","usePlugin","accept","inputRef","previewUrl","setPreviewUrl","isDragging","setIsDragging","processFile","file","reader","FileReader","onload","Blob","dataUrl","URL","createObjectURL","prev","revokeObjectURL","img","Image","previewCanvas","Upload","src","readAsArrayBuffer","handleFileInputChange","files","handleDrop","preventDefault","dataTransfer","handleDragOver","handleDragLeave","openFilePicker","click"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '../shared-preact';