@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 CloudPDF
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@embedpdf/core"),e=require("@embedpdf/models"),i=require("@embedpdf/plugin-annotation");var n=(t=>(t.SignatureOnly="signature-only",t.SignatureAndInitials="signature-and-initials",t))(n||{}),a=(t=>(t.Draw="draw",t.Type="type",t.Upload="upload",t))(a||{}),r=(t=>(t.Signature="signature",t.Initials="initials",t))(r||{});const o="signature",s={id:o,name:"Signature Plugin",version:"1.0.0",provides:["signature"],requires:["annotation"],optional:[],defaultConfig:{mode:n.SignatureOnly}},l="SIGNATURE/ADD_ENTRY",h="SIGNATURE/REMOVE_ENTRY";function c(t){return{type:l,payload:t}}function u(t){return{type:h,payload:t}}const g={annotationType:e.PdfAnnotationSubtype.STAMP,create(t){const{onPreview:n,onCommit:a,getTool:r,pageSize:o,pageRotation:s,getToolContext:l}=t;return{onPointerMove:t=>{const i=l();if(!(null==i?void 0:i.targetSize))return;const{width:a,height:r}=i.targetSize;n({type:e.PdfAnnotationSubtype.STAMP,bounds:{origin:{x:t.x-a/2,y:t.y-r/2},size:{width:a,height:r}},data:{rect:{origin:{x:t.x-a/2,y:t.y-r/2},size:{width:a,height:r}},ghostUrl:i.ghostUrl,pageRotation:s}})},onPointerDown:h=>{var c;const u=r(),g=l();if(!u||!(null==g?void 0:g.targetSize))return;const{width:d,height:p}=g.targetSize,m={origin:{x:h.x-d/2,y:h.y-p/2},size:{width:d,height:p}};let y={...u.defaults,rect:m,type:e.PdfAnnotationSubtype.STAMP,name:e.PdfAnnotationName.Custom,subject:"Signature",flags:u.defaults.flags??["print"],pageIndex:t.pageIndex,id:e.uuidV4(),created:new Date};(null==(c=u.behavior)?void 0:c.insertUpright)&&(y=i.applyInsertUpright(y,s,!1)),y=i.clampAnnotationToPage(y,o),a(y,{data:g.imageData}),n(null)},onPointerLeave:()=>{n(null)}}}};function d(t,e,i){const n=e.width/t.size.width,a=e.height/t.size.height,r=Math.min(n,a),o=t.size.width*r,s=t.size.height*r,l=i.x-o/2,h=i.y-s/2;return{inkList:t.inkList.map(t=>({points:t.points.map(t=>({x:t.x*r+l,y:t.y*r+h}))})),strokeWidth:Math.round(t.strokeWidth*r*10)/10}}const p={annotationType:e.PdfAnnotationSubtype.INK,create(t){const{onPreview:n,onCommit:a,getTool:r,pageSize:o,getToolContext:s}=t;return{onPointerMove:t=>{const i=s();if(!(null==i?void 0:i.inkData)||!(null==i?void 0:i.targetSize))return;const{inkList:a,strokeWidth:r}=d(i.inkData,i.targetSize,t),o=a.flatMap(t=>t.points);if(0===o.length)return;const l=e.expandRect({origin:{x:Math.min(...o.map(t=>t.x)),y:Math.min(...o.map(t=>t.y))},size:{width:Math.max(...o.map(t=>t.x))-Math.min(...o.map(t=>t.x)),height:Math.max(...o.map(t=>t.y))-Math.min(...o.map(t=>t.y))}},r/2);n({type:e.PdfAnnotationSubtype.INK,bounds:l,data:{rect:l,inkList:a,strokeWidth:r,strokeColor:i.inkData.strokeColor,opacity:.5}})},onPointerDown:l=>{const h=r(),c=s();if(!h||!(null==c?void 0:c.inkData)||!(null==c?void 0:c.targetSize))return;const{inkList:u,strokeWidth:g}=d(c.inkData,c.targetSize,l),p=u.flatMap(t=>t.points);if(0===p.length)return;const m=e.expandRect({origin:{x:Math.min(...p.map(t=>t.x)),y:Math.min(...p.map(t=>t.y))},size:{width:Math.max(...p.map(t=>t.x))-Math.min(...p.map(t=>t.x)),height:Math.max(...p.map(t=>t.y))-Math.min(...p.map(t=>t.y))}},g/2);let y={...h.defaults,inkList:u,rect:m,strokeWidth:g,strokeColor:c.inkData.strokeColor,opacity:1,type:e.PdfAnnotationSubtype.INK,subject:"Signature",flags:h.defaults.flags??["print"],pageIndex:t.pageIndex,id:e.uuidV4(),created:new Date};const f=y.rect;y=i.clampAnnotationToPage(y,o);const S=y.rect.origin.x-f.origin.x,v=y.rect.origin.y-f.origin.y;0===S&&0===v||(y={...y,inkList:y.inkList.map(t=>({points:t.points.map(t=>({x:t.x+S,y:t.y+v}))}))}),a(y),n(null)},onPointerLeave:()=>{n(null)}}}},m="signatureStamp",y="signatureInk",f=[i.defineAnnotationTool({id:m,name:"Signature Stamp",labelKey:"signature.stamp",categories:["annotation","signature","insert"],matchScore:()=>0,interaction:{exclusive:!0,cursor:"copy",isDraggable:!0,isResizable:!0,isRotatable:!1,lockAspectRatio:!0,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:e.PdfAnnotationSubtype.STAMP},behavior:{deactivateToolAfterCreate:!0,selectAfterCreate:!0,insertUpright:!0,useAppearanceStream:!0},pointerHandler:g}),i.defineAnnotationTool({id:y,name:"Signature Ink",labelKey:"signature.ink",categories:["annotation","signature","insert"],matchScore:t=>t.type===e.PdfAnnotationSubtype.INK&&"Signature"===t.subject?20:0,interaction:{exclusive:!0,cursor:"copy",isDraggable:!0,isResizable:!0,isRotatable:!1,lockAspectRatio:!0,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:e.PdfAnnotationSubtype.INK},behavior:{deactivateToolAfterCreate:!0,selectAfterCreate:!0},transform:i.patching.patchInk,pointerHandler:p})],S=class extends t.BasePlugin{constructor(e,i,n){var a;if(super(e,i),this.config=n,this.entries=new Map,this.entriesChange$=t.createEmitter(),this.activePlacement$=t.createScopedEmitter((t,e)=>({documentId:t,activePlacement:e})),this.annotation=null,this.toolChangeUnsubscribe=null,this.currentGhostUrl=null,this.annotation=(null==(a=i.getPlugin("annotation"))?void 0:a.provides())??null,this.annotation){for(const t of f)this.annotation.addTool(t);this.toolChangeUnsubscribe=this.annotation.onActiveToolChange(({documentId:t,tool:e})=>{(null==e?void 0:e.id)!==m&&(null==e?void 0:e.id)!==y&&(this.revokeGhostUrl(),this.activePlacement$.emit(t,null))})}}async initialize(){}buildCapability(){return{mode:this.config.mode,getEntries:()=>this.getEntries(),addEntry:t=>this.addEntry(t),removeEntry:t=>this.removeEntry(t),loadEntries:t=>this.loadEntries(t),exportEntries:()=>this.exportEntries(),onEntriesChange:this.entriesChange$.on,forDocument:t=>this.createSignatureScope(t),onActivePlacementChange:this.activePlacement$.onGlobal}}getEntries(){return Array.from(this.entries.values())}addEntry(t){const i=e.uuidV4(),n={...t,id:i,createdAt:Date.now()};return this.entries.set(i,n),this.dispatch(c(i)),this.emitEntriesChange(),i}removeEntry(t){this.entries.has(t)&&(this.entries.delete(t),this.dispatch(u(t)),this.emitEntriesChange())}loadEntries(t){for(const e of t)this.entries.set(e.id,e),this.dispatch(c(e.id));this.emitEntriesChange()}exportEntries(){return this.getEntries()}createSignatureScope(t){return{activateSignaturePlacement:e=>this.activatePlacement(t,e,r.Signature),activateInitialsPlacement:e=>this.activatePlacement(t,e,r.Initials),deactivatePlacement:()=>this.deactivatePlacement(t),getActivePlacement:()=>this.activePlacement$.getValue(t)??null,onActivePlacementChange:this.activePlacement$.forScope(t)}}activatePlacement(t,e,i){const n=this.entries.get(e);if(!n||!this.annotation)return;const o=i===r.Initials?n.initials:n.signature;if(o){if(this.revokeGhostUrl(),o.creationType===a.Draw){if(n.signature.creationType!==a.Draw)return;const t=this.config.defaultSize??{width:150,height:50},r=n.signature.inkData.size,s=Math.min(t.width/r.width,t.height/r.height),l={width:o.inkData.size.width*s,height:o.inkData.size.height*s};this.annotation.setActiveTool(y,{inkData:o.inkData,targetSize:l,entryId:e,kind:i})}else{if(!o.imageData)return;const t=URL.createObjectURL(new Blob([o.imageData],{type:o.imageMimeType??"image/png"}));this.currentGhostUrl=t;const r=this.config.defaultSize??{width:150,height:50};let s=r;if(o.imageSize){const t=n.signature.creationType!==a.Draw?n.signature.imageSize??o.imageSize:o.imageSize,e=Math.min(r.width/t.width,r.height/t.height);s={width:o.imageSize.width*e,height:o.imageSize.height*e}}this.annotation.setActiveTool(m,{imageData:o.imageData,ghostUrl:t,targetSize:s,entryId:e,kind:i})}this.activePlacement$.emit(t,{entryId:e,kind:i})}}deactivatePlacement(t){this.annotation&&(this.annotation.setActiveTool(null),this.revokeGhostUrl(),this.activePlacement$.emit(t,null))}revokeGhostUrl(){this.currentGhostUrl&&(URL.revokeObjectURL(this.currentGhostUrl),this.currentGhostUrl=null)}emitEntriesChange(){this.entriesChange$.emit(this.getEntries())}async destroy(){var t;this.revokeGhostUrl(),null==(t=this.toolChangeUnsubscribe)||t.call(this),this.entries.clear()}};S.id=o;let v=S;const x={entryIds:[]},A=(t=x,e)=>{switch(e.type){case l:return{...t,entryIds:[...t.entryIds,e.payload]};case h:return{...t,entryIds:t.entryIds.filter(t=>t!==e.payload)};default:return t}};function P(t){const e=new Uint8Array(t);let i="";for(let n=0;n<e.length;n++)i+=String.fromCharCode(e[n]);return btoa(i)}function b(t){const e=atob(t),i=new Uint8Array(e.length);for(let n=0;n<e.length;n++)i[n]=e.charCodeAt(n);return i.buffer}function k(t){if(t.creationType===a.Draw)return t;const{imageData:e,...i}=t;return{...i,imageData:e?P(e):void 0}}function T(t){if(t.creationType===a.Draw)return t;const{imageData:e,...i}=t;return{...i,imageData:e?b(e):void 0}}const D={manifest:s,create:(t,e)=>new v(o,t,e),reducer:A,initialState:x};exports.ADD_SIGNATURE_ENTRY=l,exports.REMOVE_SIGNATURE_ENTRY=h,exports.SIGNATURE_INK_TOOL_ID=y,exports.SIGNATURE_PLUGIN_ID=o,exports.SIGNATURE_STAMP_TOOL_ID=m,exports.SignatureCreationType=a,exports.SignatureFieldKind=r,exports.SignatureMode=n,exports.SignaturePlugin=v,exports.SignaturePluginPackage=D,exports.addSignatureEntry=c,exports.deserializeEntries=function(t){return t.map(t=>({id:t.id,createdAt:t.createdAt,signature:T(t.signature),...t.initials&&{initials:T(t.initials)}}))},exports.initialState=x,exports.manifest=s,exports.removeSignatureEntry=u,exports.serializeEntries=function(t){return t.map(t=>({id:t.id,createdAt:t.createdAt,signature:k(t.signature),...t.initials&&{initials:k(t.initials)}}))},exports.signatureReducer=A;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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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"}
@@ -0,0 +1 @@
1
+ export * from './lib';
package/dist/index.js ADDED
@@ -0,0 +1,516 @@
1
+ import { BasePlugin, createEmitter, createScopedEmitter } from "@embedpdf/core";
2
+ import { PdfAnnotationSubtype, uuidV4, PdfAnnotationName, expandRect } from "@embedpdf/models";
3
+ import { applyInsertUpright, clampAnnotationToPage, defineAnnotationTool, patching } from "@embedpdf/plugin-annotation";
4
+ var SignatureMode = /* @__PURE__ */ ((SignatureMode2) => {
5
+ SignatureMode2["SignatureOnly"] = "signature-only";
6
+ SignatureMode2["SignatureAndInitials"] = "signature-and-initials";
7
+ return SignatureMode2;
8
+ })(SignatureMode || {});
9
+ var SignatureCreationType = /* @__PURE__ */ ((SignatureCreationType2) => {
10
+ SignatureCreationType2["Draw"] = "draw";
11
+ SignatureCreationType2["Type"] = "type";
12
+ SignatureCreationType2["Upload"] = "upload";
13
+ return SignatureCreationType2;
14
+ })(SignatureCreationType || {});
15
+ var SignatureFieldKind = /* @__PURE__ */ ((SignatureFieldKind2) => {
16
+ SignatureFieldKind2["Signature"] = "signature";
17
+ SignatureFieldKind2["Initials"] = "initials";
18
+ return SignatureFieldKind2;
19
+ })(SignatureFieldKind || {});
20
+ const SIGNATURE_PLUGIN_ID = "signature";
21
+ const manifest = {
22
+ id: SIGNATURE_PLUGIN_ID,
23
+ name: "Signature Plugin",
24
+ version: "1.0.0",
25
+ provides: ["signature"],
26
+ requires: ["annotation"],
27
+ optional: [],
28
+ defaultConfig: {
29
+ mode: SignatureMode.SignatureOnly
30
+ }
31
+ };
32
+ const ADD_SIGNATURE_ENTRY = "SIGNATURE/ADD_ENTRY";
33
+ const REMOVE_SIGNATURE_ENTRY = "SIGNATURE/REMOVE_ENTRY";
34
+ function addSignatureEntry(id) {
35
+ return { type: ADD_SIGNATURE_ENTRY, payload: id };
36
+ }
37
+ function removeSignatureEntry(id) {
38
+ return { type: REMOVE_SIGNATURE_ENTRY, payload: id };
39
+ }
40
+ const signatureStampHandlerFactory = {
41
+ annotationType: PdfAnnotationSubtype.STAMP,
42
+ create(context) {
43
+ const { onPreview, onCommit, getTool, pageSize, pageRotation, getToolContext } = context;
44
+ return {
45
+ onPointerMove: (pos) => {
46
+ const ctx = getToolContext();
47
+ if (!(ctx == null ? void 0 : ctx.targetSize)) return;
48
+ const { width, height } = ctx.targetSize;
49
+ onPreview({
50
+ type: PdfAnnotationSubtype.STAMP,
51
+ bounds: {
52
+ origin: { x: pos.x - width / 2, y: pos.y - height / 2 },
53
+ size: { width, height }
54
+ },
55
+ data: {
56
+ rect: {
57
+ origin: { x: pos.x - width / 2, y: pos.y - height / 2 },
58
+ size: { width, height }
59
+ },
60
+ ghostUrl: ctx.ghostUrl,
61
+ pageRotation
62
+ }
63
+ });
64
+ },
65
+ onPointerDown: (pos) => {
66
+ var _a;
67
+ const tool = getTool();
68
+ const ctx = getToolContext();
69
+ if (!tool || !(ctx == null ? void 0 : ctx.targetSize)) return;
70
+ const { width, height } = ctx.targetSize;
71
+ const rect = {
72
+ origin: { x: pos.x - width / 2, y: pos.y - height / 2 },
73
+ size: { width, height }
74
+ };
75
+ let anno = {
76
+ ...tool.defaults,
77
+ rect,
78
+ type: PdfAnnotationSubtype.STAMP,
79
+ name: PdfAnnotationName.Custom,
80
+ subject: "Signature",
81
+ flags: tool.defaults.flags ?? ["print"],
82
+ pageIndex: context.pageIndex,
83
+ id: uuidV4(),
84
+ created: /* @__PURE__ */ new Date()
85
+ };
86
+ if ((_a = tool.behavior) == null ? void 0 : _a.insertUpright) {
87
+ anno = applyInsertUpright(anno, pageRotation, false);
88
+ }
89
+ anno = clampAnnotationToPage(anno, pageSize);
90
+ onCommit(anno, { data: ctx.imageData });
91
+ onPreview(null);
92
+ },
93
+ onPointerLeave: () => {
94
+ onPreview(null);
95
+ }
96
+ };
97
+ }
98
+ };
99
+ function translateAndScaleInk(inkData, targetSize, centerPos) {
100
+ const scaleX = targetSize.width / inkData.size.width;
101
+ const scaleY = targetSize.height / inkData.size.height;
102
+ const scale = Math.min(scaleX, scaleY);
103
+ const scaledW = inkData.size.width * scale;
104
+ const scaledH = inkData.size.height * scale;
105
+ const offsetX = centerPos.x - scaledW / 2;
106
+ const offsetY = centerPos.y - scaledH / 2;
107
+ const inkList = inkData.inkList.map((stroke) => ({
108
+ points: stroke.points.map((p) => ({
109
+ x: p.x * scale + offsetX,
110
+ y: p.y * scale + offsetY
111
+ }))
112
+ }));
113
+ return { inkList, strokeWidth: Math.round(inkData.strokeWidth * scale * 10) / 10 };
114
+ }
115
+ const signatureInkHandlerFactory = {
116
+ annotationType: PdfAnnotationSubtype.INK,
117
+ create(context) {
118
+ const { onPreview, onCommit, getTool, pageSize, getToolContext } = context;
119
+ return {
120
+ onPointerMove: (pos) => {
121
+ const ctx = getToolContext();
122
+ if (!(ctx == null ? void 0 : ctx.inkData) || !(ctx == null ? void 0 : ctx.targetSize)) return;
123
+ const { inkList, strokeWidth } = translateAndScaleInk(ctx.inkData, ctx.targetSize, pos);
124
+ const allPoints = inkList.flatMap((s) => s.points);
125
+ if (allPoints.length === 0) return;
126
+ const rect = expandRect(
127
+ {
128
+ origin: {
129
+ x: Math.min(...allPoints.map((p) => p.x)),
130
+ y: Math.min(...allPoints.map((p) => p.y))
131
+ },
132
+ size: {
133
+ width: Math.max(...allPoints.map((p) => p.x)) - Math.min(...allPoints.map((p) => p.x)),
134
+ height: Math.max(...allPoints.map((p) => p.y)) - Math.min(...allPoints.map((p) => p.y))
135
+ }
136
+ },
137
+ strokeWidth / 2
138
+ );
139
+ onPreview({
140
+ type: PdfAnnotationSubtype.INK,
141
+ bounds: rect,
142
+ data: {
143
+ rect,
144
+ inkList,
145
+ strokeWidth,
146
+ strokeColor: ctx.inkData.strokeColor,
147
+ opacity: 0.5
148
+ }
149
+ });
150
+ },
151
+ onPointerDown: (pos) => {
152
+ const tool = getTool();
153
+ const ctx = getToolContext();
154
+ if (!tool || !(ctx == null ? void 0 : ctx.inkData) || !(ctx == null ? void 0 : ctx.targetSize)) return;
155
+ const { inkList, strokeWidth } = translateAndScaleInk(ctx.inkData, ctx.targetSize, pos);
156
+ const allPoints = inkList.flatMap((s) => s.points);
157
+ if (allPoints.length === 0) return;
158
+ const rect = expandRect(
159
+ {
160
+ origin: {
161
+ x: Math.min(...allPoints.map((p) => p.x)),
162
+ y: Math.min(...allPoints.map((p) => p.y))
163
+ },
164
+ size: {
165
+ width: Math.max(...allPoints.map((p) => p.x)) - Math.min(...allPoints.map((p) => p.x)),
166
+ height: Math.max(...allPoints.map((p) => p.y)) - Math.min(...allPoints.map((p) => p.y))
167
+ }
168
+ },
169
+ strokeWidth / 2
170
+ );
171
+ let anno = {
172
+ ...tool.defaults,
173
+ inkList,
174
+ rect,
175
+ strokeWidth,
176
+ strokeColor: ctx.inkData.strokeColor,
177
+ opacity: 1,
178
+ type: PdfAnnotationSubtype.INK,
179
+ subject: "Signature",
180
+ flags: tool.defaults.flags ?? ["print"],
181
+ pageIndex: context.pageIndex,
182
+ id: uuidV4(),
183
+ created: /* @__PURE__ */ new Date()
184
+ };
185
+ const unclamped = anno.rect;
186
+ anno = clampAnnotationToPage(anno, pageSize);
187
+ const dx = anno.rect.origin.x - unclamped.origin.x;
188
+ const dy = anno.rect.origin.y - unclamped.origin.y;
189
+ if (dx !== 0 || dy !== 0) {
190
+ anno = {
191
+ ...anno,
192
+ inkList: anno.inkList.map((s) => ({
193
+ points: s.points.map((p) => ({ x: p.x + dx, y: p.y + dy }))
194
+ }))
195
+ };
196
+ }
197
+ onCommit(anno);
198
+ onPreview(null);
199
+ },
200
+ onPointerLeave: () => {
201
+ onPreview(null);
202
+ }
203
+ };
204
+ }
205
+ };
206
+ const SIGNATURE_STAMP_TOOL_ID = "signatureStamp";
207
+ const SIGNATURE_INK_TOOL_ID = "signatureInk";
208
+ const signatureStampTool = defineAnnotationTool({
209
+ id: SIGNATURE_STAMP_TOOL_ID,
210
+ name: "Signature Stamp",
211
+ labelKey: "signature.stamp",
212
+ categories: ["annotation", "signature", "insert"],
213
+ matchScore: () => 0,
214
+ interaction: {
215
+ exclusive: true,
216
+ cursor: "copy",
217
+ isDraggable: true,
218
+ isResizable: true,
219
+ isRotatable: false,
220
+ lockAspectRatio: true,
221
+ isGroupDraggable: true,
222
+ isGroupResizable: false,
223
+ isGroupRotatable: false
224
+ },
225
+ defaults: {
226
+ type: PdfAnnotationSubtype.STAMP
227
+ },
228
+ behavior: {
229
+ deactivateToolAfterCreate: true,
230
+ selectAfterCreate: true,
231
+ insertUpright: true,
232
+ useAppearanceStream: true
233
+ },
234
+ pointerHandler: signatureStampHandlerFactory
235
+ });
236
+ const signatureInkTool = defineAnnotationTool({
237
+ id: SIGNATURE_INK_TOOL_ID,
238
+ name: "Signature Ink",
239
+ labelKey: "signature.ink",
240
+ categories: ["annotation", "signature", "insert"],
241
+ matchScore: (a) => a.type === PdfAnnotationSubtype.INK && a.subject === "Signature" ? 20 : 0,
242
+ interaction: {
243
+ exclusive: true,
244
+ cursor: "copy",
245
+ isDraggable: true,
246
+ isResizable: true,
247
+ isRotatable: false,
248
+ lockAspectRatio: true,
249
+ isGroupDraggable: true,
250
+ isGroupResizable: false,
251
+ isGroupRotatable: false
252
+ },
253
+ defaults: {
254
+ type: PdfAnnotationSubtype.INK
255
+ },
256
+ behavior: {
257
+ deactivateToolAfterCreate: true,
258
+ selectAfterCreate: true
259
+ },
260
+ transform: patching.patchInk,
261
+ pointerHandler: signatureInkHandlerFactory
262
+ });
263
+ const signatureTools = [signatureStampTool, signatureInkTool];
264
+ const _SignaturePlugin = class _SignaturePlugin extends BasePlugin {
265
+ constructor(id, registry, config) {
266
+ var _a;
267
+ super(id, registry);
268
+ this.config = config;
269
+ this.entries = /* @__PURE__ */ new Map();
270
+ this.entriesChange$ = createEmitter();
271
+ this.activePlacement$ = createScopedEmitter((documentId, activePlacement) => ({ documentId, activePlacement }));
272
+ this.annotation = null;
273
+ this.toolChangeUnsubscribe = null;
274
+ this.currentGhostUrl = null;
275
+ this.annotation = ((_a = registry.getPlugin("annotation")) == null ? void 0 : _a.provides()) ?? null;
276
+ if (this.annotation) {
277
+ for (const tool of signatureTools) {
278
+ this.annotation.addTool(tool);
279
+ }
280
+ this.toolChangeUnsubscribe = this.annotation.onActiveToolChange(({ documentId, tool }) => {
281
+ if ((tool == null ? void 0 : tool.id) !== SIGNATURE_STAMP_TOOL_ID && (tool == null ? void 0 : tool.id) !== SIGNATURE_INK_TOOL_ID) {
282
+ this.revokeGhostUrl();
283
+ this.activePlacement$.emit(documentId, null);
284
+ }
285
+ });
286
+ }
287
+ }
288
+ async initialize() {
289
+ }
290
+ buildCapability() {
291
+ return {
292
+ mode: this.config.mode,
293
+ getEntries: () => this.getEntries(),
294
+ addEntry: (entry) => this.addEntry(entry),
295
+ removeEntry: (id) => this.removeEntry(id),
296
+ loadEntries: (entries) => this.loadEntries(entries),
297
+ exportEntries: () => this.exportEntries(),
298
+ onEntriesChange: this.entriesChange$.on,
299
+ forDocument: (documentId) => this.createSignatureScope(documentId),
300
+ onActivePlacementChange: this.activePlacement$.onGlobal
301
+ };
302
+ }
303
+ getEntries() {
304
+ return Array.from(this.entries.values());
305
+ }
306
+ addEntry(entry) {
307
+ const id = uuidV4();
308
+ const fullEntry = {
309
+ ...entry,
310
+ id,
311
+ createdAt: Date.now()
312
+ };
313
+ this.entries.set(id, fullEntry);
314
+ this.dispatch(addSignatureEntry(id));
315
+ this.emitEntriesChange();
316
+ return id;
317
+ }
318
+ removeEntry(id) {
319
+ if (!this.entries.has(id)) return;
320
+ this.entries.delete(id);
321
+ this.dispatch(removeSignatureEntry(id));
322
+ this.emitEntriesChange();
323
+ }
324
+ loadEntries(entries) {
325
+ for (const entry of entries) {
326
+ this.entries.set(entry.id, entry);
327
+ this.dispatch(addSignatureEntry(entry.id));
328
+ }
329
+ this.emitEntriesChange();
330
+ }
331
+ exportEntries() {
332
+ return this.getEntries();
333
+ }
334
+ createSignatureScope(documentId) {
335
+ return {
336
+ activateSignaturePlacement: (entryId) => this.activatePlacement(documentId, entryId, SignatureFieldKind.Signature),
337
+ activateInitialsPlacement: (entryId) => this.activatePlacement(documentId, entryId, SignatureFieldKind.Initials),
338
+ deactivatePlacement: () => this.deactivatePlacement(documentId),
339
+ getActivePlacement: () => this.activePlacement$.getValue(documentId) ?? null,
340
+ onActivePlacementChange: this.activePlacement$.forScope(documentId)
341
+ };
342
+ }
343
+ activatePlacement(documentId, entryId, kind) {
344
+ const entry = this.entries.get(entryId);
345
+ if (!entry || !this.annotation) return;
346
+ const field = kind === SignatureFieldKind.Initials ? entry.initials : entry.signature;
347
+ if (!field) return;
348
+ this.revokeGhostUrl();
349
+ if (field.creationType === SignatureCreationType.Draw) {
350
+ if (entry.signature.creationType !== SignatureCreationType.Draw) return;
351
+ const defaultSize = this.config.defaultSize ?? { width: 150, height: 50 };
352
+ const referenceSize = entry.signature.inkData.size;
353
+ const scale = Math.min(
354
+ defaultSize.width / referenceSize.width,
355
+ defaultSize.height / referenceSize.height
356
+ );
357
+ const targetSize = {
358
+ width: field.inkData.size.width * scale,
359
+ height: field.inkData.size.height * scale
360
+ };
361
+ this.annotation.setActiveTool(SIGNATURE_INK_TOOL_ID, {
362
+ inkData: field.inkData,
363
+ targetSize,
364
+ entryId,
365
+ kind
366
+ });
367
+ } else {
368
+ if (!field.imageData) return;
369
+ const ghostUrl = URL.createObjectURL(
370
+ new Blob([field.imageData], { type: field.imageMimeType ?? "image/png" })
371
+ );
372
+ this.currentGhostUrl = ghostUrl;
373
+ const defaultSize = this.config.defaultSize ?? { width: 150, height: 50 };
374
+ let targetSize = defaultSize;
375
+ if (field.imageSize) {
376
+ const referenceSize = entry.signature.creationType !== SignatureCreationType.Draw ? entry.signature.imageSize ?? field.imageSize : field.imageSize;
377
+ const scale = Math.min(
378
+ defaultSize.width / referenceSize.width,
379
+ defaultSize.height / referenceSize.height
380
+ );
381
+ targetSize = {
382
+ width: field.imageSize.width * scale,
383
+ height: field.imageSize.height * scale
384
+ };
385
+ }
386
+ this.annotation.setActiveTool(SIGNATURE_STAMP_TOOL_ID, {
387
+ imageData: field.imageData,
388
+ ghostUrl,
389
+ targetSize,
390
+ entryId,
391
+ kind
392
+ });
393
+ }
394
+ this.activePlacement$.emit(documentId, { entryId, kind });
395
+ }
396
+ deactivatePlacement(documentId) {
397
+ if (!this.annotation) return;
398
+ this.annotation.setActiveTool(null);
399
+ this.revokeGhostUrl();
400
+ this.activePlacement$.emit(documentId, null);
401
+ }
402
+ revokeGhostUrl() {
403
+ if (this.currentGhostUrl) {
404
+ URL.revokeObjectURL(this.currentGhostUrl);
405
+ this.currentGhostUrl = null;
406
+ }
407
+ }
408
+ emitEntriesChange() {
409
+ this.entriesChange$.emit(this.getEntries());
410
+ }
411
+ async destroy() {
412
+ var _a;
413
+ this.revokeGhostUrl();
414
+ (_a = this.toolChangeUnsubscribe) == null ? void 0 : _a.call(this);
415
+ this.entries.clear();
416
+ }
417
+ };
418
+ _SignaturePlugin.id = SIGNATURE_PLUGIN_ID;
419
+ let SignaturePlugin = _SignaturePlugin;
420
+ const initialState = {
421
+ entryIds: []
422
+ };
423
+ const signatureReducer = (state = initialState, action) => {
424
+ switch (action.type) {
425
+ case ADD_SIGNATURE_ENTRY:
426
+ return {
427
+ ...state,
428
+ entryIds: [...state.entryIds, action.payload]
429
+ };
430
+ case REMOVE_SIGNATURE_ENTRY:
431
+ return {
432
+ ...state,
433
+ entryIds: state.entryIds.filter((id) => id !== action.payload)
434
+ };
435
+ default:
436
+ return state;
437
+ }
438
+ };
439
+ function arrayBufferToBase64(buffer) {
440
+ const bytes = new Uint8Array(buffer);
441
+ let binary = "";
442
+ for (let i = 0; i < bytes.length; i++) {
443
+ binary += String.fromCharCode(bytes[i]);
444
+ }
445
+ return btoa(binary);
446
+ }
447
+ function base64ToArrayBuffer(base64) {
448
+ const binary = atob(base64);
449
+ const bytes = new Uint8Array(binary.length);
450
+ for (let i = 0; i < binary.length; i++) {
451
+ bytes[i] = binary.charCodeAt(i);
452
+ }
453
+ return bytes.buffer;
454
+ }
455
+ function serializeField(field) {
456
+ if (field.creationType === SignatureCreationType.Draw) {
457
+ return field;
458
+ }
459
+ const { imageData, ...rest } = field;
460
+ return {
461
+ ...rest,
462
+ imageData: imageData ? arrayBufferToBase64(imageData) : void 0
463
+ };
464
+ }
465
+ function deserializeField(field) {
466
+ if (field.creationType === SignatureCreationType.Draw) {
467
+ return field;
468
+ }
469
+ const { imageData, ...rest } = field;
470
+ return {
471
+ ...rest,
472
+ imageData: imageData ? base64ToArrayBuffer(imageData) : void 0
473
+ };
474
+ }
475
+ function serializeEntries(entries) {
476
+ return entries.map((entry) => ({
477
+ id: entry.id,
478
+ createdAt: entry.createdAt,
479
+ signature: serializeField(entry.signature),
480
+ ...entry.initials && { initials: serializeField(entry.initials) }
481
+ }));
482
+ }
483
+ function deserializeEntries(data) {
484
+ return data.map((entry) => ({
485
+ id: entry.id,
486
+ createdAt: entry.createdAt,
487
+ signature: deserializeField(entry.signature),
488
+ ...entry.initials && { initials: deserializeField(entry.initials) }
489
+ }));
490
+ }
491
+ const SignaturePluginPackage = {
492
+ manifest,
493
+ create: (registry, config) => new SignaturePlugin(SIGNATURE_PLUGIN_ID, registry, config),
494
+ reducer: signatureReducer,
495
+ initialState
496
+ };
497
+ export {
498
+ ADD_SIGNATURE_ENTRY,
499
+ REMOVE_SIGNATURE_ENTRY,
500
+ SIGNATURE_INK_TOOL_ID,
501
+ SIGNATURE_PLUGIN_ID,
502
+ SIGNATURE_STAMP_TOOL_ID,
503
+ SignatureCreationType,
504
+ SignatureFieldKind,
505
+ SignatureMode,
506
+ SignaturePlugin,
507
+ SignaturePluginPackage,
508
+ addSignatureEntry,
509
+ deserializeEntries,
510
+ initialState,
511
+ manifest,
512
+ removeSignatureEntry,
513
+ serializeEntries,
514
+ signatureReducer
515
+ };
516
+ //# sourceMappingURL=index.js.map